################################################################################ # Special Invulnerable State Script By Black Mage (Credit required to use) # Version : 1.3 # https://burningwizard.wordpress.com/2015/11/09/special-invulnerable-state-script/ ################################################################################ # WARNING : This script is heavily modified the targeting system and how things # related to them is handled, thus make this script might not compatible with # many custom battle script. If you found some incompatibility, with another # script, make sure to report to : # https://burningwizard.wordpress.com/2015/11/09/special-invulnerable-state-script/ # so we can solve the problem. # To use this script, put it above Main script in the script editor, and make sure # to put it BELOW any script that alter the battle system. # Character inflicted by these states are treated as they not existed in the party. # Insert the states ID to the brackets below. $special_states1 = [1,17] # Character inflicted by these states can't be attacked by the enemies. # If player insisted to attack the target, it'll change into another target. # It still work on skill that target self. # Insert the states ID to the brackets below. $special_states2 = [17] # Character inflicted by these states are grayed out. # You can modified the value of $special_tone to get your own color. # Insert the states ID to the brackets below. $special_states3 = [17] $special_tone = [0,0,0,255] class Game_Party #-------------------------------------------------------------------------- # * Determine wether state 2 is in effect or not #-------------------------------------------------------------------------- def state2_invulnerable(target) # If it fits the conditions @special_states = false # Check whether special state available for i in 0..($special_states2.size - 1) if target.state?($special_states2[i]) @special_states = true end end if @special_states == true return true else return false end end #-------------------------------------------------------------------------- # * Determine Everyone is Dead #-------------------------------------------------------------------------- def all_dead? # If number of party members is 0 if $game_party.actors.size == 0 return false end # If an actor is in the party with 0 or more HP @special_game_over = 0 for actor in @actors @special_states = false if actor.hp == 0 @special_game_over = @special_game_over + 1 elsif actor.hp > 0 # If it fits the conditions if $special_states1.size == 0 return false else for i in 0..($special_states1.size - 1) if actor.state?($special_states1[i]) @special_states = true end end end end if @special_states == true @special_game_over = @special_game_over + 1 end end # All members dead if @special_game_over == @actors.size return true else return false end end #-------------------------------------------------------------------------- # * Random Selection of Target Actor # hp0 : limited to actors with 0 HP #-------------------------------------------------------------------------- def random_target_actor(hp0 = false) # Initialize roulette roulette = [] # Loop for actor in @actors if state2_invulnerable(actor) == false if (not hp0 and actor.exist?) or (hp0 and actor.hp0?) # Get actor class [position] position = $data_classes[actor.class_id].position # Front guard: n = 4; Mid guard: n = 3; Rear guard: n = 2 n = 4 - position # Add actor to roulette n times n.times do roulette.push(actor) end end end end # If roulette size is 0 if roulette.size == 0 return nil end # Spin the roulette, choose an actor return roulette[rand(roulette.size)] end #-------------------------------------------------------------------------- # * Smooth Selection of Target Actor # actor_index : actor index #-------------------------------------------------------------------------- def smooth_target_actor(actor_index) # Get an actor actor = @actors[actor_index] # If an actor exists if actor != nil and actor.exist? if state2_invulnerable(actor) == false return actor end end # Loop for actor in @actors # If an actor exists if actor.exist? if state2_invulnerable(actor) == false return actor end end end actor = $game_party.random_target_actor return actor end end #---------------------------------------------------------------------------- class Scene_Battle #---------------------------------------------------------------------------- #-------------------------------------------------------------------------- # * Determine wether state 2 is in effect or not #-------------------------------------------------------------------------- def state2_invulnerable(target) # If it fits the conditions @special_states = false # Check whether target is exist if target == nil return false else # Check whether special state available for i in 0..($special_states2.size - 1) if target.state?($special_states2[i]) @special_states = true end end if @special_states == true return true else return false end end end #-------------------------------------------------------------------------- # * Set Targeted Battler for Skill or Item # scope : effect scope for skill or item #-------------------------------------------------------------------------- def set_target_battlers(scope) # If battler performing action is enemy if @active_battler.is_a?(Game_Enemy) # Branch by effect scope case scope when 1 # single enemy index = @active_battler.current_action.target_index actortemp = $game_party.smooth_target_actor(index) if state2_invulnerable(actortemp) == false @target_battlers.push($game_party.smooth_target_actor(index)) end when 2 # all enemies for actor in $game_party.actors if actor.exist? if state2_invulnerable(actor) == false @target_battlers.push(actor) end end end when 3 # single ally index = @active_battler.current_action.target_index enemytemp = $game_troop.smooth_target_enemy(index) if state2_invulnerable(enemytemp) == false @target_battlers.push($game_troop.smooth_target_enemy(index)) end when 4 # all allies for enemy in $game_troop.enemies if enemy.exist? if state2_invulnerable(enemy) == false @target_battlers.push(enemy) end end end when 5 # single ally (HP 0) index = @active_battler.current_action.target_index enemy = $game_troop.enemies[index] if enemy != nil and enemy.hp0? if state2_invulnerable(enemy) == false @target_battlers.push(enemy) end end when 6 # all allies (HP 0) for enemy in $game_troop.enemies if enemy != nil and enemy.hp0? if state2_invulnerable(enemy) == false @target_battlers.push(enemy) end end end when 7 # user @target_battlers.push(@active_battler) end end # If battler performing action is actor if @active_battler.is_a?(Game_Actor) # Branch by effect scope case scope when 1 # single enemy index = @active_battler.current_action.target_index enemytemp = $game_troop.smooth_target_enemy(index) if state2_invulnerable(enemytemp) == false @target_battlers.push($game_troop.smooth_target_enemy(index)) end when 2 # all enemies for enemy in $game_troop.enemies if enemy.exist? if state2_invulnerable(enemy) == false @target_battlers.push(enemy) end end end when 3 # single ally index = @active_battler.current_action.target_index actortemp = $game_party.smooth_target_actor(index) if state2_invulnerable(actortemp) == false @target_battlers.push($game_party.smooth_target_actor(index)) end when 4 # all allies for actor in $game_party.actors if actor.exist? if state2_invulnerable(actor) == false @target_battlers.push(actor) end end end when 5 # single ally (HP 0) index = @active_battler.current_action.target_index actor = $game_party.actors[index] if actor != nil and actor.hp0? if state2_invulnerable(actor) == false @target_battlers.push(actor) end end when 6 # all allies (HP 0) for actor in $game_party.actors if actor != nil and actor.hp0? if state2_invulnerable(actor) == false @target_battlers.push(actor) end end end when 7 # user @target_battlers.push(@active_battler) end end end #-------------------------------------------------------------------------- # * Make Skill Action Results #-------------------------------------------------------------------------- def make_skill_action_result # Get skill @skill = $data_skills[@active_battler.current_action.skill_id] # If not a forcing action unless @active_battler.current_action.forcing # If unable to use due to SP running out unless @active_battler.skill_can_use?(@skill.id) # Clear battler being forced into action $game_temp.forcing_battler = nil # Shift to step 1 @phase4_step = 1 return end end # Set target battlers set_target_battlers(@skill.scope) if @target_battlers == nil else # Use up SP @active_battler.sp -= @skill.sp_cost # Refresh status window @status_window.refresh # Show skill name on help window @help_window.set_text(@skill.name, 1) # Set animation ID @animation1_id = @skill.animation1_id @animation2_id = @skill.animation2_id # Set command event ID @common_event_id = @skill.common_event_id # Apply skill effect for target in @target_battlers if target != nil target.skill_effect(@active_battler, @skill) end end end end #-------------------------------------------------------------------------- # * Make Item Action Results #-------------------------------------------------------------------------- def make_item_action_result # Get item @item = $data_items[@active_battler.current_action.item_id] # If unable to use due to items running out unless $game_party.item_can_use?(@item.id) # Shift to step 1 @phase4_step = 1 return end # If consumable if @item.consumable # Decrease used item by 1 $game_party.lose_item(@item.id, 1) end # Display item name on help window @help_window.set_text(@item.name, 1) # Set animation ID @animation1_id = @item.animation1_id @animation2_id = @item.animation2_id # Set common event ID @common_event_id = @item.common_event_id # Decide on target index = @active_battler.current_action.target_index target = $game_party.smooth_target_actor(index) # Set targeted battlers set_target_battlers(@item.scope) # Apply item effect for target in @target_battlers if target != nil target.item_effect(@item) end end end #-------------------------------------------------------------------------- # * Frame Update (main phase step 4 : animation for target) #-------------------------------------------------------------------------- def update_phase4_step4 # Animation for target for target in @target_battlers if target != nil target.animation_id = @animation2_id target.animation_hit = (target.damage != "Miss") end end # Animation has at least 8 frames, regardless of its length @wait_count = 8 # Shift to step 5 @phase4_step = 5 end #-------------------------------------------------------------------------- # * Frame Update (main phase step 5 : damage display) #-------------------------------------------------------------------------- def update_phase4_step5 # Hide help window @help_window.visible = false # Refresh status window @status_window.refresh # Display damage for target in @target_battlers if target != nil if target.damage != nil target.damage_pop = true end end end # Shift to step 6 @phase4_step = 6 end end ########################################################################### #-------------------------------------------------------------------------- # * This section enables the first two states to be inflicted onto enemies #-------------------------------------------------------------------------- ########################################################################### class Game_Troop #-------------------------------------------------------------------------- # * Determine wether state 2 is in effect or not #-------------------------------------------------------------------------- def state2_invulnerable(target) # If it fits the conditions @special_states = false # Check whether special state available for i in 0..($special_states2.size - 1) if target.state?($special_states2[i]) @special_states = true end end if @special_states == true return true else return false end end def random_target_enemy(hp0 = false) # Initialize roulette roulette = [] # Loop for enemy in @enemies if state2_invulnerable(enemy) == false if (not hp0 and enemy.exist?) or (hp0 and enemy.hp0?) # Add an enemy to the roulette roulette.push(enemy) end end end # If roulette size is 0 if roulette.size == 0 return nil end # Spin the roulette, choose an enemy return roulette[rand(roulette.size)] end #-------------------------------------------------------------------------- # * Smooth Selection of a Target Enemy # enemy_index : enemy index #-------------------------------------------------------------------------- def smooth_target_enemy(enemy_index) # Get an enemy enemy = @enemies[enemy_index] # If an enemy exists if enemy != nil and enemy.exist? if state2_invulnerable(enemy) == false return enemy end end # Loop for enemy in @enemies # If an enemy exists if enemy.exist? if state2_invulnerable(enemy) == false return enemy end end enemy = $game_troop.random_target_enemy return enemy end end end #---------------------------------------------------------------------------- class Scene_Battle #---------------------------------------------------------------------------- def make_basic_action_result # If attack if @active_battler.current_action.basic == 0 # Set anaimation ID @animation1_id = @active_battler.animation1_id @animation2_id = @active_battler.animation2_id # If action battler is enemy if @active_battler.is_a?(Game_Enemy) if @active_battler.restriction == 3 target = $game_troop.random_target_enemy elsif @active_battler.restriction == 2 target = $game_party.random_target_actor else index = @active_battler.current_action.target_index target = $game_party.smooth_target_actor(index) if state2_invulnerable(target) == false else target = $game_troop.random_target_actor end end end # If action battler is actor if @active_battler.is_a?(Game_Actor) if @active_battler.restriction == 3 target = $game_party.random_target_actor elsif @active_battler.restriction == 2 target = $game_troop.random_target_enemy else index = @active_battler.current_action.target_index target = $game_troop.smooth_target_enemy(index) if state2_invulnerable(target) == false else target = $game_troop.random_target_enemy end end end # Set array of targeted battlers @target_battlers = [target] # Apply normal attack results if target != nil for target in @target_battlers target.attack_effect(@active_battler) end end return end # If guard if @active_battler.current_action.basic == 1 # Display "Guard" in help window @help_window.set_text($data_system.words.guard, 1) return end # If escape if @active_battler.is_a?(Game_Enemy) and @active_battler.current_action.basic == 2 # Display "Escape" in help window @help_window.set_text("Escape", 1) # Escape @active_battler.escape return end # If doing nothing if @active_battler.current_action.basic == 3 # Clear battler being forced into action $game_temp.forcing_battler = nil # Shift to step 1 @phase4_step = 1 return end end end ########################################################################### #-------------------------------------------------------------------------- # * This section enables grey battler sprite #-------------------------------------------------------------------------- ########################################################################### class Sprite_Battler < RPG::Sprite #-------------------------------------------------------------------------- # * Determine wether state 3 is in effect or not #-------------------------------------------------------------------------- def state3_gray(target) # If it fits the conditions @special_states = false # Check whether special state available for i in 0..($special_states3.size - 1) if target.state?($special_states3[i]) @special_states = true end end if @special_states == true return true else return false end end alias black_sprite_update update def update black_sprite_update if @battler != nil if state3_gray(@battler) == true self.tone.set($special_tone[0],$special_tone[1],$special_tone[2],$special_tone[3]) end end end end