Advertisement
LiTTleDRAgo

[RGSS] Drago - Custom Resolution II

Jul 28th, 2014
1,410
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 70.22 KB | None | 0 0
  1. #==============================================================================
  2. # ** Drago - Custom Resolution
  3. # Version : 2.17
  4. # Contact : littledrago.blogspot.com / forum.chaos-project.com
  5. #==============================================================================
  6. ($imported ||= {})[:drg_custom_resolution] = 2.17
  7. #==============================================================================
  8. #
  9. # Introduction :
  10. #
  11. #   Version 2 from previous Drago - Custom Resolution
  12. #
  13. # Issue :
  14. #  
  15. #  - Normal transition didn't work when resolution is more than 640x480
  16. #  - ALT+Enter is disabled by default
  17. #  - Custom menu system will require an edit to match the new resolution
  18. #  - Anything that modify Sprite_Character & Spriteset_Map will require an edit
  19. #
  20. # Script Call :
  21. #
  22. #  Graphics.window
  23. #  Graphics.fullscreen
  24. #  Graphics.fullscreen?     # returns true if game is fullscreen
  25. #
  26. #    $game_map.start_zoom(X, Y, ZOOM_VALUE, DURATION = 20)    
  27. #    $game_map.zoom(X = nil, Y = nil, ZOOM_VALUE)    
  28. #    $game_map.zoom_in(X = nil, Y = nil, DURATION = 20)
  29. #    $game_map.zoom_out(X = nil, Y = nil, DURATION = 20)
  30. #
  31. #    $game_map.reverse(true / false) # Flip the map
  32. #
  33. #    $game_map.start_tilemap_opacity(OPACITY = 255, DURATION = 20)
  34. #    $game_map.start_tilemap_tone(TONE = Tone.new(0,0,0,0), DURATION = 0)
  35. #
  36. #
  37. #    change_tilemap_tone(TONE,*CHARACTER)     # change tilemap tone
  38. #    change_character_tone(TONE,*CHARACTER)   # change character tone without
  39. #                                               changing the tilemap
  40. #
  41. #   X, Y       = Zoom focus
  42. #
  43. #   ZOOM_VALUE = Integer from 1-12
  44. #
  45. #   OPACITY    = Integer from 0-255
  46. #
  47. #   TONE       = [R,G,B,A] or Tone.new(R,G,B,A)
  48. #
  49. #   CHARACTER  = $game_map.events.values # all events
  50. #              = $game_map.events.keys   # all events
  51. #              = $game_player            # player
  52. #              = -1                      # player
  53. #              = 0                       # this event
  54. #              = [2,3,4,6]               # events with selected id
  55. #              = [-1,2,3,4,6]            # player & events with selected id
  56. #              = [0,2,3,4,6]             # this event & events with selected id
  57. #              = (1..99)                 # events in range
  58. #              = [(1..8),20,25,(30..42)] # events in range
  59. #
  60. #    * will not change the character tone if left out
  61. #
  62. # Links :
  63. #
  64. #  - Fantasist's Transitions Pack
  65. #    http://forum.chaos-project.com/index.php/topic,1390.0.html
  66. #  - ForeverZer0's Add-ons
  67. #    http://forum.chaos-project.com/index.php/topic,7862.0.html
  68. #  - ThallionDarkshine's Add-ons
  69. #    http://forum.chaos-project.com/index.php/topic,12655.0.html
  70. #  - Drago Transition Pack
  71. #    http://forum.chaos-project.com/index.php/topic,13488.0.html
  72. #
  73. #  - Adjust Menu Position
  74. #    http://forum.chaos-project.com/index.php/topic,13781.0.html
  75. #
  76. #  - ThallionDarkshine's F12 Fix
  77. #    http://forum.chaos-project.com/index.php/topic,13629.0.html
  78. #  - Zeriab's F12 Pause with images
  79. #    http://forum.chaos-project.com/index.php/topic,3613.0.html
  80. #
  81. # Special Thanks :
  82. #  
  83. # - ForeverZer0 & KK20 for method used in this script
  84. # - Wecoc for autotile addon
  85. #
  86. #==============================================================================
  87.  
  88. module LiTTleDRAgo
  89.  
  90.   SCREEN_SIZE = [640,490]
  91.   # Define the resolution of the game screen. These values can be anything
  92.   # within reason. Centering, viewports, etc. will all be taken care of, but it
  93.   # is recommended that you use values divisible by 32 for best results.
  94.  
  95.  
  96.   AUTOTILE_SPEED = {}
  97.  
  98.   AUTOTILE_SPEED[:map_id] = :speed
  99.   AUTOTILE_SPEED[0]       = 6                              # default speed
  100.   #AUTOTILE_SPEED[35]      = 0                              # unchanged autotile
  101.   #AUTOTILE_SPEED[159]     = 16                            
  102.   # Speed of the autotile based on map_id
  103.  
  104.   CONTROL_SCREEN_SIZE = false
  105.   # Control screen size with a mouse
  106.  
  107.   HIGH_PRIORITY = true
  108.   # Change Game process priority to high
  109.  
  110.   SPRITE_COMPACT = true
  111.   # Keep the sprite to the very minimum number
  112.  
  113.   CHARACTER_Z_FIX = {
  114.     '178-Switch01'  => 0,
  115.     '180-Switch03'  => 0,
  116.     '181-Switch04'  => 0,
  117.     '199-Support07' => 0,
  118.   }
  119.   # Fix the screen_z value for events based on Graphic name.
  120.   # You can also define z value for event by inserting <z: Z_VALUE>
  121.   # on event name.
  122.   # This way, flat events such as pitfall won't overlap with player z value.
  123.  
  124. end
  125.  
  126.  
  127. core = "This script needs Drago - Core Engine ver 1.47 or above"
  128. rmvx = "This script not for RMVX"
  129. implemented = "%1$s has already implemented, Please remove the %1$s script"
  130. zoom = sprintf(implemented,"Map Zoom")
  131. tone = sprintf(implemented,"Tilemap Tone Changer" )
  132.  
  133. ($imported[:drg_core_engine] || 0) >= 1.47 || raise(core)
  134. LiTTleDRAgo::XP || LiTTleDRAgo::VXA  || raise(rmvx)
  135. $imported[:drg_cr_map_zoom]          && raise(zoom)
  136. $imported[:drg_tilemap_tone_changer] && raise(tone)
  137. #==============================================================================
  138. # ** Graphics
  139. #------------------------------------------------------------------------------
  140. #  This module handles all Graphics
  141. #==============================================================================
  142.  
  143. class << Graphics
  144.   #-------------------------------------------------------------------------
  145.   # * Alias Listing
  146.   #-------------------------------------------------------------------------
  147.   alias_sec_method :zer0_graphics_transition,            :transition
  148.   alias_sec_method :drg_resolution_change_resize_screen, :resize_screen
  149.   alias_sec_method :drg_resolution_change_update,        :update
  150.   #-------------------------------------------------------------------------
  151.   # * Aliased method: resize_screen
  152.   #-------------------------------------------------------------------------
  153.   def resize_screen(width, height)
  154.     width = (width / 32.0).round * 32
  155.     height = (height / 32.0).round * 32
  156.     if $game_map.respond_to?(:screen_size)
  157.       $game_map.screen_size[0] = width
  158.       $game_map.screen_size[1] = height
  159.     end
  160.     drg_resolution_change_resize_screen(width, height)
  161.   end
  162.   #-------------------------------------------------------------------------
  163.   # * Aliased method: transition
  164.   #-------------------------------------------------------------------------
  165.   def transition(duration = 8, *args)
  166.     if width <= 640 && height <= 480
  167.       return zer0_graphics_transition(duration, *args)
  168.     end
  169.     if duration > 0
  170.       viewport = Viewport.new(0,0,width,height)
  171.       sprite  = Sprite.new(viewport)
  172.       sprite.bitmap = Graphics.snap_to_bitmap
  173.       sprite2 = Sprite.new(viewport)
  174.       sprite2.z = sprite.z - 10
  175.       sprite2.blend_type = 1
  176.       zer0_graphics_transition(0)
  177.       fade = 255 / duration
  178.       if (file = args.at(0)).is_a?(String)
  179.         bitmap = Bitmap.new(file)
  180.         sprite2.bitmap = bitmap.stretch(width,height)
  181.         bitmap.dispose
  182.       end
  183.       duration.times {[sprite,sprite2].each {|s|s.opacity -= fade} && update }
  184.       [sprite.bitmap, sprite2.bitmap, sprite, sprite2, viewport].dispose
  185.     end
  186.     zer0_graphics_transition(0)
  187.   end
  188.   #-------------------------------------------------------------------------
  189.   # * Aliased method: update
  190.   #-------------------------------------------------------------------------
  191.   def update
  192.     drg_resolution_change_update
  193.     update_resolution_adjust
  194.   end
  195.   #-------------------------------------------------------------------------
  196.   # * New method: update_resolution_adjust
  197.   #-------------------------------------------------------------------------
  198.   def update_resolution_adjust
  199.     return unless LiTTleDRAgo::XP && $game_player
  200.     return unless Game_Player.const_defined?(:CENTER_X)
  201.     change   = Game_Player.const_get(:CENTER_X) != $game_player.center_x
  202.     change ||= Game_Player.const_get(:CENTER_Y) != $game_player.center_y
  203.     return unless change
  204.     resize_screen(width,height)
  205.     $game_player.center($game_player.x,$game_player.y)
  206.   end
  207.   #-------------------------------------------------------------------------
  208.   # * Overwriten method: fullscreen
  209.   #-------------------------------------------------------------------------
  210.   def fullscreen
  211.     @fullscreen = true
  212.     fill_monitor
  213.     LiTTleDRAgo.hide_borders
  214.   end
  215.   #-------------------------------------------------------------------------
  216.   # * Overwriten method: window
  217.   #-------------------------------------------------------------------------
  218.   def window
  219.     @fullscreen = false
  220.     LiTTleDRAgo.show_borders
  221.     if $game_map && $game_map.screen_size.all? {|s| s.is_a?(Numeric)}
  222.       x,y = $game_map.screen_size[0..1]
  223.       x += ($game_map.screen_size[2] ||= 1)
  224.       $game_map.screen_size[2] *= -1
  225.       drg_resolution_change_resize_screen(x,y)
  226.     else
  227.       x,y = LiTTleDRAgo::SCREEN_SIZE
  228.     end
  229.     resize_screen(x,y)
  230.   end
  231.   #-------------------------------------------------------------------------
  232.   # * Overwriten method: fullscreen?
  233.   #-------------------------------------------------------------------------
  234.   define_method(:fullscreen?) { @fullscreen == true }
  235. end
  236.  
  237. Graphics.window
  238. Graphics.disable_alt_enter
  239. Graphics.control_screen_size LiTTleDRAgo::CONTROL_SCREEN_SIZE
  240. Graphics.high_priority     = LiTTleDRAgo::HIGH_PRIORITY
  241. GC.start
  242. #==============================================================================
  243. # ** Game_Map
  244. #------------------------------------------------------------------------------
  245. #  This class handles the map. It includes scrolling and passable determining
  246. #  functions. Refer to "$game_map" for the instance of this class.
  247. #==============================================================================
  248.  
  249. class Game_Map
  250.   #--------------------------------------------------------------------------
  251.   # * Public Instance Variable
  252.   #--------------------------------------------------------------------------
  253.   attr_sec_accessor :zoom_x, :zoom_y, 'Integer(1)'
  254.   attr_sec_accessor :screen_size,     'LiTTleDRAgo::SCREEN_SIZE'
  255.   attr_sec_accessor :tilemap_tone,    'Tone.new(0,0,0)'
  256.   attr_sec_accessor :tilemap_opacity, 'Integer(255)'
  257.   attr_sec_accessor :tilemap_hue,     'Integer(0)'
  258.   #---------------------------------------------------------------------------
  259.   # * Redirect Listing
  260.   #---------------------------------------------------------------------------
  261.   [:tilemap_tone,:tilemap_opacity].each do |meth|
  262.     redirect_method :"#{meth}_changing?",   "(@#{meth}_duration ||= 0) > 0"
  263.   end
  264.   #---------------------------------------------------------------------------
  265.   # * Define Sec Listing
  266.   #---------------------------------------------------------------------------
  267.   define_sec_method(:zooming?)      {(@zoom_duration ||= 0) > 0}
  268.   define_sec_method(:screen_tile_x) {(Graphics.width  / 32.0).ceil}
  269.   define_sec_method(:screen_tile_y) {(Graphics.height / 32.0).ceil}
  270.   #-------------------------------------------------------------------------
  271.   # * Alias Listing
  272.   #-------------------------------------------------------------------------
  273.   alias_sec_method(:drg_scroll_right_adjust, :scroll_right)
  274.   alias_sec_method(:drg_scroll_down_adjust,  :scroll_down)
  275.   alias_sec_method(:tilemap_effect_update,   :update)
  276.   alias_sec_method(:get_map_data,            :data)
  277.   #--------------------------------------------------------------------------
  278.   # * Aliased method: Scroll Down
  279.   #--------------------------------------------------------------------------
  280.   def scroll_down(distance)
  281.     times = vxa_map_multiplier
  282.     if loop_vertical?
  283.       @display_y += distance
  284.       @display_y %= height * times
  285.       @parallax_y += distance if @parallax_y && @parallax_loop_y
  286.     else
  287.       last_y = @display_y
  288.       result = [@display_y + distance, (map_edge.at(1) / zoom_y)].min
  289.       drg_scroll_down_adjust(distance)
  290.       @display_y = result
  291.     end
  292.   end
  293.   #--------------------------------------------------------------------------
  294.   # * Aliased method: Scroll Right
  295.   #--------------------------------------------------------------------------
  296.   def scroll_right(distance)
  297.     times = vxa_map_multiplier
  298.     if loop_horizontal?
  299.       @display_x += distance
  300.       @display_x %= width * times
  301.       @parallax_x += distance if @parallax_x && @parallax_loop_x
  302.     else
  303.       last_x = @display_x
  304.       result = [@display_x + distance, (map_edge.at(0) / zoom_x)].min
  305.       drg_scroll_right_adjust(distance)
  306.       @display_x = result
  307.     end
  308.   end
  309.   #--------------------------------------------------------------------------
  310.   # * New method: zoom
  311.   #--------------------------------------------------------------------------
  312.   def zoom(*zoom)
  313.     if zoom.size == 1
  314.       zoom = (zoom.first)
  315.     elsif zoom.size == 3
  316.       x,y,zoom = zoom[0..2]
  317.     end
  318.     return unless zoom.is_a?(Numeric)
  319.     old_zoom = @zoom_x
  320.     @zoom_x = [[zoom,12].min, 1].max
  321.     @zoom_y = [[zoom,12].min, 1].max
  322.     $game_player.center(x,y) if x && y
  323.   end
  324.   #--------------------------------------------------------------------------
  325.   # * New method: zoom_in
  326.   #--------------------------------------------------------------------------
  327.   def zoom_in(x = nil,y = nil, duration = 20)
  328.     start_zoom(x,y, zoom_x >= 1 ? zoom_x + 1 : 1, duration)
  329.   end    
  330.   #--------------------------------------------------------------------------
  331.   # * New method: zoom_out
  332.   #--------------------------------------------------------------------------
  333.   def zoom_out(x = nil,y = nil,duration = 20)
  334.     start_zoom(x,y, zoom_x - 1 >= 1 ? zoom_x - 1 : zoom_x - 0.5, duration)
  335.   end
  336.   #--------------------------------------------------------------------------
  337.   # * New method: map_edge
  338.   #--------------------------------------------------------------------------
  339.   def map_edge
  340.     times = vxa_map_multiplier
  341.     [_w = [(width  * zoom_x - screen_tile_x).ceil * times, 0].max,
  342.      _h = [(height * zoom_y - screen_tile_y).ceil * times, 0].max]
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # * New method: autotile_speed
  346.   #--------------------------------------------------------------------------
  347.   def autotile_speed(id = @map_id)
  348.     speed = LiTTleDRAgo::AUTOTILE_SPEED
  349.     @autotile_speed.is_a?(Array) || @autotile_speed = []
  350.     @autotile_speed[id] ||= (speed[id] || speed[0] || 0)
  351.   end
  352.   #--------------------------------------------------------------------------
  353.   # * New method: autotile_speed=
  354.   #--------------------------------------------------------------------------
  355.   def autotile_speed=(*value)
  356.     @autotile_speed.is_a?(Array) || @autotile_speed = []
  357.     @autotile_speed[@map_id]     = [value.first,0].max if value.size == 1
  358.     @autotile_speed[value.first] = [value.at(1),0].max if value.size > 1
  359.   end
  360.   #--------------------------------------------------------------------------
  361.   # * New method: vxa_map_multiplier
  362.   #--------------------------------------------------------------------------
  363.   def vxa_map_multiplier
  364.     LiTTleDRAgo::VXA ? 1 : 128
  365.   end
  366.   #--------------------------------------------------------------------------
  367.   # * New method: screen_is_solid?
  368.   #--------------------------------------------------------------------------
  369.   def screen_is_solid?
  370.     tone = screen.tone.to_s.gsub(/([(),0 ])/i){''}
  371.     return true if tone['255.255.255.']
  372.     return true if tone['255.-255.-255.']
  373.     return true if tone['-255.255.-255.']
  374.     return true if tone['-255.-255.255.']
  375.     return true if tone['255.255.-255.']
  376.     return true if tone['255.-255.255.']
  377.     return true if tone['-255.255.255.']
  378.     return true if tone['-255.-255.-255.']
  379.   end
  380.   #--------------------------------------------------------------------------
  381.   # * Aliased method: data
  382.   #--------------------------------------------------------------------------
  383.   def data
  384.     data = self.reverse ? reverse_data : get_map_data
  385.     data.make_changes = true
  386.     data
  387.   end
  388.   #--------------------------------------------------------------------------
  389.   # * New method: reverse_data
  390.   #--------------------------------------------------------------------------
  391.   def reverse_data
  392.     @reverse_data ||= []
  393.     @reverse_data[@map_id] ||= get_map_data.reverse(true,false,false)
  394.   end
  395.   #--------------------------------------------------------------------------
  396.   # * New method: reverse=
  397.   #--------------------------------------------------------------------------
  398.   def reverse=(val)
  399.     return val if @reverse == val
  400.     @reverse = ((@reverse_data||=[])[@map_id] = nil) || val
  401.     spriteset && spriteset.reload_tilemap
  402.     @reverse
  403.   end
  404.   #--------------------------------------------------------------------------
  405.   # * New method: reverse
  406.   #--------------------------------------------------------------------------
  407.   def reverse
  408.     @reverse && LiTTleDRAgo::XP
  409.   end
  410.   #--------------------------------------------------------------------------
  411.   # * New method: start_tilemap_tone
  412.   #--------------------------------------------------------------------------
  413.   def start_tilemap_tone(tone = Tone.new(0,0,0,0), duration = 0)
  414.     @tilemap_tone_target = tone.is_a?(Array) ? Tone.new(*tone) : tone.clone
  415.     @tilemap_tone_duration = duration
  416.     tilemap_tone_changing? || @tilemap_tone = @tilemap_tone_target.clone
  417.   end
  418.   #--------------------------------------------------------------------------
  419.   # * New method: start_tilemap_opacity
  420.   #--------------------------------------------------------------------------
  421.   def start_tilemap_opacity(opacity = 255, duration = 0)
  422.     @tilemap_opacity_target = opacity * 1.0
  423.     @tilemap_opacity_duration = duration
  424.     tilemap_opacity_changing? || @tilemap_opacity = @tilemap_opacity_target
  425.   end
  426.   #--------------------------------------------------------------------------
  427.   # * New method: update_tilemap_tone
  428.   #--------------------------------------------------------------------------
  429.   def update_tilemap_tone
  430.     if tilemap_tone_changing?
  431.       d = @tilemap_tone_duration
  432.       target = @tilemap_tone_target
  433.       @tilemap_tone.red   = (@tilemap_tone.red   * (d - 1) + target.red) / d
  434.       @tilemap_tone.green = (@tilemap_tone.green * (d - 1) + target.green) / d
  435.       @tilemap_tone.blue  = (@tilemap_tone.blue  * (d - 1) + target.blue) / d
  436.       @tilemap_tone.gray  = (@tilemap_tone.gray  * (d - 1) + target.gray) / d
  437.       @tilemap_tone_duration -= 1
  438.       tilemap_tone_changing? || @tilemap_tone = @tilemap_tone_target.clone
  439.     end
  440.   end
  441.   #--------------------------------------------------------------------------
  442.   # * New method: update_tilemap_opacity
  443.   #--------------------------------------------------------------------------
  444.   def update_tilemap_opacity
  445.     if tilemap_opacity_changing?
  446.       d = @tilemap_opacity_duration
  447.       @tilemap_opacity = (@tilemap_opacity * (d - 1) +
  448.       @tilemap_opacity_target) / d
  449.       @tilemap_opacity_duration -= 1
  450.       tilemap_opacity_changing? || @tilemap_opacity = @tilemap_opacity_target
  451.     end
  452.   end
  453.   #--------------------------------------------------------------------------
  454.   # * New method: start_zoom
  455.   #--------------------------------------------------------------------------
  456.   def start_zoom(x,y, zoom_target, duration=20)
  457.     @x_zoom = x
  458.     @y_zoom = y
  459.     @zoom_target = zoom_target * 1.0
  460.     @zoom_duration = @zoom_x == @zoom_target ? 0 : duration
  461.     zooming? || zoom(@x_zoom,@y_zoom,@zoom_target)
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # * New method: update_zooming
  465.   #--------------------------------------------------------------------------
  466.   def update_zooming
  467.     if zooming?
  468.       d = @zoom_duration
  469.       power = (@zoom_x * (d - 1) + @zoom_target) / d
  470.       @zoom_duration -= 1
  471.       zoom(@x_zoom,@y_zoom,power)
  472.       zoom(@x_zoom,@y_zoom,@zoom_target) unless zooming?
  473.     end
  474.   end
  475.   #--------------------------------------------------------------------------
  476.   # * Aliased method: update
  477.   #--------------------------------------------------------------------------
  478.   def update(*args)
  479.     tilemap_effect_update(*args)
  480.     update_tilemap_tone
  481.     update_tilemap_opacity
  482.     update_zooming
  483.   end
  484. end
  485. #==============================================================================
  486. # ** Interpreter
  487. #------------------------------------------------------------------------------
  488. #  This interpreter runs event commands. This class is used within the
  489. #  Game_System class and the Game_Event class.
  490. #==============================================================================
  491. unless LiTTleDRAgo::VX  
  492.   class Interpreter
  493.     #---------------------------------------------------------------------------
  494.     # * Redirect Listing
  495.     #---------------------------------------------------------------------------
  496.     redirect_method :zoom,                  '$game_map.zoom'
  497.     redirect_method :zoom_in,               '$game_map.zoom_in'
  498.     redirect_method :zoom_out,              '$game_map.zoom_out'
  499.     redirect_method :start_zoom,            '$game_map.start_zoom'
  500.     redirect_method :start_tilemap_opacity, '$game_map.start_tilemap_opacity'
  501.     redirect_method :start_tilemap_tone,    '$game_map.start_tilemap_tone'
  502.     [:change_tilemap_tone,:change_character_tone].each do |meth|
  503.       redirect_method :"#{meth}", :"$game_map.spriteset.#{meth}"
  504.     end
  505.   end
  506. end
  507.  
  508. #==============================================================================
  509. # ** Game_Player
  510. #------------------------------------------------------------------------------
  511. #  This class handles the player. Its functions include event starting
  512. #  determinants and map scrolling. Refer to "$game_player" for the one
  513. #  instance of this class.
  514. #==============================================================================
  515. class Game_Player
  516.   #---------------------------------------------------------------------------
  517.   # * Define Sec Listing
  518.   #---------------------------------------------------------------------------
  519.   define_sec_method(:center_x) {((Graphics.width/2)  / $game_map.zoom_x-16) * 4}
  520.   define_sec_method(:center_y) {((Graphics.height/2) / $game_map.zoom_y-16) * 4}
  521.   #-------------------------------------------------------------------------
  522.   # * Alias Listing
  523.   #-------------------------------------------------------------------------
  524.   alias_sec_method(:drg_adjust_viewport_center, :center)
  525.   #-------------------------------------------------------------------------
  526.   # * Aliased method: center
  527.   #-------------------------------------------------------------------------
  528.   def center(x, y)
  529.     if LiTTleDRAgo::XP
  530.       Game_Player.const_set(:CENTER_X, center_x)
  531.       Game_Player.const_set(:CENTER_Y, center_y)
  532.     end
  533.     drg_adjust_viewport_center(x, y)
  534.     max_x = $game_map.map_edge.at(0) / $game_map.zoom_x
  535.     max_y = $game_map.map_edge.at(1) / $game_map.zoom_y
  536.     if LiTTleDRAgo::XP
  537.       $game_map.display_x = [0, [(x * 32*4) - center_x, max_x.ceil].min].max
  538.       $game_map.display_y = [0, [(y * 32*4) - center_y, max_y.ceil].min].max
  539.     elsif $game_map.respond_to?(:set_display_pos)
  540.       $game_map.set_display_pos(x - center_x, y - center_y)
  541.     end
  542.   end  
  543. end
  544.  
  545. #==============================================================================
  546. # ** Tilemap
  547. #------------------------------------------------------------------------------
  548. #  
  549. #==============================================================================
  550. class Tilemap
  551.   #---------------------------------------------------------------------------
  552.   # * Public Instance Variables
  553.   #---------------------------------------------------------------------------
  554.   method_defined?(:tileset)   || attr_accessor(:tileset)
  555.   method_defined?(:priorities)|| attr_accessor(:priorities)
  556.   method_defined?(:autotiles) || attr_sec_accessor(:autotiles,'Array.new')
  557. end
  558.  
  559. #==============================================================================
  560. # ** Table
  561. #------------------------------------------------------------------------------
  562. #  
  563. #==============================================================================
  564. class Table
  565.   #--------------------------------------------------------------------------
  566.   # * Public Instance Variable
  567.   #--------------------------------------------------------------------------
  568.   attr_sec_accessor :table_changes, :orig_value, 'Array.new'
  569.   attr_accessor     :make_changes
  570.   #--------------------------------------------------------------------------
  571.   # * Alias Listing
  572.   #--------------------------------------------------------------------------
  573.   alias_sec_method :set_method, :"[]="
  574.   #--------------------------------------------------------------------------
  575.   # * Set Data
  576.   #--------------------------------------------------------------------------
  577.   def []=(*args)
  578.     if @make_changes
  579.       table_changes.push([*args]) && orig_value.push(self[*args[0..-2]])
  580.       @make_changes = false
  581.     end
  582.     set_method(*args)
  583.   end
  584.   #--------------------------------------------------------------------------
  585.   # * Reverse
  586.   #--------------------------------------------------------------------------
  587.   def reverse(rx=true,ry=true,rz=true)
  588.     reverse = self.clone
  589.     _x = (0...xsize).to_a
  590.     _y = (0...ysize).to_a
  591.     _z = (0...zsize).to_a
  592.     _x.each do |x|
  593.       _rx = rx ? _x[-1-x] : x
  594.        ysize == 1 && (reverse[x] = self[_rx]) && next
  595.       _y.each do |y|
  596.         _ry = ry ? _y[-1-y] : y
  597.         zsize == 1 && (reverse[x,y] = self[_rx,_ry]) && next
  598.         _z.each do |z|
  599.           _rz = rz ? _z[-1-z] : z
  600.           reverse[x,y,z] = self[_rx,_ry,_rz]
  601.         end
  602.       end
  603.     end
  604.     reverse
  605.   end
  606. end
  607.  
  608. #==============================================================================
  609. # ** RPG::Cache
  610. #==============================================================================
  611. ModCache = LiTTleDRAgo.cache
  612. module ModCache
  613.   #----------------------------------------------------------------------------
  614.   # * Self
  615.   #----------------------------------------------------------------------------
  616.   class << self
  617.     #--------------------------------------------------------------------------
  618.     # * Constant
  619.     #--------------------------------------------------------------------------
  620.     AUTO_INDEX = [[
  621.       [27,28,33,34],  [ 5,28,33,34],  [27, 6,33,34],  [ 5, 6,33,34],
  622.       [27,28,33,12],  [ 5,28,33,12],  [27, 6,33,12],  [ 5, 6,33,12],
  623.       [27,28,11,34],  [ 5,28,11,34],  [27, 6,11,34],  [ 5, 6,11,34],
  624.       [27,28,11,12],  [ 5,28,11,12],  [27, 6,11,12],  [ 5, 6,11,12],
  625.       [25,26,31,32],  [25, 6,31,32],  [25,26,31,12],  [25, 6,31,12],
  626.       [15,16,21,22],  [15,16,21,12],  [15,16,11,22],  [15,16,11,12],
  627.       [29,30,35,36],  [29,30,11,36],  [ 5,30,35,36],  [ 5,30,11,36],
  628.       [39,40,45,46],  [ 5,40,45,46],  [39, 6,45,46],  [ 5, 6,45,46],
  629.       [25,30,31,36],  [15,16,45,46],  [13,14,19,20],  [13,14,19,12],
  630.       [17,18,23,24],  [17,18,11,24],  [41,42,47,48],  [ 5,42,47,48],
  631.       [37,38,43,44],  [37, 6,43,44],  [13,18,19,24],  [13,14,43,44],
  632.       [37,42,43,48],  [17,18,47,48],  [13,18,43,48],  [ 1, 2, 7, 8]],
  633.      
  634.      [[27,28,33,34],  [49,50,55,56],  [51,52,57,58],  [49,52,55,58],
  635.       [63,64,69,70],  [65,66,71,72],  [51,52,69,70],  [ 5, 6,33,12],
  636.       [61,62,67,68],  [49,50,67,68],  [53,54,59,60],  [ 5, 6,11,34],
  637.       [61,64,67,70],  [ 5,28,11,12],  [27, 6,11,12],  [ 5, 6,11,12],
  638.       [25,26,31,32],  [25, 6,31,32],  [25,26,31,12],  [25, 6,31,12],
  639.       [15,16,21,22],  [15,16,21,12],  [15,16,11,22],  [15,16,11,12],
  640.       [29,30,35,36],  [29,30,11,36],  [ 5,30,35,36],  [ 5,30,11,36],
  641.       [39,40,45,46],  [ 5,40,45,46],  [39, 6,45,46],  [ 5, 6,45,46],
  642.       [25,30,31,36],  [15,16,45,46],  [13,14,19,20],  [13,14,19,12],
  643.       [17,18,23,24],  [17,18,11,24],  [41,42,47,48],  [ 5,42,47,48],
  644.       [37,38,43,44],  [37, 6,43,44],  [13,18,19,24],  [13,14,43,44],
  645.       [37,42,43,48],  [17,18,47,48],  [13,18,43,48],  [ 1, 2, 7, 8]]
  646.     ].freeze
  647.     #--------------------------------------------------------------------------
  648.     # * Public Instance Variable
  649.     #--------------------------------------------------------------------------
  650.     attr_sec_reader :cache, 'Hash.new'
  651.     #--------------------------------------------------------------------------
  652.     # * New method: autotile_cr_tilemap
  653.     #--------------------------------------------------------------------------
  654.     def autotile_cr_tilemap(filename)
  655.       key = "Graphics/Autotiles/CR#{filename}"
  656.       if !@cache.include?(key) || @cache[key].disposed?
  657.         @cache[key] = (filename=='') ? Bitmap.new(128,96) : autotile(filename)
  658.         new_bm = self.format_autotiles(@cache[key], filename)
  659.         @cache[key].dispose
  660.         @cache[key] = new_bm
  661.         @cache[key].instance_variable_set(:@autotile_name, filename)
  662.       end
  663.       return @cache[key]
  664.     end
  665.     #--------------------------------------------------------------------------
  666.     # * New method: include?
  667.     #--------------------------------------------------------------------------
  668.     unless method_defined?(:include?)
  669.       def include?(key)
  670.         @cache[key] && !@cache[key].disposed?
  671.       end
  672.     end
  673.     #--------------------------------------------------------------------------
  674.     # * New method: format_autotiles
  675.     #--------------------------------------------------------------------------
  676.     def format_autotiles(bitmap, filename)
  677.       if bitmap.height > 32
  678.         frames = bitmap.width / 96
  679.         index = bitmap.height == 192 ? AUTO_INDEX[1] : AUTO_INDEX[0]
  680.         template = Bitmap.new(256*frames,192)
  681.         frames.times {|a| (0...6).each { |i| (0...8).each { |j|
  682.           index[8*i+j].each { |number|
  683.             number -= 1
  684.             x, y = 16 * (number % 6), 16 * (number / 6)
  685.             ox, oy = (32 * j + x % 32) + (a * 256), 32 * i + y % 32
  686.             rect = Rect.new(x + (a * 96), y, 16, 16)
  687.             template.blt(ox, oy, bitmap, rect)
  688.         }}}}
  689.         return template
  690.       else
  691.         return bitmap
  692.       end
  693.     end
  694.     #--------------------------------------------------------------------------
  695.     # * New method: tile
  696.     #--------------------------------------------------------------------------
  697.     unless method_defined?(:format_tile)
  698.       def format_tile(bitmap, tile_id, hue)
  699.         filename = bitmap.pathname
  700.         key = [filename, tile_id, hue]
  701.         unless include?(key)
  702.           @cache[key] = empty_bitmap
  703.           x = (tile_id - 384) % 8 * 32
  704.           y = (tile_id - 384) / 8 * 32
  705.           rect = Rect.new(x, y, 32, 32)
  706.           @cache[key].blt(0, 0, bitmap, rect)
  707.           @cache[key].hue_change(hue)
  708.         end
  709.         @cache[key]
  710.       end
  711.     end
  712.     #--------------------------------------------------------------------------
  713.     # * New method: clear_tile_cache
  714.     #--------------------------------------------------------------------------
  715.     def clear_tile_cache
  716.       @cache ||= {}
  717.       @cache.reject! do |keys|
  718.         keys.is_a?(Array) && keys.size == 3 &&
  719.         keys[0].is_a?(String) && keys[0].downcase["tilemap"]
  720.       end
  721.       GC.start
  722.     end
  723.   end
  724. end
  725.  
  726. #==============================================================================
  727. # ** Bitmap
  728. #------------------------------------------------------------------------------
  729. #  
  730. #==============================================================================
  731. class Bitmap
  732.   #--------------------------------------------------------------------------
  733.   # * Public Instance Variable
  734.   #--------------------------------------------------------------------------
  735.   attr_sec_accessor :pathname, 'String.new'
  736.   #--------------------------------------------------------------------------
  737.   # ● Alias Method
  738.   #--------------------------------------------------------------------------
  739.   $@ || alias_method(:cr_path_init, :initialize)
  740.   #--------------------------------------------------------------------------
  741.   # ● Object Initialization
  742.   #--------------------------------------------------------------------------
  743.   def initialize(*args)
  744.     @pathname = args.at(0) if args.at(0).is_a?(String)
  745.     cr_path_init(*args)
  746.   end
  747. end
  748. #==============================================================================
  749. # ** RPG::Weather
  750. #------------------------------------------------------------------------------
  751. #  A class for weather effects (rain, storm, and snow). It is used within the
  752. # Spriteset_Map class.
  753. #==============================================================================
  754. CRWeather = LiTTleDRAgo::VX ? Spriteset_Weather : RPG::Weather
  755. class CRWeather
  756.   #--------------------------------------------------------------------------
  757.   # * Public Instance Variable
  758.   #--------------------------------------------------------------------------
  759.   attr_reader :viewport
  760.   attr_accessor :zoom_x, :zoom_y
  761.   #--------------------------------------------------------------------------
  762.   # * Alias Listing
  763.   #--------------------------------------------------------------------------
  764.   $@ || alias_method(:init_custom_resolution, :initialize)
  765.   #--------------------------------------------------------------------------
  766.   # * Aliased method: initialize
  767.   #--------------------------------------------------------------------------
  768.   def initialize(viewport)
  769.     @viewport = viewport
  770.     init_custom_resolution(@viewport)
  771.   end
  772.   #--------------------------------------------------------------------------
  773.   # * Overwriten method: update
  774.   #--------------------------------------------------------------------------
  775.   def update
  776.     return if @type == 0
  777.     return if $game_map && $game_map.screen_is_solid?
  778.     update_screen if respond_to?(:update_screen)
  779.     @sprites.each {|sprite| update_sprite(sprite) }
  780.   end
  781.   #--------------------------------------------------------------------------
  782.   # * Update Sprite
  783.   #--------------------------------------------------------------------------
  784.   def update_sprite(sprite)
  785.     sprite.ox = @ox
  786.     sprite.oy = @oy
  787.     case @type
  788.     when 1, :rain  then update_sprite_rain(sprite)
  789.     when 2, :storm then update_sprite_storm(sprite)
  790.     when 3, :snow  then update_sprite_snow(sprite)
  791.     end
  792.     create_new_particle(sprite) if sprite.opacity < 64
  793.   end
  794.   #--------------------------------------------------------------------------
  795.   # * Update Sprite [Rain]
  796.   #--------------------------------------------------------------------------
  797.   def update_sprite_rain(sprite)
  798.     sprite.bitmap = @rain_bitmap
  799.     sprite.x -= 2 * sprite.zoom_x
  800.     sprite.y += 16 * sprite.zoom_y
  801.     sprite.opacity -= 8
  802.   end
  803.   #--------------------------------------------------------------------------
  804.   # * Update Sprite [Storm]
  805.   #--------------------------------------------------------------------------
  806.   def update_sprite_storm(sprite)
  807.     sprite.bitmap = @storm_bitmap
  808.     sprite.x -= 8 * sprite.zoom_x
  809.     sprite.y += 16 * sprite.zoom_y
  810.     sprite.opacity -= 12
  811.   end
  812.   #--------------------------------------------------------------------------
  813.   # * Update Sprite [Snow]
  814.   #--------------------------------------------------------------------------
  815.   def update_sprite_snow(sprite)
  816.     sprite.bitmap = @snow_bitmap
  817.     sprite.x -= 2 * sprite.zoom_x
  818.     sprite.y += 8 * sprite.zoom_y
  819.     sprite.opacity -= 8
  820.   end
  821.   #--------------------------------------------------------------------------
  822.   # * Create New Particle
  823.   #--------------------------------------------------------------------------
  824.   def create_new_particle(sprite)
  825.     sprite.x = rand(Graphics.width + 100) - 100 + @ox
  826.     sprite.y = rand(Graphics.height + 200) - 200 + @oy
  827.     sprite.zoom_x = @zoom_x || 1
  828.     sprite.zoom_y = @zoom_y || 1
  829.     sprite.x *= sprite.zoom_x
  830.     sprite.y *= sprite.zoom_y
  831.     sprite.opacity = 160 + rand(96)
  832.   end
  833.   #---------------------------------------------------------------------------
  834.   # * New method: method_missing
  835.   #---------------------------------------------------------------------------
  836.   def method_missing(val,*a,&b)
  837.     en = @sprites.flatten.find_all {|s|s.respond_to?(val.to_sym)}
  838.     if en.empty?
  839.       text = "Undefined method #{val} at #{self.inspect}"
  840.       raise(NoMethodError,text,caller(1))
  841.     end
  842.     return en.map {|s| s.send(val.to_sym,*a,&b)}
  843.   end  
  844. end
  845.  
  846. #==============================================================================
  847. # ** Plane
  848. #------------------------------------------------------------------------------
  849. #  This class is the rewrite of the default plane class
  850. #==============================================================================
  851.  
  852. class CRPlane < Sprite
  853.   #---------------------------------------------------------------------------
  854.   # * Public Instance Variable
  855.   #---------------------------------------------------------------------------
  856.   attr_reader :bitmap
  857.   #---------------------------------------------------------------------------
  858.   # * New method: z=
  859.   #---------------------------------------------------------------------------
  860.   def z=(z)
  861.     super(z * 1000)
  862.   end
  863.   #---------------------------------------------------------------------------
  864.   # * New method: ox=
  865.   #---------------------------------------------------------------------------
  866.   def ox=(ox)
  867.     return if $game_map && $game_map.screen_is_solid?
  868.     return if bitmap.nil? || bitmap.disposed?
  869.     super(ox % bitmap.width)  if bitmap.is_a?(Bitmap)
  870.   end
  871.   #---------------------------------------------------------------------------
  872.   # * New method: oy=
  873.   #---------------------------------------------------------------------------
  874.   def oy=(oy)
  875.     return if $game_map && $game_map.screen_is_solid?
  876.     return if bitmap.nil? || bitmap.disposed?
  877.     super(oy % bitmap.height) if bitmap.is_a?(Bitmap)
  878.   end
  879.   #---------------------------------------------------------------------------
  880.   # * New method: dispose
  881.   #---------------------------------------------------------------------------
  882.   def dispose
  883.     @plane && (@plane.disposed? || @plane.dispose)
  884.     super unless disposed?
  885.   end
  886.   #---------------------------------------------------------------------------
  887.   # * New method: bitmap=
  888.   #---------------------------------------------------------------------------
  889.   def bitmap=(tile)
  890.     return if @bitmap == tile
  891.     @bitmap = tile
  892.     if @bitmap.is_a?(Bitmap)
  893.       xx = 1 + (Graphics.width.to_f / tile.width).ceil
  894.       yy = 1 + (Graphics.height.to_f / tile.height).ceil
  895.       @plane.dispose if @plane.respond_to?(:dispose) && @plane.not.disposed?
  896.       @plane = Bitmap.new(@bitmap.width * xx, @bitmap.height * yy)
  897.       (0..xx).each {|x| (0..yy).each {|y|
  898.         @plane.blt(x * @bitmap.width, y * @bitmap.height, @bitmap, @bitmap.rect)
  899.       }}
  900.       super(@plane)
  901.     else
  902.       super(nil)
  903.     end
  904.   end
  905.   #---------------------------------------------------------------------------
  906.   # * Undefine methods dealing with coordinates to do nothing.
  907.   #---------------------------------------------------------------------------
  908.   undef :x, :x=, :y, :y=   if method_defined?(:x)
  909. end
  910.  
  911. #==============================================================================
  912. # ** Viewport
  913. #------------------------------------------------------------------------------
  914. #  
  915. #==============================================================================
  916. class Viewport
  917.   #--------------------------------------------------------------------------
  918.   # * Overwriten method: update_viewport_sizes
  919.   #--------------------------------------------------------------------------
  920.   def update_viewport_sizes
  921.     map = $game_map
  922.     w, h = Graphics.width, Graphics.height
  923.     hor = $game_map.loop_horizontal?
  924.     ver = $game_map.loop_vertical?
  925.     _w = ($game_map.width  * 32 * $game_map.zoom_x).floor
  926.     _h = ($game_map.height * 32 * $game_map.zoom_y).floor
  927.     dx = w > _w && !hor ? ((w - _w).floor.abs / 32) * 16 : 0
  928.     dw = hor ? w : [w, $game_map.width  * 32 * $game_map.zoom_x].min  
  929.     dy = h > _h && !ver ? ((h - _h).floor.abs / 32) * 16 : 0
  930.     dh = ver ? h : [h, $game_map.height * 32 * $game_map.zoom_y].min
  931.     resize(Rect.new(dx, dy, dw, dh))
  932.   end
  933. end
  934. #==============================================================================
  935. # ** ZTilemap
  936. #------------------------------------------------------------------------------
  937. #  This class is the rewrite of the default tilemap class
  938. #==============================================================================
  939.  
  940. class ZTilemap  
  941.   #---------------------------------------------------------------------------
  942.   # * Public Instance Variables
  943.   #---------------------------------------------------------------------------
  944.   attr_reader       :map_data,  :viewport
  945.   attr_accessor     :tileset,   :tone,    :priorities, :sprite_compact
  946.   attr_sec_accessor :autotiles, 'Array.new'
  947.   attr_sec_accessor :ox, :oy,   :zoom_x,  :zoom_y, :hue, 'Integer(1)'
  948.   attr_sec_accessor :opacity,  'Integer(255)'
  949.   attr_sec_reader   :layers, :bitmap_layers, :extra_map_data, 'Array.new'
  950.   #---------------------------------------------------------------------------
  951.   # * Redirect Listing
  952.   #---------------------------------------------------------------------------
  953.   redirect_method :width,       '$game_map.screen_tile_x + 2'
  954.   redirect_method :height,      '$game_map.screen_tile_y + 2'
  955.   #---------------------------------------------------------------------------
  956.   # * Define Sec Listing
  957.   #---------------------------------------------------------------------------
  958.   define_sec_method(:all_sprites) { layers.flatten.select {|s| is_sprite?(s)}}
  959.   define_sec_method(:is_sprite?)  { |s|  s.is_a?(Sprite) && s.not.disposed?  }
  960.   #---------------------------------------------------------------------------
  961.   # * Alias Listing
  962.   #---------------------------------------------------------------------------
  963.   alias_method :bitmaps, :autotiles
  964.   #---------------------------------------------------------------------------
  965.   # * Object Initialization
  966.   #---------------------------------------------------------------------------
  967.   def initialize(viewport)
  968.     @viewport       = viewport
  969.     @sprite_compact = false#LiTTleDRAgo::SPRITE_COMPACT
  970.     create_sprites
  971.     create_carrot
  972.   end
  973.   #---------------------------------------------------------------------------
  974.   # * New method: create_sprites
  975.   #---------------------------------------------------------------------------
  976.   def create_sprites
  977.     6.times do |i|
  978.       layers[i] ||= []
  979.       (i % 6 == 0 ? 1 : height).times do |s|
  980.         layers[i][s] = Sprite.new(@viewport) unless is_sprite?(layers[i][s])
  981.       end
  982.       layers[i].each_with_index do |s,r|
  983.         next unless is_sprite?(s)
  984.         s.y = r * 32 * zoom_y      
  985.         s.z = (i % 6 == 0) ? 0 : (r * 32 + 32 + (i % 6) * 32)
  986.         s.mirror = $game_map.reverse
  987.       end
  988.     end
  989.   end
  990.   #---------------------------------------------------------------------------
  991.   # * New method: create_carrot
  992.   #---------------------------------------------------------------------------
  993.   def create_carrot
  994.     @draw_tiles = carrot do |x,y,data,prio|
  995.       [0,1,2].each do |r|
  996.         if (id = data[x,y,r]).to_i == 0 || (layer = prio[id]).nil?
  997.           next
  998.         elsif @layer_clear && @layer_clear.not.include?(layer)
  999.           @bitmap_layers[layer].fill_rect(x*32,y*32,32,32,Color.erase)
  1000.           @layer_clear.push(layer)
  1001.         end
  1002.         refresh_tiles(x,y,r,id)
  1003.       end
  1004.     end
  1005.     @change_tone         = carrot {|s| all_sprites.tone    = (@tone = s)   }
  1006.     @change_opacity      = carrot {|s| all_sprites.opacity = (@opacity = s)}
  1007.     @change_autotile_hue = carrot do |a,old,hue|
  1008.       [old.to_i != 0 && a.hue_change((old - 360).abs)] && a.hue_change(hue)
  1009.     end
  1010.   end
  1011.   #---------------------------------------------------------------------------
  1012.   # * New method: ox=, oy=, zoom_x=, zoom_y=
  1013.   #---------------------------------------------------------------------------
  1014.   [:ox, :oy, :zoom_x, :zoom_y].each do |a|
  1015.     meth = "def %1$s=(%1$s) (@%1$s != %1$s) && (@%1$s = %1$s) && %2$s end"
  1016.     module_eval(sprintf(meth, a ,'adjust_sprites'))
  1017.   end
  1018.   #---------------------------------------------------------------------------
  1019.   # * New method: tone=
  1020.   #---------------------------------------------------------------------------
  1021.   def tone=(*tone)
  1022.     new_tone = tone.flatten.size == 4 ? Tone.new(*tone.flatten) :
  1023.                tone.first.is_a?(Tone) ? tone.first : nil
  1024.     @tone.to_s == new_tone.to_s || @change_tone.call(new_tone.clone)
  1025.   end
  1026.   #---------------------------------------------------------------------------
  1027.   # * New method: opacity=
  1028.   #---------------------------------------------------------------------------
  1029.   def opacity=(opacity)
  1030.     opacity = [[opacity.round,255].min,0].max
  1031.     @opacity == opacity || @change_opacity.call(opacity)
  1032.   end
  1033.   #---------------------------------------------------------------------------
  1034.   # * New method: hue=
  1035.   #---------------------------------------------------------------------------
  1036.   def hue=(hue)
  1037.     return if @hue == (hue % 360)
  1038.     old = self.hue
  1039.     @hue = hue % 360
  1040.     all_autotiles = @autotiles + extra_map_data.map {|m| m[:autotiles]}.flatten
  1041.     @change_autotile_hue.call(all_autotiles.uniq, old, @hue)
  1042.     refresh    
  1043.   end
  1044.   #---------------------------------------------------------------------------
  1045.   # * New method: Adjust Sprites
  1046.   #---------------------------------------------------------------------------
  1047.   def adjust_sprites
  1048.     @times_compact ||= []
  1049.     @layers_used && @layers.size.times do |i|
  1050.       layer = @layers[i]
  1051.       (i % 6 == 0 ? 1 : height).times do |r|
  1052.         sprite = layer[r]
  1053.         d = 32
  1054.         _r = 32 + (i % 6) * 32
  1055.         _y = r * 32 * zoom_y
  1056.         _z = i % 6 == 0 ? 0 : r * d + _r # (r * d + _r)
  1057.         unless is_sprite?(sprite)
  1058.           change = _y <= @viewport.height
  1059.           if @sprite_compact
  1060.             change &&= !char_out_range?(_r, (height-1)*d+_r)
  1061.             change &&= @layers_used[i] > 0
  1062.           end
  1063.           change || next
  1064.           sprite = (layer[r] = Sprite.new(@viewport))
  1065.           sprite.bitmap  = bitmap_layers[i]
  1066.           sprite.tone    = tone if tone
  1067.           sprite.opacity = opacity
  1068.           sprite.mirror  = $game_map.reverse
  1069.           sprite.zoom_x, sprite.zoom_y = zoom_x, zoom_y
  1070.         else
  1071.           change = _y > @viewport.height
  1072.           if (@times_compact[i] ||= 0) < 10 && @sprite_compact
  1073.             change ||=  (r > 0 && char_out_range?(_r, (height-1)*d+_r))
  1074.             change ||=  (r > 0 && @layers_used[i] == 0)
  1075.           end
  1076.           sprite.y, sprite.z = _y, _z.ceil
  1077.           change && [sprite.dispose, @times_compact[i] += 1] && next
  1078.         end
  1079.         sprite.y, sprite.z = _y, _z.ceil
  1080.         _wd = @viewport.width/zoom_x
  1081.         _ox = sprite.mirror ? (sprite.bitmap.width-ox)-_wd  : (_wd+=10) && ox
  1082.         if layer.select { |s| is_sprite?(s) }.size == 1
  1083.           sprite.src_rect.set(_ox, oy, _wd, @viewport.height/zoom_x + 10)
  1084.         else
  1085.           sprite.src_rect.set(_ox, (oy + r*32), _wd, 33)
  1086.         end        
  1087.         sprite.zoom_x, sprite.zoom_y = zoom_x, zoom_y
  1088.       end
  1089.     end
  1090.   end
  1091.   #---------------------------------------------------------------------------
  1092.   # * New method: char_out_range?
  1093.   #---------------------------------------------------------------------------
  1094.   def char_out_range?(z1,z2)
  1095.     return false unless (s = $game_map.spriteset).is_a?(Spriteset_Map)
  1096.     s.character_sprites.all? do |d|
  1097.       d.not.disposed? && d.opacity > 0 && d.visible &&
  1098.       (d.z).not.between?(z1,z2)
  1099.     end
  1100.   end
  1101.   #---------------------------------------------------------------------------
  1102.   # * New method: Frame Dispose
  1103.   #---------------------------------------------------------------------------
  1104.   def dispose
  1105.     all_sprites.each   { |s| s.dispose }
  1106.     bitmap  = bitmap_layers
  1107.     bitmap += extra_map_data.map {|m| m[:autotiles]}.flatten - @autotiles
  1108.     bitmap += extra_map_data.map {|m| m[:tileset]}.flatten
  1109.     bitmap.compact.each { |s| s.disposed? || s.dispose }
  1110.     @layers.clear
  1111.     GC.start
  1112.   end
  1113.   #---------------------------------------------------------------------------
  1114.   # * New method: Change Map Data
  1115.   #---------------------------------------------------------------------------
  1116.   def map_data=(data)
  1117.     return if @map_data == data
  1118.     @map_data = data
  1119.     @map_data_reverse = data.reverse(true,false,false)
  1120.     6.times do |i|
  1121.       bitmap_layers[i].dispose if bitmap_layers[i] && bitmap_layers[i].disposed?
  1122.       bitmap_layers[i] =  Bitmap.new($game_map.width*32,$game_map.height*32)
  1123.       layers[i].each { |s| is_sprite?(s) && s.bitmap = bitmap_layers[i] }
  1124.     end
  1125.     refresh
  1126.   end
  1127.   #---------------------------------------------------------------------------
  1128.   # * New method: Map Data
  1129.   #---------------------------------------------------------------------------
  1130.   def map_data
  1131.     $game_map.reverse ? @map_data_reverse : @map_data
  1132.   end
  1133.   #---------------------------------------------------------------------------
  1134.   # * New method: Change priorities
  1135.   #---------------------------------------------------------------------------
  1136.   def priorities=(priorities)
  1137.     return if @priorities == priorities
  1138.     @priorities = priorities
  1139.     refresh
  1140.   end
  1141.   #---------------------------------------------------------------------------
  1142.   # * New method: Frame Refresh
  1143.   #---------------------------------------------------------------------------
  1144.   def refresh    
  1145.     return unless @priorities && @map_data
  1146.     LiTTleDRAgo.cache.clear_tile_cache
  1147.     @animated_tiles   = []
  1148.     @unrefreshed_tile = []
  1149.     @layers_used      = []
  1150.     7.times do |i|
  1151.       @total_frames   = [] if i == 0
  1152.       @current_frame  = [] if i == 0
  1153.       bm = (@current_frame[i] = @layers_used[i] = 0) && autotiles[i]
  1154.       bm.nil? && @total_frames[i] = 1
  1155.       bm.nil? || @total_frames[i] = bm.width / (bm.height > 32 ? 256 : 32)
  1156.       extra_map_data.each do |data|
  1157.         data[:total_frames]  = [] if i == 0
  1158.         data[:current_frame] = [] if i == 0
  1159.         bm = (data[:current_frame][i] = 0) && data[:autotiles][i]
  1160.         bm.nil? && data[:total_frames][i] = 1
  1161.         bm.nil? || data[:total_frames][i] = bm.width / (bm.height>32 ? 256 : 32)
  1162.       end
  1163.     end
  1164.     _w = @viewport.width
  1165.     _h = @viewport.height
  1166.     layers[0][0].src_rect.set(ox, oy, _w/zoom_x, _h/zoom_y )
  1167.     (0...map_data.xsize).each do |x|
  1168.       (0...map_data.ysize).each do |y|
  1169.         if in_range?(x,y)
  1170.           update_map_changes(x,y)
  1171.         else
  1172.           next if @unrefreshed_tile.include?([x,y])
  1173.           @unrefreshed_tile.push([x,y])
  1174.           @unrefreshed_tile.uniq!
  1175.         end
  1176.       end
  1177.     end
  1178.     adjust_sprites
  1179.   end
  1180.   #---------------------------------------------------------------------------
  1181.   # * New method: Refresh Tiles
  1182.   #---------------------------------------------------------------------------
  1183.   def refresh_tiles(x,y,z,i,d = nil)
  1184.     return if i.nil? || i == 0
  1185.     i < 384 ? refresh_autotile(x,y,z,i,d) : refresh_regular_tile(x,y,z,i,d)
  1186.   end
  1187.   #---------------------------------------------------------------------------
  1188.   # * New method: Refresh Autotile
  1189.   #---------------------------------------------------------------------------
  1190.   def refresh_autotile(x,y,z,id,data)
  1191.     layer  = data.nil? ? @priorities[id]        : data[:priorities][id]
  1192.     tframe = data.nil? ? @total_frames          : data[:total_frames]
  1193.     cframe = data.nil? ? @current_frame         : data[:current_frame]
  1194.     bitmap = data.nil? ? @autotiles.at(id/48-1) : data[:autotiles].at(id/48-1)
  1195.     return if bitmap.nil? || layer.nil?
  1196.     div = (fid = id / 48 - 1) &&(id % 48)
  1197.     if @animated_tiles.not.include?([x,y]) && tframe[fid] > 1
  1198.       @animated_tiles.push([x,y])
  1199.       @animated_tiles.uniq!
  1200.     end
  1201.     rect = Rect.new((div % 8)*32 + cframe[fid] * 256, (div / 8)*32, 32, 32)
  1202.     bitmap_layers[layer].blt(x*32, y*32, bitmap, rect)  
  1203.     @layers_used[layer] = [(@layers_used[layer] + 1) % 10000,1].max    
  1204.   end
  1205.   #---------------------------------------------------------------------------
  1206.   # * New method: Refresh Regular Tile
  1207.   #---------------------------------------------------------------------------
  1208.   def refresh_regular_tile(x,y,z,id,data)
  1209.     tileset = data.nil? ? @tileset        : data[:tileset]
  1210.     layer   = data.nil? ? @priorities[id] : data[:priorities][id]
  1211.     return if layer.nil? || tileset.not.is_a?(Bitmap)
  1212.     bitmap  = LiTTleDRAgo.cache.format_tile(tileset, id, hue)
  1213.     bitmap_layers[layer].blt(x*32, y*32, bitmap, Rect.new(0, 0, 32, 32))
  1214.     @layers_used[layer] = [(@layers_used[layer] + 1) % 10000, 1].max  
  1215.   end  
  1216.   #---------------------------------------------------------------------------
  1217.   # * New method: force_refresh
  1218.   #---------------------------------------------------------------------------
  1219.   def force_refresh
  1220.     refresh
  1221.     (@unrefreshed_tile ||= []).each {|x,y| update_map_changes(x,y)}
  1222.     (@unrefreshed_tile.clear)
  1223.   end
  1224.   #---------------------------------------------------------------------------
  1225.   # * New method: Frame Update
  1226.   #---------------------------------------------------------------------------
  1227.   def update
  1228.     update_map_data
  1229.     update_autotile
  1230.     update_unrefreshed_tile
  1231.   end
  1232.   #---------------------------------------------------------------------------
  1233.   # * New method: Update Unrefreshed Tile
  1234.   #---------------------------------------------------------------------------
  1235.   def update_unrefreshed_tile
  1236.     if @unrefreshed_tile && @unrefreshed_tile.not.empty?
  1237.       unrefreshed = @unrefreshed_tile.select { |x,y| in_range?(x,y) }
  1238.       if unrefreshed.not.empty?
  1239.         (unrefreshed).each {|x,y| update_map_changes(x,y)}
  1240.         (@unrefreshed_tile -= unrefreshed) && adjust_sprites
  1241.       end
  1242.     end
  1243.   end
  1244.   #---------------------------------------------------------------------------
  1245.   # * New method: Update Map Data
  1246.   #---------------------------------------------------------------------------
  1247.   def update_map_data
  1248.     if map_data.table_changes.not.empty?
  1249.       map_data.table_changes.each do|item|
  1250.         x,y,z,tile_id = item
  1251.         update_map_changes(x,y)
  1252.       end
  1253.       map_data.table_changes.clear
  1254.       map_data.make_changes = false
  1255.       adjust_sprites
  1256.     end
  1257.   end
  1258.   #---------------------------------------------------------------------------
  1259.   # * New method: Update the autotile
  1260.   #---------------------------------------------------------------------------
  1261.   def update_autotile
  1262.     return if $game_map.screen_is_solid?
  1263.     speed = $game_map.autotile_speed
  1264.     total = [(@autotile_total || 0) / 10, 0].max
  1265.     if speed > 0 && Graphics.frame_count % (speed + total) == 0
  1266.       7.times do |i|
  1267.         extra_map_data.each do |data|
  1268.           next if (total = data[:total_frames].at(i)) == 0
  1269.           data[:current_frame][i] = (data[:current_frame].at(i) + 1) % total
  1270.         end
  1271.         next if (total = @total_frames.at(i)) == 0
  1272.         @current_frame[i] = (@current_frame.at(i) + 1) % total
  1273.       end
  1274.       animated = @animated_tiles.select { |x,y| in_range?(x,y) }
  1275.       animated.each {|x,y| update_map_changes(x,y) }
  1276.       @autotile_total = animated.size
  1277.     end
  1278.   end
  1279.   #---------------------------------------------------------------------------
  1280.   # * New method: in_range?
  1281.   #---------------------------------------------------------------------------
  1282.   def in_range?(x=nil,y=nil)
  1283.     return false if layers[0].nil? || layers[0][0].nil?
  1284.     rect = @layers[0][0].src_rect
  1285.     _x = x && (x * 32).between?(rect.x-32, rect.x + rect.width)
  1286.     _y = y && (y * 32).between?(rect.y-32, rect.y + rect.height)
  1287.     return _x && _y if x && y
  1288.     return _x if x
  1289.     return _y if y
  1290.     return false
  1291.   end
  1292.   #---------------------------------------------------------------------------
  1293.   # * New method: Update Map Changes
  1294.   #---------------------------------------------------------------------------
  1295.   def update_map_changes(x,y)
  1296.     @layer_clear ||= []
  1297.     @layer_clear.clear
  1298.     draw = [[x,y,map_data,priorities]]  
  1299.     draw += extra_map_data.map {|data|[x,y,data[:map].data,data[:priorities]]}
  1300.     draw.each {|data| @draw_tiles.call(*data)}
  1301.   end    
  1302. end
  1303. #==============================================================================
  1304. # ** Game_Character
  1305. #------------------------------------------------------------------------------
  1306. #  This class deals with characters. It's used as a superclass for the
  1307. #  determinants and map scrolling. Refer to "$game_player" for the one
  1308. #  Game_Player and Game_Event classes.
  1309. #==============================================================================
  1310. class Game_Character
  1311.   #--------------------------------------------------------------------------
  1312.   # * Alias Listing
  1313.   #--------------------------------------------------------------------------
  1314.   alias_sec_method(:screen_x_before_zoom, :screen_x)
  1315.   alias_sec_method(:screen_y_before_zoom, :screen_y)
  1316.   alias_sec_method(:screen_z_before_zoom, :screen_z)
  1317.   #--------------------------------------------------------------------------
  1318.   # * Aliased method: screen_x
  1319.   #--------------------------------------------------------------------------
  1320.   def screen_x(*args)
  1321.     screen_x_before_zoom(*args) * $game_map.zoom_x
  1322.   end
  1323.   #--------------------------------------------------------------------------
  1324.   # * Aliased method: screen_y
  1325.   #--------------------------------------------------------------------------
  1326.   def screen_y(*args)
  1327.     screen_y_before_zoom(*args) * $game_map.zoom_y
  1328.   end
  1329.   #--------------------------------------------------------------------------
  1330.   # * Aliased method: screen_z
  1331.   #--------------------------------------------------------------------------
  1332.   def screen_z(*args)
  1333.     if self.is_a?(Game_Event)
  1334.       return 999                  if @always_on_top
  1335.       return $1.to_i              if self.name[/\<Z:\s*([-]?\d+)\s*\>/i]
  1336.       return screen_z_tilemap_fix if screen_z_tilemap_fix.is_a?(Integer)
  1337.     end
  1338.     return screen_z_before_zoom(*args)
  1339.   end
  1340.   #--------------------------------------------------------------------------
  1341.   # * New method: screen_z_tilemap_fix
  1342.   #--------------------------------------------------------------------------
  1343.   def screen_z_tilemap_fix
  1344.     LiTTleDRAgo::CHARACTER_Z_FIX.each do |key,value|
  1345.       if value.is_a?(Array) && key.is_a?(Integer)
  1346.         return key if value.any?{|v|"#{v}".downcase == @character_name.downcase}
  1347.       elsif key.is_a?(Array) && value.is_a?(Integer)
  1348.         return value if key.any?{|v|"#{v}".downcase == @character_name.downcase}
  1349.       elsif (key.is_a?(String) || key.is_a?(Symbol)) && value.is_a?(Integer)
  1350.         return value if "#{key}".downcase == @character_name.downcase
  1351.       end
  1352.     end
  1353.     return nil
  1354.   end
  1355. end
  1356.  
  1357. #==============================================================================
  1358. # ** Sprite_Character
  1359. #------------------------------------------------------------------------------
  1360. #  This sprite is used to display the character.It observes the Game_Character
  1361. #  class and automatically changes sprite conditions.
  1362. #==============================================================================
  1363. class Sprite_Character
  1364.   #--------------------------------------------------------------------------
  1365.   # * Alias Listing
  1366.   #--------------------------------------------------------------------------
  1367.   alias_sec_method(:zoom_update_scrolling, :update)
  1368.   #--------------------------------------------------------------------------
  1369.   # * Aliased method: update
  1370.   #--------------------------------------------------------------------------
  1371.   def update(*args)
  1372.     if @old_character_zoom_x
  1373.       self.zoom_x = @old_character_zoom_x
  1374.       self.zoom_y = @old_character_zoom_y
  1375.     end
  1376.     zoom_update_scrolling(*args)
  1377.     @old_character_zoom_x = self.zoom_x
  1378.     @old_character_zoom_y = self.zoom_y
  1379.     self.zoom_x *= $game_map.zoom_x
  1380.     self.zoom_y *= $game_map.zoom_y
  1381.   end
  1382.   #--------------------------------------------------------------------------
  1383.   # * New method: in_range?
  1384.   #--------------------------------------------------------------------------
  1385.   unless method_defined?(:in_range?)
  1386.     def in_range?
  1387.       cw = self.src_rect ? self.src_rect.width : 32
  1388.       ch = self.src_rect ? self.src_rect.height : 32
  1389.       return @character.screen_x.round.between?(self.viewport.x - cw,
  1390.         self.viewport.x + self.viewport.width) &&
  1391.       @character.screen_y.round.between?(self.viewport.y - ch,
  1392.         self.viewport.y + self.viewport.height)
  1393.     end
  1394.   end
  1395. end
  1396.  
  1397. #==============================================================================
  1398. # ** Spriteset_Map
  1399. #------------------------------------------------------------------------------
  1400. #  This class brings together map screen sprites, tilemaps, etc.
  1401. #  It's used within the Scene_Map class.
  1402. #==============================================================================
  1403. class Spriteset_Map
  1404.   #---------------------------------------------------------------------------
  1405.   # * Public Instance Variables
  1406.   #---------------------------------------------------------------------------
  1407.   attr_reader :character_sprites, :tilemap
  1408.   attr_reader :viewport1, :viewport2, :viewport3
  1409.   #--------------------------------------------------------------------------
  1410.   # * Alias Listing
  1411.   #--------------------------------------------------------------------------
  1412.   $@ || alias_method(:init_drgcr_tilemap, :initialize)
  1413.   alias_sec_method(:update_drgcr_tilemap, :update)
  1414.   #--------------------------------------------------------------------------
  1415.   # * Aliased method: initialize
  1416.   #--------------------------------------------------------------------------
  1417.   def initialize(*args)
  1418.     check_autotile_height
  1419.     init_drgcr_tilemap(*args)
  1420.   end
  1421.   #---------------------------------------------------------------------------
  1422.   # * New method: check_autotile_height
  1423.   #---------------------------------------------------------------------------
  1424.   def check_autotile_height
  1425.     return unless LiTTleDRAgo::XP
  1426.     $game_map.autotile_names.each do |autotile_name|
  1427.       bitmap = ModCache.autotile(autotile_name)
  1428.       [@force_tilemap_enabled = true] && break if bitmap.height == 192
  1429.     end
  1430.   end
  1431.   #--------------------------------------------------------------------------
  1432.   # * Aliased method: update
  1433.   #--------------------------------------------------------------------------
  1434.   def update(*args)
  1435.     adjust_viewport
  1436.     adjust_tilemap
  1437.     adjust_old_zoom
  1438.     update_drgcr_tilemap(*args)
  1439.     update_tilemap_zoom
  1440.   end
  1441.   #---------------------------------------------------------------------------
  1442.   # * New method: adjust_old_zoom
  1443.   #---------------------------------------------------------------------------
  1444.   def adjust_old_zoom
  1445.     if @old_fog_zoom_x
  1446.       @fog.zoom_x = @old_fog_zoom_x
  1447.       @fog.zoom_y = @old_fog_zoom_y
  1448.       @panorama.zoom_x = @old_panorama_zoom_x
  1449.       @panorama.zoom_y = @old_panorama_zoom_y
  1450.     end
  1451.   end
  1452.   #---------------------------------------------------------------------------
  1453.   # * New method: viewport_sprite
  1454.   #---------------------------------------------------------------------------
  1455.   def viewport_sprite(*v)
  1456.     v.collect! {|s| s.is_a?(Symbol) ? instance_variable_get(:"@#{s}") : s }
  1457.     v.reject!  {|s| s.not.is_a?(Viewport)}
  1458.     all = instance_variables.map {|s| instance_variable_get("#{s}")}.flatten
  1459.     all.select {|s| s.respond_to?(:viewport) && v.include?(s.viewport)}
  1460.   end
  1461.   #---------------------------------------------------------------------------
  1462.   # * New method: change_tilemap_tone
  1463.   #---------------------------------------------------------------------------
  1464.   def change_tilemap_tone(tone = Tone.new(0,0,0,0), *char)
  1465.     if tone.is_a?(Array) && (3..4) === tone.size
  1466.       result = $game_map.tilemap_tone = Tone.new(*tone)
  1467.     elsif tone.is_a?(Tone)
  1468.       result = $game_map.tilemap_tone = tone
  1469.     else
  1470.       return
  1471.     end
  1472.     sprite = viewport_sprite(:viewport1)
  1473.     sprite.reject! {|s| s.is_a?(Sprite_Character)}
  1474.     sprite.each    {|s| s.tone = result if s.respond_to?(:tone=) }
  1475.     change_character_tone(tone, *char) unless char.empty?
  1476.   end
  1477.   #---------------------------------------------------------------------------
  1478.   # * New method: change_character_tone
  1479.   #---------------------------------------------------------------------------
  1480.   def change_character_tone(tone = Tone.new(0,0,0,0), *char)
  1481.     char = char.collect {|c| c.is_a?(Range) ? c.to_a : c}.flatten
  1482.     char = char.collect {|c| c.is_a?(Range) ? c.to_a : c}.flatten
  1483.     char.collect! {|c| c.is_a?(Game_Character) ? c :
  1484.                        $game_map.interpreter.get_character(c)}
  1485.     sprite = viewport_sprite(:viewport1)
  1486.     sprite.reject! {|s| s.not.is_a?(Sprite_Character) }
  1487.     sprite.reject! {|s| char.not.include?(s.character)}
  1488.     if tone.is_a?(Array) && (3..4) === tone.size
  1489.       sprite.tone(:tone=, Tone.new(*tone))
  1490.     elsif tone.is_a?(Tone)
  1491.       sprite.send(:tone=, tone)
  1492.     end
  1493.   end
  1494.   #--------------------------------------------------------------------------
  1495.   # * New method: reload_tilemap
  1496.   #--------------------------------------------------------------------------
  1497.   def reload_tilemap
  1498.     return [dispose_tilemap, create_tilemap] if LiTTleDRAgo::VXA
  1499.     @tilemap.respond_to?(:dispose) && @tilemap.dispose
  1500.     7.times do |i|
  1501.       auto = @tilemap.autotiles[i]
  1502.       auto.respond_to?(:dispose) && (auto.disposed? || auto.dispose)
  1503.     end
  1504.     res = tilemap_enabled? ? ZTilemap : Tilemap
  1505.     @tilemap = res.new(@viewport1)
  1506.     @tilemap.tileset = ModCache.tileset($game_map.tileset_name)
  1507.     7.times do |i|
  1508.       autotile_name = $game_map.autotile_names[i]
  1509.       @tilemap.autotiles[i] = @tilemap.is_a?(ZTilemap) ?
  1510.       ModCache.autotile_cr_tilemap(autotile_name) :
  1511.       ModCache.autotile(autotile_name)
  1512.     end
  1513.     update_tilemap_effect
  1514.     @tilemap.priorities = $game_map.priorities
  1515.     @tilemap.map_data   = $game_map.data
  1516.     @tilemap.update
  1517.     @viewport_screen_width = 0
  1518.   end    
  1519.   #--------------------------------------------------------------------------
  1520.   # * New method: reload_plane
  1521.   #--------------------------------------------------------------------------
  1522.   def reload_plane
  1523.     z1  = @panorama.respond_to?(:z) ? @panorama.z : -1000
  1524.     z2  = @fog.respond_to?(:z)      ? @fog.z      :  5000
  1525.     z1 /= 1000 if @panorama.is_a?(CRPlane)
  1526.     z2 /= 1000 if @fog.is_a?(CRPlane)
  1527.     res =  plane_enabled? ? CRPlane : Plane
  1528.     bitmap1 = @panorama.respond_to?(:bitmap) ? @panorama.bitmap : nil
  1529.     bitmap2 = @fog.respond_to?(:bitmap)      ? @fog.bitmap      : nil
  1530.     @panorama.respond_to?(:dispose) && @panorama.dispose
  1531.     @fog.respond_to?(:dispose) && @fog.dispose      
  1532.     @panorama = res.new(@viewport1)
  1533.     @fog      = res.new(@viewport1)
  1534.     @panorama.bitmap = bitmap1 if bitmap1.is_a?(Bitmap)
  1535.     @fog.bitmap      = bitmap2 if bitmap2.is_a?(Bitmap)
  1536.     @panorama.z, @fog.z = z1, z2
  1537.     @viewport_screen_width = 0
  1538.   end
  1539.   #--------------------------------------------------------------------------
  1540.   # * New method: update_tilemap_zoom
  1541.   #--------------------------------------------------------------------------
  1542.   def update_tilemap_zoom
  1543.     @weather.zoom_x      = $game_map.zoom_x
  1544.     @weather.zoom_y      = $game_map.zoom_y
  1545.     @old_fog_zoom_x      = @fog.zoom_x
  1546.     @old_fog_zoom_y      = @fog.zoom_y
  1547.     @old_panorama_zoom_x = @panorama.zoom_x
  1548.     @old_panorama_zoom_y = @panorama.zoom_y
  1549.     @fog.zoom_x         *= $game_map.zoom_x
  1550.     @fog.zoom_y         *= $game_map.zoom_y
  1551.     @panorama.zoom_x    *= $game_map.zoom_x
  1552.     @panorama.zoom_y    *= $game_map.zoom_y
  1553.     update_tilemap_effect
  1554.   end
  1555.   #--------------------------------------------------------------------------
  1556.   # * New method: update_tilemap_effect
  1557.   #--------------------------------------------------------------------------
  1558.   def update_tilemap_effect
  1559.     return if @tilemap.not.is_a?(ZTilemap)
  1560.     @tilemap.zoom_x  = $game_map.zoom_x
  1561.     @tilemap.zoom_y  = $game_map.zoom_y
  1562.     @tilemap.opacity = $game_map.tilemap_opacity
  1563.     @tilemap.hue     = $game_map.tilemap_hue
  1564.     @tilemap.tone    = $game_map.tilemap_tone
  1565.   end
  1566.   #--------------------------------------------------------------------------
  1567.   # * Overwriten method: viewport_size_change?
  1568.   #--------------------------------------------------------------------------
  1569.   def viewport_size_change?
  1570.     return true if @viewport_map_width  != $game_map.width  * $game_map.zoom_x
  1571.     return true if @viewport_map_height != $game_map.height * $game_map.zoom_y
  1572.     return true if @viewport_screen_width  != Graphics.width
  1573.     return true if @viewport_screen_height != Graphics.height
  1574.   end
  1575.   #--------------------------------------------------------------------------
  1576.   # * New method: adjust_viewport
  1577.   #--------------------------------------------------------------------------
  1578.   def adjust_viewport
  1579.     if viewport_size_change?
  1580.       @viewport_map_width     = $game_map.width * $game_map.zoom_x
  1581.       @viewport_map_height    = $game_map.height * $game_map.zoom_y
  1582.       @viewport_screen_width  = Graphics.width
  1583.       @viewport_screen_height = Graphics.height
  1584.       [@viewport1,@viewport2,@viewport3].compact.update_viewport_sizes
  1585.     end
  1586.   end
  1587.   #--------------------------------------------------------------------------
  1588.   # * New method: adjust_tilemap
  1589.   #--------------------------------------------------------------------------
  1590.   def adjust_tilemap
  1591.     if LiTTleDRAgo::XP
  1592.       if tilemap_enabled?
  1593.         reload_tilemap if @tilemap.is_a?(Tilemap)
  1594.       else
  1595.         reload_tilemap if @tilemap.is_a?(ZTilemap)
  1596.       end
  1597.     end
  1598.     if plane_enabled?
  1599.       reload_plane   if @panorama.is_a?(Plane)   || @fog.is_a?(Plane)
  1600.     else
  1601.       reload_plane   if @panorama.is_a?(CRPlane) || @fog.is_a?(CRPlane)
  1602.     end
  1603.   end
  1604.   #--------------------------------------------------------------------------
  1605.   # * New method: tilemap_enabled?
  1606.   #--------------------------------------------------------------------------
  1607.   def tilemap_enabled?
  1608.     return true if @force_tilemap_enabled
  1609.     return true unless LiTTleDRAgo::RGSS1
  1610.     return true unless @viewport1.width <= 640 && @viewport1.height <= 480
  1611.     return true unless (map = $game_map) && map.zoom_x * map.zoom_y == 1
  1612.     return true unless map.tilemap_opacity >= 255
  1613.     return true unless map.tilemap_hue <= 0
  1614.     return true unless map.tilemap_tone.to_s.get_int == 0
  1615.     return true if map.reverse
  1616.     return false  
  1617.   end
  1618.   #--------------------------------------------------------------------------
  1619.   # * New method: plane_enabled?
  1620.   #--------------------------------------------------------------------------
  1621.   def plane_enabled?
  1622.     return true unless LiTTleDRAgo::RGSS1
  1623.     return true unless @viewport1.width <= 640 && @viewport1.height <= 480
  1624.     return false
  1625.   end
  1626. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement