Sign in to follow this  
Followers 0
xXDarkDragonXx

"Change Map Tileset"

7 posts in this topic

Bueno, este "script" recupera una función perdida del RPG Maker 2003: poder cambiar de Tileset en el mismo mapa. Ideal para elevaciones. Un ejemplo... creas un mapa con un puente y pones terreno pasable debajo del mismo. Con este script cambias el Tileset antes de pasar por debajo al mismo Tileset (deben haber dos Tilesets del mismo en la Base de Datos) pero este tiene que al puente se le puede pasar por debajo. Ahora, si quieres pasar por encima, es sencillo. Antes de pasar por arriba cambias el Tileset al primero del Tileset y ese tiene que se puede pasar el puente. No se si me entienden pero tiene una idea... bueno. Para no poner paso a paso donde poner cada cosa en los scripts, tomen.

Cambien su Game_Map completo por este:

CODE
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------

class Game_Map
# ------------------------------------  
 attr_accessor :tileset_name
 attr_accessor :new_tileset
 attr_accessor :autotile_names
 attr_accessor :panorama_name
 attr_accessor :panorama_hue
 attr_accessor :fog_name
 attr_accessor :fog_hue
 attr_accessor :fog_opacity
 attr_accessor :fog_blend_type
 attr_accessor :fog_zoom
 attr_accessor :fog_sx
 attr_accessor :fog_sy
 attr_accessor :battleback_name
 attr_accessor :display_x
 attr_accessor :display_y
 attr_accessor :need_refresh
 attr_reader   :passages
 attr_reader   :priorities
 attr_reader   :terrain_tags
 attr_reader   :events
 attr_reader   :fog_ox
 attr_reader   :fog_oy
 attr_reader   :fog_tone
 
# ------------------------------------  
 def initialize
@map_id = 0
 end
# ------------------------------------  
 def setup(map_id)
@map_id = map_id
@map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
tileset = $data_tilesets[@map.tileset_id]
@tileset_name = tileset.tileset_name
@autotile_names = tileset.autotile_names
@panorama_name = tileset.panorama_name
@panorama_hue = tileset.panorama_hue
@fog_name = tileset.fog_name
@fog_hue = tileset.fog_hue
@fog_opacity = tileset.fog_opacity
@fog_blend_type = tileset.fog_blend_type
@fog_zoom = tileset.fog_zoom
@fog_sx = tileset.fog_sx
@fog_sy = tileset.fog_sy
@battleback_name = tileset.battleback_name
@passages = tileset.passages
@priorities = tileset.priorities
@terrain_tags = tileset.terrain_tags
@display_x = 0
@display_y = 0
@need_refresh = false
@events = {}
for i in @map.events.keys
  @events[i] = Game_Event.new(@map_id, @map.events[i])
end
@common_events = {}
for i in 1...$data_common_events.size
  @common_events[i] = Game_CommonEvent.new(i)
end
@fog_ox = 0
@fog_oy = 0
@fog_tone = Tone.new(0, 0, 0, 0)
@fog_tone_target = Tone.new(0, 0, 0, 0)
@fog_tone_duration = 0
@fog_opacity_duration = 0
@fog_opacity_target = 0
@scroll_direction = 2
@scroll_rest = 0
@scroll_speed = 4
@new_tileset = false
 end
# ------------------------------------  
 def map_id
return @map_id
 end
# ------------------------------------  
 def width
return @map.width
 end
# ------------------------------------  
 def height
return @map.height
 end
# ------------------------------------  
 def encounter_list
return @map.encounter_list
 end
# ------------------------------------  
 def encounter_step
return @map.encounter_step
 end
# ------------------------------------  
 def data
return @map.data
 end
# ------------------------------------  
 def autoplay
if @map.autoplay_bgm
  $game_system.bgm_play(@map.bgm)
end
if @map.autoplay_bgs
  $game_system.bgs_play(@map.bgs)
end
 end
# ------------------------------------  
 def refresh
if @map_id > 0
  for event in @events.values
 event.refresh
  end
  for common_event in @common_events.values
 common_event.refresh
  end
end
@need_refresh = false
 end
# ------------------------------------  
 def scroll_down(distance)
@display_y = [@display_y + distance, (self.height - 15) * 128].min
 end
# ------------------------------------  
 def scroll_left(distance)
@display_x = [@display_x - distance, 0].max
 end
# ------------------------------------  
 def scroll_right(distance)
@display_x = [@display_x + distance, (self.width - 20) * 128].min
 end
# ------------------------------------  
 def scroll_up(distance)
@display_y = [@display_y - distance, 0].max
 end
# ------------------------------------  
 def valid?(x, y)
return (x >= 0 and x < width and y >= 0 and y < height)
 end
# ------------------------------------  
 def passable?(x, y, d, self_event = nil)
unless valid?(x, y)
  return false
end
bit = (1 << (d / 2 - 1)) & 0x0f
for event in events.values
  if event.tile_id >= 0 and event != self_event and
  event.x == x and event.y == y and not event.through
 if @passages[event.tile_id] & bit != 0
   return false
 elsif @passages[event.tile_id] & 0x0f == 0x0f
   return false
 elsif @priorities[event.tile_id] == 0
   return true
 end
  end
end
for i in [2, 1, 0]
  tile_id = data[x, y, i]
  if tile_id == nil
 return false
  elsif @passages[tile_id] & bit != 0
 return false
  elsif @passages[tile_id] & 0x0f == 0x0f
 return false
  elsif @priorities[tile_id] == 0
 return true
  end
end
return true
 end
# ------------------------------------  
 def bush?(x, y)
for i in [2, 1, 0]
  tile_id = data[x, y, i]
  if tile_id == nil
 return false
  elsif @passages[tile_id] & 0x40 == 0x40
 return true
  end
end
return false
 end
# ------------------------------------  
 def counter?(x, y)
for i in [2, 1, 0]
  tile_id = data[x, y, i]
  if tile_id == nil
 return false
  elsif @passages[tile_id] & 0x80 == 0x80
 return true
  end
end
return false
 end
# ------------------------------------  
 def terrain_tag(x, y)
for i in [2, 1, 0]
  tile_id = data[x, y, i]
  if tile_id == nil
 return 0
  elsif @terrain_tags[tile_id] > 0
 return @terrain_tags[tile_id]
  end
end
return 0
 end
# ------------------------------------  
 def check_event(x, y)
for event in $game_map.events.values
  if event.x == x and event.y == y
 return event.id
  end
end
 end
# ------------------------------------  
 def start_scroll(direction, distance, speed)
@scroll_direction = direction
@scroll_rest = distance * 128
@scroll_speed = speed
 end
# ------------------------------------  
 def scrolling?
return @scroll_rest > 0
 end
# ------------------------------------  
 def start_fog_tone_change(tone, duration)
@fog_tone_target = tone.clone
@fog_tone_duration = duration
if @fog_tone_duration == 0
  @fog_tone = @fog_tone_target.clone
end
 end
# ------------------------------------  
 def start_fog_opacity_change(opacity, duration)
@fog_opacity_target = opacity * 1.0
@fog_opacity_duration = duration
if @fog_opacity_duration == 0
  @fog_opacity = @fog_opacity_target.clone
end
 end
# ------------------------------------  
 def update
if $game_map.need_refresh
  refresh
end
if @scroll_rest > 0
  distance = 2 ** @scroll_speed
  case @scroll_direction
  when 2
 scroll_down(distance)
  when 4
 scroll_left(distance)
  when 6
 scroll_right(distance)
  when 8
 scroll_up(distance)
  end
  @scroll_rest -= distance
end
for event in @events.values
  event.update
end
for common_event in @common_events.values
  common_event.update
end
@fog_ox -= @fog_sx / 8.0
@fog_oy -= @fog_sy / 8.0
if @fog_tone_duration >= 1
  d = @fog_tone_duration
  target = @fog_tone_target
  @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  @fog_tone_duration -= 1
end
if @fog_opacity_duration >= 1
  d = @fog_opacity_duration
  @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  @fog_opacity_duration -= 1
end
 end
end
def replace_tileset(new_tiles) # New Method
 tileset = $data_tilesets[new_tiles]
 @tileset_name = tileset.tileset_name
 @autotile_names = tileset.autotile_names
 @panorama_name = tileset.panorama_name
 @panorama_hue = tileset.panorama_hue
 @fog_name = tileset.fog_name
 @fog_hue = tileset.fog_hue
 @fog_opacity = tileset.fog_opacity
 @fog_blend_type = tileset.fog_blend_type
 @fog_zoom = tileset.fog_zoom
 @fog_sx = tileset.fog_sx
 @fog_sy = tileset.fog_sy
 @battleback_name = tileset.battleback_name
 @passages = tileset.passages
 @priorities = tileset.priorities
 @terrain_tags = tileset.terrain_tags
 $game_map.new_tileset = true
end


Cambien su Spriteset_Map completo por este:

CODE
#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------

class Spriteset_Map
 #--------------------------------------------------------------------------
 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)
@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
@panorama = Plane.new(@viewport1)
@panorama.z = -1000
@fog = Plane.new(@viewport1)
@fog.z = 3000
@character_sprites = []
for i in $game_map.events.keys.sort
  sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
  @character_sprites.push(sprite)
end
@character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
@weather = RPG::Weather.new(@viewport1)
@picture_sprites = []
for i in 1..50
  @picture_sprites.push(Sprite_Picture.new(@viewport2,
 $game_screen.pictures[i]))
end
@timer_sprite = Sprite_Timer.new
update
 end
 #--------------------------------------------------------------------------
 def dispose
@tilemap.tileset.dispose
for i in 0..6
  @tilemap.autotiles[i].dispose
end
@tilemap.dispose
@panorama.dispose
@fog.dispose
for sprite in @character_sprites
  sprite.dispose
end
@weather.dispose
for sprite in @picture_sprites
  sprite.dispose
end
@timer_sprite.dispose
@viewport1.dispose
@viewport2.dispose
@viewport3.dispose
 end
 #--------------------------------------------------------------------------
 def update
 if $game_map.new_tileset == true
@tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
@tilemap.priorities = $game_map.priorities
for i in 0..6
  autotile_name = $game_map.autotile_names[i]
  @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
end
$game_map.new_tileset = false
 end
if @panorama_name != $game_map.panorama_name or
   @panorama_hue != $game_map.panorama_hue
  @panorama_name = $game_map.panorama_name
  @panorama_hue = $game_map.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
end
if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  @fog_name = $game_map.fog_name
  @fog_hue = $game_map.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
end
@tilemap.ox = $game_map.display_x / 4
@tilemap.oy = $game_map.display_y / 4
@tilemap.update
@panorama.ox = $game_map.display_x / 8
@panorama.oy = $game_map.display_y / 8
@fog.zoom_x = $game_map.fog_zoom / 100.0
@fog.zoom_y = $game_map.fog_zoom / 100.0
@fog.opacity = $game_map.fog_opacity
@fog.blend_type = $game_map.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
for sprite in @character_sprites
  sprite.update
end
@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
for sprite in @picture_sprites
  sprite.update
end
@timer_sprite.update
@viewport1.tone = $game_screen.tone
@viewport1.ox = $game_screen.shake
@viewport3.color = $game_screen.flash_color
@viewport1.update
@viewport3.update
 end
end


Para llamarlo simplemente en "Llamar script..." poner:

CODE
$game_map.replace_tileset(x)


Donde pone 'x' va el número del Tileset en la Base de Datos. Es preferible poner el evento en Toparse con Héroe. No se si entendieron mi explicación que di arriba pero intenten el script antes de preguntar cualquier duda relacionada al script.

DEMO:

Change Map Tileset

Pasen por debajo de puente y luego suban las escaleras y pasenle por encima. Ya verán a que me refiero... :ninja:

:y:
0

Share this post


Link to post
Share on other sites
muy bueno, me va de coña men
0

Share this post


Link to post
Share on other sites
Sí, es perfecto, algo que viene realmente bien dadas las limitaciones del XP en ese aspecto, y si no quieres un engine astronómico...
0

Share this post


Link to post
Share on other sites
me tilda error xDD
0

Share this post


Link to post
Share on other sites
Hola,mira quiro bajarme la demo, pero ellink ya caduco,mepodrias paras un nuevolink?
muchas gracias
0

Share this post


Link to post
Share on other sites
No me lo lee, osea el personaje se queda quieto (aunque puede girar a los costados) o directamente no me reconoce el cambio de tile, porq en el q le digo q cambie le puse q no halla prioridad pero no lo toma. verguenza.gif

Corrijo, el problema es q no me reconoce las prioridades XD Edited by Nailuj
0

Share this post


Link to post
Share on other sites
podrian resuvir la demo el el script porteado tiene un error no cambia la prioridad es decir lo que hay encima del personaje eso que se marca con *1..*5
es muy urgente podrian resuvir la demo
0

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0