03-07-2008, 06:35 AM 
	
	
	Isometric View
version 1.0
by MGCaladtogel and Siegfried
Translated and enhancements by GubiD
Description:version 1.0
by MGCaladtogel and Siegfried
Translated and enhancements by GubiD
This allows you to create the game you have always wanted in RMXP! This script takes the standard movement and character placement and tile rendering to Isometric, which is 2.5D. What does that mean? You can now create games that incorporate height and a semi 3d look without actually being 3d! Of course this means that there will be a lot of spriting of tilesets, but the capability is there. This can eventually be incorporated into many ABS's and TBS's (its already in GTBS... v1.3 to be released soon).
Instructions for use are in the demo.
 script part1
  			Code:
#-------------------------------------------------------------------------------
# ? Script 2D_ISO, created by MGCaladtogel tranlated by GubiD
#-------------------------------------------------------------------------------
#==============================================================================
# New Variables: 
#  $game_map indicates the map of data (where you will place events)
#  $game_map_iso indicates the map into 2d-isometric view, although containing no events.
#==============================================================================
#==============================================================================
# ? Game_Map
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # ? The scrolling must be carried out according to dimensions of chart
  #     into isometric
  #--------------------------------------------------------------------------
  def scroll_down(distance)
    if $game_map.iso?
      corr = (($game_map.height + $game_map.width)%2 == 0 ? 0 : 4*16)
      @display_y = [@display_y + distance, 128*$game_map_iso.height - 4*480 - corr].min
    else
      @display_y = [@display_y + distance, (self.height - 15) * 128].min
    end
  end
  #--------------------------------------------------------------------------
  def scroll_right(distance)
    if $game_map.iso?
      @display_x = [@display_x + distance, 128*$game_map_iso.width - 4 * 640].min
    else
      @display_x = [@display_x + distance, (self.width - 20) * 128].min
    end
    
  end
end
#==============================================================================
# ? Game_Character
#==============================================================================
class Game_Character
  #--------------------------------------------------------------------------
  # ? Update the position of the characters to the screen according to x,y in isometric 
  #--------------------------------------------------------------------------
  def screen_x
    if $game_map.iso?
      return  (@real_x - @real_y)/4 + 32*$game_map.height - 0 - $game_map.display_x/4
    else
      return (@real_x - $game_map.display_x + 3) / 4 + 16
    end
  end
  #--------------------------------------------------------------------------
  def screen_y
    if $game_map.iso?
      y = (@real_y + @real_x) / 8 + 24 - $game_map.display_y/4
      if @jump_count >= @jump_peak
        n = @jump_count - @jump_peak
      else
        n = @jump_peak - @jump_count
      end
      return y - (@jump_peak * @jump_peak - n * n) / 2
    else
      y = (@real_y - $game_map.display_y + 3) / 4 + 32
      # Make y-coordinate smaller via jump count
      if @jump_count >= @jump_peak
        n = @jump_count - @jump_peak
      else
        n = @jump_peak - @jump_count
      end
      return y - (@jump_peak * @jump_peak - n * n) / 2
    end
  end
  #--------------------------------------------------------------------------
  def screen_z(height = 0)
    if $game_map.iso?
      if @always_on_top
        return 999
      end
      z = 9999#screen_y
      if @tile_id > 0
        return z + $game_map_iso.priorities[@tile_id] * (32 + (8*screen_th))
      end
    else # use default method
      if @always_on_top
        # 999, unconditional
        return 999
      end
      # Get screen coordinates from real coordinates and map display position
      z = (@real_y - $game_map.display_y + 3) / 4 + 32
      # If tile
      if @tile_id > 0
        # Add tile priority * 32
        return z + $game_map.priorities[@tile_id] * 32
      # If character
      else
        # If height exceeds 32, then add 31
        return z + ((height > 32) ? 31 : 0)
      end
    end
  end
end
#==============================================================================
# ? Game_Player
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ? Sets up use for directions using 1,3,7,9 coordinated to up/down/left/right
  #     so that the scrolling occurs cleaner.
  #--------------------------------------------------------------------------
  alias gmpl_iso_update update
  def update
    if $game_map.iso?
      last_moving = moving?
      unless moving? or $game_system.map_interpreter.running? or
             @move_route_forcing or $game_temp.message_window_showing
        case Input.dir8
        when 1..2
          move_down
        when 3
          move_right
        when 4
          move_left
        when 7
          move_left
        when 6
          move_right
        when 8..9
          move_up
        end
      end
      last_real_x = @real_x
      last_real_y = @real_y
      super
      disp_y = screen_y + $game_map.display_y/4
      disp_x = screen_x + $game_map.display_x/4
      if CENTER_Y - (4*disp_y - $game_map.display_y) < 0
        $game_map.scroll_down(4*disp_y - $game_map.display_y - CENTER_Y)
      end
      if CENTER_X - (4*disp_x - $game_map.display_x) > 0
        $game_map.scroll_left(CENTER_X - (4*disp_x - $game_map.display_x))
      end
      if CENTER_X - (4*disp_x - $game_map.display_x) < 0
        $game_map.scroll_right(4*disp_x - $game_map.display_x - CENTER_X)
      end
      if CENTER_Y - (4*disp_y - $game_map.display_y) > 0
        $game_map.scroll_up(CENTER_Y - (4*disp_y - $game_map.display_y))
      end
      unless moving?
        if last_moving
          result = check_event_trigger_here([1,2])
          if result == false
            unless $DEBUG and Input.press?(Input::CTRL)
              if @encounter_count > 0
                @encounter_count -= 1
              end
            end
          end
        end
        if Input.trigger?(Input::C)
          check_event_trigger_here([0])
          check_event_trigger_there([0,1,2])
        end
      end
    else
      gmpl_iso_update
    end
  end
    
end
#==============================================================================
# ? Scene_Title
#==============================================================================
class Scene_Title
  alias main_orig main
  #--------------------------------------------------------------------------
  # ? Loads MapInfos so that Iso map id's can be loaded according to the current map.
  #--------------------------------------------------------------------------
  def main
    $data_map_infos        = load_data("Data/MapInfos.rxdata")
    main_orig
  end
end
#==============================================================================
# ? Spriteset_Map
#==============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ? Generates the map, then lays the iso view map (parent map) over it, but uses
  #      $game_map for data
  #--------------------------------------------------------------------------
  def initialize
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    @tilemap = Tilemap.new(@viewport1) #creates standard 2d map
    if $game_map.iso?
      map_infos = $data_map_infos[$game_map.map_id]
      $game_map_iso = Game_Map.new #creates new iso map
      $game_map_iso.setup(map_infos.parent_id) #draws map
      @tilemap.tileset = RPG::Cache.tileset($game_map_iso.tileset_name) #sets correct tileset
      for i in 0..6 #draws autotiles
        autotile_name = $game_map.autotile_names[i]
        @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
      end
      @tilemap.map_data = $game_map_iso.data #reads terrain tags and else
      @tilemap.priorities = $game_map_iso.priorities #sets iso map priorities
    else
      @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
      for i in 0..6
        autotile_name = $game_map.autotile_names[i]
        @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
      end
      @tilemap.map_data = $game_map.data
      @tilemap.priorities = $game_map.priorities
    end
    @panorama = Plane.new(@viewport1) #create pan plane
    @panorama.z = -1000
    @fog = Plane.new(@viewport1)  #creates fog plane
    @fog.z = 3000
    @character_sprites = []#initializes character update thread
    for i in $game_map.events.keys.sort #add events to map from $game_map, NOT ISO
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player)) #add player to map
    @weather = RPG::Weather.new(@viewport1) #draw weather
    @picture_sprites = [] 
    for i in 1..50 #draw setup pictures
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
    @timer_sprite = Sprite_Timer.new #start timer
    update
  end
  #--------------------------------------------------------------------------
  # ? Caution: Updated the panorama to draw in the same fashion and update according to 
  #                iso view settings
  #     Get the original displacement settings and expand them:
  #       @panorama.ox = $game_map.display_x / 4
  #       @panorama.oy = $game_map.display_y / 4
  #     to :
  #       @panorama.ox = $game_map.display_y / 8
  #       @panorama.oy = $game_map.display_y / 8
  #--------------------------------------------------------------------------
  alias upd_iso_map update
  def update(map_id = $game_map.map_id)
    #if pan settings changed.. update pan info
    if $game_map.iso?
      if @panorama_name != $game_map_iso.panorama_name or
         @panorama_hue != $game_map_iso.panorama_hue
        @panorama_name = $game_map_iso.panorama_name
        @panorama_hue = $game_map_iso.panorama_hue
        if @panorama.bitmap != nil
          @panorama.bitmap.dispose
          @panorama.bitmap = nil
        end
        if @panorama_name != ""
          @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
        end
        Graphics.frame_reset #reset frame count to 0
      end
      #if fog settings changed.. update fog info
      if @fog_name != $game_map_iso.fog_name or @fog_hue != $game_map_iso.fog_hue
        @fog_name = $game_map_iso.fog_name
        @fog_hue = $game_map_iso.fog_hue
        if @fog.bitmap != nil
          @fog.bitmap.dispose
          @fog.bitmap = nil
        end
        if @fog_name != ""
          @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
        end
        Graphics.frame_reset #reset frame count to 0
      end
      #update tilemap offset
      @tilemap.ox = $game_map.display_x / 4
      @tilemap.oy = $game_map.display_y / 4
      #redraw tilemap to current offset
      @tilemap.update
      #update pan and fog offsets.
      @panorama.ox = $game_map.display_x / 4
      @panorama.oy = $game_map.display_y / 4
      @fog.zoom_x = $game_map_iso.fog_zoom / 100.0
      @fog.zoom_y = $game_map_iso.fog_zoom / 100.0
      @fog.opacity = $game_map_iso.fog_opacity
      @fog.blend_type = $game_map_iso.fog_blend_type
      @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
      @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
      @fog.tone = $game_map.fog_tone
      #update event and character sprites
      for sprite in @character_sprites
        sprite.update
      end
      #update weather
      @weather.type = $game_screen.weather_type
      @weather.max = $game_screen.weather_max
      @weather.ox = $game_map.display_x / 4
      @weather.oy = $game_map.display_y / 4
      @weather.update
      #update pictures
      for sprite in @picture_sprites
        sprite.update
      end
      @timer_sprite.update
      #update screen tone/shake/flash
      @viewport1.tone = $game_screen.tone
      @viewport1.ox = $game_screen.shake
      @viewport3.color = $game_screen.flash_color
      @viewport1.update
      @viewport3.update
    else #use standard update process tilemap update process
      upd_iso_map
    end
  end
end
#==============================================================================
# ? Interpreter
#==============================================================================
class Interpreter
  #--------------------------------------------------------------------------
  # ? Change Map Settings
  #--------------------------------------------------------------------------
  def command_204
    case @parameters[0]
    when 0 #change panorama
      if $game_map.iso?
        $game_map_iso.panorama_name = @parameters[1]
        $game_map_iso.panorama_hue = @parameters[2]
      else
        $game_map.panorama_name = @parameters[1]
        $game_map.panorama_hue = @parameters[2]
      end
    when 1 #change fog settings
      if $game_map.iso?
        $game_map_iso.fog_name = @parameters[1]
        $game_map_iso.fog_hue = @parameters[2]
        $game_map_iso.fog_opacity = @parameters[3]
        $game_map_iso.fog_blend_type = @parameters[4]
        $game_map_iso.fog_zoom = @parameters[5]
        $game_map_iso.fog_sx = @parameters[6]
        $game_map_iso.fog_sy = @parameters[7]
      else
        $game_map.fog_name = @parameters[1]
        $game_map.fog_hue = @parameters[2]
        $game_map.fog_opacity = @parameters[3]
        $game_map.fog_blend_type = @parameters[4]
        $game_map.fog_zoom = @parameters[5]
        $game_map.fog_sx = @parameters[6]
        $game_map.fog_sy = @parameters[7]
      end
    when 2 #change battleback
      if $game_map.iso?
        $game_map_iso.battleback_name = @parameters[1]
        $game_temp_iso.battleback_name = @parameters[1]
      else
        $game_map.battleback_name = @parameters[1]
        $game_temp.battleback_name = @parameters[1]
      end
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ? Change fog tone
  #--------------------------------------------------------------------------
  def command_205
    if $game_map.iso?
      $game_map_iso.start_fog_tone_change(@parameters[0], @parameters[1] * 2)
    else
      $game_map.start_fog_tone_change(@parameters[0], @parameters[1] * 2)
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ? Change fog opacity
  #--------------------------------------------------------------------------
  def command_206
    if $game_map.iso?
      $game_map_iso.start_fog_opacity_change(@parameters[0], @parameters[1] * 2)
    else
      $game_map.start_fog_opacity_change(@parameters[0], @parameters[1] * 2)
    end
    return true
  end
end script part2
  			Code:
#==============================================================================
# o Sprite_Character add-on : Fix Pic
#------------------------------------------------------------------------------
# Script curtisy of Siegfried which is made to work with MGCaladtogel's iso script
#------------------------------------------------------------------------------
# Updates passability to check height changes
#------------------------------------------------------------------------------
# Rules for the map passabilities :
# -Apply the numbered tileset
# -Each number is equivalent to a height (tileset infinite, infinite height)
# -For the nonpassable tiles, put an inaccessible height.
#==============================================================================
# o ISO_LVL2_Config
#============================================================================== 
module ISO_LVL2_Config
  # Passable height from one tile to another
  DIFF_N = 2
  # Passable height from one tile to another: stairs, height change
  DIFF_L = 2
  # Falling speed
  FALLING_SPEED = 0.5
end
#==============================================================================
# o Game_Map
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# o Attributes
#--------------------------------------------------------------------------
  attr_accessor   :map
  #is iso map?
  def iso?
    if $data_map_infos[@map_id].name.include?("ISO")
      return true
    else
      return false
    end
  end
end
#==============================================================================
# o Game_Character
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# o Attributes
#--------------------------------------------------------------------------
  attr_accessor   :x
  attr_accessor   :y
  attr_accessor   :h
  attr_accessor   :th
  
#--------------------------------------------------------------------------
# o Initialize
#--------------------------------------------------------------------------
  alias sieg_iso_initialize initialize
  def initialize
    @h = 0
    @th = 0
    sieg_iso_initialize
  end
#--------------------------------------------------------------------------
# o Screen_th : height of the ground
#--------------------------------------------------------------------------
  def screen_th
    tile_id = $game_map.map.data[self.x,self.y,0]
    t_x = (tile_id - 384) % 8     
    t_y = (tile_id - 384) / 8
    th = t_x + t_y * 8
    return th
  end
#--------------------------------------------------------------------------
# o Screen_h : height of the character
#--------------------------------------------------------------------------
  def screen_h
    return @h 
  end
  
#--------------------------------------------------------------------------
# Update character/event rise/fall according to position on map.
#--------------------------------------------------------------------------
  alias iso_gm_update update
  def update
    if $game_map.iso?
      if screen_h < screen_th
        @h = screen_th
      elsif screen_h > screen_th
        if (screen_h - screen_th) > 1.5
          @h -= [ISO_LVL2_Config::FALLING_SPEED * 3, 1].min
        else
          @h -= ISO_LVL2_Config::FALLING_SPEED
        end
      end 
    end
    iso_gm_update
  end
#--------------------------------------------------------------------------
# o Screen_x
#--------------------------------------------------------------------------
  alias iso_screen_x screen_x
  def screen_x
    return  iso_screen_x if !$game_map.iso?
    return  (@real_x - @real_y)/4 + 32 * $game_map.height - 0 - $game_map.display_x / 4
  end
#--------------------------------------------------------------------------
# o Screen_y
#--------------------------------------------------------------------------
  alias iso_screen_y screen_y
  def screen_y
    return iso_screen_y if !$game_map.iso?
    y = (@real_y + @real_x) / 8 + 24 - $game_map.display_y / 4 - (self.screen_h) * 8
    if @jump_count >= @jump_peak
      n = @jump_count - @jump_peak
    else
      n = @jump_peak - @jump_count
    end
    return y - (@jump_peak * @jump_peak - n * n) / 2
  end
#--------------------------------------------------------------------------
# o Screen_z
#--------------------------------------------------------------------------
  alias iso_screen_z screen_z
  def screen_z(height = 0)
    return iso_screen_z if !$game_map.iso?
    if @always_on_top
      return 999
    end
    z = screen_y
    if @tile_id > 0
      return z + $game_map_iso.priorities[@tile_id] * 32
    else
      return z + ((height > 32) ? 31 : 0)
    end
  end
end
#==============================================================================
# o Passabilities and interactions with events
#==============================================================================
#==============================================================================
# o Game_Character
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# o Passable?
#--------------------------------------------------------------------------
  alias sieg_gc_passable? passable?
  def passable?(x, y, d)
    if !$game_map.iso?
      return sieg_gc_passable?(x, y, d)
    end
    @diff_n = ISO_LVL2_Config::DIFF_N
    @diff_l = ISO_LVL2_Config::DIFF_L
    
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : d == 1 ? -1 : d == 3 ? 1 : d == 7 ? -1 : d == 9 ? 1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : d == 1 ? 1 : d == 3 ? 1 : d == 7 ? -1 : d == 9 ? -1 : 0)
    
    
    tile_id = $game_map.map.data[x, y, 0]
    t_x= (tile_id - 384)%8     
    t_y= (tile_id - 384)/8
    h = t_x + t_y * 8
    
    new_tile_id = $game_map.map.data[new_x, new_y,0]
    new_t_x= (new_tile_id - 384)%8     
    new_t_y= (new_tile_id - 384)/8
    new_h = new_t_x + new_t_y * 8
    
    tile_tag = $game_map.terrain_tag(x, y)
    tile_tag_new = $game_map.terrain_tag(new_x, new_y)
    
    if tile_tag == 1
      @diff = @diff_l
    else
      @diff = @diff_n
    end
    
    unless $game_map.valid?(new_x, new_y) and (new_h - h) <= @diff and (new_h - h) >= -@diff
      return false
    end
    
    if @through
      return true
    end
    
    unless $game_map.passable?(x, y, d, self) and (new_h - h) <= @diff and (new_h - h) >= -@diff
      return false
    end
    
    unless $game_map.passable?(new_x, new_y, 10 - d) and (new_h - h) <= @diff and (new_h - h) >= -@diff
      return false
    end
    
    for event in $game_map.events.values
      if event.x == new_x and event.y == new_y and (new_h - h) <= @diff and (new_h - h) >= -@diff
        unless event.through and (new_h - h) <= @diff_n
          if self != $game_player
            return false
          end
          if event.character_name != ""
            return false
          end
        end
      end
    end
    
    if $game_player.x == new_x and $game_player.y == new_y and (new_h - h) <= @diff and (new_h - h) >= -@diff
      unless $game_player.through
        if @character_name != ""
          return false
        end
      end
    end
    
    return true
  end
end
#==============================================================================
# o Game_Event
#==============================================================================
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# o Start
#--------------------------------------------------------------------------
  alias iso_evnt_start start
  def start
    if !$game_map.iso?
      iso_evnt_start
      return
    end
    @diff_n = 1
   # Dialogue 
    tile_id = $game_map.map.data[$game_player.x,$game_player.y,0]
    t_x = (tile_id - 384) % 8     
    t_y = (tile_id - 384) / 8
    h = t_x + t_y * 8
    
    ev_tile_id = $game_map.map.data[self.x,self.y,0]
    ev_t_x = (ev_tile_id - 384) % 8     
    ev_t_y = (ev_tile_id - 384) / 8
    ev_h = ev_t_x + ev_t_y * 8
    
    if @list.size > 1 and (ev_h - h).abs <= @diff_n
      @starting = true
    end
  end
end Screen Shots
  			![[Image: Iso3.jpg]](http://i218.photobucket.com/albums/cc200/GubiD/Iso3.jpg)
![[Image: Iso2.jpg]](http://i218.photobucket.com/albums/cc200/GubiD/Iso2.jpg)
![[Image: Iso1.jpg]](http://i218.photobucket.com/albums/cc200/GubiD/Iso1.jpg)
Demo!

 
 
 Isometric View
 Isometric View
 

 


