[RESOLVED][XP]"Lock Panorama" in Heretic's Loop Maps script doesn't work.

Started by Simon Greedwell, June 07, 2022, 06:03:04 pm

Previous topic - Next topic

Simon Greedwell

I've been using Heretic's Loop Map script and it seems the "lock panorama" script call is bugged. Like the name suggests, it's supposed to prevent the panorama from scrolling along with the character. At first I assumed it was an incompatibility with one of the dozen or so scripts on my game but I tested it in a new project and it still doesn't work.

The Modular Passable script is needed for the script to run. It can be found here. Both scripts on the same message hit the character limit per post. Pity.   

There's the Loop Map script:

#===============================================================================
#
#           HERETIC'S LOOP MAPS [XP]
#           Version - 1.0
#           Wednesday, March 25th, 2015
#
#===============================================================================
#
# ---  Requirements and Installation  ---
#
# *** REQUIRES HERETICS MODULAR PASSABLE SCRIPT ***
#
#  This script should be placed DIRECTLY below Heretic's Modular Passable
#  directly below Modular Collision Optimizer (recommended for performance) if
#  it is used, or directly below Modular Passable.
#
# -----  FEATURES  ------
#
# - Allows Maps to Loop like in RPG Maker VX and VX Ace
# - Can be turned on or off during gameplay
# - Allows for Panorama Tuning to adjust Panorama Speeds or Lock in place
# - Allows for Auto Scrolling of Panorama like in VX and VX Ace
# - Works with Fogs and Panoramas unlike other scripts
# - Compatible with Heretic's Cloud Altitude 2.2
# - Also compatible with Game Guy's Unlimited Fogs if you have Cloud Altitude
#
#
# -----  INSTRUCTIONS  ------
#
#  Install below Heretic's Modular Passable Script and above Main.  You'll
#  probably need to put it above other scripts that have Loop Map Compatability
#  such as the Caterpillar, NPCs on Event Tiles, Diagonal Stairs, Bush Passages
#  Hotfoot Tiles, and my Vehicles script.
#
#  Once installed, scroll down to the Config and set up your game as you
#  see fit.  The Config is intended for maps that you always expect to
#  have a Looping behavior.
#
#  - SDK (if installed)
#  - Heretic's Modular Passable (** Required **)
#  - Heretic's Modular Collision Optimizer (Optional)
#  - Heretic's Loop Maps (This Script)
#
#  Heretic's Modular Collision Optimizer can be exceptionally useful for
#  other scripters to be able to do things with Event Tiles in a manner
#  that is actually efficient enough that collisions with these types
#  of tiles do not affect performance.  This script is NOT intended
#  to be used for only increasing performances.  I have noticed much
#  better performance given the exceptionally high number of scripts
#  that are created in the collection.  Read the Documentation in
#  the Collision Optimizer script for more information.
#
#
#  -----  SCRIPT CALLS  -----
#
#  This script is actually pretty easy to use.  If you want to set a Map to
#  have a Looping property during gameplay, you can adjust it on the fly
#  by using a Script Call: $game_map.loop_type = N  The best results of
#  this script are set in the Config section, so you won't really need
#  to use these Script Calls during gameplay.
#
#  By default, 0 is a Non Looping Map, which is default for all maps, except
#  those specified in the Config.  Loop Type of 1 is a Vertical Loop.  A Loop
#  Type of 2 is a Horizontal Loop.  Loop Type of 3 is to Loop both Horizontal
#  and Vertical.
#
#  @>Script: $game_map.loop_type = 0 - No Loop
#  @>Script: $game_map.loop_type = 1 - Loop Vertical
#  @>Script: $game_map.loop_type = 2 - Loop Horizontal
#  @>Script: $game_map.loop_type = 3 - Loop Vertical and Horizontal
#
#  If you change the LOOP TYPE during gameplay, the Map will "snap" if the
#  screen is displaying over a Map Edge.  Changing the LOOP TYPE will usually
#  look the best to Players if you change it while away from Map Edges so
#  no "snapping" takes place.  You can disable this "snapping" by running
#  a script of $game_system.loop_snap = false, but as soon as the Player
#  tries to move in the direction of the Map Edge, the Map will just
#  "snap" anyway.
#
#  NOTE:  My Caterpillar Script has a feature to allow Characters to go off the
#         edge of maps.  This ONLY works if a Map is NOT Looping for the
#         direction allowed.  Thus, you can make a Map have a Vertical Loop
#         and still allow Characters to walk off the side edges of the Map.
#
#
#  -----  DETECTING LOOPS  -----
#
#  If you need to detect if a Map has Looped for some reason, you can check
#  with a script to $game_map.looped which will return nil until the Player
#  has caused the Map to Loop, at which time, will return the Direction of
#  the way the Map has Looped.  The value will be returned for ONE FRAME
#  of UPDATE, then it will automatically be reset back to nil.
#
#  In a Parallel Event, you can run this:
#
#  @>Conditional Branch: Script: $game_map.looped != nil
#  @>  (your Event Stuff goes here)
#  @>Branch End
#

#  -----  PANORAMA SCROLL ADJUSTMENTS  -----
#
#  Some Panoramas do not tile properly, so it may be useful to "lock" these
#  styles of panoramas in place, either Horizontally or Vertically.  The
#  ability to do this also allows you to alter the Panorama Scroll Speeds.
#
#  Due to the way the Math came out, you'll need to use a value of 4 for
#  you to "lock" a Panorama.  Numbers less than 4 will cause the Panorama
#  to move faster than the current map, and those greater than 4 will
#  make the Panorama scroll slower than the current map.  The default value
#  is 8.  Numbers greater than 8 scroll increasingly slowly, and numbers
#  that are less than 8 will move slower than the map, but faster than the
#  default Panorama Scroll Speed.  This can be useful when you want to make
#  something in the distance appear to be either much nearer or farther
#  away from the Player's plane.
#
#  $game_map.pan_scroll_x = 4 - Lock the X Panorama Scroll
#  $game_map.pan_scroll_y = 4 - Lock the Y Panorama Scroll
#  $game_map.pan_scroll_x = 8 - Default Panorama Scroll Speed
#  $game_map.pan_scroll_y = 8 - Default Panorama Scroll Speed
#  $game_map.pan_scroll_x = 16 - Very Slow Panorama X Scrolling (Distant)
#  $game_map.pan_scroll_y = 16 - Very Slow Panorama Y Scrolling (Distant)
#  $game_map.pan_scroll_x = 5 - Fast Panorama X Scrolling (Close Plane)
#  $game_map.pan_scroll_y = 5 - Fast Panorama Y Scrolling (Close Plane)
#  $game_map.pan_scroll_x = < 4 - Panorama X Scrolls faster than Map
#  $game_map.pan_scroll_y = < 4 - Panorama Y Scrolls faster than Map
#
#
#  -----  PANORAMA AUTO SCROLLING  -----
#
#  You can set a Panorama to Scroll automagically either by setting a value
#  in the Config section, or by making a Script Call.  To enter a Config
#  value for Auto Scrolling, X Scroll Speeds should be the 5th value and
#  likewise, the Y Scroll Speed is the 6th value.
#
#  Map Config: [map_id, loop_type, scroll_x_spd, scroll_y_spd, auto_x, auto_y]
#
#  $game_map.panorama_ax = 4   - Automatically Scroll Panorama X
#  $game_map.panorama_ax = 7.5 - Automatically Scroll Panorama Y
#
#  NOTE: Maps do NOT need to Loop for Panorama Scrolling or Adjustments
#
#
#  -----  KNOWN BUGS  ------
#
#  Loop maps does not appear to work with Pathfinders at this time.
#
#  DOWNHILL ICE DELUXE can cause an "Artifact Glitch" where the bottom
#  of sprites appears at the top of the screen.  You can avoid this Glitch
#  in Mapping Technique.  It only occurs if the Player steps onto Downhill
#  Ice at the very bottom of a Looping Map.  You can allow the Player to
#  slide infinitely, just block access from stepping on to the infinite
#  or looping ice at the very bottom of your map.
#
#
# ------  LOOP MAP CONFIG SECTION  ------

#
# Map ID - Obvious
# Loop Type:
#   0 - No Looping (Normal Maps and Collisions
#   1 - Vertical Loop, no Horizontal
#   2 - Horizontal Loop, no Vertical
#   3 - Loop Horizontal and Vertical

#  -----  CONFIG  -----
#
# Edit these values to suit your game
#
#  Map Config: [map_id, loop_type, scroll_x, scroll_y, auto_x, auto_y]
#
#  NOTE: You don't need to put Names in for each entry
#
#  Example: [map_id = 1, loop_type = 3, nil, 16, -10.5, 14]
LOOP_MAPS = [ # Leave this character here!

  [map_id = 74, loop_type = 3, 8, 8, -10.5, 14], # Put commas if not the last set of []
  [map_id = 479, loop_type = 2],
  [map_id = 73, loop_type = 3],
  [map_id = 72, loop_type = 3, nil, 16, -10.5, 14],
  [map_id = 134, loop_type = 3]
            ] # Leave this character here!

# Adjustment to Top Edge of Map (Default)
LOOP_TOP_OFFSET = 2  #64 pixels or 2 tiles
LOOP_SIDE_OFFSET = 3


#  -----  END CONFIG  -----

# Check for Modular Passable Script - REQUIRED - DO NOT EDIT
unless $Modular_Passable
  print "Fatal Error: Heretics Loop Maps script\n",
        "requires Heretics Modular Passable Script!\n\n",
        "Modular Passable is Not Available or is below this script.\n",
        "Modular Passable MUST be above this script.\n\n",
        "The Game will now Exit"
  exit
end

#==============================================================================
# ** Game_Map - Class
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables - Game_Map
  #--------------------------------------------------------------------------
  attr_reader    :loop_type        # 0:Off 1:Vertical 2:Horizontal 3:Both
  attr_accessor  :looped           # Returns Direction if Map Looped or nil
  attr_accessor  :fog_ox           # Fog Origin X
  attr_accessor  :fog_oy           # Fog Origin Y
  attr_accessor  :loop_snap        # If corrections to Display on value change
  attr_accessor  :loop_top_offset  # Adjusts Top Edge for larger Maps
  attr_accessor  :loop_side_offset # Adjusts Side Edges for larger Maps
  attr_accessor  :loop_pan_x       # Panorama Adjustment when Looping Horizontal
  attr_accessor  :loop_pan_y       # Panorama Adjustment when Looping Vertical
  attr_accessor  :pan_scroll_x     # Panorama Scroll Rate X Override
  attr_accessor  :pan_scroll_y     # Panorama Scroll Rate Y Override
  attr_accessor  :panorama_ax      # Panorama Auto Scroll X Speed
  attr_accessor  :panorama_ay      # Panorama Auto Scroll Y Speed
  attr_accessor  :pan_ax_counter   # Panorama Adjustment Counter
  attr_accessor  :pan_ay_counter   # Panorama Adjustment Counter
  #--------------------------------------------------------------------------
  # * Setup - Game_Map
  #     map_id : Map ID
  #--------------------------------------------------------------------------
  alias loop_map_setup setup unless $@
  def setup(map_id)
    # Set the Default Loop Type
    @loop_type = 0
    # Returns Direction of Loop for ONE FRAME of UPDATE when a Map has Looped
    @looped = nil
    # Panorama Adjustments for Looping
    @loop_pan_x = 0
    @loop_pan_y = 0
    # Top Loop / Side Offsets from Config
    @loop_top_offset = LOOP_TOP_OFFSET
    @loop_side_offset = LOOP_SIDE_OFFSET
    # Adjust Display Values on Loop Type Change (false due to Bugs, artifacts)
    @loop_snap = true
    # Default Found Loop Map in Config
    found_loop_map = false
    # If Config has Looping Map
    for loops in LOOP_MAPS
      # If Config is set for this Map ID
      if loops[0] == map_id
        # Found the Map
        found_loop_map = true
        # Set Loop Type based on Config
        @loop_type = loops[1]         
        # Panorama Scroll Speed Adjustments
        @pan_scroll_x = (loops[2]) ? loops[2] : nil
        @pan_scroll_y = (loops[3]) ? loops[3] : nil
        # Panorama Auto Scroll Speeds
        @panorama_ax = (loops[4]) ? loops[4] : 0
        @panorama_ay = (loops[5]) ? loops[5] : 0
      end
    end
    # Check Nonexistent Values or Missing Config
    @panorama_ax = 0 if @panorama_ax.nil?
    @panorama_ay = 0 if @panorama_ay.nil?
    # Panorama Adjustment Counters
    @pan_ax_counter = 0
    @pan_ay_counter = 0
    # Call Original or other Aliases of Setup
    loop_map_setup(map_id)
    # If Loop Map Config is not found
    if not found_loop_map
      # Clear these values
      @pan_scroll_x = nil
      @pan_scroll_y = nil
      @panorama_ax = 0
      @panorama_ay = 0
    end   
  end
  #--------------------------------------------------------------------------
  # * Loop_Type= (Setter Method) - Game_Map
  #  - Changes Map Loop Type and Display Values appropriately
  #
  #  NOTE: Buggy!  More work is needed to prevent visual artifacts when
  #        the Display Values are adjusted by a vast degree.  Recommend
  #        to only use in the midde of a map where there is no "snap".
  #--------------------------------------------------------------------------
  def loop_type=(i)
    # If Valid
    if [0,1,2,3].include?(i)
      # Change to New Value
      @loop_type = i
      # Update Display X
      if [0,1].include?(i) and @loop_snap and
         (@display_x < 0 or @display_x > (self.width - 20) * 128)
        # Shorthand for Player X
        x = $game_player.x
        # Max X
        mx = ($game_map.width - 20) * 128
        # Correct Center Screen X
        $game_map.display_x = [0, [x * 128 - Game_Player::CENTER_X,mx].min].max
        # If Map Scene
        if $scene.is_a?(Scene_Map)
          # Correct Map Positions of ALL Events (unless allowed Off Map)
          $game_map.force_event_loop_round_positions
          # Force an Update of ALL Sprite Positions
          $scene.force_sprites_position_update
          # Correct Panorama Positions
          $scene.panorama_update_loop_scroll
        end
      end
      # Update Display Y
      if [0,2].include?(i) and @loop_snap and
         (@display_y < 0 or @display_y > (self.height - 15) * 128)
        # Shorthand for Player Y
        y = $game_player.y
        # Max Y
        my = ($game_map.height - 15) * 128
        # Correct Center Screen
        $game_map.display_y = [0, [y * 128 - Game_Player::CENTER_Y,my].min].max       
        # If Map Scene
        if $scene.is_a?(Scene_Map)
          # Correct Map Positions of ALL Events (unless allowed Off Map)
          $game_map.force_event_loop_round_positions
          # Force an Update of ALL Sprite Positions
          $scene.force_sprites_position_update
          # Correct Panorama Positions
          $scene.panorama_update_loop_scroll
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Loop? - Game_Map
  #--------------------------------------------------------------------------
  def loop?
    # True if Loop is 1, 2, or 3
    return (@loop_type > 0)
  end 
  #--------------------------------------------------------------------------
  # * Loop Horizontally? - Game_Map
  #--------------------------------------------------------------------------
  def loop_horizontal?
    return (@loop_type == 2 or @loop_type == 3)
  end
  #--------------------------------------------------------------------------
  # * Loop Vertically? - Game_Map
  #--------------------------------------------------------------------------
  def loop_vertical?
    return (@loop_type == 1 or @loop_type == 3)
  end
  #--------------------------------------------------------------------------
  # * Determine Valid Coordinates - Game_Map
  #     x          : x-coordinate
  #     y          : y-coordinate
  #     d          : direction (0,2,4,6,8,10)
  #                  *  0,10 = determine if all directions are impassable
  #     self_event : Character calling $game_map.passable 
  #     result     : true or false passed as an arg by Aliases
  #  - Added all available arguments for other Aliases to alter result
  #  - Adjusts X and Y values for Looping Maps
  #--------------------------------------------------------------------------
  alias map_loop_valid? valid? unless $@ 
  def valid?(x, y, d = nil, self_event = nil, result = nil) 
    # Fix X Value to Map Range if Map Loops Horizontally
    x %= @map.width if loop_horizontal?
    # Fix Y Value to Map Range if Map Loops Vertically
    y %= @map.height if loop_vertical?
    # Call Original or other Aliases
    map_loop_valid?(x, y, d, self_event, result)
  end
  #--------------------------------------------------------------------------
  # * Passable? - Game_Map
  #  - Adjusts X and Y values for Looping Maps
  #--------------------------------------------------------------------------
  alias map_loop_passable? passable? unless $@
  def passable?(x, y, d, self_event = nil)
    # Fix X Value to Map Range if Map Loops Horizontally
    x %= @map.width if loop_horizontal?
    # Fix Y Value to Map Range if Map Loops Vertically
    y %= @map.height if loop_vertical?
    # Call Original or other Aliases with updated X and Y
    map_loop_passable?(x, y, d, self_event)
  end
  #--------------------------------------------------------------------------
  # * Scroll Down - Game_Map
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias map_loop_scroll_down scroll_down unless $@
  def scroll_down(distance)
    # If Map Loops Vertically
    if loop_vertical?
      # Update Display with no Limiters
      @display_y += distance
    else
      # Call Original or other Aliases
      map_loop_scroll_down(distance)
    end
  end
  #--------------------------------------------------------------------------
  # * Scroll Left - Game_Map
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias map_loop_scroll_left scroll_left unless $@
  def scroll_left(distance)
    # If Map Loops Horizontal
    if loop_horizontal?
      # Update Display with no Limiters
      @display_x -= distance
    else
      # Call Original or other Aliases
      map_loop_scroll_left(distance)
    end
  end
  #--------------------------------------------------------------------------
  # * Scroll Right - Game_Map
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias map_loop_scroll_right scroll_right unless $@
  def scroll_right(distance)
    # If Map Loops Horizontal
    if loop_horizontal?
      @display_x += distance
    else
      # Call Original or other Aliases
      map_loop_scroll_right(distance)
    end
  end
  #--------------------------------------------------------------------------
  # * Scroll Up - Game_Map
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias map_loop_scroll_up scroll_up unless $@
  def scroll_up(distance)
    # If Map Loops Vertically
    if loop_vertical?
      @display_y -= distance
    else
      # Call Original or other Aliases
      map_loop_scroll_up(distance)
    end
  end
  #--------------------------------------------------------------------------
  # * Get Terrain Tag - Game_Map
  #     x          : x-coordinate
  #     y          : y-coordinate
  #--------------------------------------------------------------------------
  alias loop_map_terrain_tag terrain_tag unless $@
  def terrain_tag(x, y)
    # Adjust X Value if Map Loops Horizontally
    x %= width if loop_horizontal?
    # Adjust Y Value if Map Loops Vertically
    y %= height if loop_vertical?
    # Call Original or other Aliases with any Adjusted Arguments
    return loop_map_terrain_tag(x, y)
  end
  #--------------------------------------------------------------------------
  # * Determine Thicket (Bush) - Game_Map
  #     x          : x-coordinate
  #     y          : y-coordinate
  #--------------------------------------------------------------------------
  alias loop_map_bush? bush? unless $@
  def bush?(x, y)
    # Adjust X Value if Map Loops Horizontally
    x %= width if loop_horizontal?
    # Adjust Y Value if Map Loops Vertically
    y %= height if loop_vertical?
    # Call Original or other Aliases with any Adjusted Arguments
    return loop_map_bush?(x, y)
  end 
  #--------------------------------------------------------------------------
  # * Adjust X - Game_Map
  #     x : Real X of Character
  #--------------------------------------------------------------------------
  def adjust_x(x)
    # Display X in "tile values".
    dx = @display_x / 128.0
    # 20 represents the number of horizontal tiles in the screen.
    if loop_horizontal?
      # If Map Loop to the Right and Character close to Left Edge
      return x - dx + @map.width if x < dx - (width - 20) / 2
      # Top Map Edge Adjustment for Sprites at Bottom Edge of Maps
      e = $game_map.loop_side_offset
      # If Map Loop to the Left and Character close to Right Edge
      return x - dx - @map.width if dx < 0 + e and x > dx + (width + 20) / 2
    end
    return x - dx
  end
  #--------------------------------------------------------------------------
  # * Adjust Y - Game_Map
  #  - Limit is "Softened" by 2 tiles to allow proper rendering along
  #    Map Edges so map sizes may need to be increased accordingly
  #     y : Real Y of Character
  #--------------------------------------------------------------------------
  def adjust_y(y)
    # Display Y in "tile values".
    dy = @display_y / 128.0
    # 15 represents the number of vertical tiles in the screen.
    if loop_vertical?
      # If Map Loops to the Bottom and Character close to Top Edge
      return y - dy + @map.height if y < dy - (height - 15) / 2
      # Top Map Edge Adjustment for Sprites at Bottom Edge of Maps
      t = $game_map.loop_top_offset
      # If Map Loops to the Top and Character close to Bottom Edge
      return y - dy - @map.height if dy < 0 + t and y > dy + (height + 15) / 2
    end
    return y - dy
  end
  #--------------------------------------------------------------------------
  # * Force Event Loop Round Positions - Game_Map
  #  - Called when Loop Type is changed to correct all map positions
  #--------------------------------------------------------------------------
  def force_event_loop_round_positions
    # For ALL Events
    for event in @events.values
      # Corrects Looping Map Positions
      event.force_loop_round_positions
    end
  end
end

#==============================================================================
# ** Sprite_Character - Class
#==============================================================================
class Sprite_Character < RPG::Sprite
  #--------------------------------------------------------------------------
  # * Loop Force Position Update
  #  - Called when Loop Type is changed to correct all Sprite Screen Positions
  #--------------------------------------------------------------------------
  def loop_force_position_update
    # Set sprite coordinates
    self.x = @character.screen_x
    self.y = @character.screen_y
    self.z = @character.screen_z(@ch)
  end
end

#==============================================================================
# ** Spriteset_Map - Class
#==============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Spriteset Force Position Update - Spriteset_Map
  #  - Called when Loop Type is changed to correct all Sprite Screen Positions
  #--------------------------------------------------------------------------
  def spriteset_force_position_update
    for sprite in @character_sprites
      # Force an Update now of all Sprite Locations due to a Loop Change
      sprite.loop_force_position_update
    end
  end
  #--------------------------------------------------------------------------
  # * Panorama Update Loop Scroll - Spriteset_Map
  #  - Updates Panorama Scrolling on either Looping or Non Looping Maps
  #--------------------------------------------------------------------------
  def panorama_update_loop_scroll
    # If Panorama Scroll X Value is adjusted
    if $game_map.pan_scroll_x
      # Adjust the Panorama X Position
      @panorama.ox = $game_map.display_x / $game_map.pan_scroll_x
    end
    # If Panorama Scroll Y Value is adjusted
    if $game_map.pan_scroll_y
      # Adjust the Panorama Y Position
      @panorama.oy = $game_map.display_y / $game_map.pan_scroll_y
    end
    # Shortcut
    p = @panorama
    # Clear Fog Looping Flags and adjust Auto Scrolling
    @panorama.ox += $game_map.loop_pan_x + $game_map.pan_ax_counter
    @panorama.oy += $game_map.loop_pan_y + $game_map.pan_ay_counter
    # If Panorama
    if @panorama_name != ""
      # Adjust Panorama Counters
      $game_map.pan_ax_counter += $game_map.panorama_ax / 8.0
      $game_map.pan_ay_counter += $game_map.panorama_ay / 8.0
      # Round Values based on size and zoom of Panorama
      $game_map.pan_ax_counter %= @panorama.bitmap.width * @panorama.zoom_x
      $game_map.pan_ay_counter %= @panorama.bitmap.height * @panorama.zoom_y
    end   
  end
  #--------------------------------------------------------------------------
  # * Update - Spriteset_Map
  #  - Adjusts Panorama Position on Looping Maps
  #  - Allows specific control over Panorama Scroll Rates
  #-------------------------------------------------------------------------- 
  alias loop_map_sprite_map_update update unless $@
  def update
    # Call Original or other Aliases
    loop_map_sprite_map_update
    # Update Panorama Scrolling
    panorama_update_loop_scroll
  end
end

class Scene_Map
  #--------------------------------------------------------------------------
  # * Loop Spriteset - Scene_Map
  #  - Just returns the Spriteset Object
  #--------------------------------------------------------------------------
  def loop_spriteset
    return @spriteset
  end 
  #--------------------------------------------------------------------------
  # * Force Sprites Position Update - Scene_Map
  #  - Calls command in the Spriteset Object
  #  - Called when Loop Type is changed
  #--------------------------------------------------------------------------
  def force_sprites_position_update
    @spriteset.spriteset_force_position_update
  end
  #--------------------------------------------------------------------------
  # * Panorama Update Loop Scroll - Scene_Map
  #  - Causes Panorama Positions to Update
  #  - Called when Loop Type is changed
  #--------------------------------------------------------------------------
  def panorama_update_loop_scroll
    @spriteset.panorama_update_loop_scroll
  end
end

#==============================================================================
# ** Interpreter
#==============================================================================
class Interpreter
  #--------------------------------------------------------------------------
  # * Change Map Settings - Interpreter
  #--------------------------------------------------------------------------
  alias loop_map_change_map_settings_command_204 command_204 unless $@
  def command_204
    # Reset Background 2 when Background 1 is changed
    case @parameters[0]
    when 0  # panorama
      # Reset the Counters used for Scrolling
      $game_map.pan_ay_counter = 0
      $game_map.pan_ay_counter = 0
    end
    # Continue
    return loop_map_change_map_settings_command_204
  end
end

#==============================================================================
# ** Game_Character - Class
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # * Make New XY - Game_Character
  #  - Makes New Coordinates for X and Y (4 Directional Movement)
  #     x      : x-coordinate
  #     y      : y-coordinate
  #     d      : direction (0,2,4,6,8)
  #     result : Array passed as an arg by Aliases
  #
  #  NOTE: Must return an Array of New Map Coordinates [new_x, new_y]
  #    new_x, new_y = make_new_xy(x, y, d) 
  #  - This can be Aliased to alter New Coordinates based on other conditions
  #--------------------------------------------------------------------------
  alias map_loop_make_new_xy make_new_xy unless $@
  def make_new_xy(x, y, d, result = nil)
    # Get the New X and New Y Results of Make New XY
    new_x, new_y = map_loop_make_new_xy(x, y, d, result)
    # Fix X Value to Map Range if Map Loops Horizontally
    new_x %= $game_map.width if $game_map.loop_horizontal?
    # Fix Y Value to Map Range if Map Loops Vertically
    new_y %= $game_map.height if $game_map.loop_vertical?
    # Return Loop Adjusted Values
    return [new_x, new_y]
  end
  #--------------------------------------------------------------------------
  # * Make New XY 8D - Game_Character
  #  - Make New Coordinates for X and Y (8 Directional Movement)
  #     x     : x-coordinate
  #     y     : y-coordinate
  #     d     : direction (0,1,2,3,4,6,7,8,9 no 5)
  #     result : Array passed as an arg by Aliases   
  #  - This method is not called, but is available if needed
  #
  #  Note: Bit Flipping with 10 - d works, 10 - 9 (up right) = 1 (down left)
  #  Note: Must return an Array of New Map Coordinates [new_x, new_y]
  #    new_x, new_y = make_new_xy_8d(x, y, d)
  #--------------------------------------------------------------------------
  alias map_loop_make_new_xy_8d make_new_xy_8d unless $@
  def make_new_xy_8d(x, y, d, result = nil)
    # Get the New X and New Y Results of Make New XY
    new_x, new_y = map_loop_make_new_xy_8d(x, y, d, result)
    # Fix X Value to Map Range if Map Loops Horizontally
    new_x %= $game_map.width if $game_map.loop_horizontal?
    # Fix Y Value to Map Range if Map Loops Vertically
    new_y %= $game_map.height if $game_map.loop_vertical?
    # Return Loop Adjusted Values
    return [new_x, new_y]
  end
  #--------------------------------------------------------------------------
  # * Player Conditions? - Game_Character
  #  - Return true / false if conditions met
  #  - If New Location matches Player Position and Player not Through
  #     x          : x-coordinate
  #     y          : y-coordinate
  #     d          : direction (0,2,4,6,8,10)
  #                  *  0,10 = determine if all directions are impassable
  #     new_x : Target X Coordinate
  #     new_y : Target Y Coordinate 
  #     result     : values other than nil by Aliases override checks here
  #--------------------------------------------------------------------------
  alias loop_map_player_conditions? player_conditions? unless $@
  def player_conditions?(x, y, d, new_x, new_y, result = nil)
    # Ignore other Results and check for Looping Maps
    if $game_map.loop?
      # Game Player Shorthand
      p = $game_player
      # Adjust Player's X Location If map Loops Horizontal
      px = ($game_map.loop_horizontal?) ? p.x % $game_map.width : p.x
      # Adjust Player's Y Location If map Loops Vertical
      py = ($game_map.loop_vertical?) ? p.y % $game_map.height : p.y
      # If Coordinates match Player Location and Player Through is Off
      if px == new_x and py == new_y and not $game_player.through
        # Conditions are met
        return true
      end
    end
    # Call Original or other Aliases
    loop_map_player_conditions?(x, y, d, new_x, new_y, result)
  end 
  #--------------------------------------------------------------------------
  # * Passable? - Game_Character
  #  - Adjusts X and Y Argument Values for Looping Maps
  #--------------------------------------------------------------------------
  alias map_loop_character_passable? passable? unless $@
  def passable?(x, y, d)
    # Fix X Value to Map Range if Map Loops Horizontally
    x %= $game_map.width if $game_map.loop_horizontal?
    # Fix Y Value to Map Range if Map Loops Vertically
    y %= $game_map.height if $game_map.loop_vertical?
    # Call Original or other Aliases with updated X and Y
    map_loop_character_passable?(x, y, d)
  end
  #--------------------------------------------------------------------------
  # * Make Events List - Game_Character
  #  - Similar to Make Passable List
  #  - Intended for use in Non Passable determining methods in other Scripts
  #  - Intended to be aliased where X and Y values can be adjusted as needed
  #  - Excludes other Arguments needed by Make Passable List
  #  - Used by other Scripts with Triggers when X or Y have no arguments to fix
  #     x          : x-coordinate
  #     y          : y-coordinate
  #     results    : Array from other Aliases to override default results
  #--------------------------------------------------------------------------
  alias loop_map_make_events_list make_events_list unless $@
  def make_events_list(x, y, results = nil)
    # Determine Corrected Coordinates for Target
    x = ($game_map.loop_horizontal?) ? x % $game_map.width : x
    y = ($game_map.loop_vertical?) ? y % $game_map.height : y
    # Call Original or other Aliases with Adjusted Arguments
    loop_map_make_events_list(x, y, results)
  end
  #--------------------------------------------------------------------------
  # * Passable Conditions? - Game_Character
  #  - Return true / false if conditions met
  #  - Conditions for running Passability Checks on an Event
  #  - Typically an Event isnt checking itself, Through, and Coordinates match
  #     x          : x-coordinate
  #     y          : y-coordinate
  #     d          : direction (0,2,4,6,8,10)
  #                  *  0,10 = determine if all directions are impassable
  #     new_x      : Target X Coordinate
  #     new_y      : Target Y Coordinate 
  #     event      : Iterated Event made by make_passable_list 
  #     result     : values other than nil by Aliases override checks here
  #--------------------------------------------------------------------------
  alias loop_map_passable_conditions? passable_conditions?
  def passable_conditions?(x, y, d, new_x, new_y, event, result = nil)
    # Ignore other results if Looping Maps
    if $game_map.loop?
      # Adjust Coordinates for Looping Maps
      ex = ($game_map.loop_horizontal?) ? event.x % $game_map.width : event.x
      ey = ($game_map.loop_vertical?) ? event.y % $game_map.height : event.y
      new_x = ($game_map.loop_horizontal?) ? new_x % $game_map.width : new_x
      new_y = ($game_map.loop_vertical?) ? new_y % $game_map.height : new_y
      # Check Adjusted Coordinates for Position Match, Through, and Self
      if ex == new_x and ey == new_y and not event.through and event != self
        # Check this Event
        return true
      end
    end
    # Call Original or other Aliases
    loop_map_passable_conditions?(x, y, d, new_x, new_y, event, result)
  end
  #--------------------------------------------------------------------------
  # * Other Passable? - Game_Character
  #  - Adjusts Arguments of Aliases for Looping Maps
  #  - Used by Heretic's Caterpillar 2.0
  #  - Use any additional conditions for denying Passable
  #     x, new_x : x-coordinate
  #     y, new_y : y-coordinate
  #--------------------------------------------------------------------------
  alias loop_map_other_passable? other_passable? unless $@
  def other_passable?(x, y, d, new_x, new_y, result = nil)
    # If Map Loops Horizontal
    if $game_map.loop_horizontal?
      # Adjust the X Arguments to pass to Original or other Aliases
      x %= $game_map.width
      new_x %= $game_map.width
    end
    # If Map Loops Vertical
    if $game_map.loop_vertical?
      # Adjust the Y Arguments to pass to Original or other Aliases
      y %= $game_map.height
      new_y %= $game_map.height
    end 
    # Call Original or other Aliases with Modified Arguments except Results
    loop_map_other_passable?(x, y, d, new_x, new_y, result)
  end
  #--------------------------------------------------------------------------
  # * MP Match Coordinates - Game_Character
  #  - Modular Passable
  #  - Adjusts Coordinates for Looping Maps without affecting Results
  #     x, tx      : x-coordinate and Target x-coordinate to Match
  #     y, ty      : y-coordinate and Target Y-coordinate to Match
  #--------------------------------------------------------------------------
  alias loop_map_mp_match_coordinates? mp_match_coordinates? unless $@
  def mp_match_coordinates?(x, y, tx, ty)
    # If Map Loops Horizontal
    if $game_map.loop_horizontal?
      # Adjust the X Arguments to pass to Original or other Aliases
      x %= $game_map.width
      tx %= $game_map.width
    end
    # If Map Loops Vertical
    if $game_map.loop_vertical?
      # Adjust the X Arguments to pass to Original or other Aliases
      y %= $game_map.height
      ty %= $game_map.height
    end   
    # Call Original or other Aliases with any Adjusted Coordinates
    loop_map_mp_match_coordinates?(x, y, tx, ty)
  end 
  #--------------------------------------------------------------------------
  # * Character Distance - Game_Character
  #  - Returns the X and Y Distance between self and another Character
  #  - Checks for Maps that Loop either Horizontal or Vertical
  #      target : Character (Player or Event)
  #-------------------------------------------------------------------------- 
  def character_distance(target)
    # Determine Corrected Coordinates for Looping Maps
    x = ($game_map.loop_horizontal?) ? @x % $game_map.width : @x
    y = ($game_map.loop_vertical?) ? @y % $game_map.height : @y
    # Determine Corrected Coordinates for Target
    tx = ($game_map.loop_horizontal?) ? target.x % $game_map.width : target.x
    ty = ($game_map.loop_vertical?) ? target.y % $game_map.height : target.y
    # Get difference in target coordinates
    dx = x - tx
    dy = y - ty
    # If Map Loops Horizontal and Distance is more than Half the Map
    if $game_map.loop_horizontal? and dx.abs > $game_map.width / 2
      # Adjust X Distance for Horizontal Looping Map
      dx += (dx < 0) ? $game_map.width : -$game_map.width
    end
    # If Map Loops Vertical and Distance is more than Half the Map
    if $game_map.loop_vertical? and dy.abs > $game_map.height / 2
      # Adjust X Distance for Vertical Looping Map
      dy += (dy < 0) ? $game_map.height : -$game_map.height
    end
    # Return Difference X and Y values as Array
    return [dx, dy]
  end
  #--------------------------------------------------------------------------
  # * Turn Towards Player - Game_Character
  #--------------------------------------------------------------------------
  def turn_toward_player
    # Don't Turn if Direction Fix is ON
    return if @direction_fix
    # Determine Correct Distance to Target for Looping Maps
    sx, sy = character_distance($game_player)
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end   
    # If horizontal distance is longer
    if sx.abs > sy.abs
      # Turn to the right or left towards player
      sx > 0 ? turn_left : turn_right
    # If vertical distance is longer
    else
      # Turn up or down towards player
      sy > 0 ? turn_up : turn_down
    end
  end
  #--------------------------------------------------------------------------
  # * Turn Away from Player - Game_Character
  #--------------------------------------------------------------------------
  def turn_away_from_player
    # Don't Turn if Direction Fix is ON
    return if @direction_fix
    # Determine Correct Distance to Target for Looping Maps
    sx, sy = character_distance($game_player)
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end   
    # If horizontal distance is longer
    if sx.abs > sy.abs
      # Turn to the right or left away from player
      sx > 0 ? turn_right : turn_left
    # If vertical distance is longer
    else
      # Turn up or down away from player
      sy > 0 ? turn_down : turn_up
    end
  end
  #--------------------------------------------------------------------------
  # * Move toward Player - Game_Character
  #--------------------------------------------------------------------------
  def move_toward_player
    # Determine Correct Distance to Target for Looping Maps
    sx, sy = character_distance($game_player)
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end
    # Get absolute value of difference
    abs_sx = sx.abs
    abs_sy = sy.abs
    # If horizontal and vertical distances are equal
    if abs_sx == abs_sy
      # Increase one of them randomly by 1
      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
    end
    # If horizontal distance is longer
    if abs_sx > abs_sy
      # Move towards player, prioritize left and right directions
      sx > 0 ? move_left : move_right
      if not moving? and sy != 0
        sy > 0 ? move_up : move_down
      end
    # If vertical distance is longer
    else
      # Move towards player, prioritize up and down directions
      sy > 0 ? move_up : move_down
      if not moving? and sx != 0
        sx > 0 ? move_left : move_right
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Move away from Player
  #--------------------------------------------------------------------------
  def move_away_from_player
    # Determine Correct Distance to Target for Looping Maps
    sx, sy = character_distance($game_player)
    # If coordinates are equal
    if sx == 0 and sy == 0
      return
    end
    # Get absolute value of difference
    abs_sx = sx.abs
    abs_sy = sy.abs
    # If horizontal and vertical distances are equal
    if abs_sx == abs_sy
      # Increase one of them randomly by 1
      rand(2) == 0 ? abs_sx += 1 : abs_sy += 1
    end
    # If horizontal distance is longer
    if abs_sx > abs_sy
      # Move away from player, prioritize left and right directions
      sx > 0 ? move_right : move_left
      if not moving? and sy != 0
        sy > 0 ? move_down : move_up
      end
    # If vertical distance is longer
    else
      # Move away from player, prioritize up and down directions
      sy > 0 ? move_down : move_up
      if not moving? and sx != 0
        sx > 0 ? move_right : move_left
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Make New XY Hash Conditions? - Game_Character
  #  - Determines if Event does not match the Stored Hash Keys
  #  - Used only if Modular Collision Optimizer is installed
  #--------------------------------------------------------------------------   
  def make_new_xy_hash_conditions?(x, y)
    # Correct Arguments for Looping Maps
    x = $game_map.loop_horizontal? ? x % $game_map.width : x
    y = $game_map.loop_vertical? ? y % $game_map.height : y
    # Evaluate the Conditions
    return (@map_hash_x != x or @map_hash_y != y)
  end 
  #--------------------------------------------------------------------------
  # * Make New XY Hash Keys - Game_Character
  #  - Creates X and Y Hash Keys using Rounded X and Y Values
  #  - Used only if Modular Collision Optimizer is installed
  #--------------------------------------------------------------------------   
  def make_new_xy_hash_keys
    x = $game_map.loop_horizontal? ? @x.round % $game_map.width : @x.round
    y = $game_map.loop_vertical? ? @y.round % $game_map.height : @y.round
    return [x,y]
  end 
  #--------------------------------------------------------------------------
  # * Screen X - Game_Character
  #  - Get Screen X-Coordinates
  #--------------------------------------------------------------------------
  def screen_x
    # Adjust for Looping Maps and Ceil to prevent Screen Event Tearing
    return ($game_map.adjust_x(@real_x / 128.0) * 32 + 16).ceil
  end
  #--------------------------------------------------------------------------
  # * Screen Y - Game_Character
  #  - Get Screen Y-Coordinates
  #--------------------------------------------------------------------------
  def screen_y
    # Determine Jump Height
    height = (@jump_peak * @jump_peak - (@jump_count - @jump_peak).abs ** 2) / 2
    # Adjust for Looping Maps and Ceil to prevent Screen Event Tearing
    return ($game_map.adjust_y(@real_y / 128.0) * 32 + 32 - height).ceil
  end
  #--------------------------------------------------------------------------
  # * Screen Z - Game_Character
  #  - Get Screen Z-Coordinates
  #     height : character height
  #--------------------------------------------------------------------------
  alias loop_map_screen_z screen_z unless $@
  def screen_z(height = 0)
    z = loop_map_screen_z(height)
    # Correct Z Index If Map Loops Vertical
    return ($game_map.loop_vertical? and not @always_on_top) ?
      z % ($game_map.height * 32.0) : z
  end
