The RPG Maker Resource Kit

RMRK RPG Maker Creation => VX Ace => VXA Scripts Database => Topic started by: TDS on January 24, 2013, 04:48:05 AM

Title: Region Display
Post by: TDS on January 24, 2013, 04:48:05 AM
Region Display
Version: 1.3
Author: TDS
Date: January 23, 2013

Version History



Description


This script allows you to see Region tiles in your game by pressing F8.

Features


Screenshots

(https://rmrk.net/proxy.php?request=http%3A%2F%2Fi.imgur.com%2FqGZ8Bgn.png&hash=095669780a6afa71040d0b722ce7149a9902920b)



Instructions

Just put the script in your game and while testing press the F8 key to toggle the visibility of Region tiles.

Script


Code: [Select]
#==============================================================================
# ** TDS Region Display
#    Ver: 1.3
#------------------------------------------------------------------------------
#  * Description:
#  This script allows you to see Region tiles in your game by pressing F8.
#------------------------------------------------------------------------------
#  * Features:
#  Viewing Region tiles.
#------------------------------------------------------------------------------
#  * Instructions:
#  Just put it in your game and pres the F8 key while testing the game to toggle
#  the visibility of Region tiles.
#------------------------------------------------------------------------------
#  * Notes:
#  None.
#------------------------------------------------------------------------------
# WARNING:
#
# Do not release, distribute or change my work without my expressed written
# consent, doing so violates the terms of use of this work.
#
# If you really want to share my work please just post a link to the original
# site.
#
# * Not Knowing English or understanding these terms will not excuse you in any
#   way from the consequenses.
#==============================================================================
# * Import to Global Hash *
#==============================================================================
($imported ||= {})[:TDS_Region_Display] = true

#==============================================================================
# ** Cache
#------------------------------------------------------------------------------
#  This module loads graphics, creates bitmap objects, and retains them.
# To speed up load times and conserve memory, this module holds the
# created bitmap object in the internal hash, allowing the program to
# return preexisting objects when the same bitmap is requested again.
#==============================================================================

module Cache
  #--------------------------------------------------------------------------
  # * Create Region Tileset
  #--------------------------------------------------------------------------
  def self.create_region_tileset_bitmap
    @cache ||= {}
    # If Cache Does not have Region Tileset Key
    if !@cache.has_key?(:region_tileset) or region_tileset_bitmap.disposed?
      # Create Region Tileset Bitmap
      bitmap = Bitmap.new(256, 544) ; bitmap.font.bold = true
      # Go Through 64 Region Tiles (2 times for over and under tiles)
      128.times {|i|
        id = i % 64
        # Get Region Colors and X & Y Drawing Coordinates
        colors = region_colors(id, 110) ; x = (i % 8) * 32 ; y = (i / 8) * 32
        # Draw Region Color Rect
        bitmap.fill_rect(x, y, 32, 32, colors.at(0))
        bitmap.fill_rect(x + 3, y + 3, 26, 26, colors.at(1))
        # Draw Region ID
        bitmap.draw_text(x, y, 32, 32, id, 1) if id != 0
      }
      # Get Region Colors and X & Y Drawing Coordinates
      colors = region_colors(64, 110) ; x = (64 % 8) * 32 ; y = (64 / 8) * 32
      # Draw Region Color Rect
      bitmap.fill_rect(x, y, 32, 32, colors.at(0))
      bitmap.fill_rect(x + 3, y + 3, 26, 26, colors.at(1))     
      # Add Region Tileset bitmap to Cache
      @cache[:region_tileset] = bitmap
    end
  end
  #--------------------------------------------------------------------------
  # * Get Region Tileset Bitmap
  #--------------------------------------------------------------------------
  def self.region_tileset_bitmap ; @cache[:region_tileset] end
  #--------------------------------------------------------------------------
  # * Get Region Colors (Outer, Inner)
  #     id    : region id
  #     alpha : color alpha value
  #--------------------------------------------------------------------------
  def self.region_colors(id, alpha = 110)
    return [Color.new(0, 0, 0, alpha),  Color.new(0, 0, 0, alpha)] if id > 63
    case id % 12
    when 0  ; [Color.new(255, 68,  164, alpha),  Color.new(255, 52,  156, alpha)]
    when 1  ; [Color.new(255, 67,  67,  alpha),  Color.new(255, 51,  51,  alpha)]
    when 2  ; [Color.new(255, 161, 68,  alpha),  Color.new(255, 153, 52,  alpha)]
    when 3  ; [Color.new(255, 252, 68,  alpha),  Color.new(255, 252, 52,  alpha)]
    when 4  ; [Color.new(164, 255, 68,  alpha),  Color.new(156, 255, 52,  alpha)]
    when 5  ; [Color.new(68,  255, 68,  alpha),  Color.new(52,  255, 52,  alpha)]
    when 6  ; [Color.new(68,  255, 161, alpha),  Color.new(52,  255, 153, alpha)]
    when 7  ; [Color.new(68,  255, 252, alpha),  Color.new(52,  255, 252, alpha)]
    when 8  ; [Color.new(68,  164, 255, alpha),  Color.new(52,  156, 255, alpha)]
    when 9  ; [Color.new(68,  72,  255, alpha),  Color.new(52,  57,  255, alpha)]
    when 10 ; [Color.new(156, 68,  255, alpha),  Color.new(148, 52,  255, alpha)]
    when 11 ; [Color.new(252, 68,  255, alpha),  Color.new(252, 52,  255, alpha)]
    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 :region_tilemap                                # Region Tilemap
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias tds_region_display_spriteset_map_initialize         initialize
  alias tds_region_display_spriteset_map_refresh_characters refresh_characters
  alias tds_region_display_spriteset_map_dispose            dispose 
  alias tds_region_display_spriteset_map_update             update
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize(*args, &block)
    # Run Original Method
    tds_region_display_spriteset_map_initialize(*args, &block)
    # Create Region Display Tilemap
    create_region_display_tilemap
  end
  #--------------------------------------------------------------------------
  # * Refresh Characters
  #--------------------------------------------------------------------------
  def refresh_characters(*args, &block)   
    # Run Original Method
    tds_region_display_spriteset_map_refresh_characters(*args, &block)
    # Previous Visibility of Region Tilemap
    prev_vis = @region_tilemap.visible
    # Dispose of Region Tilemap & Recreate it
    dispose_region_tilemap ; create_region_display_tilemap
    # Set Region Tilemap Visibility
    @region_tilemap.visible = prev_vis
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update(*args, &block)
    # Run Original Method
    tds_region_display_spriteset_map_update(*args, &block)
    # Update Region Tilemap
    update_region_tilemap
  end
  #--------------------------------------------------------------------------
  # * Free
  #--------------------------------------------------------------------------
  def dispose(*args, &block)
    # Run Original Method
    tds_region_display_spriteset_map_dispose(*args, &block)
    # Dispose of Region Tilemap
    dispose_region_tilemap
  end
  #--------------------------------------------------------------------------
  # * Free Region Tilemap
  #--------------------------------------------------------------------------
  def dispose_region_tilemap ; @region_tilemap.dispose end 
  #--------------------------------------------------------------------------
  # * Create Region Display Tilemap
  #--------------------------------------------------------------------------
  def create_region_display_tilemap
    # Create Region Tileset
    Cache.create_region_tileset_bitmap   
    # Create Region Tilemap
    @region_tilemap = Tilemap.new(@viewport1)
    @region_tilemap.map_data = $game_map.data.dup
    @region_tilemap.flags = Table.new(8192)
    # Make Region Tilemap Invisible
    @region_tilemap.visible = false
    # Set Region Tilemap Flags (Over Character [?])
    64.upto(128) {|n| @region_tilemap.flags[n] = 0x10}
    # Go Through Game Map Tiles
    $game_map.data.xsize.times {|x|
      $game_map.data.ysize.times {|y|
        # Clear Region Tilemap Info
        4.times {|z| @region_tilemap.map_data[x, y, z] = 0}
        # Get Region ID
        region_id = $game_map.region_id(x, y)
        # Get Passability Flags
        flag1 = $game_map.tileset.flags[$game_map.data[x, y, 2]]         
        # If Region ID is 0 or more
        if region_id > 0
          next @region_tilemap.map_data[x, y, 2] = 64 + region_id if flag1 > 16 and flag1 & 0x10 != 0
          @region_tilemap.map_data[x, y, 2] = region_id         
        else                   
          next @region_tilemap.map_data[x, y, 2] = 64 if flag1 > 16 and flag1 & 0x10 != 0
          next @region_tilemap.map_data[x, y, 1] = 64       
        end       
      }
    }
    # Set Region Tilemap Bitmap (Tile B)
    @region_tilemap.bitmaps[5] = Cache.region_tileset_bitmap
    # Update Region Tilemap
    update_region_tilemap
  end
  #--------------------------------------------------------------------------
  # * Update Region Tilemap
  #--------------------------------------------------------------------------
  def update_region_tilemap
    # Return if Region Tilemap is nil
    return if @region_tilemap.nil?
    # Set Region Tilemap OX & OY Values
    @region_tilemap.ox = $game_map.display_x * 32
    @region_tilemap.oy = $game_map.display_y * 32   
  end
end


#==============================================================================
# ** Scene_Map
#------------------------------------------------------------------------------
#  This class performs the map screen processing.
#==============================================================================

class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # * Alias Listing
  #--------------------------------------------------------------------------
  alias tds_region_display_scene_map_update                            update
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update(*args, &block)
    # Update Region Display Input
    update_region_display_input
    # Run Original Method
    tds_region_display_scene_map_update(*args, &block)
  end
  #--------------------------------------------------------------------------
  # * Update Region Display Input
  #--------------------------------------------------------------------------
  def update_region_display_input
    # If Input Trigger F8
    if $TEST and Input.trigger?(:F8)
      # Toggle Region Tilemap Visibility
      @spriteset.region_tilemap.visible = !@spriteset.region_tilemap.visible
    end
  end 
end

Credit




Thanks



Support


On this topic.

Known Compatibility Issues

None that I'm aware of.


Author's Notes


I know this script might not be of much use to a lot of people, but working on it has helped me develop a lot of other more complex scripts that use the Tilemap class.

Restrictions

Only for use in non-commercial games.
Title: Re: Region Display
Post by: modern algebra on January 24, 2013, 01:07:17 PM
This is a neat script. One minor thing I noticed on a brief review of your code was this:

Code: [Select]
    case id
    when 1,  13, 25, 37, 49, 61  ; [Color.new(255, 67,  67,  alpha),  Color.new(255, 51,  51,  alpha)]
    when 2,  14, 26, 38, 50, 62  ; [Color.new(255, 161, 68,  alpha),  Color.new(255, 153, 52,  alpha)]
    when 3,  15, 27, 39, 51, 63  ; [Color.new(255, 252, 68,  alpha),  Color.new(255, 252, 52,  alpha)]
    when 4,  16, 28, 40, 52      ; [Color.new(164, 255, 68,  alpha),  Color.new(156, 255, 52,  alpha)]
    when 5,  17, 29, 41, 53      ; [Color.new(68,  255, 68,  alpha),  Color.new(52,  255, 52,  alpha)]
    when 6,  18, 30, 42, 54      ; [Color.new(68,  255, 161, alpha),  Color.new(52,  255, 153, alpha)]
    when 7,  19, 31, 43, 55      ; [Color.new(68,  255, 252, alpha),  Color.new(52,  255, 252, alpha)]
    when 8,  20, 32, 44, 56      ; [Color.new(68,  164, 255, alpha),  Color.new(52,  156, 255, alpha)]
    when 9,  21, 33, 45, 57      ; [Color.new(68,  72,  255, alpha),  Color.new(52,  57,  255, alpha)]
    when 10, 22, 34, 46, 58      ; [Color.new(156, 68,  255, alpha),  Color.new(148, 52,  255, alpha)]
    when 11, 23, 35, 47, 59      ; [Color.new(252, 68,  255, alpha),  Color.new(252, 52,  255, alpha)]
    when 12, 24, 36, 48, 60      ; [Color.new(255, 68,  164, alpha),  Color.new(255, 52,  156, alpha)]
    else    ; [Color.new(0, 0, 0, alpha),  Color.new(0, 0, 0, alpha)]
    end 

It might be more efficient to do something like this:

Code: [Select]
    return [Color.new(0, 0, 0, alpha),  Color.new(0, 0, 0, alpha)] if id > 63
    case id % 12
    when 0  ; [Color.new(255, 68,  164, alpha),  Color.new(255, 52,  156, alpha)]
    when 1  ; [Color.new(255, 67,  67,  alpha),  Color.new(255, 51,  51,  alpha)]
    when 2  ; [Color.new(255, 161, 68,  alpha),  Color.new(255, 153, 52,  alpha)]
    when 3  ; [Color.new(255, 252, 68,  alpha),  Color.new(255, 252, 52,  alpha)]
    when 4  ; [Color.new(164, 255, 68,  alpha),  Color.new(156, 255, 52,  alpha)]
    when 5  ; [Color.new(68,  255, 68,  alpha),  Color.new(52,  255, 52,  alpha)]
    when 6  ; [Color.new(68,  255, 161, alpha),  Color.new(52,  255, 153, alpha)]
    when 7  ; [Color.new(68,  255, 252, alpha),  Color.new(52,  255, 252, alpha)]
    when 8  ; [Color.new(68,  164, 255, alpha),  Color.new(52,  156, 255, alpha)]
    when 9  ; [Color.new(68,  72,  255, alpha),  Color.new(52,  57,  255, alpha)]
    when 10 ; [Color.new(156, 68,  255, alpha),  Color.new(148, 52,  255, alpha)]
    when 11 ; [Color.new(252, 68,  255, alpha),  Color.new(252, 52,  255, alpha)]
    end 


Anyway, that's minor. I think this is a very helpful debug tool.
Title: Re: Region Display
Post by: TDS on January 24, 2013, 05:10:27 PM
Thanks modern algebra. I knew that ugly little chunk of code would stick out like a sore thumb. I tried to figure it out myself, but I got stuck and couldn't make (id % 12/13) work properly.
Title: Re: Region Display
Post by: ekomega on January 25, 2013, 06:55:05 PM
This is outstanding! Thank you.