Swimming
Version: 1.8
Introduction
It seems to me that most swimming is done through event systems or Seph's vehicle script which is fine if you want to hop on a penguin to get across a river but we all know swimming isn't the same as riding a bike. I saw a lot of requests for a swimming script so I thought I'd make one. This is my first script that does something more interesting than displaying a window XD.
The script will cause the following when the player approaches water:
Updates
Screenshots
Before
Diving
In the water
Templates
Both from Mack's Male
Script
Instructions
Read the script. I'm getting tired of updating this part each time XD
Compatibility
Compatable with SDK...well I'm not sure about the new one as of yet.
Not compatable with scripts that will change your graphic (ie sneaking/dashing scripts or fukyama's caterpiller) although these scripts can be easily made compatable if you ask somebody.
Credits and Thanks
Major thanks to Chaosg1 whom without this wouldn't be possible :#
Thanks to Mr.Mo for helping me with passability.
Version: 1.8
Introduction
It seems to me that most swimming is done through event systems or Seph's vehicle script which is fine if you want to hop on a penguin to get across a river but we all know swimming isn't the same as riding a bike. I saw a lot of requests for a swimming script so I thought I'd make one. This is my first script that does something more interesting than displaying a window XD.
The script will cause the following when the player approaches water:
- The player will change to a diving graphic (optional)
- The player will jump into a body of water (at least 2 tiles wide)
- A sound is played (optional and customizable)
- The player will change to a swimming graphic
- The speed will change
- The player will jump out of water onto land that is at least 2 tiles wide and walk onto land that is 1 tile wide
- Swimming can be but doesn't have to be, controled by a switch
- If swimming is not available (switch is off), water will be impassable OR the player can drown
Updates
- fixed the bug where the player jumps over 1 tile streams when DROWNING is true
- fixed the water passability problem
- I think i fixed that _swim_swim bug
- Added more swim availability conditions!
- Fixed the problem that disabling swimming didn't really do anything XD
- Removed custom dashing and sneaking animation suffixes. They don't work. Sorry!
- Fixed bug where player will jump right non water tiles if there is only one and water behind it
- Added leveling up; you can swim faster if you swim more
- Changed in water dashing speed and availability option
- Added diving graphic change option
- Added 'treading water' effect
- Added Touch Swim
- Added dashing and sneaking ability
- Fixed the bug where the character gets trapped on an impassable tile after getting out of water
Screenshots
Before

Diving

In the water

Templates
Both from Mack's Male


Script
Code:
Â
#==============================================================================#
# Â 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 = 1
SWIM_SWITCH = 1
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 = "021-Dive01"
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 :)
#------------------------------------------------------------------------------#
Â
Instructions
Read the script. I'm getting tired of updating this part each time XD
Compatibility
Compatable with SDK...well I'm not sure about the new one as of yet.
Not compatable with scripts that will change your graphic (ie sneaking/dashing scripts or fukyama's caterpiller) although these scripts can be easily made compatable if you ask somebody.
Credits and Thanks
Major thanks to Chaosg1 whom without this wouldn't be possible :#
Thanks to Mr.Mo for helping me with passability.