#==============================================================================#
# Swimming! v 1.8                             #
# By: ToriVerly @ rmxp.org                          #
#==============================================================================#
#Â Intructions:Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â #
#------------------------------------------------------------------------------#
=begin
Paste this script above Main and below everything else.
For each character you will have swimming, make a swimming sprite that has the
same name as the character but ending with "_swim" and another with "_dive" if
DIVE_GRAPHIC is true.
  Example: "001-Fighter01_swim.png"
If TREAD_ANI = true, the character will be animated while in water when they are
not moving. Hence a treading water effect. Set it to false if you don't want
the effect.
Set the WATER constant to the terrain tag ID of your water tiles or whatever tile
you want to swim through. When you place non water tiles over water tiles (in
a higher layer), the non water tiles will need to have a terrain tag that is
different than WATER and not 0 or else the characters is swim through it.
  IMPORTANT--->make sure your water tile is passable.
If you want the ability to swim to depend on a switch, set SWIM_SWITCH to the ID
of the game switch you're using. If you don't want to use a switch, set it to nil.
Similarily, set SWIM_ITEM, SWIM_ARMOR or SWIM_WEAPON to the ID of the item, armor
or weapon required for swimming and nil if there is none. You can even set more
than one condition!
The SWIM_SE will play every time you jump into water. If you don't want a sound,
set DIVE_SOUND_OFF to true.
The SNEAK_KEY and DASH_KEY functions can be set for Mr.Mo's ABS or an input
letters script. If you don't have such an input system but have another dashing
and/or sneaking system/script, change them to Input::YourKey.
  Example: Input::X
       Input::Y
If you don't have dashing or sneaking at all, set them to nil.
WATER_DASHING is self explanitory. If you want to dash in water, set it to true.
If DROWNING is on, the player will have about three seconds to get out of water
before they die (if swimming isn't available). If it is off, water will just be
impassable.
Enjoy!
=end
#------------------------------------------------------------------------------#
WATER = 7
SWIM_SWITCH = 28
SWIM_ITEM = nil
SWIM_ARMOR = nil
SWIM_WEAPON = nil
SNEAK_KEY = nil #Input::Letterres["Z"] for Mr.Mo's ABS or input letters script
DASH_KEY = nil #Input::Letters["X"] for Mr.Mo's ABS or input letters script
SWIM_SE = "022-Dive02"
DROWN_SE = "128-Water03"
DROWNING = true
WATER_DASHING = false
DIVE_SOUND_OFF = false
DIVE_GRAPHIC = true
TREAD_ANI = true
#------------------------------------------------------------------------------#
#==============================================================================#
# Game_Player                                 #
#------------------------------------------------------------------------------#
# Modifies the Game_Player class initialization and updating         #
#==============================================================================#
class Game_Player < Game_Character
 attr_reader :swim
 attr_reader :swimming?
 attr_reader :swim_count
 alias swim_init initialize
 def initialize
  @swim = false
  @drown_count = 0
  @swim_count = 0
  swim_init
 end
 alias swim_update update
 def update
  # Checks if swimming is triggered
  if DROWNING == true
  return jump_in if facing?(WATER, 'any', 1) and !@swim and moving?
  # Drowns if it is not available
  drown if !swim_available? and on?(WATER)
  elsif DROWNING == false
  return jump_in if facing?(WATER, 'any', 1) and !@swim and moving? and swim_available?
  end
 Â
  # Jumps out of water at shore
  jump_forward if !on?(WATER) and !facing?(WATER, 'any', 1) and !facing?(WATER, 'any', 2) and @swim and moving?
  # Returns original settings when out of water
  revert if @swim and !on?(WATER)
 Â
  # Refreshes swimming state
  swim_refresh if swimming?
 swim_update
end
  # Makes water impassable when swimming isn't available
 alias mrmo_swim_game_player_passable passable?
 def passable?(x, y, d)
  # Get new coordinates
  new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  # Check if it water tag
  return false if $game_map.terrain_tag(new_x,new_y) == WATER and !swim_available? and DROWNING == false
  # Old Method
  mrmo_swim_game_player_passable(x,y,d)
 end
#------------------------------------------------------------------------------#
# Custom Methods                               #
#------------------------------------------------------------------------------#
 # Checks swimming availability
 def swim_available?
  if SWIM_SWITCH != nil
   return true if $game_switches[SWIM_SWITCH]
   return false if !$game_switches[SWIM_SWITCH]
  end
  if SWIM_ITEM != nil
   return true if $game_party.item_number(SWIM_ITEM) != 0
   return false if $game_party.item_number(SWIM_ITEM) == 0
  end
  if SWIM_ARMOR != nil
   return true if $game_party.actors[0].armor1_id == SWIM_ARMOR
   return true if $game_party.actors[0].armor2_id == SWIM_ARMOR
   return true if $game_party.actors[0].armor3_id == SWIM_ARMOR
   return true if $game_party.actors[0].armor4_id == SWIM_ARMOR
   return false
  end
  if SWIM_WEAPON != nil
   return true if $game_party.actors[0].weapon_id == SWIM_WEAPON
   return false
  end
  return true
 end
 Â
 # Jumps in the water if swimming is triggered
 def jump_in
  @swim = true
  unless DIVE_SOUND_OFF
  @play_sound = true
  end
 if DIVE_GRAPHIC == true
  @character_name = $game_party.actors[0].character_name
  @character_name = $game_party.actors[0].character_name + "_dive"
 end
 jump_forward if facing?(WATER, 'any', 1)
 end
Â
 # Swimming setup
 def swim_refresh
   get_speed if moving?
   if !moving?
    @character_name = $game_party.actors[0].character_name
    @character_name = $game_party.actors[0].character_name + "_swim"
   end
   if @play_sound and !moving?
    Audio.se_play("Audio/SE/" + SWIM_SE , 80, 100)
    @play_sound = false
   end
    @swim = true
   if TREAD_ANI == true
    @step_anime = true
   end
  end
 Â
 # Drowning
 def drown
  @move_speed = 0.1
  if @drown_count <= 120
   #jump_in if !@swim
   @drown_count += 1
    if @drown_count %40 == 0
     Audio.se_play("Audio/SE/" + DROWN_SE, 80, 100)
    end
   elsif @drown_count >= 120
   @character_name = ""
   @drown_count = 0
   Audio.se_play("Audio/SE/" + SWIM_SE, 80, 100)
  $scene = Scene_Gameover.new
  end
 end
Â
 # Reverts original settings when out of water
 def revert
   @character_name = $game_party.actors[0].character_name
   @swim = false
   @drown_count = 0
    unless dashing? or sneaking?
    @move_speed = 4
    @move_frequency = 6
    end
   if TREAD_ANI == true
   @step_anime = false
  end
 end
Â
 # Determines Speed (Swim Leveling)
 def get_speed
  # Gets Swim Count
   @swim_count += 0.05
  case @swim_count
  when 0.05
   @swim_speed = 1
   @move_frequency = 1
  when 100
   @swim_speed = 2
   @move_frequency = 1
  when 250
   @swim_speed = 3
   @move_frequency = 1
  when 750
   @swim_speed = 4
   @move_frequency = 1
  when 2000
   @swim_speed = 5
   @move_frequency = 1
  end
  @move_speed = @swim_speed
   if WATER_DASHING == true
     if DASH_KEY != nil and Input.press?(DASH_KEY) and !sneaking?
     @move_speed = @swim_speed + 1
     @move_frequency = 6
     end
     if SNEAK_KEY != nil and Input.press?(SNEAK_KEY) and !dashing?
     @move_speed = @swim_speed -1
     @move_frequency = 2
    end
   end
  end
Â
# Jumps forward
 def jump_forward
 case @direction
   when 2
    jump(0, 1)
   when 4
    jump(-1, 0)
   when 6
    jump(1, 0)
   when 8
    jump(0, -1)
   end
  end
 # Jumps backward
 def jump_backward
  case @direction
   when 2
    jump(0, -1)
   when 4
    jump(1, 0)
   when 6
    jump(-1, 0)
   when 8
    jump(0, 1)
   end
  end
 # Checks if dashing
 def dashing?
  return true if DASH_KEY != nil and Input.press?(DASH_KEY)
  return false if SNEAK_KEY != nil and Input.press?(SNEAK_KEY)
 end
 # Checks if sneaking
 def sneaking?
  return true if SNEAK_KEY != nil and Input.press?(SNEAK_KEY)
  return false if DASH_KEY != nil and Input.press?(DASH_KEY)
 end
 # Checks if swimming
 def swimming?
  return true if on?(WATER) and @swim
 end
 # Checks if player is on a terrain tag
 def on?(tag)
  return true if $game_map.terrain_tag($game_player.x, $game_player.y) == tag
 end
 # Checks if player is facing a terrain tag
 def facing?(tag, dir, dist)
  case dir
  when 2
   if $game_player.direction == 2
    tag_x = $game_player.x
    tag_y = $game_player.y + dist
   end
  when 4
   if $game_player.direction == 4
    tag_x = $game_player.x - dist
    tag_y = $game_player.y
   end
  when 6
   if $game_player.direction == 6
    tag_x = $game_player.x + dist
    tag_y = $game_player.y
   end
  when 8
   if $game_player.direction == 8
    tag_x = $game_player.x
    tag_y = $game_player.y - dist
   end
  when 'any'
   if $game_player.direction == 2
    tag_x = $game_player.x
    tag_y = $game_player.y + dist
   end
   if $game_player.direction == 4
    tag_x = $game_player.x - dist
    tag_y = $game_player.y
   end
   if $game_player.direction == 6
    tag_x = $game_player.x + dist
    tag_y = $game_player.y
   end
   if $game_player.direction == 8
    tag_x = $game_player.x
    tag_y = $game_player.y - dist
   end
  end
 return false if tag_x == nil or tag_y == nil
 return true if $game_map.terrain_tag(tag_x, tag_y) == tag
end
end
#------------------------------------------------------------------------------#
# By ToriVerly
# Thanks to Mr.Mo for help with my passability issues and to Chaosg1 for my intro
# into scripting :)
#------------------------------------------------------------------------------#