end

#==============================================================================
# ** Game_Event - Class
#==============================================================================
class Game_Event
  #--------------------------------------------------------------------------
  # * Check Event Trigger Touch - Game_Event
  #  - Touch Event Starting Determinant (Event Touches Player)
  #--------------------------------------------------------------------------
  alias loop_map_check_event_trigger_touch check_event_trigger_touch unless $@
  def check_event_trigger_touch(x, y)
    # If event is running
    if $game_system.map_interpreter.running?
      return
    end
    # If trigger is [touch from event] and consistent with player coordinates
    if @trigger == 2 and
       mp_match_coordinates?(x, y, $game_player.x, $game_player.y)
      # If starting determinant other than jumping is front event
      if not jumping? and not over_trigger?
        start
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Check Event Trigger Auto - Game_Event
  #  - Automatic Event Starting Determinant
  #--------------------------------------------------------------------------
  def check_event_trigger_auto
    # If trigger is [touch from event] and consistent with player coordinates
    if @trigger == 2 and
       mp_match_coordinates?(@x, @y, $game_player.x, $game_player.y)     
      # If starting determinant other than jumping is same position event
      if not jumping? and over_trigger?
        start
      end
    end
    # If trigger is [auto run]
    if @trigger == 3
      start
    end
  end
  #--------------------------------------------------------------------------
  # * Force Loop Round Positions - Game_Event
  #  - Called when Map Loop Type is changd to correct positions
  #  - Ignores Map Loop Properties when called
  #--------------------------------------------------------------------------
  def force_loop_round_positions
    # If not Allowed Off Map (Property of Heretic's Caterpillar or Other)
    if not (@through and @allowed_off_map)
      # Round X Coordinates
      @x %= $game_map.width
      # If Moving Horizontal
      d = (@real_x != @x * 128) ? @real_x - @x * 128 : 0
      # Correct Real X Coordinates to suit Animations
      if d.abs > $game_map.width * 64
        @real_x += (d < 0) ? $game_map.width * 128 : $game_map.width * -128
      else
        @real_x %= $game_map.width * 128
      end     
      # Round Y Coordinates
      @y %= $game_map.height
      # If Moving Vertical
      d = (@real_y != @y * 128) ? @real_y - @y * 128 : 0
      # Correct Real Y Coordinates to suit Animations
      if d.abs > $game_map.height * 64
        @real_y += (d < 0) ? $game_map.height * 128 : $game_map.height * -128
      else
        @real_y %= $game_map.height * 128
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Loop Round Coordinates - Game_Event
  #  - Corrects self position based on Looping Maps
  #--------------------------------------------------------------------------
  def loop_round_coordinates
    # If Map Loops Horizontally and Out of Map Range (No X Loop is Caterpillar)
    if $game_map.loop_horizontal? and not @no_x_loop_round and
       (@real_x < 0 or @real_x > $game_map.width * 128)
      # Correct Event's Position
      @x %= $game_map.width
      @real_x %= $game_map.width * 128
    end
    # If Map Loops Vertically and Out of Map Range (No Y Loop is Caterpillar)
    if $game_map.loop_vertical? and not @no_y_loop_round and
       (@real_y < 0 or @real_y > $game_map.height * 128)
      # Correct Event's Position
      @y %= $game_map.height
      @real_y %= $game_map.height * 128
    end   
  end
  #--------------------------------------------------------------------------
  # * Update - Game_Event
  #--------------------------------------------------------------------------
  alias loop_map_event_update update unless $@
  def update
    # Check for Looping Maps and adjust out of range coordinates
    loop_round_coordinates
    # Call Original or other Aliases
    loop_map_event_update
  end
end

#==============================================================================
# ** Game_Player
#==============================================================================
class Game_Player
  #----------------------------------------------------------------------------
  # * Check Event Trigger Here - Game_Player (FULL REDEFINITION)
  #  - Same Position Starting Determinant
  #  - Fully Redefines method Check Event Trigger Here
  #     triggers : Array of @trigger[0,1,2] Action Button, Player / Event Touch
  #----------------------------------------------------------------------------
  def check_event_trigger_here(triggers)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # Create an Array of Events to check Triggers
    event_list = make_events_list(@x, @y)
    # Loop Events in List
    for event in event_list
      # If Coordinat Match and Triggers Arg is consistent with Event's Trigger
      if mp_match_coordinates?(@x, @y, event.x, event.y) and
         triggers.include?(event.trigger)
        # If starting determinant is same position event (other than jumping)
        if not event.jumping? and event.over_trigger?
          event.start
          result = true
        end
      end
    end
    return result
  end 
  #--------------------------------------------------------------------------
  # * Check Event Trigger There - Game_Player (FULL REDEFINITION)
  #  - Front Envent Starting Determinant
  #      triggers : [0,1,2] for Action Button, Player Touch, Event Touch
  #--------------------------------------------------------------------------
  def check_event_trigger_there(triggers)
    result = false
    # If event is running
    if $game_system.map_interpreter.running?
      return result
    end
    # Calculate front event coordinates
    new_x, new_y = make_new_xy(@x, @y, @direction)
    # Create an Array of Events to check Triggers
    event_list = make_events_list(new_x, new_y)
    # Loop Events in List
    for event in event_list
      # If event coordinates and triggers are consistent
      if mp_match_coordinates?(new_x, new_y, event.x, event.y) and
         triggers.include?(event.trigger)
        # If starting determinant is front event (other than jumping)
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    # If fitting event is not found
    if result == false
      # If front tile is a counter
      if $game_map.counter?(new_x, new_y)
        # Calculate 1 tile inside coordinates
        new_x, new_y = make_new_xy(new_x, new_y, @direction)
        # Create an Array of Events to check Triggers
        event_list = make_events_list(new_x, new_y)
        # Loop Events in List
        for event in event_list
          # If event coordinates and triggers are consistent
          if mp_match_coordinates?(new_x, new_y, event.x, event.y) and
             triggers.include?(event.trigger)
            # If starting determinant is front event (other than jumping)
            if not event.jumping? and not event.over_trigger?
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # * Check Event Trigger Touch - Game_Player
  #  - Touch Event Starting Determinant
  #--------------------------------------------------------------------------
  alias map_loop_check_event_trigger_touch check_event_trigger_touch unless $@
  def check_event_trigger_touch(x, y)
    # Correct X and Y values for Looping Maps
    x = x % $game_map.width if $game_map.loop_horizontal?
    y = y % $game_map.height if $game_map.loop_vertical?
    # Use Corrected X and Y for Looping Maps to check Touch Triggers
    return map_loop_check_event_trigger_touch(x, y)
  end 
  #--------------------------------------------------------------------------
  # * Center - Game_Player
  #  - Positions Player
  #  - Set Map Display Position to Center of Screen
  #--------------------------------------------------------------------------
  alias loop_map_center center unless $@
  def center(x, y)
    # Call Original or other Aliases
    loop_map_center(x, y)   
    # Recenter Display Horizontally if Map Loops Horizontal
    $game_map.display_x = x * 128 - CENTER_X if $game_map.loop_horizontal?
    # Recenter Display Vertically if Map Loops Vertical
    $game_map.display_y = y * 128 - CENTER_Y if $game_map.loop_vertical?
  end
  #--------------------------------------------------------------------------
  # * Correct Loop Left - Game_Player
  #  - Corrects Player Coordinates, Fogs, and Panoramas on a Map Loop
  #--------------------------------------------------------------------------   
  def correct_loop_left(scroll_dist = 0)
    # Set Looped Property for Scripts to check Value for one frame
    $game_map.looped = 4   
    # Fix Player's Position
    @x %= $game_map.width
    @real_x %= $game_map.width * 128
    # Correct Map Display (Optional Arg for Corrections from other scripts)
    $game_map.display_x %= $game_map.width * 128
    $game_map.display_x += scroll_dist
    # Correct Fog Display
    $game_map.fog_ox -= $game_map.width * 32.0
    # If Game Guy's Unlimited Fogs with Heretic's Cloud Altitude
    if $scene.loop_spriteset.respond_to?(:get_all_multi_fogs)
      # Select each Fog in Spriteset Array
      for i in 1...$scene.loop_spriteset.get_all_multi_fogs.size
        # Shorthand for the Unlimited Fog Object
        fog = $scene.loop_spriteset.get_all_multi_fogs[i]
        # Adjust Fog Position for Loop Display
        fog.real_ox -= $game_map.width * 32.0
      end
    end
    # Panorama Scroll Speed Adjustment
    pscroll_x = ($game_map.pan_scroll_x) ? $game_map.pan_scroll_x / 8.0 : 1.0
    # Correct Panorama Display
    $game_map.loop_pan_x -= $game_map.width * 16.0 / pscroll_x
  end
  #--------------------------------------------------------------------------
  # * Correct Loop Right - Game_Player
  #  - Corrects Player Coordinates, Fogs, and Panoramas on a Map Loop
  #--------------------------------------------------------------------------   
  def correct_loop_right(scroll_dist = 0)
    # Set Looped Property for Scripts to check Value for one frame
    $game_map.looped = 6   
    # Fix Player's Position
    @x %= $game_map.width
    @real_x %= ($game_map.width * 128)
    # Correct Map Display (Optional Arg for Corrections from other scripts)
    $game_map.display_x %= $game_map.width * 128
    $game_map.display_x -= $game_map.width * 128 + scroll_dist
    # Correct Fog Display
    $game_map.fog_ox += $game_map.width * 32.0
    # If Game Guy's Unlimited Fogs with Heretic's Cloud Altitude
    if $scene.loop_spriteset.respond_to?(:get_all_multi_fogs)
      # Select each Fog in Spriteset Array
      for i in 1...$scene.loop_spriteset.get_all_multi_fogs.size
        # Shorthand for the Unlimited Fog Object
        fog = $scene.loop_spriteset.get_all_multi_fogs[i]
        # Adjust Fog Position for Loop Display
        fog.real_ox += $game_map.width * 32.0
      end
    end
    # Panorama Scroll Speed Adjustment
    pscroll_x = ($game_map.pan_scroll_x) ? $game_map.pan_scroll_x / 8.0 : 1.0
    # Correct Panorama Display
    $game_map.loop_pan_x += $game_map.width * 16 / pscroll_x
  end
  #--------------------------------------------------------------------------
  # * Correct Loop Up - Game_Player
  #  - Corrects Player Coordinates, Fogs, and Panoramas on a Map Loop
  #--------------------------------------------------------------------------   
  def correct_loop_up(scroll_dist = 0)
    # Set Looped Property for Scripts to check Value for one frame
    $game_map.looped = 8   
    # Fix Player's Position
    @y %= $game_map.height
    @real_y %= $game_map.height * 128
    # Correct Map Display (Optional Arg for Corrections from other scripts)
    $game_map.display_y %= $game_map.height * 128
    $game_map.display_y += scroll_dist
    # Correct Fog Display
    $game_map.fog_oy -= $game_map.height * 32.0
    # If Game Guy's Unlimited Fogs with Heretic's Cloud Altitude
    if $scene.loop_spriteset.respond_to?(:get_all_multi_fogs)
      # Select each Fog in Spriteset Array
      for i in 1...$scene.loop_spriteset.get_all_multi_fogs.size
        # Shorthand for the Unlimited Fog Object
        fog = $scene.loop_spriteset.get_all_multi_fogs[i]
        # Adjust Fog Position for Loop Display
        fog.real_oy -= $game_map.height * 32.0
      end
    end
    # Panorama Scroll Speed Adjustment
    pscroll_y = ($game_map.pan_scroll_y) ? $game_map.pan_scroll_y / 8.0 : 1.0
    # Correct Panorama Display
    $game_map.loop_pan_y -= $game_map.height * 16.0 / pscroll_y
  end
  #--------------------------------------------------------------------------
  # * Correct Loop Down - Game_Player
  #  - Corrects Player Coordinates, Fogs, and Panoramas on a Map Loop
  #-------------------------------------------------------------------------- 
  def correct_loop_down(scroll_dist = 0)
    # Set Looped Property for Scripts to check Value for one frame
    $game_map.looped = 2   
    # Fix Player's Position
    @y %= $game_map.height
    @real_y %= $game_map.height * 128
    # Correct Map Display (Optional Arg for Corrections from other scripts)
    $game_map.display_y %= $game_map.height * 128
    $game_map.display_y -= $game_map.height * 128 + scroll_dist
    # Correct Fog Display
    $game_map.fog_oy += $game_map.height * 32.0
    # If Game Guy's Unlimited Fogs with Heretic's Cloud Altitude
    if $scene.loop_spriteset.respond_to?(:get_all_multi_fogs)
      # Select each Fog in Spriteset Array
      for i in 1...$scene.loop_spriteset.get_all_multi_fogs.size
        # Shorthand for the Unlimited Fog Object
        fog = $scene.loop_spriteset.get_all_multi_fogs[i]
        # Adjust Fog Position for Loop Display
        fog.real_oy += $game_map.height * 32.0
      end
    end
    # Panorama Scroll Speed Adjustment
    pscroll_y = ($game_map.pan_scroll_y) ? $game_map.pan_scroll_y / 8.0 : 1.0
    # Correct Panorama Display
    $game_map.loop_pan_y += $game_map.height * 16.0 / pscroll_y
  end
  #--------------------------------------------------------------------------
  # * Map Loop Position - Game_Player
  #  - Calls for Corrections when Player triggers a Map Loop
  #-------------------------------------------------------------------------- 
  def map_loop_position
    # Set Looped Property for Scripts to check Value for ONE FRAME
    $game_map.looped = nil   
    # Ignore Corrections if not on a Looping Map
    return unless $game_map.loop_type > 0 and (moving? or jumping?)
    # If Horizontal Map Loop
    if $game_map.loop_horizontal?
      # Correct Positions if outside Map Boundaries
      correct_loop_left if @real_x < 0
      correct_loop_right if @real_x > $game_map.width * 128
    end
    # If Horizontal Map Loop
    if $game_map.loop_vertical?
      # Correct Positions if outside Map Boundaries
      correct_loop_up if @real_y < 0
      correct_loop_down if @real_y > $game_map.height * 128
    end
  end
  #--------------------------------------------------------------------------
  # * Update - Game_Player
  #--------------------------------------------------------------------------
  alias map_loop_update update unless $@
  def update
    # Update Map Loop Positions
    map_loop_position   
    # Call Original or other Aliases
    map_loop_update
  end
end

Thanks in advance.
Bury with my...money!

KK20

It doesn't PREVENT the panorama from scrolling, it just makes it move evenly along with the tiles of your map. Because, normally, you don't have any control as to how much the panorama moved.

What it sounds like you want is to just not update the ox/oy values and leave them at zero.
    # Clear Fog Looping Flags and adjust Auto Scrolling
    # @panorama.ox += $game_map.loop_pan_x + $game_map.pan_ax_counter
    # @panorama.oy += $game_map.loop_pan_y + $game_map.pan_ay_counter
    @panorama.ox = 0
    @panorama.oy = 0

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Simon Greedwell

Quote from: KK20 on June 07, 2022, 09:30:28 pmIt doesn't PREVENT the panorama from scrolling, it just makes it move evenly along with the tiles of your map. Because, normally, you don't have any control as to how much the panorama moved.

What it sounds like you want is to just not update the ox/oy values and leave them at zero.
    # Clear Fog Looping Flags and adjust Auto Scrolling
    # @panorama.ox += $game_map.loop_pan_x + $game_map.pan_ax_counter
    # @panorama.oy += $game_map.loop_pan_y + $game_map.pan_ay_counter
    @panorama.ox = 0
    @panorama.oy = 0

... Whelp. Looks like I misinterpreted the instructions. My bad. I tried again with the modification above and the problem persists:



As seen here, there's a noticeable "hiccup" during the loop, something I thought could be fixed by locking the panorama at the center of the map.
Bury with my...money!

KK20

I think it's best you share what it is exactly that you're doing with your project. Not seeing that on my end.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Simon Greedwell

Well, I'm trying to make maps that mimic those found in Yume Nikki-esque games. Usually, those areas were large, looping maps that used parallax backgrounds. In RM2K3, all you could ever need about scrolling customization was in the map properties. For whatever reason, RMXP did away with all that and now we have to rely in scripts for options that, honestly, should be there by default.

In RM2K3, you could disable autoscrolling, leaving the parallax background "locked" like this:



This is what I'm trying to accomplish.       

Bury with my...money!

KK20

And what I provided to you was the solution, but you're claiming otherwise. So I need to have your scripts to check for incompatibility.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Simon Greedwell

Alright, egg applied directly to face: checking out all the scripts I'm using I found both MOG's Scroll Panorama and Battle Panorama. 

#_________________________________________________
# MOG_Scroll Panorama V1.3           
#_________________________________________________
# By Moghunter 
# http://www.atelier-rgss.com
#_________________________________________________
# Movimenta os panoramas na horizontal e na vertical.
# Fade Mode.
# Movimentos aleatórios.
#_________________________________________________
module MOG
#ID da variável que define a velocidade na horizontal. 
VARPANO_X = 5
#ID da variável que define a velocidade na vertical.
VARPANO_Y = 6
#ID da Switch que ativa o Fade Mode.
PANO_FADE_MODE_SWITCHE_ID = 167 #SWITCH ID
#Velocidade do Fade.
PANO_FADE_SPEED = 3
#ID da Switch que ativa o Rand Mode.
#O panorama se move em direções aleatórias.
PAN_RAND_MOVE_SWITCHE_ID = 166  #SWITCH ID
#Tempo para mudar de direção.
PAN_RAND_TIME = 2  #(s)
end
$mogscript = {} if $mogscript == nil
$mogscript["scroll_panorama"] = true
############
# Game_Map #
############
class Game_Map
attr_reader  :pan_ox                 
attr_reader  :pan_oy
attr_accessor :panorama_opacity
alias mog10_setup setup 
def setup(map_id)
@pan_ox = 0
@pan_oy = 0 
@opa_loop = 0
@pan_rand_scroll_x = 0
@pan_rand_scroll_y = 0
@rand_time_x = 0
@rand_time_y = 0
@panorama_opacity = 0
mog10_setup(map_id)
end
alias mog10_update update
def update
if $game_switches[MOG::PANO_FADE_MODE_SWITCHE_ID] == true
if @opa_loop == 0
@panorama_opacity -= MOG::PANO_FADE_SPEED
elsif @opa_loop == 1
@panorama_opacity += MOG::PANO_FADE_SPEED
end
if @panorama_opacity < 1
@opa_loop = 1
elsif @panorama_opacity > 254
@opa_loop = 0 
end
else
@panorama_opacity = 255
end
if $game_switches[MOG::PAN_RAND_MOVE_SWITCHE_ID] == true
@rand_time_x += 1
@rand_time_y += 1
if @rand_time_x > 40 * MOG::PAN_RAND_TIME
@rand_time_x = 0
case rand(2)
when 0
@pan_rand_scroll_x = 0
when 1
@pan_rand_scroll_x = 1
end
end
if @rand_time_y > 40 * MOG::PAN_RAND_TIME
@rand_time_y = 0
case rand(2)
when 0
@pan_rand_scroll_y = 0
when 1
@pan_rand_scroll_y = 1
end
end
if @pan_rand_scroll_x == 0
@pan_ox -= $game_variables[MOG::VARPANO_X]
else
@pan_ox += $game_variables[MOG::VARPANO_X] 
end
if @pan_rand_scroll_y == 0
@pan_oy -= $game_variables[MOG::VARPANO_Y] 
else @pan_rand_scroll_y == 1
@pan_oy += $game_variables[MOG::VARPANO_Y]   
end 
else
@pan_ox -= $game_variables[MOG::VARPANO_X]
@pan_oy -= $game_variables[MOG::VARPANO_Y]
end
mog10_update
end
end
#################
# Spriteset_Map #
#################
class Spriteset_Map
alias mog10_update update
def update
mog10_update
@panorama.ox = $game_map.display_x / 8 + $game_map.pan_ox
@panorama.oy = $game_map.display_y / 8 + $game_map.pan_oy
@panorama.opacity = $game_map.panorama_opacity
end 
end

#_______________________________________________________________________________
# MOG_Battle Panorama 1.6       
#_______________________________________________________________________________
# By Moghunter             
# http://www.atelier-rgss.com
#_______________________________________________________________________________
# CARACTERÍSTICAS
# - Adiciona um panorama em movimento no campo de batalha.
# - Zoom.
# - Movimento aleatório.
#
# UTILIZAÇÃO
# - Defina um panorama qualquer no Tilesets.
# - Modifique o valor da variável que corresponderá a velocidade
#  do panorama de fundo.
# - É necessário que o Battleback tenha alguma transparência
#  para que a visualização do panorama seja possível.
#_______________________________________________________________________________
module MOG
  #Definição da variável que definirá a velocidade na horizontal. 
  BAT_PANO_VARIABLE_ID_X = 16
  #Definição da variável que definirá a velocidade na vertical. 
  BAT_PANO_VARIABLE_ID_Y = 17
  #ID da Switch que ativa o movimento aleatório do panorama.
  BAT_PANO_RAND_SWITCH_ID = 229 
  #Tempo para mudar de direção do panorama.
  BAT_PANO_RAND_TIME = 2  #(s)
  #ID da Switch que ativa o zoom no panorama.
  BAT_PANO_ZOOM_SWITCH_ID = 230
  #Tempo para mudar de zoom (IN para OUT).
  BAT_PANO_ZOOM_TIME = 2  #(s)
  #Poder (Velocidade) do zoom.
  BAT_PANO_ZOOM_SPEED = 0.007
end 

#===============================================================================
# Scene Menu
#===============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# Main
#-------------------------------------------------------------------------- 
  alias mog04_main main
  def main
    @mb = Plane.new
    @mb.bitmap = RPG::Cache.panorama($game_map.panorama_name,0) rescue nil
    @mb.z = -1
    @mbr = 0
    @bat_pano_x = 0
    @bat_pano_y = 0
    @bat_pano_speed_x = 1
    @bat_pano_speed_y = 1
    @bat_pano_zoom_x = 0
    @bat_pano_zoom_y = 0
    @bat_pano_zoom_time_x = 0
    @bat_pano_zoom_time_y = 0
    mog04_main
    @mb.dispose
  end
#--------------------------------------------------------------------------
# Update
#-------------------------------------------------------------------------- 
alias mog04_update update
def update 
  if $game_switches[MOG::BAT_PANO_RAND_SWITCH_ID] == true
    @mbr += 1
    if @mbr > 40 * MOG::BAT_PANO_RAND_TIME
      @mbr = 0
      case rand(2)
      when 0
      @bat_pano_x = 0
      when 1
      @bat_pano_x = 1
    end
    case rand(2)
      when 0
        @bat_pano_y = 0
      when 1
        @bat_pano_y = 1
    end
    case rand(2)
      when 0
      @bat_pano_speed_x = 1
      when 1
      @bat_pano_speed_x = 2
    end
    case rand(2)
      when 0
        @bat_pano_speed_y = 1
      when 1
        @bat_pano_speed_y = 2
    end
  end
  if @bat_pano_x == 0
    @mb.ox += $game_variables[MOG::BAT_PANO_VARIABLE_ID_X] * @bat_pano_speed_x
  else
    @mb.ox -= $game_variables[MOG::BAT_PANO_VARIABLE_ID_X] * @bat_pano_speed_x   
  end
  if @bat_pano_y == 0
    @mb.oy += $game_variables[MOG::BAT_PANO_VARIABLE_ID_Y] * @bat_pano_speed_y
  else
    @mb.oy -= $game_variables[MOG::BAT_PANO_VARIABLE_ID_Y] * @bat_pano_speed_y
  end
  else
    @mb.ox += $game_variables[MOG::BAT_PANO_VARIABLE_ID_X]
    @mb.oy += $game_variables[MOG::BAT_PANO_VARIABLE_ID_Y]
  end
  if $game_switches[MOG::BAT_PANO_ZOOM_SWITCH_ID] == true
    if  @bat_pano_zoom_x > 1
      @bat_pano_zoom_x = 0
    end
    if  @bat_pano_zoom_y > 1
      @bat_pano_zoom_y = 0
    end
    @bat_pano_zoom_time_x += 1
    @bat_pano_zoom_time_y += 1
    if @bat_pano_zoom_time_x > 40 * MOG::BAT_PANO_ZOOM_TIME
      @bat_pano_zoom_time_x = 0 
      @bat_pano_zoom_x += 1
    end
    if @bat_pano_zoom_time_y > 40 * MOG::BAT_PANO_ZOOM_TIME
      @bat_pano_zoom_time_y = 0 
      @bat_pano_zoom_y += 1
    end 
    if @bat_pano_zoom_x == 0
      @mb.zoom_x += MOG::BAT_PANO_ZOOM_SPEED
    elsif @bat_pano_zoom_x == 1
      @mb.zoom_x -= MOG::BAT_PANO_ZOOM_SPEED
    end
    if @bat_pano_zoom_y == 0
      @mb.zoom_y += MOG::BAT_PANO_ZOOM_SPEED
    elsif  @bat_pano_zoom_y == 1
      @mb.zoom_y -= MOG::BAT_PANO_ZOOM_SPEED
    end
    if @mb.zoom_x > 2.0
      @mb.zoom_x = 2.0 
    elsif @mb.zoom_x < 1.0
      @mb.zoom_x = 1.0 
    end
    if @mb.zoom_y > 2.0
      @mb.zoom_y = 2.0 
    elsif @mb.zoom_y < 1.0
      @mb.zoom_y = 1.0 
    end
    end
  mog04_update
  end
end

$mog_rgss_Battle_Panorama = true

Ninja Edit: Wait, nevermind, I tested a copy of my project without those scripts and the problem persists. There's a list of all the scripts I'm currently using:


Bury with my...money!

KK20

It's easier for all of us to just give your scripts.rxdata file

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Simon Greedwell

...Indeed. When it comes to scripts, my project is a bloated behemoth on the verge of collapsing into itself. As requested: 

https://fastupload.io/0gxSu83jKuJcM3P
Bury with my...money!

KK20

Move the Anti Lag script above Heretic's scripts. It has a rewritten Spriteset_Map#update method that was still using the default panorama update logic, essentially ignoring the change I suggested. It even says in the script to put it above other scripts that may have aliased Spriteset_Map#update.
# This script makes changes to update in both Spriteset_Map and Game_Map classes
# There isnt a whole heck of a lot of script to run the optimizations, so if
# you have ANY other script that makes changes to update in either of those
# classes, place those scripts BELOW this one.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Simon Greedwell

June 10, 2022, 09:45:09 am #10 Last Edit: June 10, 2022, 10:01:33 am by Simon Greedwell
Tried that, sadly it didn't work.

Shuffling around the order of the scripts, though, I discovered that putting Mogs' scripts above Heretic's fixes the issue despite my observation earlier but also causes the former to not work at all. So it's a compatibility problem after all.

If it has come to this, I think I'll settle out with using seamless panoramas for the backgrounds. I tested it and while the "hiccups" are still here, they're almost unnoticeable.

   
Bury with my...money!

KK20

What in the world are you even talking about? Moghunter's scripts don't affect anything related to the map. And I literally put your script file into a project (moving Anti Lag as I said) and confirmed it worked.

Here's the project: https://www.dropbox.com/s/536b73lryc2gcdc/ModularPassable.zip?dl=0
Just start the game and walk around

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Simon Greedwell

June 10, 2022, 09:11:01 pm #12 Last Edit: June 10, 2022, 09:43:04 pm by Simon Greedwell
... You're right. And I just copied and pasted the scripts.rxdata file into my project and now it works.

Guess I screwed up something during the process. My bad. Guess this is fixed, I'll just update the title...
Bury with my...money!