Galv’s Superman Ability (F) V.1.3 – Follower Version

NOTE: This script is designed for use with followers. If you won’t use followers, a streamlined script can be found here.

Demo – Version 1.3 >

#------------------------------------------------------------------------------#
#  Galv's Superman Ability (F)
#------------------------------------------------------------------------------#
#  For: RPGMAKER VX ACE
#  Version 1.3(F)                       (Followers Added)
#------------------------------------------------------------------------------#
#  2012-11-30 - Version 1.3 - can set equip/skill/actor requirements to fly
#                           - fixed talking and trying to fly/land bug
#                           - added script calls to force takeoff and land
#  2012-11-14 - Version 1.2 - can no longer land on same-as-player events
#  2012-11-13 - Version 1.1 - priority bug when flying fixed
#  2012-11-13 - Version 1.0 - spawned from original version - added followers
#------------------------------------------------------------------------------#
#
#  This script allows the player to gain the power of flight and land/takeoff
#  whenever they want to. This version gives options for followers to fly, too.
#
#  NOTE: This is the "Follower" version. If you use followers in your game,
#        use this script. Otherwise, use the other version as it has a lot
#        less processing in it.
#
#------------------------------------------------------------------------------#
#  INSTRUCTIONS:
#  Read the setup options below and set it up as desired.
#------------------------------------------------------------------------------#
#  SCRIPT CALLS:
#------------------------------------------------------------------------------#
#
#  flying?    # return true or false. Use in conditional branch if ACTIVATE_EVENTS
#             # is set to true in the settings below
#
#  $game_player.force_land        # script call to force player to land
#  $game_player.force_takeoff     # script call to force player to take off
#
#------------------------------------------------------------------------------#
#  NOTETAG ACTORS / EQUIPS / SKILLS:
#------------------------------------------------------------------------------#
#
#  <flight>  # if REQUIREMENTS = true, then the leader requires a notetag on
#            # them, one of their equips or a skill they know.
#
#------------------------------------------------------------------------------#

($imported ||= {})["Galvs_Superman_Ability"] = true

module Galv_Superman
#------------------------------------------------------------------------------#
#  SCRIPT SETUP OPTIONS
#------------------------------------------------------------------------------#

  
  ENABLE_SWITCH = 1          # Can only fly when this switch is ON
  
  REQUIREMENTS = true        # Leader requires actor/equip/skill <fly> tag
                             # false = dont need to tag anything to fly
  
  SPEED_BONUS = 1            # Speed increases by this number when flying.
  
  BUTTON = :X                # Button to press to fly and land. :X is "a" key.
  
  FLY_EXTENSION = "_fly"     # Character set for when actor is flying. If your
                             # actor uses "Actor1.png" then you must have a file
                             # called "Actor1_fly.png" if this extenstion is set
                             # to "_fly". The actor must be in the same position
                             # in both charsets.
  
  ACTIVATE_EVENTS = true     # If true, can still activate events as normal.
                             # If false, will work like airship does, unable to
                             # activate events until landed.
  
  MAX_FOLLOWERS = 4          # Default RPGmaker this is 4. If you have a script
                             # that changes this, change it here as well.

  FOLLOWERS_FLY = true       # Followers need fly charsets too as they also fly.
                             # Set to false to make followers gather into leader
                             # instead and only the leader flies.

#------------------------------------------------------------------------------#
#  END SCRIPT SETUP OPTIONS
#------------------------------------------------------------------------------#

end


class RPG::BaseItem
  def flight
    if @flight.nil?
      if @note =~ /<flight>/i
        @flight = true
      else
        @flight = false
      end
    end
    @flight
  end
end # RPG::BaseItem


class Scene_Map < Scene_Base
  
  alias galv_superman_map_initialize initialize
  def initialize
    galv_superman_map_initialize
  end
  
  alias galv_superman_map_update_scene update_scene
  def update_scene
    galv_superman_map_update_scene
    $game_player.take_off if $game_player.taking_off
    $game_player.land if $game_player.landing
  end
  
end # Scene_Map < Scene_Base


class Game_Player < Game_Character
  attr_accessor :through
  attr_accessor :altitude
  attr_accessor :step_anime
  attr_accessor :move_speed
  attr_accessor :priority_type
  attr_accessor :in_air
  attr_accessor :taking_off
  attr_accessor :landing
  
  alias galv_superman_player_initialize initialize
  def initialize
    galv_superman_player_initialize
    @altitude = 0
    @in_air = false
  end

  alias galv_superman_player_move_by_input move_by_input
  def move_by_input
    galv_superman_player_move_by_input
    
    if Input.trigger?(Galv_Superman::BUTTON) && !@taking_off && !@landing
      
      return if !$game_switches[Galv_Superman::ENABLE_SWITCH]
      return if !$game_player.can_fly? || !$game_player.normal_walk? || $game_map.interpreter.running?
      
      if @in_air
        return if !$game_map.airship_land_ok?($game_player.x, $game_player.y) || !blocking_event?
        force_land
      else
        force_takeoff
      end
    end
  end
  
  def blocking_event?
    $game_map.events_xy($game_player.x, $game_player.y).each do |event|
       return false if event.priority_type == 1
     end
     return true
  end
  
  def force_land
    $game_player.through = false
    if $game_player.followers.visible && $game_party.members.count > 1 || !Galv_Superman::FOLLOWERS_FLY
      $game_player.followers.gather
    end
    $game_player.move_speed -= Galv_Superman::SPEED_BONUS
    @in_air = false
    @landing = true
  end
  
  def force_takeoff
    if !Galv_Superman::FOLLOWERS_FLY
      $game_player.followers.gather
      $game_party.leader.set_graphic($game_party.leader.character_name + Galv_Superman::FLY_EXTENSION, $game_party.leader.character_index, $game_party.leader.face_name, $game_party.leader.face_index)
    else
      $game_party.members.each do |mem|
        mem.set_graphic(mem.character_name + Galv_Superman::FLY_EXTENSION, mem.character_index, mem.face_name, mem.face_index)
      end
    end
    $game_system.menu_disabled = true
    $game_player.step_anime = true
    @in_air = true
    $game_player.through = true
    $game_player.priority_type = 2
    if Galv_Superman::FOLLOWERS_FLY
      $game_player.followers.each do |fol|
        fol.priority_type = 2
      end
    end
    
    @taking_off = true
    $game_player.refresh
  end
  
  def take_off
    $game_player.altitude += 1
    if Galv_Superman::FOLLOWERS_FLY
      $game_player.followers.each do |fol|
        fol.altitude += 1
      end
    end
    if $game_player.altitude >= 32
      $game_player.altitude = 32
      if Galv_Superman::FOLLOWERS_FLY
        $game_player.followers.each do |fol|
          fol.altitude = 32
        end
      else
        $game_player.followers.visible = false
        $game_player.refresh
      end
      $game_player.move_speed += Galv_Superman::SPEED_BONUS
      @taking_off = false
    end
  end

  def land
    $game_player.altitude -= 1
    if Galv_Superman::FOLLOWERS_FLY
      $game_player.followers.each do |fol|
        fol.altitude -= 1
      end
    else
      $game_player.followers.gather
    end
    if $game_player.altitude <= 0
      $game_player.altitude = 0
      $game_player.followers.each do |fol|
        fol.altitude = 0
        fol.priority_type = 1
      end
      if Galv_Superman::FOLLOWERS_FLY
        $game_party.members.each do |mem|
          mem.set_graphic(mem.character_name.chomp(Galv_Superman::FLY_EXTENSION), mem.character_index, mem.face_name, mem.face_index)
        end
      else
        $game_party.leader.set_graphic($game_party.leader.character_name.chomp(Galv_Superman::FLY_EXTENSION), $game_party.leader.character_index, $game_party.leader.face_name, $game_party.leader.face_index)
      end
      $game_player.followers.visible = $game_temp.follower_setting
      $game_player.refresh
      $game_system.menu_disabled = false
      $game_player.step_anime = false
      $game_player.priority_type = 1
      @landing = false
    end
  end
  
  def can_fly?
    # Check switch
    return true if !Galv_Superman::REQUIREMENTS
    
    # Check actor
    return true if $data_actors[$game_party.leader.id].flight
    
    # Check actor's skills
    $game_party.leader.skills.each do |s|
      return true if s.flight
    end
    
    # Check equips
    no_equips = $game_party.leader.equips.count
    no_equips.times { |i|
      if $game_party.leader.equips[i] != nil
        return true if $game_party.leader.equips[i].flight
      end
    }
    return false
  end
  
  def screen_y
    super - @altitude
  end
  
  alias galv_superman_in_airship? in_airship?
  def in_airship?
    if !Galv_Superman::ACTIVATE_EVENTS
      @vehicle_type == :airship || @altitude > 0
    else
      galv_superman_in_airship?
    end
  end
  
  alias galv_superman_player_get_on_vehicle get_on_vehicle
  def get_on_vehicle
    return if @altitude > 0
    galv_superman_player_get_on_vehicle
  end
end # Game_Player < Game_Character


class Spriteset_Map
  alias galv_superman_map_initialize initialize
  def initialize
    galv_superman_map_initialize
    @follower_shadow = []
    create_follower_shadows if Galv_Superman::FOLLOWERS_FLY
  end
  
  alias galv_superman_update_shadow update_shadow
  def update_shadow
    if $game_player.altitude > 0
      player = $game_player
      @shadow_sprite.x = player.screen_x
      @shadow_sprite.y = player.screen_y + player.altitude
      @shadow_sprite.opacity = player.altitude * 8
      @shadow_sprite.update
      
      if Galv_Superman::FOLLOWERS_FLY
        follower = $game_player.followers
        count = Galv_Superman::MAX_FOLLOWERS - 1
        count.times { |i|
        if $game_party.members[i+1].nil? || !$game_player.followers.visible
          @follower_shadow[i].opacity = 0
        else
          return if @follower_shadow.nil?
          @follower_shadow[i].x = follower[i].screen_x
          @follower_shadow[i].y = follower[i].screen_y + follower[i].altitude
          @follower_shadow[i].opacity = follower[i].altitude * 8
        end
          @follower_shadow[i].update
      }
      end
    else
      galv_superman_update_shadow
    end
  end
  
  def create_follower_shadows
    count = Galv_Superman::MAX_FOLLOWERS - 1
    count.times { |i|
      @follower_shadow[i] = Sprite.new(@viewport1)
      @follower_shadow[i].bitmap = Cache.system("Shadow")
      @follower_shadow[i].ox = @follower_shadow[i].bitmap.width / 2
      @follower_shadow[i].oy = @follower_shadow[i].bitmap.height
      @follower_shadow[i].z = 180
    }
  end
end # Spriteset_Map


class Game_Follower < Game_Character
  attr_accessor :altitude
  attr_accessor :priority_type
  
  alias galv_superman_follower_initialize initialize
  def initialize(member_index, preceding_character)
    galv_superman_follower_initialize(member_index, preceding_character)
    @altitude = 0
  end
  
  def screen_y
    super - @altitude
  end
end # Game_Follower < Game_Character


class Game_Followers
  alias galv_superman_followers_initialize initialize
  def initialize(leader)
    galv_superman_followers_initialize(leader)
    $game_temp.follower_setting = @visible
  end
end # Game_Followers


class Game_Temp
  attr_accessor :follower_setting
end # Game_Temp


class Game_Interpreter
  def flying?
    $game_player.altitude > 0
  end
  
  alias galv_superman_command_216 command_216
  def command_216
    galv_superman_command_216
    $game_temp.follower_setting = $game_player.followers.visible
  end
  
  alias galv_superman_interpreter_command_129 command_129
  def command_129
    galv_superman_interpreter_command_129
    $game_party.members.each do |mem|
      if !mem.character_name.include?(Galv_Superman::FLY_EXTENSION) && flying?
        mem.set_graphic(mem.character_name + Galv_Superman::FLY_EXTENSION, mem.character_index, mem.face_name, mem.face_index)
      elsif mem.character_name.include?(Galv_Superman::FLY_EXTENSION) && !flying?
        mem.set_graphic(mem.character_name.chomp(Galv_Superman::FLY_EXTENSION), mem.character_index, mem.face_name, mem.face_index)
      end
    end
  end
  
end # Game_Interpreter
Advertisements

7 thoughts on “Galv’s Superman Ability (F) V.1.3 – Follower Version

  1. This script is just what I needed for my game! Thanks a lot ^^!

  2. Mordrid says:

    After finally learning to read a little ruby, I’ve noticed this code’s instructions makes the same typo as the no-followers code did. The notetag required is “flight” while the instructions say to use “fly”. |D Thanks again for the awesome scripts! :)

  3. BobNobody says:

    So I am probably doing something wrong, but whenever I try to use this, I get this error:

    Script ‘Flight’ line 44: NoMethodError occurred
    undefined method `-@’ for true:TrueClass

    Any help would be great!

  4. 黒木智子 says:

    Hello it’s me again and I got a little request again, is there a small chance, that you add region ID’s or Terrain ID tags?

    A second question is more a question for an add on, because I thought of adding the same for diving, so the character fly’s on pressing button “x” and dives if presses “y”.

    Sorry, if I bothered to much, but thank you in advance. :D (\s/)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s