I'm having trouble with my swimming script
Water is recognized by its terrain tag and it has to be a passable tile for the player to swim through it. The problem is that I need it to be impassable if swimming isn't available. I thought I had fixed it by causing the character to "move_backward" whenever it was on water but not allowed to swim, but now that I have a faster computer, i see that it just sort of vibrates as it tries to go forward and back and the same time. Anyone know how I can make the terrain tag impassable based on conditions?
Code:
#==============================================================================#
# Swimming! v 1.7.b #
# 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 set to true, the player can jump in water if swimming is not
available but they will get a gameover.
Easy right? 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"
DROWNING = false
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
return jump_in if facing?(WATER, 'any', 1) and !@swim and moving?
# Determines if swimming and sets up the character appropriately
swim_refresh if swimming?
# Drowns or prevents swimming if it is not available
if !swim_available? and on?(WATER)
if DROWNING == true
drown
elsif DROWNING == false
move_backward
end
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)
swim_update
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 + ".ogg", 80, 100)
@play_sound = false
end
@swim = true
if TREAD_ANI == true
@step_anime = true
end
end
# Drowning
def drown
$game_screen.start_flash(Color.new(255,0,0,128), 20)
if @drown_count <= 50
#jump_in if !@swim
@drown_count += 1
elsif @drown_count >= 50
@drown_count = 0
$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 #
#------------------------------------------------------------------------------#