#==============================================================================
# ** TDS Lock Character Movement
#    Ver: 1.0
#------------------------------------------------------------------------------
#  * Description:
#  This script allows you to lock the movement of an event or character to a
#  specific region or terrain ID.
#------------------------------------------------------------------------------
#  * Features: 
#  Restricting the movement of the Player or Events to Terrains or Regions.
#------------------------------------------------------------------------------
#  * Instructions:
#  To lock the movement of an event to a Region or Terrain put this in a note
#  in the event:
#
#    <Movement_Region_Lock: ID>
#    <Movement_Terrain_Lock: ID>
#
#    ID = Region or Terrain ID. (Can be multiple ones separated by ",".)
#
#    Example: 
#
#    <Movement_Region_Lock: 1>  or  <Movement_Region_Lock: 1, 2, 3, 4>
#    <Movement_Terrain_Lock: 4>  or  <Movement_Terrain_Lock: 1, 2, 3, 5> 
#
#
#  To lock the movement of the player to a Region or Terrain use this in a
#  script call:
#
#    add_player_move_lock_region(ID) 
#    add_player_move_lock_terrain(ID)
# 
#    ID = Region or Terrain ID.
#
#    Example:
#
#    add_player_move_lock_region(1) 
#    add_player_move_lock_terrain(5)
#    
#  To remove the Region or Terrain movement lock of the player use this in a
#  script call:
#
#    remove_player_move_lock_region(ID)  
#    remove_player_move_lock_terrain(ID)
#
#    ID = Region or Terrain ID.
#
#    Example:
#
#    remove_player_move_lock_region(1)  
#    remove_player_move_lock_terrain(3)
#
#    To completely clear all movement locks use this:
#
#    clear_player_move_lock_region
#    clear_player_move_lock_terrain
#------------------------------------------------------------------------------
#  * Notes:
#  None.
#------------------------------------------------------------------------------
# WARNING:
#
# Do not release, distribute or change my work without my expressed written 
# consent, doing so violates the terms of use of this work.
#
# If you really want to share my work please just post a link to the original
# site.
#
# * Not Knowing English or understanding these terms will not excuse you in any
#   way from the consequenses.
#==============================================================================
# * Import to Global Hash *
#==============================================================================
($imported ||= {})[:TDS_Lock_Character_Movement] = true

#==============================================================================
# ** Game_CharacterBase
#------------------------------------------------------------------------------
#  This base class handles characters. It retains basic information, such as 
# coordinates and graphics, shared by all characters.
#==============================================================================

class Game_CharacterBase  
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :move_lock_terrains, :move_lock_regions # Move Lock ID Arrays
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------  
  alias tds_lock_character_movement_game_characterbase_init_public_members init_public_members
  alias tds_lock_character_movement_game_characterbase_passable?   passable?
  #--------------------------------------------------------------------------
  # * Initialize Public Member Variables
  #--------------------------------------------------------------------------
  def init_public_members(*args, &block)
    # Run Original Method
    tds_lock_character_movement_game_characterbase_init_public_members(*args, &block)
    # Initialize Move Lock Terrain & Region Arrays
    @move_lock_terrains = [] ; @move_lock_regions = []
  end  
  #--------------------------------------------------------------------------
  # * Determine if Passable
  #     d : Direction (2,4,6,8)
  #--------------------------------------------------------------------------
  def passable?(x, y, d)
    x2 = $game_map.round_x_with_direction(x, d)
    y2 = $game_map.round_y_with_direction(y, d)
    # Return False if Movement at Coordinates is not lock passable
    return false if !debug_through? and !movement_lock_passable?(x2, y2) 
    # Run Original Method
    tds_lock_character_movement_game_characterbase_passable?(x, y, d)
  end  
  #--------------------------------------------------------------------------
  # * Determine if Movement is locked by Terrain or Region
  #--------------------------------------------------------------------------
  def movement_locked? ; (!@move_lock_terrains.empty? or !@move_lock_regions.empty?) end
  #--------------------------------------------------------------------------
  # * Determine if Coordinates are Passable if movement is locked
  #--------------------------------------------------------------------------
  def movement_lock_passable?(x = @x, y = @y)    
    return true if !movement_locked?
    return false if !@move_lock_regions.empty? and !@move_lock_regions.include?($game_map.region_id(x, y))
    return false if !@move_lock_terrains.empty? and !@move_lock_terrains.include?($game_map.terrain_tag(x, y))
    return true
  end
  #--------------------------------------------------------------------------
  # *  Add Movement Lock Region
  #--------------------------------------------------------------------------
  def add_move_lock_region(region_id) ; @move_lock_regions.push(region_id).uniq! end
  #--------------------------------------------------------------------------
  # *  Remove Movement Lock Region
  #--------------------------------------------------------------------------
  def remove_move_lock_region(region_id) ; @move_lock_regions.delete(region_id) end    
  #--------------------------------------------------------------------------
  # * Add Movement Locked Terrain
  #--------------------------------------------------------------------------
  def add_move_lock_terrain(terrain_id) ; @move_lock_terrains.push(terrain_id).uniq! end
  #--------------------------------------------------------------------------
  # * Remove Movement Locked Terrain
  #--------------------------------------------------------------------------
  def remove_move_lock_terrain(terrain_id) ; @move_lock_terrains.delete(terrain_id) end    
end
  

#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class handles events. Functions include event page switching via
# condition determinants and running parallel process events. Used within the
# Game_Map class.
#==============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------  
  alias tds_lock_character_movement_game_event_clear_page_settings clear_page_settings
  alias tds_lock_character_movement_game_event_setup_page_settings setup_page_settings
  #--------------------------------------------------------------------------
  # * Set Up Event Page Settings
  #--------------------------------------------------------------------------
  def setup_page_settings(*args, &block)
    # Run Original Method
    tds_lock_character_movement_game_event_setup_page_settings(*args, &block)
    # Run Original Method
    setup_page_movement_lock_settings
  end
  #--------------------------------------------------------------------------
  # * Clear Event Page Settings
  #--------------------------------------------------------------------------
  def clear_page_settings(*args, &block)
    # Run Original Method
    tds_lock_character_movement_game_event_clear_page_settings(*args, &block)
    # Initialize Move Lock Terrain & Region Arrays
    @move_lock_terrains = [] ; @move_lock_regions = []
  end
  #--------------------------------------------------------------------------
  # * Set Up Event Page Movement Lock Settings
  #--------------------------------------------------------------------------
  def setup_page_movement_lock_settings
    # Initialize Move Lock Terrain & Region Arrays
    @move_lock_terrains = [] ; @move_lock_regions = []    
    # Get All Page Comment Text
    comment_text = @list.select {|c| [108, 408].include? (c.code)}.collect {|c| c.parameters}.join
    # Return if Comment Text is empty
    return if comment_text.empty?    
    # Scan Comment Text for Movement Region Lock
    comment_text.scan(/<Movement_Region_lock: (.+?)>/i).each {|m,i|
      # Add Matched Region ID's to Move Lock Region
      m.split(/,/).each {|id| add_move_lock_region(id.to_i)}
    }
    # Scan Comment Text for Movement Terrain Lock
    comment_text.scan(/<Movement_Terrain_lock: (.+?)>/i).each {|m,i|
      # Add Matched Terrain ID's to Move Lock Region
      m.split(/,/).each {|id| add_move_lock_terrain(id.to_i)}
    }
  end
end


#==============================================================================
# ** Game_Interpreter
#------------------------------------------------------------------------------
#  An interpreter for executing event commands. This class is used within the
# Game_Map, Game_Troop, and Game_Event classes.
#==============================================================================

class Game_Interpreter
  #--------------------------------------------------------------------------
  # * Add Player Move Lock Region
  #--------------------------------------------------------------------------
  def add_player_move_lock_region(id) ; $game_player.add_move_lock_region(id) end
  #--------------------------------------------------------------------------
  # * Remove Player Move Lock Region
  #--------------------------------------------------------------------------
  def remove_player_move_lock_region(id) ; $game_player.remove_move_lock_region(id) end    
  #--------------------------------------------------------------------------
  # * Clear All Player Move Lock Region
  #--------------------------------------------------------------------------
  def clear_player_move_lock_region ; $game_player.move_lock_regions.clear end        
  #--------------------------------------------------------------------------
  # * Add Player Move Lock Terrain
  #--------------------------------------------------------------------------
  def add_player_move_lock_terrain(id) ; $game_player.add_move_lock_terrain(id) end    
  #--------------------------------------------------------------------------
  # * Remove Player Move Lock Terrain
  #--------------------------------------------------------------------------
  def remove_player_move_lock_terrain(id) ; $game_player.remove_move_lock_terrain(id) end        
  #--------------------------------------------------------------------------
  # * Clear All Player Move Lock Terrain
  #--------------------------------------------------------------------------
  def clear_player_move_lock_terrain ; $game_player.move_lock_terrains.clear end        
end