Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #==============================================================================
- # ** Drago - Custom Resolution
- # Version : 2.17
- # Contact : littledrago.blogspot.com / forum.chaos-project.com
- #==============================================================================
- ($imported ||= {})[:drg_custom_resolution] = 2.17
- #==============================================================================
- #
- # Introduction :
- #
- # Version 2 from previous Drago - Custom Resolution
- #
- # Issue :
- #
- # - Normal transition didn't work when resolution is more than 640x480
- # - ALT+Enter is disabled by default
- # - Custom menu system will require an edit to match the new resolution
- # - Anything that modify Sprite_Character & Spriteset_Map will require an edit
- #
- # Script Call :
- #
- # Graphics.window
- # Graphics.fullscreen
- # Graphics.fullscreen? # returns true if game is fullscreen
- #
- # $game_map.start_zoom(X, Y, ZOOM_VALUE, DURATION = 20)
- # $game_map.zoom(X = nil, Y = nil, ZOOM_VALUE)
- # $game_map.zoom_in(X = nil, Y = nil, DURATION = 20)
- # $game_map.zoom_out(X = nil, Y = nil, DURATION = 20)
- #
- # $game_map.reverse(true / false) # Flip the map
- #
- # $game_map.start_tilemap_opacity(OPACITY = 255, DURATION = 20)
- # $game_map.start_tilemap_tone(TONE = Tone.new(0,0,0,0), DURATION = 0)
- #
- #
- # change_tilemap_tone(TONE,*CHARACTER) # change tilemap tone
- # change_character_tone(TONE,*CHARACTER) # change character tone without
- # changing the tilemap
- #
- # X, Y = Zoom focus
- #
- # ZOOM_VALUE = Integer from 1-12
- #
- # OPACITY = Integer from 0-255
- #
- # TONE = [R,G,B,A] or Tone.new(R,G,B,A)
- #
- # CHARACTER = $game_map.events.values # all events
- # = $game_map.events.keys # all events
- # = $game_player # player
- # = -1 # player
- # = 0 # this event
- # = [2,3,4,6] # events with selected id
- # = [-1,2,3,4,6] # player & events with selected id
- # = [0,2,3,4,6] # this event & events with selected id
- # = (1..99) # events in range
- # = [(1..8),20,25,(30..42)] # events in range
- #
- # * will not change the character tone if left out
- #
- # Links :
- #
- # - Fantasist's Transitions Pack
- # http://forum.chaos-project.com/index.php/topic,1390.0.html
- # - ForeverZer0's Add-ons
- # http://forum.chaos-project.com/index.php/topic,7862.0.html
- # - ThallionDarkshine's Add-ons
- # http://forum.chaos-project.com/index.php/topic,12655.0.html
- # - Drago Transition Pack
- # http://forum.chaos-project.com/index.php/topic,13488.0.html
- #
- # - Adjust Menu Position
- # http://forum.chaos-project.com/index.php/topic,13781.0.html
- #
- # - ThallionDarkshine's F12 Fix
- # http://forum.chaos-project.com/index.php/topic,13629.0.html
- # - Zeriab's F12 Pause with images
- # http://forum.chaos-project.com/index.php/topic,3613.0.html
- #
- # Special Thanks :
- #
- # - ForeverZer0 & KK20 for method used in this script
- # - Wecoc for autotile addon
- #
- #==============================================================================
- module LiTTleDRAgo
- SCREEN_SIZE = [640,490]
- # Define the resolution of the game screen. These values can be anything
- # within reason. Centering, viewports, etc. will all be taken care of, but it
- # is recommended that you use values divisible by 32 for best results.
- AUTOTILE_SPEED = {}
- AUTOTILE_SPEED[:map_id] = :speed
- AUTOTILE_SPEED[0] = 6 # default speed
- #AUTOTILE_SPEED[35] = 0 # unchanged autotile
- #AUTOTILE_SPEED[159] = 16
- # Speed of the autotile based on map_id
- CONTROL_SCREEN_SIZE = false
- # Control screen size with a mouse
- HIGH_PRIORITY = true
- # Change Game process priority to high
- SPRITE_COMPACT = true
- # Keep the sprite to the very minimum number
- CHARACTER_Z_FIX = {
- '178-Switch01' => 0,
- '180-Switch03' => 0,
- '181-Switch04' => 0,
- '199-Support07' => 0,
- }
- # Fix the screen_z value for events based on Graphic name.
- # You can also define z value for event by inserting <z: Z_VALUE>
- # on event name.
- # This way, flat events such as pitfall won't overlap with player z value.
- end
- core = "This script needs Drago - Core Engine ver 1.47 or above"
- rmvx = "This script not for RMVX"
- implemented = "%1$s has already implemented, Please remove the %1$s script"
- zoom = sprintf(implemented,"Map Zoom")
- tone = sprintf(implemented,"Tilemap Tone Changer" )
- ($imported[:drg_core_engine] || 0) >= 1.47 || raise(core)
- LiTTleDRAgo::XP || LiTTleDRAgo::VXA || raise(rmvx)
- $imported[:drg_cr_map_zoom] && raise(zoom)
- $imported[:drg_tilemap_tone_changer] && raise(tone)
- #==============================================================================
- # ** Graphics
- #------------------------------------------------------------------------------
- # This module handles all Graphics
- #==============================================================================
- class << Graphics
- #-------------------------------------------------------------------------
- # * Alias Listing
- #-------------------------------------------------------------------------
- alias_sec_method :zer0_graphics_transition, :transition
- alias_sec_method :drg_resolution_change_resize_screen, :resize_screen
- alias_sec_method :drg_resolution_change_update, :update
- #-------------------------------------------------------------------------
- # * Aliased method: resize_screen
- #-------------------------------------------------------------------------
- def resize_screen(width, height)
- width = (width / 32.0).round * 32
- height = (height / 32.0).round * 32
- if $game_map.respond_to?(:screen_size)
- $game_map.screen_size[0] = width
- $game_map.screen_size[1] = height
- end
- drg_resolution_change_resize_screen(width, height)
- end
- #-------------------------------------------------------------------------
- # * Aliased method: transition
- #-------------------------------------------------------------------------
- def transition(duration = 8, *args)
- if width <= 640 && height <= 480
- return zer0_graphics_transition(duration, *args)
- end
- if duration > 0
- viewport = Viewport.new(0,0,width,height)
- sprite = Sprite.new(viewport)
- sprite.bitmap = Graphics.snap_to_bitmap
- sprite2 = Sprite.new(viewport)
- sprite2.z = sprite.z - 10
- sprite2.blend_type = 1
- zer0_graphics_transition(0)
- fade = 255 / duration
- if (file = args.at(0)).is_a?(String)
- bitmap = Bitmap.new(file)
- sprite2.bitmap = bitmap.stretch(width,height)
- bitmap.dispose
- end
- duration.times {[sprite,sprite2].each {|s|s.opacity -= fade} && update }
- [sprite.bitmap, sprite2.bitmap, sprite, sprite2, viewport].dispose
- end
- zer0_graphics_transition(0)
- end
- #-------------------------------------------------------------------------
- # * Aliased method: update
- #-------------------------------------------------------------------------
- def update
- drg_resolution_change_update
- update_resolution_adjust
- end
- #-------------------------------------------------------------------------
- # * New method: update_resolution_adjust
- #-------------------------------------------------------------------------
- def update_resolution_adjust
- return unless LiTTleDRAgo::XP && $game_player
- return unless Game_Player.const_defined?(:CENTER_X)
- change = Game_Player.const_get(:CENTER_X) != $game_player.center_x
- change ||= Game_Player.const_get(:CENTER_Y) != $game_player.center_y
- return unless change
- resize_screen(width,height)
- $game_player.center($game_player.x,$game_player.y)
- end
- #-------------------------------------------------------------------------
- # * Overwriten method: fullscreen
- #-------------------------------------------------------------------------
- def fullscreen
- @fullscreen = true
- fill_monitor
- LiTTleDRAgo.hide_borders
- end
- #-------------------------------------------------------------------------
- # * Overwriten method: window
- #-------------------------------------------------------------------------
- def window
- @fullscreen = false
- LiTTleDRAgo.show_borders
- if $game_map && $game_map.screen_size.all? {|s| s.is_a?(Numeric)}
- x,y = $game_map.screen_size[0..1]
- x += ($game_map.screen_size[2] ||= 1)
- $game_map.screen_size[2] *= -1
- drg_resolution_change_resize_screen(x,y)
- else
- x,y = LiTTleDRAgo::SCREEN_SIZE
- end
- resize_screen(x,y)
- end
- #-------------------------------------------------------------------------
- # * Overwriten method: fullscreen?
- #-------------------------------------------------------------------------
- define_method(:fullscreen?) { @fullscreen == true }
- end
- Graphics.window
- Graphics.disable_alt_enter
- Graphics.control_screen_size LiTTleDRAgo::CONTROL_SCREEN_SIZE
- Graphics.high_priority = LiTTleDRAgo::HIGH_PRIORITY
- GC.start
- #==============================================================================
- # ** Game_Map
- #------------------------------------------------------------------------------
- # This class handles the map. It includes scrolling and passable determining
- # functions. Refer to "$game_map" for the instance of this class.
- #==============================================================================
- class Game_Map
- #--------------------------------------------------------------------------
- # * Public Instance Variable
- #--------------------------------------------------------------------------
- attr_sec_accessor :zoom_x, :zoom_y, 'Integer(1)'
- attr_sec_accessor :screen_size, 'LiTTleDRAgo::SCREEN_SIZE'
- attr_sec_accessor :tilemap_tone, 'Tone.new(0,0,0)'
- attr_sec_accessor :tilemap_opacity, 'Integer(255)'
- attr_sec_accessor :tilemap_hue, 'Integer(0)'
- #---------------------------------------------------------------------------
- # * Redirect Listing
- #---------------------------------------------------------------------------
- [:tilemap_tone,:tilemap_opacity].each do |meth|
- redirect_method :"#{meth}_changing?", "(@#{meth}_duration ||= 0) > 0"
- end
- #---------------------------------------------------------------------------
- # * Define Sec Listing
- #---------------------------------------------------------------------------
- define_sec_method(:zooming?) {(@zoom_duration ||= 0) > 0}
- define_sec_method(:screen_tile_x) {(Graphics.width / 32.0).ceil}
- define_sec_method(:screen_tile_y) {(Graphics.height / 32.0).ceil}
- #-------------------------------------------------------------------------
- # * Alias Listing
- #-------------------------------------------------------------------------
- alias_sec_method(:drg_scroll_right_adjust, :scroll_right)
- alias_sec_method(:drg_scroll_down_adjust, :scroll_down)
- alias_sec_method(:tilemap_effect_update, :update)
- alias_sec_method(:get_map_data, :data)
- #--------------------------------------------------------------------------
- # * Aliased method: Scroll Down
- #--------------------------------------------------------------------------
- def scroll_down(distance)
- times = vxa_map_multiplier
- if loop_vertical?
- @display_y += distance
- @display_y %= height * times
- @parallax_y += distance if @parallax_y && @parallax_loop_y
- else
- last_y = @display_y
- result = [@display_y + distance, (map_edge.at(1) / zoom_y)].min
- drg_scroll_down_adjust(distance)
- @display_y = result
- end
- end
- #--------------------------------------------------------------------------
- # * Aliased method: Scroll Right
- #--------------------------------------------------------------------------
- def scroll_right(distance)
- times = vxa_map_multiplier
- if loop_horizontal?
- @display_x += distance
- @display_x %= width * times
- @parallax_x += distance if @parallax_x && @parallax_loop_x
- else
- last_x = @display_x
- result = [@display_x + distance, (map_edge.at(0) / zoom_x)].min
- drg_scroll_right_adjust(distance)
- @display_x = result
- end
- end
- #--------------------------------------------------------------------------
- # * New method: zoom
- #--------------------------------------------------------------------------
- def zoom(*zoom)
- if zoom.size == 1
- zoom = (zoom.first)
- elsif zoom.size == 3
- x,y,zoom = zoom[0..2]
- end
- return unless zoom.is_a?(Numeric)
- old_zoom = @zoom_x
- @zoom_x = [[zoom,12].min, 1].max
- @zoom_y = [[zoom,12].min, 1].max
- $game_player.center(x,y) if x && y
- end
- #--------------------------------------------------------------------------
- # * New method: zoom_in
- #--------------------------------------------------------------------------
- def zoom_in(x = nil,y = nil, duration = 20)
- start_zoom(x,y, zoom_x >= 1 ? zoom_x + 1 : 1, duration)
- end
- #--------------------------------------------------------------------------
- # * New method: zoom_out
- #--------------------------------------------------------------------------
- def zoom_out(x = nil,y = nil,duration = 20)
- start_zoom(x,y, zoom_x - 1 >= 1 ? zoom_x - 1 : zoom_x - 0.5, duration)
- end
- #--------------------------------------------------------------------------
- # * New method: map_edge
- #--------------------------------------------------------------------------
- def map_edge
- times = vxa_map_multiplier
- [_w = [(width * zoom_x - screen_tile_x).ceil * times, 0].max,
- _h = [(height * zoom_y - screen_tile_y).ceil * times, 0].max]
- end
- #--------------------------------------------------------------------------
- # * New method: autotile_speed
- #--------------------------------------------------------------------------
- def autotile_speed(id = @map_id)
- speed = LiTTleDRAgo::AUTOTILE_SPEED
- @autotile_speed.is_a?(Array) || @autotile_speed = []
- @autotile_speed[id] ||= (speed[id] || speed[0] || 0)
- end
- #--------------------------------------------------------------------------
- # * New method: autotile_speed=
- #--------------------------------------------------------------------------
- def autotile_speed=(*value)
- @autotile_speed.is_a?(Array) || @autotile_speed = []
- @autotile_speed[@map_id] = [value.first,0].max if value.size == 1
- @autotile_speed[value.first] = [value.at(1),0].max if value.size > 1
- end
- #--------------------------------------------------------------------------
- # * New method: vxa_map_multiplier
- #--------------------------------------------------------------------------
- def vxa_map_multiplier
- LiTTleDRAgo::VXA ? 1 : 128
- end
- #--------------------------------------------------------------------------
- # * New method: screen_is_solid?
- #--------------------------------------------------------------------------
- def screen_is_solid?
- tone = screen.tone.to_s.gsub(/([(),0 ])/i){''}
- return true if tone['255.255.255.']
- return true if tone['255.-255.-255.']
- return true if tone['-255.255.-255.']
- return true if tone['-255.-255.255.']
- return true if tone['255.255.-255.']
- return true if tone['255.-255.255.']
- return true if tone['-255.255.255.']
- return true if tone['-255.-255.-255.']
- end
- #--------------------------------------------------------------------------
- # * Aliased method: data
- #--------------------------------------------------------------------------
- def data
- data = self.reverse ? reverse_data : get_map_data
- data.make_changes = true
- data
- end
- #--------------------------------------------------------------------------
- # * New method: reverse_data
- #--------------------------------------------------------------------------
- def reverse_data
- @reverse_data ||= []
- @reverse_data[@map_id] ||= get_map_data.reverse(true,false,false)
- end
- #--------------------------------------------------------------------------
- # * New method: reverse=
- #--------------------------------------------------------------------------
- def reverse=(val)
- return val if @reverse == val
- @reverse = ((@reverse_data||=[])[@map_id] = nil) || val
- spriteset && spriteset.reload_tilemap
- @reverse
- end
- #--------------------------------------------------------------------------
- # * New method: reverse
- #--------------------------------------------------------------------------
- def reverse
- @reverse && LiTTleDRAgo::XP
- end
- #--------------------------------------------------------------------------
- # * New method: start_tilemap_tone
- #--------------------------------------------------------------------------
- def start_tilemap_tone(tone = Tone.new(0,0,0,0), duration = 0)
- @tilemap_tone_target = tone.is_a?(Array) ? Tone.new(*tone) : tone.clone
- @tilemap_tone_duration = duration
- tilemap_tone_changing? || @tilemap_tone = @tilemap_tone_target.clone
- end
- #--------------------------------------------------------------------------
- # * New method: start_tilemap_opacity
- #--------------------------------------------------------------------------
- def start_tilemap_opacity(opacity = 255, duration = 0)
- @tilemap_opacity_target = opacity * 1.0
- @tilemap_opacity_duration = duration
- tilemap_opacity_changing? || @tilemap_opacity = @tilemap_opacity_target
- end
- #--------------------------------------------------------------------------
- # * New method: update_tilemap_tone
- #--------------------------------------------------------------------------
- def update_tilemap_tone
- if tilemap_tone_changing?
- d = @tilemap_tone_duration
- target = @tilemap_tone_target
- @tilemap_tone.red = (@tilemap_tone.red * (d - 1) + target.red) / d
- @tilemap_tone.green = (@tilemap_tone.green * (d - 1) + target.green) / d
- @tilemap_tone.blue = (@tilemap_tone.blue * (d - 1) + target.blue) / d
- @tilemap_tone.gray = (@tilemap_tone.gray * (d - 1) + target.gray) / d
- @tilemap_tone_duration -= 1
- tilemap_tone_changing? || @tilemap_tone = @tilemap_tone_target.clone
- end
- end
- #--------------------------------------------------------------------------
- # * New method: update_tilemap_opacity
- #--------------------------------------------------------------------------
- def update_tilemap_opacity
- if tilemap_opacity_changing?
- d = @tilemap_opacity_duration
- @tilemap_opacity = (@tilemap_opacity * (d - 1) +
- @tilemap_opacity_target) / d
- @tilemap_opacity_duration -= 1
- tilemap_opacity_changing? || @tilemap_opacity = @tilemap_opacity_target
- end
- end
- #--------------------------------------------------------------------------
- # * New method: start_zoom
- #--------------------------------------------------------------------------
- def start_zoom(x,y, zoom_target, duration=20)
- @x_zoom = x
- @y_zoom = y
- @zoom_target = zoom_target * 1.0
- @zoom_duration = @zoom_x == @zoom_target ? 0 : duration
- zooming? || zoom(@x_zoom,@y_zoom,@zoom_target)
- end
- #--------------------------------------------------------------------------
- # * New method: update_zooming
- #--------------------------------------------------------------------------
- def update_zooming
- if zooming?
- d = @zoom_duration
- power = (@zoom_x * (d - 1) + @zoom_target) / d
- @zoom_duration -= 1
- zoom(@x_zoom,@y_zoom,power)
- zoom(@x_zoom,@y_zoom,@zoom_target) unless zooming?
- end
- end
- #--------------------------------------------------------------------------
- # * Aliased method: update
- #--------------------------------------------------------------------------
- def update(*args)
- tilemap_effect_update(*args)
- update_tilemap_tone
- update_tilemap_opacity
- update_zooming
- end
- end
- #==============================================================================
- # ** Interpreter
- #------------------------------------------------------------------------------
- # This interpreter runs event commands. This class is used within the
- # Game_System class and the Game_Event class.
- #==============================================================================
- unless LiTTleDRAgo::VX
- class Interpreter
- #---------------------------------------------------------------------------
- # * Redirect Listing
- #---------------------------------------------------------------------------
- redirect_method :zoom, '$game_map.zoom'
- redirect_method :zoom_in, '$game_map.zoom_in'
- redirect_method :zoom_out, '$game_map.zoom_out'
- redirect_method :start_zoom, '$game_map.start_zoom'
- redirect_method :start_tilemap_opacity, '$game_map.start_tilemap_opacity'
- redirect_method :start_tilemap_tone, '$game_map.start_tilemap_tone'
- [:change_tilemap_tone,:change_character_tone].each do |meth|
- redirect_method :"#{meth}", :"$game_map.spriteset.#{meth}"
- end
- end
- end
- #==============================================================================
- # ** Game_Player
- #------------------------------------------------------------------------------
- # This class handles the player. Its functions include event starting
- # determinants and map scrolling. Refer to "$game_player" for the one
- # instance of this class.
- #==============================================================================
- class Game_Player
- #---------------------------------------------------------------------------
- # * Define Sec Listing
- #---------------------------------------------------------------------------
- define_sec_method(:center_x) {((Graphics.width/2) / $game_map.zoom_x-16) * 4}
- define_sec_method(:center_y) {((Graphics.height/2) / $game_map.zoom_y-16) * 4}
- #-------------------------------------------------------------------------
- # * Alias Listing
- #-------------------------------------------------------------------------
- alias_sec_method(:drg_adjust_viewport_center, :center)
- #-------------------------------------------------------------------------
- # * Aliased method: center
- #-------------------------------------------------------------------------
- def center(x, y)
- if LiTTleDRAgo::XP
- Game_Player.const_set(:CENTER_X, center_x)
- Game_Player.const_set(:CENTER_Y, center_y)
- end
- drg_adjust_viewport_center(x, y)
- max_x = $game_map.map_edge.at(0) / $game_map.zoom_x
- max_y = $game_map.map_edge.at(1) / $game_map.zoom_y
- if LiTTleDRAgo::XP
- $game_map.display_x = [0, [(x * 32*4) - center_x, max_x.ceil].min].max
- $game_map.display_y = [0, [(y * 32*4) - center_y, max_y.ceil].min].max
- elsif $game_map.respond_to?(:set_display_pos)
- $game_map.set_display_pos(x - center_x, y - center_y)
- end
- end
- end
- #==============================================================================
- # ** Tilemap
- #------------------------------------------------------------------------------
- #
- #==============================================================================
- class Tilemap
- #---------------------------------------------------------------------------
- # * Public Instance Variables
- #---------------------------------------------------------------------------
- method_defined?(:tileset) || attr_accessor(:tileset)
- method_defined?(:priorities)|| attr_accessor(:priorities)
- method_defined?(:autotiles) || attr_sec_accessor(:autotiles,'Array.new')
- end
- #==============================================================================
- # ** Table
- #------------------------------------------------------------------------------
- #
- #==============================================================================
- class Table
- #--------------------------------------------------------------------------
- # * Public Instance Variable
- #--------------------------------------------------------------------------
- attr_sec_accessor :table_changes, :orig_value, 'Array.new'
- attr_accessor :make_changes
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- alias_sec_method :set_method, :"[]="
- #--------------------------------------------------------------------------
- # * Set Data
- #--------------------------------------------------------------------------
- def []=(*args)
- if @make_changes
- table_changes.push([*args]) && orig_value.push(self[*args[0..-2]])
- @make_changes = false
- end
- set_method(*args)
- end
- #--------------------------------------------------------------------------
- # * Reverse
- #--------------------------------------------------------------------------
- def reverse(rx=true,ry=true,rz=true)
- reverse = self.clone
- _x = (0...xsize).to_a
- _y = (0...ysize).to_a
- _z = (0...zsize).to_a
- _x.each do |x|
- _rx = rx ? _x[-1-x] : x
- ysize == 1 && (reverse[x] = self[_rx]) && next
- _y.each do |y|
- _ry = ry ? _y[-1-y] : y
- zsize == 1 && (reverse[x,y] = self[_rx,_ry]) && next
- _z.each do |z|
- _rz = rz ? _z[-1-z] : z
- reverse[x,y,z] = self[_rx,_ry,_rz]
- end
- end
- end
- reverse
- end
- end
- #==============================================================================
- # ** RPG::Cache
- #==============================================================================
- ModCache = LiTTleDRAgo.cache
- module ModCache
- #----------------------------------------------------------------------------
- # * Self
- #----------------------------------------------------------------------------
- class << self
- #--------------------------------------------------------------------------
- # * Constant
- #--------------------------------------------------------------------------
- AUTO_INDEX = [[
- [27,28,33,34], [ 5,28,33,34], [27, 6,33,34], [ 5, 6,33,34],
- [27,28,33,12], [ 5,28,33,12], [27, 6,33,12], [ 5, 6,33,12],
- [27,28,11,34], [ 5,28,11,34], [27, 6,11,34], [ 5, 6,11,34],
- [27,28,11,12], [ 5,28,11,12], [27, 6,11,12], [ 5, 6,11,12],
- [25,26,31,32], [25, 6,31,32], [25,26,31,12], [25, 6,31,12],
- [15,16,21,22], [15,16,21,12], [15,16,11,22], [15,16,11,12],
- [29,30,35,36], [29,30,11,36], [ 5,30,35,36], [ 5,30,11,36],
- [39,40,45,46], [ 5,40,45,46], [39, 6,45,46], [ 5, 6,45,46],
- [25,30,31,36], [15,16,45,46], [13,14,19,20], [13,14,19,12],
- [17,18,23,24], [17,18,11,24], [41,42,47,48], [ 5,42,47,48],
- [37,38,43,44], [37, 6,43,44], [13,18,19,24], [13,14,43,44],
- [37,42,43,48], [17,18,47,48], [13,18,43,48], [ 1, 2, 7, 8]],
- [[27,28,33,34], [49,50,55,56], [51,52,57,58], [49,52,55,58],
- [63,64,69,70], [65,66,71,72], [51,52,69,70], [ 5, 6,33,12],
- [61,62,67,68], [49,50,67,68], [53,54,59,60], [ 5, 6,11,34],
- [61,64,67,70], [ 5,28,11,12], [27, 6,11,12], [ 5, 6,11,12],
- [25,26,31,32], [25, 6,31,32], [25,26,31,12], [25, 6,31,12],
- [15,16,21,22], [15,16,21,12], [15,16,11,22], [15,16,11,12],
- [29,30,35,36], [29,30,11,36], [ 5,30,35,36], [ 5,30,11,36],
- [39,40,45,46], [ 5,40,45,46], [39, 6,45,46], [ 5, 6,45,46],
- [25,30,31,36], [15,16,45,46], [13,14,19,20], [13,14,19,12],
- [17,18,23,24], [17,18,11,24], [41,42,47,48], [ 5,42,47,48],
- [37,38,43,44], [37, 6,43,44], [13,18,19,24], [13,14,43,44],
- [37,42,43,48], [17,18,47,48], [13,18,43,48], [ 1, 2, 7, 8]]
- ].freeze
- #--------------------------------------------------------------------------
- # * Public Instance Variable
- #--------------------------------------------------------------------------
- attr_sec_reader :cache, 'Hash.new'
- #--------------------------------------------------------------------------
- # * New method: autotile_cr_tilemap
- #--------------------------------------------------------------------------
- def autotile_cr_tilemap(filename)
- key = "Graphics/Autotiles/CR#{filename}"
- if !@cache.include?(key) || @cache[key].disposed?
- @cache[key] = (filename=='') ? Bitmap.new(128,96) : autotile(filename)
- new_bm = self.format_autotiles(@cache[key], filename)
- @cache[key].dispose
- @cache[key] = new_bm
- @cache[key].instance_variable_set(:@autotile_name, filename)
- end
- return @cache[key]
- end
- #--------------------------------------------------------------------------
- # * New method: include?
- #--------------------------------------------------------------------------
- unless method_defined?(:include?)
- def include?(key)
- @cache[key] && !@cache[key].disposed?
- end
- end
- #--------------------------------------------------------------------------
- # * New method: format_autotiles
- #--------------------------------------------------------------------------
- def format_autotiles(bitmap, filename)
- if bitmap.height > 32
- frames = bitmap.width / 96
- index = bitmap.height == 192 ? AUTO_INDEX[1] : AUTO_INDEX[0]
- template = Bitmap.new(256*frames,192)
- frames.times {|a| (0...6).each { |i| (0...8).each { |j|
- index[8*i+j].each { |number|
- number -= 1
- x, y = 16 * (number % 6), 16 * (number / 6)
- ox, oy = (32 * j + x % 32) + (a * 256), 32 * i + y % 32
- rect = Rect.new(x + (a * 96), y, 16, 16)
- template.blt(ox, oy, bitmap, rect)
- }}}}
- return template
- else
- return bitmap
- end
- end
- #--------------------------------------------------------------------------
- # * New method: tile
- #--------------------------------------------------------------------------
- unless method_defined?(:format_tile)
- def format_tile(bitmap, tile_id, hue)
- filename = bitmap.pathname
- key = [filename, tile_id, hue]
- unless include?(key)
- @cache[key] = empty_bitmap
- x = (tile_id - 384) % 8 * 32
- y = (tile_id - 384) / 8 * 32
- rect = Rect.new(x, y, 32, 32)
- @cache[key].blt(0, 0, bitmap, rect)
- @cache[key].hue_change(hue)
- end
- @cache[key]
- end
- end
- #--------------------------------------------------------------------------
- # * New method: clear_tile_cache
- #--------------------------------------------------------------------------
- def clear_tile_cache
- @cache ||= {}
- @cache.reject! do |keys|
- keys.is_a?(Array) && keys.size == 3 &&
- keys[0].is_a?(String) && keys[0].downcase["tilemap"]
- end
- GC.start
- end
- end
- end
- #==============================================================================
- # ** Bitmap
- #------------------------------------------------------------------------------
- #
- #==============================================================================
- class Bitmap
- #--------------------------------------------------------------------------
- # * Public Instance Variable
- #--------------------------------------------------------------------------
- attr_sec_accessor :pathname, 'String.new'
- #--------------------------------------------------------------------------
- # ● Alias Method
- #--------------------------------------------------------------------------
- $@ || alias_method(:cr_path_init, :initialize)
- #--------------------------------------------------------------------------
- # ● Object Initialization
- #--------------------------------------------------------------------------
- def initialize(*args)
- @pathname = args.at(0) if args.at(0).is_a?(String)
- cr_path_init(*args)
- end
- end
- #==============================================================================
- # ** RPG::Weather
- #------------------------------------------------------------------------------
- # A class for weather effects (rain, storm, and snow). It is used within the
- # Spriteset_Map class.
- #==============================================================================
- CRWeather = LiTTleDRAgo::VX ? Spriteset_Weather : RPG::Weather
- class CRWeather
- #--------------------------------------------------------------------------
- # * Public Instance Variable
- #--------------------------------------------------------------------------
- attr_reader :viewport
- attr_accessor :zoom_x, :zoom_y
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- $@ || alias_method(:init_custom_resolution, :initialize)
- #--------------------------------------------------------------------------
- # * Aliased method: initialize
- #--------------------------------------------------------------------------
- def initialize(viewport)
- @viewport = viewport
- init_custom_resolution(@viewport)
- end
- #--------------------------------------------------------------------------
- # * Overwriten method: update
- #--------------------------------------------------------------------------
- def update
- return if @type == 0
- return if $game_map && $game_map.screen_is_solid?
- update_screen if respond_to?(:update_screen)
- @sprites.each {|sprite| update_sprite(sprite) }
- end
- #--------------------------------------------------------------------------
- # * Update Sprite
- #--------------------------------------------------------------------------
- def update_sprite(sprite)
- sprite.ox = @ox
- sprite.oy = @oy
- case @type
- when 1, :rain then update_sprite_rain(sprite)
- when 2, :storm then update_sprite_storm(sprite)
- when 3, :snow then update_sprite_snow(sprite)
- end
- create_new_particle(sprite) if sprite.opacity < 64
- end
- #--------------------------------------------------------------------------
- # * Update Sprite [Rain]
- #--------------------------------------------------------------------------
- def update_sprite_rain(sprite)
- sprite.bitmap = @rain_bitmap
- sprite.x -= 2 * sprite.zoom_x
- sprite.y += 16 * sprite.zoom_y
- sprite.opacity -= 8
- end
- #--------------------------------------------------------------------------
- # * Update Sprite [Storm]
- #--------------------------------------------------------------------------
- def update_sprite_storm(sprite)
- sprite.bitmap = @storm_bitmap
- sprite.x -= 8 * sprite.zoom_x
- sprite.y += 16 * sprite.zoom_y
- sprite.opacity -= 12
- end
- #--------------------------------------------------------------------------
- # * Update Sprite [Snow]
- #--------------------------------------------------------------------------
- def update_sprite_snow(sprite)
- sprite.bitmap = @snow_bitmap
- sprite.x -= 2 * sprite.zoom_x
- sprite.y += 8 * sprite.zoom_y
- sprite.opacity -= 8
- end
- #--------------------------------------------------------------------------
- # * Create New Particle
- #--------------------------------------------------------------------------
- def create_new_particle(sprite)
- sprite.x = rand(Graphics.width + 100) - 100 + @ox
- sprite.y = rand(Graphics.height + 200) - 200 + @oy
- sprite.zoom_x = @zoom_x || 1
- sprite.zoom_y = @zoom_y || 1
- sprite.x *= sprite.zoom_x
- sprite.y *= sprite.zoom_y
- sprite.opacity = 160 + rand(96)
- end
- #---------------------------------------------------------------------------
- # * New method: method_missing
- #---------------------------------------------------------------------------
- def method_missing(val,*a,&b)
- en = @sprites.flatten.find_all {|s|s.respond_to?(val.to_sym)}
- if en.empty?
- text = "Undefined method #{val} at #{self.inspect}"
- raise(NoMethodError,text,caller(1))
- end
- return en.map {|s| s.send(val.to_sym,*a,&b)}
- end
- end
- #==============================================================================
- # ** Plane
- #------------------------------------------------------------------------------
- # This class is the rewrite of the default plane class
- #==============================================================================
- class CRPlane < Sprite
- #---------------------------------------------------------------------------
- # * Public Instance Variable
- #---------------------------------------------------------------------------
- attr_reader :bitmap
- #---------------------------------------------------------------------------
- # * New method: z=
- #---------------------------------------------------------------------------
- def z=(z)
- super(z * 1000)
- end
- #---------------------------------------------------------------------------
- # * New method: ox=
- #---------------------------------------------------------------------------
- def ox=(ox)
- return if $game_map && $game_map.screen_is_solid?
- return if bitmap.nil? || bitmap.disposed?
- super(ox % bitmap.width) if bitmap.is_a?(Bitmap)
- end
- #---------------------------------------------------------------------------
- # * New method: oy=
- #---------------------------------------------------------------------------
- def oy=(oy)
- return if $game_map && $game_map.screen_is_solid?
- return if bitmap.nil? || bitmap.disposed?
- super(oy % bitmap.height) if bitmap.is_a?(Bitmap)
- end
- #---------------------------------------------------------------------------
- # * New method: dispose
- #---------------------------------------------------------------------------
- def dispose
- @plane && (@plane.disposed? || @plane.dispose)
- super unless disposed?
- end
- #---------------------------------------------------------------------------
- # * New method: bitmap=
- #---------------------------------------------------------------------------
- def bitmap=(tile)
- return if @bitmap == tile
- @bitmap = tile
- if @bitmap.is_a?(Bitmap)
- xx = 1 + (Graphics.width.to_f / tile.width).ceil
- yy = 1 + (Graphics.height.to_f / tile.height).ceil
- @plane.dispose if @plane.respond_to?(:dispose) && @plane.not.disposed?
- @plane = Bitmap.new(@bitmap.width * xx, @bitmap.height * yy)
- (0..xx).each {|x| (0..yy).each {|y|
- @plane.blt(x * @bitmap.width, y * @bitmap.height, @bitmap, @bitmap.rect)
- }}
- super(@plane)
- else
- super(nil)
- end
- end
- #---------------------------------------------------------------------------
- # * Undefine methods dealing with coordinates to do nothing.
- #---------------------------------------------------------------------------
- undef :x, :x=, :y, :y= if method_defined?(:x)
- end
- #==============================================================================
- # ** Viewport
- #------------------------------------------------------------------------------
- #
- #==============================================================================
- class Viewport
- #--------------------------------------------------------------------------
- # * Overwriten method: update_viewport_sizes
- #--------------------------------------------------------------------------
- def update_viewport_sizes
- map = $game_map
- w, h = Graphics.width, Graphics.height
- hor = $game_map.loop_horizontal?
- ver = $game_map.loop_vertical?
- _w = ($game_map.width * 32 * $game_map.zoom_x).floor
- _h = ($game_map.height * 32 * $game_map.zoom_y).floor
- dx = w > _w && !hor ? ((w - _w).floor.abs / 32) * 16 : 0
- dw = hor ? w : [w, $game_map.width * 32 * $game_map.zoom_x].min
- dy = h > _h && !ver ? ((h - _h).floor.abs / 32) * 16 : 0
- dh = ver ? h : [h, $game_map.height * 32 * $game_map.zoom_y].min
- resize(Rect.new(dx, dy, dw, dh))
- end
- end
- #==============================================================================
- # ** ZTilemap
- #------------------------------------------------------------------------------
- # This class is the rewrite of the default tilemap class
- #==============================================================================
- class ZTilemap
- #---------------------------------------------------------------------------
- # * Public Instance Variables
- #---------------------------------------------------------------------------
- attr_reader :map_data, :viewport
- attr_accessor :tileset, :tone, :priorities, :sprite_compact
- attr_sec_accessor :autotiles, 'Array.new'
- attr_sec_accessor :ox, :oy, :zoom_x, :zoom_y, :hue, 'Integer(1)'
- attr_sec_accessor :opacity, 'Integer(255)'
- attr_sec_reader :layers, :bitmap_layers, :extra_map_data, 'Array.new'
- #---------------------------------------------------------------------------
- # * Redirect Listing
- #---------------------------------------------------------------------------
- redirect_method :width, '$game_map.screen_tile_x + 2'
- redirect_method :height, '$game_map.screen_tile_y + 2'
- #---------------------------------------------------------------------------
- # * Define Sec Listing
- #---------------------------------------------------------------------------
- define_sec_method(:all_sprites) { layers.flatten.select {|s| is_sprite?(s)}}
- define_sec_method(:is_sprite?) { |s| s.is_a?(Sprite) && s.not.disposed? }
- #---------------------------------------------------------------------------
- # * Alias Listing
- #---------------------------------------------------------------------------
- alias_method :bitmaps, :autotiles
- #---------------------------------------------------------------------------
- # * Object Initialization
- #---------------------------------------------------------------------------
- def initialize(viewport)
- @viewport = viewport
- @sprite_compact = false#LiTTleDRAgo::SPRITE_COMPACT
- create_sprites
- create_carrot
- end
- #---------------------------------------------------------------------------
- # * New method: create_sprites
- #---------------------------------------------------------------------------
- def create_sprites
- 6.times do |i|
- layers[i] ||= []
- (i % 6 == 0 ? 1 : height).times do |s|
- layers[i][s] = Sprite.new(@viewport) unless is_sprite?(layers[i][s])
- end
- layers[i].each_with_index do |s,r|
- next unless is_sprite?(s)
- s.y = r * 32 * zoom_y
- s.z = (i % 6 == 0) ? 0 : (r * 32 + 32 + (i % 6) * 32)
- s.mirror = $game_map.reverse
- end
- end
- end
- #---------------------------------------------------------------------------
- # * New method: create_carrot
- #---------------------------------------------------------------------------
- def create_carrot
- @draw_tiles = carrot do |x,y,data,prio|
- [0,1,2].each do |r|
- if (id = data[x,y,r]).to_i == 0 || (layer = prio[id]).nil?
- next
- elsif @layer_clear && @layer_clear.not.include?(layer)
- @bitmap_layers[layer].fill_rect(x*32,y*32,32,32,Color.erase)
- @layer_clear.push(layer)
- end
- refresh_tiles(x,y,r,id)
- end
- end
- @change_tone = carrot {|s| all_sprites.tone = (@tone = s) }
- @change_opacity = carrot {|s| all_sprites.opacity = (@opacity = s)}
- @change_autotile_hue = carrot do |a,old,hue|
- [old.to_i != 0 && a.hue_change((old - 360).abs)] && a.hue_change(hue)
- end
- end
- #---------------------------------------------------------------------------
- # * New method: ox=, oy=, zoom_x=, zoom_y=
- #---------------------------------------------------------------------------
- [:ox, :oy, :zoom_x, :zoom_y].each do |a|
- meth = "def %1$s=(%1$s) (@%1$s != %1$s) && (@%1$s = %1$s) && %2$s end"
- module_eval(sprintf(meth, a ,'adjust_sprites'))
- end
- #---------------------------------------------------------------------------
- # * New method: tone=
- #---------------------------------------------------------------------------
- def tone=(*tone)
- new_tone = tone.flatten.size == 4 ? Tone.new(*tone.flatten) :
- tone.first.is_a?(Tone) ? tone.first : nil
- @tone.to_s == new_tone.to_s || @change_tone.call(new_tone.clone)
- end
- #---------------------------------------------------------------------------
- # * New method: opacity=
- #---------------------------------------------------------------------------
- def opacity=(opacity)
- opacity = [[opacity.round,255].min,0].max
- @opacity == opacity || @change_opacity.call(opacity)
- end
- #---------------------------------------------------------------------------
- # * New method: hue=
- #---------------------------------------------------------------------------
- def hue=(hue)
- return if @hue == (hue % 360)
- old = self.hue
- @hue = hue % 360
- all_autotiles = @autotiles + extra_map_data.map {|m| m[:autotiles]}.flatten
- @change_autotile_hue.call(all_autotiles.uniq, old, @hue)
- refresh
- end
- #---------------------------------------------------------------------------
- # * New method: Adjust Sprites
- #---------------------------------------------------------------------------
- def adjust_sprites
- @times_compact ||= []
- @layers_used && @layers.size.times do |i|
- layer = @layers[i]
- (i % 6 == 0 ? 1 : height).times do |r|
- sprite = layer[r]
- d = 32
- _r = 32 + (i % 6) * 32
- _y = r * 32 * zoom_y
- _z = i % 6 == 0 ? 0 : r * d + _r # (r * d + _r)
- unless is_sprite?(sprite)
- change = _y <= @viewport.height
- if @sprite_compact
- change &&= !char_out_range?(_r, (height-1)*d+_r)
- change &&= @layers_used[i] > 0
- end
- change || next
- sprite = (layer[r] = Sprite.new(@viewport))
- sprite.bitmap = bitmap_layers[i]
- sprite.tone = tone if tone
- sprite.opacity = opacity
- sprite.mirror = $game_map.reverse
- sprite.zoom_x, sprite.zoom_y = zoom_x, zoom_y
- else
- change = _y > @viewport.height
- if (@times_compact[i] ||= 0) < 10 && @sprite_compact
- change ||= (r > 0 && char_out_range?(_r, (height-1)*d+_r))
- change ||= (r > 0 && @layers_used[i] == 0)
- end
- sprite.y, sprite.z = _y, _z.ceil
- change && [sprite.dispose, @times_compact[i] += 1] && next
- end
- sprite.y, sprite.z = _y, _z.ceil
- _wd = @viewport.width/zoom_x
- _ox = sprite.mirror ? (sprite.bitmap.width-ox)-_wd : (_wd+=10) && ox
- if layer.select { |s| is_sprite?(s) }.size == 1
- sprite.src_rect.set(_ox, oy, _wd, @viewport.height/zoom_x + 10)
- else
- sprite.src_rect.set(_ox, (oy + r*32), _wd, 33)
- end
- sprite.zoom_x, sprite.zoom_y = zoom_x, zoom_y
- end
- end
- end
- #---------------------------------------------------------------------------
- # * New method: char_out_range?
- #---------------------------------------------------------------------------
- def char_out_range?(z1,z2)
- return false unless (s = $game_map.spriteset).is_a?(Spriteset_Map)
- s.character_sprites.all? do |d|
- d.not.disposed? && d.opacity > 0 && d.visible &&
- (d.z).not.between?(z1,z2)
- end
- end
- #---------------------------------------------------------------------------
- # * New method: Frame Dispose
- #---------------------------------------------------------------------------
- def dispose
- all_sprites.each { |s| s.dispose }
- bitmap = bitmap_layers
- bitmap += extra_map_data.map {|m| m[:autotiles]}.flatten - @autotiles
- bitmap += extra_map_data.map {|m| m[:tileset]}.flatten
- bitmap.compact.each { |s| s.disposed? || s.dispose }
- @layers.clear
- GC.start
- end
- #---------------------------------------------------------------------------
- # * New method: Change Map Data
- #---------------------------------------------------------------------------
- def map_data=(data)
- return if @map_data == data
- @map_data = data
- @map_data_reverse = data.reverse(true,false,false)
- 6.times do |i|
- bitmap_layers[i].dispose if bitmap_layers[i] && bitmap_layers[i].disposed?
- bitmap_layers[i] = Bitmap.new($game_map.width*32,$game_map.height*32)
- layers[i].each { |s| is_sprite?(s) && s.bitmap = bitmap_layers[i] }
- end
- refresh
- end
- #---------------------------------------------------------------------------
- # * New method: Map Data
- #---------------------------------------------------------------------------
- def map_data
- $game_map.reverse ? @map_data_reverse : @map_data
- end
- #---------------------------------------------------------------------------
- # * New method: Change priorities
- #---------------------------------------------------------------------------
- def priorities=(priorities)
- return if @priorities == priorities
- @priorities = priorities
- refresh
- end
- #---------------------------------------------------------------------------
- # * New method: Frame Refresh
- #---------------------------------------------------------------------------
- def refresh
- return unless @priorities && @map_data
- LiTTleDRAgo.cache.clear_tile_cache
- @animated_tiles = []
- @unrefreshed_tile = []
- @layers_used = []
- 7.times do |i|
- @total_frames = [] if i == 0
- @current_frame = [] if i == 0
- bm = (@current_frame[i] = @layers_used[i] = 0) && autotiles[i]
- bm.nil? && @total_frames[i] = 1
- bm.nil? || @total_frames[i] = bm.width / (bm.height > 32 ? 256 : 32)
- extra_map_data.each do |data|
- data[:total_frames] = [] if i == 0
- data[:current_frame] = [] if i == 0
- bm = (data[:current_frame][i] = 0) && data[:autotiles][i]
- bm.nil? && data[:total_frames][i] = 1
- bm.nil? || data[:total_frames][i] = bm.width / (bm.height>32 ? 256 : 32)
- end
- end
- _w = @viewport.width
- _h = @viewport.height
- layers[0][0].src_rect.set(ox, oy, _w/zoom_x, _h/zoom_y )
- (0...map_data.xsize).each do |x|
- (0...map_data.ysize).each do |y|
- if in_range?(x,y)
- update_map_changes(x,y)
- else
- next if @unrefreshed_tile.include?([x,y])
- @unrefreshed_tile.push([x,y])
- @unrefreshed_tile.uniq!
- end
- end
- end
- adjust_sprites
- end
- #---------------------------------------------------------------------------
- # * New method: Refresh Tiles
- #---------------------------------------------------------------------------
- def refresh_tiles(x,y,z,i,d = nil)
- return if i.nil? || i == 0
- i < 384 ? refresh_autotile(x,y,z,i,d) : refresh_regular_tile(x,y,z,i,d)
- end
- #---------------------------------------------------------------------------
- # * New method: Refresh Autotile
- #---------------------------------------------------------------------------
- def refresh_autotile(x,y,z,id,data)
- layer = data.nil? ? @priorities[id] : data[:priorities][id]
- tframe = data.nil? ? @total_frames : data[:total_frames]
- cframe = data.nil? ? @current_frame : data[:current_frame]
- bitmap = data.nil? ? @autotiles.at(id/48-1) : data[:autotiles].at(id/48-1)
- return if bitmap.nil? || layer.nil?
- div = (fid = id / 48 - 1) &&(id % 48)
- if @animated_tiles.not.include?([x,y]) && tframe[fid] > 1
- @animated_tiles.push([x,y])
- @animated_tiles.uniq!
- end
- rect = Rect.new((div % 8)*32 + cframe[fid] * 256, (div / 8)*32, 32, 32)
- bitmap_layers[layer].blt(x*32, y*32, bitmap, rect)
- @layers_used[layer] = [(@layers_used[layer] + 1) % 10000,1].max
- end
- #---------------------------------------------------------------------------
- # * New method: Refresh Regular Tile
- #---------------------------------------------------------------------------
- def refresh_regular_tile(x,y,z,id,data)
- tileset = data.nil? ? @tileset : data[:tileset]
- layer = data.nil? ? @priorities[id] : data[:priorities][id]
- return if layer.nil? || tileset.not.is_a?(Bitmap)
- bitmap = LiTTleDRAgo.cache.format_tile(tileset, id, hue)
- bitmap_layers[layer].blt(x*32, y*32, bitmap, Rect.new(0, 0, 32, 32))
- @layers_used[layer] = [(@layers_used[layer] + 1) % 10000, 1].max
- end
- #---------------------------------------------------------------------------
- # * New method: force_refresh
- #---------------------------------------------------------------------------
- def force_refresh
- refresh
- (@unrefreshed_tile ||= []).each {|x,y| update_map_changes(x,y)}
- (@unrefreshed_tile.clear)
- end
- #---------------------------------------------------------------------------
- # * New method: Frame Update
- #---------------------------------------------------------------------------
- def update
- update_map_data
- update_autotile
- update_unrefreshed_tile
- end
- #---------------------------------------------------------------------------
- # * New method: Update Unrefreshed Tile
- #---------------------------------------------------------------------------
- def update_unrefreshed_tile
- if @unrefreshed_tile && @unrefreshed_tile.not.empty?
- unrefreshed = @unrefreshed_tile.select { |x,y| in_range?(x,y) }
- if unrefreshed.not.empty?
- (unrefreshed).each {|x,y| update_map_changes(x,y)}
- (@unrefreshed_tile -= unrefreshed) && adjust_sprites
- end
- end
- end
- #---------------------------------------------------------------------------
- # * New method: Update Map Data
- #---------------------------------------------------------------------------
- def update_map_data
- if map_data.table_changes.not.empty?
- map_data.table_changes.each do|item|
- x,y,z,tile_id = item
- update_map_changes(x,y)
- end
- map_data.table_changes.clear
- map_data.make_changes = false
- adjust_sprites
- end
- end
- #---------------------------------------------------------------------------
- # * New method: Update the autotile
- #---------------------------------------------------------------------------
- def update_autotile
- return if $game_map.screen_is_solid?
- speed = $game_map.autotile_speed
- total = [(@autotile_total || 0) / 10, 0].max
- if speed > 0 && Graphics.frame_count % (speed + total) == 0
- 7.times do |i|
- extra_map_data.each do |data|
- next if (total = data[:total_frames].at(i)) == 0
- data[:current_frame][i] = (data[:current_frame].at(i) + 1) % total
- end
- next if (total = @total_frames.at(i)) == 0
- @current_frame[i] = (@current_frame.at(i) + 1) % total
- end
- animated = @animated_tiles.select { |x,y| in_range?(x,y) }
- animated.each {|x,y| update_map_changes(x,y) }
- @autotile_total = animated.size
- end
- end
- #---------------------------------------------------------------------------
- # * New method: in_range?
- #---------------------------------------------------------------------------
- def in_range?(x=nil,y=nil)
- return false if layers[0].nil? || layers[0][0].nil?
- rect = @layers[0][0].src_rect
- _x = x && (x * 32).between?(rect.x-32, rect.x + rect.width)
- _y = y && (y * 32).between?(rect.y-32, rect.y + rect.height)
- return _x && _y if x && y
- return _x if x
- return _y if y
- return false
- end
- #---------------------------------------------------------------------------
- # * New method: Update Map Changes
- #---------------------------------------------------------------------------
- def update_map_changes(x,y)
- @layer_clear ||= []
- @layer_clear.clear
- draw = [[x,y,map_data,priorities]]
- draw += extra_map_data.map {|data|[x,y,data[:map].data,data[:priorities]]}
- draw.each {|data| @draw_tiles.call(*data)}
- end
- end
- #==============================================================================
- # ** Game_Character
- #------------------------------------------------------------------------------
- # This class deals with characters. It's used as a superclass for the
- # determinants and map scrolling. Refer to "$game_player" for the one
- # Game_Player and Game_Event classes.
- #==============================================================================
- class Game_Character
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- alias_sec_method(:screen_x_before_zoom, :screen_x)
- alias_sec_method(:screen_y_before_zoom, :screen_y)
- alias_sec_method(:screen_z_before_zoom, :screen_z)
- #--------------------------------------------------------------------------
- # * Aliased method: screen_x
- #--------------------------------------------------------------------------
- def screen_x(*args)
- screen_x_before_zoom(*args) * $game_map.zoom_x
- end
- #--------------------------------------------------------------------------
- # * Aliased method: screen_y
- #--------------------------------------------------------------------------
- def screen_y(*args)
- screen_y_before_zoom(*args) * $game_map.zoom_y
- end
- #--------------------------------------------------------------------------
- # * Aliased method: screen_z
- #--------------------------------------------------------------------------
- def screen_z(*args)
- if self.is_a?(Game_Event)
- return 999 if @always_on_top
- return $1.to_i if self.name[/\<Z:\s*([-]?\d+)\s*\>/i]
- return screen_z_tilemap_fix if screen_z_tilemap_fix.is_a?(Integer)
- end
- return screen_z_before_zoom(*args)
- end
- #--------------------------------------------------------------------------
- # * New method: screen_z_tilemap_fix
- #--------------------------------------------------------------------------
- def screen_z_tilemap_fix
- LiTTleDRAgo::CHARACTER_Z_FIX.each do |key,value|
- if value.is_a?(Array) && key.is_a?(Integer)
- return key if value.any?{|v|"#{v}".downcase == @character_name.downcase}
- elsif key.is_a?(Array) && value.is_a?(Integer)
- return value if key.any?{|v|"#{v}".downcase == @character_name.downcase}
- elsif (key.is_a?(String) || key.is_a?(Symbol)) && value.is_a?(Integer)
- return value if "#{key}".downcase == @character_name.downcase
- end
- end
- return nil
- end
- end
- #==============================================================================
- # ** Sprite_Character
- #------------------------------------------------------------------------------
- # This sprite is used to display the character.It observes the Game_Character
- # class and automatically changes sprite conditions.
- #==============================================================================
- class Sprite_Character
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- alias_sec_method(:zoom_update_scrolling, :update)
- #--------------------------------------------------------------------------
- # * Aliased method: update
- #--------------------------------------------------------------------------
- def update(*args)
- if @old_character_zoom_x
- self.zoom_x = @old_character_zoom_x
- self.zoom_y = @old_character_zoom_y
- end
- zoom_update_scrolling(*args)
- @old_character_zoom_x = self.zoom_x
- @old_character_zoom_y = self.zoom_y
- self.zoom_x *= $game_map.zoom_x
- self.zoom_y *= $game_map.zoom_y
- end
- #--------------------------------------------------------------------------
- # * New method: in_range?
- #--------------------------------------------------------------------------
- unless method_defined?(:in_range?)
- def in_range?
- cw = self.src_rect ? self.src_rect.width : 32
- ch = self.src_rect ? self.src_rect.height : 32
- return @character.screen_x.round.between?(self.viewport.x - cw,
- self.viewport.x + self.viewport.width) &&
- @character.screen_y.round.between?(self.viewport.y - ch,
- self.viewport.y + self.viewport.height)
- end
- end
- end
- #==============================================================================
- # ** Spriteset_Map
- #------------------------------------------------------------------------------
- # This class brings together map screen sprites, tilemaps, etc.
- # It's used within the Scene_Map class.
- #==============================================================================
- class Spriteset_Map
- #---------------------------------------------------------------------------
- # * Public Instance Variables
- #---------------------------------------------------------------------------
- attr_reader :character_sprites, :tilemap
- attr_reader :viewport1, :viewport2, :viewport3
- #--------------------------------------------------------------------------
- # * Alias Listing
- #--------------------------------------------------------------------------
- $@ || alias_method(:init_drgcr_tilemap, :initialize)
- alias_sec_method(:update_drgcr_tilemap, :update)
- #--------------------------------------------------------------------------
- # * Aliased method: initialize
- #--------------------------------------------------------------------------
- def initialize(*args)
- check_autotile_height
- init_drgcr_tilemap(*args)
- end
- #---------------------------------------------------------------------------
- # * New method: check_autotile_height
- #---------------------------------------------------------------------------
- def check_autotile_height
- return unless LiTTleDRAgo::XP
- $game_map.autotile_names.each do |autotile_name|
- bitmap = ModCache.autotile(autotile_name)
- [@force_tilemap_enabled = true] && break if bitmap.height == 192
- end
- end
- #--------------------------------------------------------------------------
- # * Aliased method: update
- #--------------------------------------------------------------------------
- def update(*args)
- adjust_viewport
- adjust_tilemap
- adjust_old_zoom
- update_drgcr_tilemap(*args)
- update_tilemap_zoom
- end
- #---------------------------------------------------------------------------
- # * New method: adjust_old_zoom
- #---------------------------------------------------------------------------
- def adjust_old_zoom
- if @old_fog_zoom_x
- @fog.zoom_x = @old_fog_zoom_x
- @fog.zoom_y = @old_fog_zoom_y
- @panorama.zoom_x = @old_panorama_zoom_x
- @panorama.zoom_y = @old_panorama_zoom_y
- end
- end
- #---------------------------------------------------------------------------
- # * New method: viewport_sprite
- #---------------------------------------------------------------------------
- def viewport_sprite(*v)
- v.collect! {|s| s.is_a?(Symbol) ? instance_variable_get(:"@#{s}") : s }
- v.reject! {|s| s.not.is_a?(Viewport)}
- all = instance_variables.map {|s| instance_variable_get("#{s}")}.flatten
- all.select {|s| s.respond_to?(:viewport) && v.include?(s.viewport)}
- end
- #---------------------------------------------------------------------------
- # * New method: change_tilemap_tone
- #---------------------------------------------------------------------------
- def change_tilemap_tone(tone = Tone.new(0,0,0,0), *char)
- if tone.is_a?(Array) && (3..4) === tone.size
- result = $game_map.tilemap_tone = Tone.new(*tone)
- elsif tone.is_a?(Tone)
- result = $game_map.tilemap_tone = tone
- else
- return
- end
- sprite = viewport_sprite(:viewport1)
- sprite.reject! {|s| s.is_a?(Sprite_Character)}
- sprite.each {|s| s.tone = result if s.respond_to?(:tone=) }
- change_character_tone(tone, *char) unless char.empty?
- end
- #---------------------------------------------------------------------------
- # * New method: change_character_tone
- #---------------------------------------------------------------------------
- def change_character_tone(tone = Tone.new(0,0,0,0), *char)
- char = char.collect {|c| c.is_a?(Range) ? c.to_a : c}.flatten
- char = char.collect {|c| c.is_a?(Range) ? c.to_a : c}.flatten
- char.collect! {|c| c.is_a?(Game_Character) ? c :
- $game_map.interpreter.get_character(c)}
- sprite = viewport_sprite(:viewport1)
- sprite.reject! {|s| s.not.is_a?(Sprite_Character) }
- sprite.reject! {|s| char.not.include?(s.character)}
- if tone.is_a?(Array) && (3..4) === tone.size
- sprite.tone(:tone=, Tone.new(*tone))
- elsif tone.is_a?(Tone)
- sprite.send(:tone=, tone)
- end
- end
- #--------------------------------------------------------------------------
- # * New method: reload_tilemap
- #--------------------------------------------------------------------------
- def reload_tilemap
- return [dispose_tilemap, create_tilemap] if LiTTleDRAgo::VXA
- @tilemap.respond_to?(:dispose) && @tilemap.dispose
- 7.times do |i|
- auto = @tilemap.autotiles[i]
- auto.respond_to?(:dispose) && (auto.disposed? || auto.dispose)
- end
- res = tilemap_enabled? ? ZTilemap : Tilemap
- @tilemap = res.new(@viewport1)
- @tilemap.tileset = ModCache.tileset($game_map.tileset_name)
- 7.times do |i|
- autotile_name = $game_map.autotile_names[i]
- @tilemap.autotiles[i] = @tilemap.is_a?(ZTilemap) ?
- ModCache.autotile_cr_tilemap(autotile_name) :
- ModCache.autotile(autotile_name)
- end
- update_tilemap_effect
- @tilemap.priorities = $game_map.priorities
- @tilemap.map_data = $game_map.data
- @tilemap.update
- @viewport_screen_width = 0
- end
- #--------------------------------------------------------------------------
- # * New method: reload_plane
- #--------------------------------------------------------------------------
- def reload_plane
- z1 = @panorama.respond_to?(:z) ? @panorama.z : -1000
- z2 = @fog.respond_to?(:z) ? @fog.z : 5000
- z1 /= 1000 if @panorama.is_a?(CRPlane)
- z2 /= 1000 if @fog.is_a?(CRPlane)
- res = plane_enabled? ? CRPlane : Plane
- bitmap1 = @panorama.respond_to?(:bitmap) ? @panorama.bitmap : nil
- bitmap2 = @fog.respond_to?(:bitmap) ? @fog.bitmap : nil
- @panorama.respond_to?(:dispose) && @panorama.dispose
- @fog.respond_to?(:dispose) && @fog.dispose
- @panorama = res.new(@viewport1)
- @fog = res.new(@viewport1)
- @panorama.bitmap = bitmap1 if bitmap1.is_a?(Bitmap)
- @fog.bitmap = bitmap2 if bitmap2.is_a?(Bitmap)
- @panorama.z, @fog.z = z1, z2
- @viewport_screen_width = 0
- end
- #--------------------------------------------------------------------------
- # * New method: update_tilemap_zoom
- #--------------------------------------------------------------------------
- def update_tilemap_zoom
- @weather.zoom_x = $game_map.zoom_x
- @weather.zoom_y = $game_map.zoom_y
- @old_fog_zoom_x = @fog.zoom_x
- @old_fog_zoom_y = @fog.zoom_y
- @old_panorama_zoom_x = @panorama.zoom_x
- @old_panorama_zoom_y = @panorama.zoom_y
- @fog.zoom_x *= $game_map.zoom_x
- @fog.zoom_y *= $game_map.zoom_y
- @panorama.zoom_x *= $game_map.zoom_x
- @panorama.zoom_y *= $game_map.zoom_y
- update_tilemap_effect
- end
- #--------------------------------------------------------------------------
- # * New method: update_tilemap_effect
- #--------------------------------------------------------------------------
- def update_tilemap_effect
- return if @tilemap.not.is_a?(ZTilemap)
- @tilemap.zoom_x = $game_map.zoom_x
- @tilemap.zoom_y = $game_map.zoom_y
- @tilemap.opacity = $game_map.tilemap_opacity
- @tilemap.hue = $game_map.tilemap_hue
- @tilemap.tone = $game_map.tilemap_tone
- end
- #--------------------------------------------------------------------------
- # * Overwriten method: viewport_size_change?
- #--------------------------------------------------------------------------
- def viewport_size_change?
- return true if @viewport_map_width != $game_map.width * $game_map.zoom_x
- return true if @viewport_map_height != $game_map.height * $game_map.zoom_y
- return true if @viewport_screen_width != Graphics.width
- return true if @viewport_screen_height != Graphics.height
- end
- #--------------------------------------------------------------------------
- # * New method: adjust_viewport
- #--------------------------------------------------------------------------
- def adjust_viewport
- if viewport_size_change?
- @viewport_map_width = $game_map.width * $game_map.zoom_x
- @viewport_map_height = $game_map.height * $game_map.zoom_y
- @viewport_screen_width = Graphics.width
- @viewport_screen_height = Graphics.height
- [@viewport1,@viewport2,@viewport3].compact.update_viewport_sizes
- end
- end
- #--------------------------------------------------------------------------
- # * New method: adjust_tilemap
- #--------------------------------------------------------------------------
- def adjust_tilemap
- if LiTTleDRAgo::XP
- if tilemap_enabled?
- reload_tilemap if @tilemap.is_a?(Tilemap)
- else
- reload_tilemap if @tilemap.is_a?(ZTilemap)
- end
- end
- if plane_enabled?
- reload_plane if @panorama.is_a?(Plane) || @fog.is_a?(Plane)
- else
- reload_plane if @panorama.is_a?(CRPlane) || @fog.is_a?(CRPlane)
- end
- end
- #--------------------------------------------------------------------------
- # * New method: tilemap_enabled?
- #--------------------------------------------------------------------------
- def tilemap_enabled?
- return true if @force_tilemap_enabled
- return true unless LiTTleDRAgo::RGSS1
- return true unless @viewport1.width <= 640 && @viewport1.height <= 480
- return true unless (map = $game_map) && map.zoom_x * map.zoom_y == 1
- return true unless map.tilemap_opacity >= 255
- return true unless map.tilemap_hue <= 0
- return true unless map.tilemap_tone.to_s.get_int == 0
- return true if map.reverse
- return false
- end
- #--------------------------------------------------------------------------
- # * New method: plane_enabled?
- #--------------------------------------------------------------------------
- def plane_enabled?
- return true unless LiTTleDRAgo::RGSS1
- return true unless @viewport1.width <= 640 && @viewport1.height <= 480
- return false
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement