Submit Your Article


 
RPG Maker

Welcome Guest ( Log In | Register )


  Games Resources RPG Maker VX RPG Maker XP Scripts Tutorials Downloads

 
Reply to this topicStart new topic
> Passability Script on XAS, game crash when a enemy die
johnny55
post Apr 22 2011, 08:31 PM
Post #1


Level 1
Group Icon

Group: Member
Posts: 5
Type: None
RM Skill: Undisclosed




Hey all, im using XAS 3.91 and Passablity mini-map from Selwyn/Squal


script is inside this

CODE
#==============================================================================
# à ¹‚–  Passability Mini Map
#------------------------------------------------------------------------------
# made by Selwyn/Squall // selwyn@rmxp.ch
# released the 30th of May 2006
#==============================================================================

#==============================================================================
# à ¹‚–  Scene_Map
#------------------------------------------------------------------------------
# draw the mini map
# @corner is the corner you want the mini map to be displayed in.
# 1 is upper left, 2 is upper right, 3 is bottom left and 4 is bottom right
#==============================================================================

class Scene_Map
  alias main_passminimap main
  alias update_passminimap update
  alias transfer_passminimap transfer_player

  #--------------------------------------------------------------------------
  # à ¹‚—� initialize
  #--------------------------------------------------------------------------
  def initialize
    @corner = 4 # 1 or 2 or 3 or 4
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� main
  #--------------------------------------------------------------------------
  def main
    @mini_map = Map_Event.new(@corner)
    main_passminimap
    @mini_map.dispose
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� update
  #--------------------------------------------------------------------------
  def update
    @mini_map.update
    if $game_system.map_interpreter.running?
      @mini_map.visible = false
    elsif not $game_system.map_interpreter.running? and @mini_map.on?
      @mini_map.visible = true
    end
    update_passminimap
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� transfer_player
  #--------------------------------------------------------------------------
  def transfer_player
    transfer_passminimap
    @mini_map.dispose
    @mini_map = Map_Event.new(@corner)
  end
end

#==============================================================================
# à ¹‚–  Map_Base
#------------------------------------------------------------------------------
# à ¹�'€€Base class for mini maps
#==============================================================================

class Map_Base < Sprite

  #--------------------------------------------------------------------------
  # à ¹‚—� constants and instances
  #--------------------------------------------------------------------------
  PMP_VERSION = 6
  ACTIVATED_ID = 5 # set the switch id for the minimap display (on/off)
  attr_reader :event
  #--------------------------------------------------------------------------
  # à ¹‚—� initialize
  #--------------------------------------------------------------------------
  def initialize(corner)
    super(Viewport.new(16, 16, width, height))
    viewport.z = 8000
    @border = Sprite.new
    @border.x = viewport.rect.x - 6
    @border.y = viewport.rect.y - 6
    @border.z = viewport.z - 1
    @border.bitmap = RPG::Cache.picture("mapback")
    self.visible = on?
    self.opacity = 180
    case corner
    when 1
      self.x = 16
      self.y = 16
    when 2
      self.x = 640 - width - 16
      self.y = 16
    when 3
      self.x = 16
      self.y = 480 - height - 16
    when 4
      self.x = 673#640 - width - 16
      self.y = 69#480 - height - 16
    else
      self.x = 16
      self.y = 16
    end
    self.visible = on?
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� dispose
  #--------------------------------------------------------------------------
  def dispose
    @border.dispose
    super
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� x=
  #--------------------------------------------------------------------------
  def x=(x)
    self.viewport.rect.x = x
    @border.x = x - 6
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� y=
  #--------------------------------------------------------------------------
  def y=(y)
    self.viewport.rect.y = y
    @border.y = y - 6
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� visible=
  #--------------------------------------------------------------------------
  def visible=(bool)
    super
    self.viewport.visible = bool
    @border.visible = bool
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� minimap_on?
  #--------------------------------------------------------------------------
  def on?
      return true #if $game_switches[ACTIVATED_ID] = false
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� update
  #--------------------------------------------------------------------------
  def update
    super
    self.visible = on?
    if viewport.ox < display_x
      viewport.ox += 1
    elsif viewport.ox > display_x
      viewport.ox -= 1
    end
    if viewport.oy < display_y
      viewport.oy += 1
    elsif viewport.oy > display_y
      viewport.oy -= 1
    end
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� width
  #--------------------------------------------------------------------------
  def width
    return 104#120
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� height
  #--------------------------------------------------------------------------
  def height
    return 70#90
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� display_x
  #--------------------------------------------------------------------------
  def display_x
    return $game_map.display_x * 3 / 64
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� display_y
  #--------------------------------------------------------------------------
  def display_y
    return $game_map.display_y * 3 / 64
  end
end

#==============================================================================
# à ¹‚–  Map_Passability
#------------------------------------------------------------------------------
# draws the mini map
#
# à ¹�'€€thanks to Fanha Giang (aka fanha99) for the autotile drawing method
#==============================================================================

class Map_Passability < Map_Base
  #--------------------------------------------------------------------------
  # à ¹‚—� constants
  #--------------------------------------------------------------------------
  INDEX =
  [
  26, 27, 32, 33, 4, 27, 32, 33, 26, 5, 32, 33, 4, 5, 32, 33,
  26, 27, 32, 11, 4, 27, 32, 11, 26, 5, 32, 11, 4, 5, 32, 11,
  26, 27, 10, 33, 4, 27, 10, 33, 26, 5, 10, 33, 4, 5, 10, 33,
  26, 27, 10, 11, 4, 27, 10, 11, 26, 5, 10, 11, 4, 5, 10, 11,
  24, 25, 30, 31, 24, 5, 30, 31, 24, 25, 30, 11, 24, 5, 30, 11,
  14, 15, 20, 21, 14, 15, 20, 11, 14, 15, 10, 21, 14, 15, 10, 11,
  28, 29, 34, 35, 28, 29, 10, 35, 4, 29, 34, 35, 4, 29, 10, 35,
  38, 39, 44, 45, 4, 39, 44, 45, 38, 5, 44, 45, 4, 5, 44, 45,
  24, 29, 30, 35, 14, 15, 44, 45, 12, 13, 18, 19, 12, 13, 18, 11,
  16, 17, 22, 23, 16, 17, 10, 23, 40, 41, 46, 47, 4, 41, 46, 47,
  36, 37, 42, 43, 36, 5, 42, 43, 12, 17, 18, 23, 12, 13, 42, 43,
  36, 41, 42, 47, 16, 17, 46, 47, 12, 17, 42, 47, 0, 1, 6, 7
  ]
  X = [0, 1, 0, 1]
  Y = [0, 0, 1, 1]
  #--------------------------------------------------------------------------
  # à ¹‚—� initialize
  #--------------------------------------------------------------------------
  def initialize(corner)
    super(corner)
    @autotile = RPG::Cache.picture("minimap_tiles")
    setup()
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� setup
  #--------------------------------------------------------------------------
  def setup()
    @map = load_data(sprintf("Data/Map%03d.rxdata", $game_map.map_id))
    tileset = $data_tilesets[@map.tileset_id]
    @passages = tileset.passages
    @priorities = tileset.priorities
    redefine_tiles
    refresh
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� pass
  #--------------------------------------------------------------------------
  def pass(tile_id)
    return 15 if tile_id == nil
    return @passages[tile_id] != nil ? @passages[tile_id] : 15
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� passable
  #--------------------------------------------------------------------------
  def passable(tile_id)
    return pass(tile_id) < 15
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� redefine_tile
  #--------------------------------------------------------------------------
  def redefine_tiles
    width = @map.width
    height = @map.height
    map = RPG::Map.new(width, height)
    map.data = @map.data.dup
    for x in 0...width
      for y in 0...height
        for level in [1, 2]
          id = @map.data[x, y, level]
          if id != 0 and @priorities[id] == 0
            @map.data[x, y, 0] = id
            @passages[@map.data[x, y, 0]] = @passages[id]
          end
        end
      end
    end
    for x in 0...width
      for y in 0...height
        for level in [0]
          tile = @map.data[x, y, level]
          u = @map.data[x, y-1, level]
          l = @map.data[x-1, y, level]
          r = @map.data[x+1, y, level]
          d = @map.data[x, y+1, level]
          if !passable(tile)
            map.data[x, y] = 0
          else
            if tile == 0
              map.data[x, y, level] = 0
              next
            end
            if pass(tile) < 15
              if !passable(u) and !passable(l) and !passable(r) and !passable(d)
                map.data[x, y, level] = 0
              elsif !passable(u) and !passable(l) and !passable(r) and passable(d)
                map.data[x, y, level] = 90
              elsif !passable(u) and !passable(l) and !passable(d) and passable(r)
                map.data[x, y, level] = 91
              elsif !passable(u) and !passable(r) and !passable(d) and passable(l)
                map.data[x, y, level] = 93
              elsif !passable(l) and !passable(r) and !passable(d) and passable(u)
                map.data[x, y, level] = 92
              elsif !passable(u) and !passable(d) and passable(r) and passable(l)
                map.data[x, y, level] = 81
              elsif !passable(u) and !passable(r) and passable(d) and passable(l)
                map.data[x, y, level] = 84
              elsif !passable(u) and !passable(l) and passable(d) and passable(r)
                map.data[x, y, level] = 82
              elsif !passable(d) and !passable(r) and passable(l) and passable(u)
                map.data[x, y, level] = 86
              elsif !passable(d) and !passable(l) and passable(r) and passable(u)
                map.data[x, y, level] = 88
              elsif !passable(r) and !passable(l) and passable(d) and passable(u)
                map.data[x, y, level] = 80
              elsif !passable(u) and passable(d) and passable(r) and passable(l)
                map.data[x, y, level] = 68
              elsif !passable(d) and passable(u) and passable(r) and passable(l)
                map.data[x, y, level] = 76
              elsif !passable(r) and passable(d) and passable(u) and passable(l)
                map.data[x, y, level] = 72
              elsif !passable(l) and passable(d) and passable(u) and passable(r)
                map.data[x, y, level] = 64
              else
                map.data[x, y, level] = 48
              end
            else
              map.data[x, y, level] = 0
            end
          end
        end
      end
    end
    @map = map.dup
    map = nil
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� refresh
  #--------------------------------------------------------------------------
  def refresh
    self.visible = false
    self.bitmap = Bitmap.new(@map.width * 6, @map.height * 6)
    bitmap = Bitmap.new(@map.width * 6, @map.height * 6)
    rect1 = Rect.new(6, 0, 6, 6)
    for y in 0...@map.height
      for x in 0...@map.width
        for level in [0]
          tile_id = @map.data[x, y, level]
          next if tile_id == 0
          id = tile_id / 48 - 1
          tile_id %= 48
          for g in 0..3
            h = 4 * tile_id + g
            y1 = INDEX[h] / 6
            x1 = INDEX[h] % 6
            rect2 = Rect.new(x1 * 3, y1 * 3, 3, 3)
            bitmap.blt(x * 6 + X[g] * 3, y * 6 + Y[g] * 3, @autotile, rect2)
          end
        end
      end
    end
    d_rect = Rect.new(0, 0, @map.width * 6, @map.height * 6)
    s_rect = Rect.new(0, 0, bitmap.width, bitmap.height)
    self.bitmap.stretch_blt(d_rect, bitmap, s_rect)
    self.viewport.ox = display_x
    self.viewport.oy = display_y
    bitmap.clear
    bitmap.dispose
  end
end

#==============================================================================
# à ¹‚–  Map_Event
#------------------------------------------------------------------------------
# à ¹�'€€draw the events and hero position
#==============================================================================

class Map_Event < Map_Passability
  #--------------------------------------------------------------------------
  # à ¹‚—� initialize
  #--------------------------------------------------------------------------
  def initialize(corner = 4)
    super(corner)
    @dots = []
    @player = Sprite.new(self.viewport)
    @player.bitmap = RPG::Cache.picture("mmcursors")
    @player.src_rect = Rect.new(0, 0, 15, 15)
    @player.z = self.z + 3
    @events = {}
    for key in $game_map.events.keys
      event = $game_map.events[key]
      next if event.list == nil
      for i in 0...event.list.size
        next if event.list[i].code != 108
        @events[key] = Sprite.new(self.viewport)
        @events[key].z = self.z + 2
        if event.list[i].parameters[0].include?("event")
          @events[key].bitmap = RPG::Cache.picture("event")
        elsif event.list[i].parameters[0].include?("enemy")
          @events[key].bitmap = RPG::Cache.picture("enemy")
        elsif event.list[i].parameters[0].include?("teleport")
          @events[key].bitmap = RPG::Cache.picture("teleport")
        elsif event.list[i].parameters[0].include?("chest")
          @events[key].bitmap = RPG::Cache.picture("chest")
        elsif event.list[i].parameters[0].include?("npc")
          @events[key].bitmap = RPG::Cache.picture("npc")
        elsif event.list[i].parameters[0].include?("savepoint")
          @events[key].bitmap = RPG::Cache.picture("savepoint")
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� dispose
  #--------------------------------------------------------------------------
  def dispose
    @player.dispose
    for event in @events.values
      event.dispose
    end
    super
  end
  #--------------------------------------------------------------------------
  # à ¹‚—� update
  #--------------------------------------------------------------------------
  def update
    super
    @player.x = $game_player.real_x * 3 / 64 - 5
    @player.y = $game_player.real_y * 3 / 64 - 4
    @player.src_rect.x = ($game_player.direction / 2 - 1) * 15
    for key in @events.keys
      event = @events[key]
      mapevent = $game_map.events[key]
      event.x = mapevent.real_x * 3 / 64
      event.y = mapevent.real_y * 3 / 64
    end
  end
end



and when an enemy (event) dies, on XAS, it disapears from the map, and with this script, it cause the game to crash on the code line of
mapevent.real_x

the last one, from what i concluded is, since the event 'disapear', there is no longer a real_x/y so the map cant 'load' the event X/Y cauing it to crash, is there some way to change it, for when a event is gone, it stop obtain it

i tried make some changes using |= nil with some ifs but got lots errors and got kinda stuck


thanks.

edit: if someone knows how change the script, so it only 'refresh' the event icons and not the whole map, i'd appreciate, since at the moment, when you interact with an event and if it moves, the entire map 'blinks' due to the refresh, and is kinda annoying when u pushing a box and you see whole map flashing =)

This post has been edited by johnny55: Apr 23 2011, 02:03 PM
Go to the top of the page
 
+Quote Post
   
Sailerius
post Apr 25 2011, 10:31 PM
Post #2


Blue Blue Glass Moon
Group Icon

Group: Revolutionary
Posts: 881
Type: Developer
RM Skill: Beginner




What's the error you get when the game crashes?


__________________________
Go to the top of the page
 
+Quote Post
   
johnny55
post Apr 28 2011, 11:12 AM
Post #3


Level 1
Group Icon

Group: Member
Posts: 5
Type: None
RM Skill: Undisclosed




it crashed due to dont recognize the 'real_x' (because there isnt one, the event is deleted when die, so he cant recognize its X/Y)
Go to the top of the page
 
+Quote Post
   

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 

Lo-Fi Version Time is now: 25th May 2013 - 11:31 PM
RPG RPG Revolution is an Privacy Policy and Legal
eXTReMe Tracker