[RESOLVED][XP] Restricted Movement based on Width

Started by LiTTleDRAgo, April 22, 2011, 09:39:11 am

Previous topic - Next topic

LiTTleDRAgo

April 22, 2011, 09:39:11 am Last Edit: April 24, 2011, 08:08:57 am by LiTTleDRAgo
Could someone make a script that can do something like this?





sorry for the image explanation, I just can't find the word to describe it

thanks in advance

WhiteRose

Because RMXP handles sprites in a strictly tile-based system, this would probably require a rewrite of some fairly major parts of the default map scripts. Of course, I might be wrong.

LiTTleDRAgo

April 22, 2011, 12:52:37 pm #2 Last Edit: April 22, 2011, 07:35:45 pm by LiTTleDRAgo
i think i remember found that kind of script in some japanese website and it's line is less than 1000 but I forgot where I find it

I guess it only modify game_map.passable

I wonder if anyone can create the same or similar script like that

brewmeister

How, EXACTLY, should this work?

You want a pixel to pixel comparison (i.e. collision detection)?

Or just, if the event is wider than 32, check the adjacent tiles for passability too?

ForeverZer0

Do something like what Cogwheel's pixel-movement script did with the black and white passability maps, except maybe an expansion on it to include spritesets. Not easy to do, but that is a script that I am sure many would find very usefull. The problem is that I don't think its compatible with BABS, so that will be another obstacle that needs to be cleared. There are probably much easier solutions to your particular problem, but I was just throwing an idea out there.
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Ryex

could this not be done with a simple event tag? the user would tag an even with it's width in tiles either in a comment on the top of the event page or in the event name and then the script would test to be sure that there was a 2*2 area  for the event to pass though.
I no longer keep up with posts in the forum very well. If you have a question or comment, about my work, or in general I welcome PM's. if you make a post in one of my threads and I don't reply with in a day or two feel free to PM me and point it out to me.<br /><br />DropBox, the best free file syncing service there is.<br />

ForeverZer0

April 23, 2011, 07:02:26 pm #6 Last Edit: April 24, 2011, 03:00:11 am by Ryex
Yes, it could most certainly be done with some eventing. It may be a little tedious, depending on your map and how many areas a sprite can't pass through, but it wouldn't actually be difficult at all. An automatic script for it would be nice, still.

you misunderstand me. use the tags in the events to tell a script how wide the event is and let the script determine passibility.
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

LiTTleDRAgo

I managed to edit this into my project, I guess it's resolved?

Spoiler: ShowHide
class Game_Character
 
  attr_accessor :size_x                   
  attr_accessor :size_y                   
  attr_accessor :tiles_left             
  attr_accessor :tiles_right             
 
  alias event_size_init initialize
  alias passable_size passable?
  def initialize
    event_size_init
    setup_event_size
  end
 
  def setup_event_size
    @size_x = 1
    @size_y = 1
    @tiles_left  = 0
    @tiles_right = 0
  end
 
  def size(x, y)
    @size_x = x
    @size_y = y
    tiles_x      = (@size_x - 1) / 2
    @tiles_left  = tiles_x.floor
    @tiles_right = tiles_x.ceil
  end

  def passable?(x, y, d)
    result = passable_size(x, y, d)
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    unless $game_map.valid?(new_x, new_y) then  return false  end
    return result if @through
    @tiles_left = 0 if @tiles_left.nil?
    @tiles_right = 0 if @tiles_right.nil?
    (0...@size_x.to_i).each {|i|
      unless $game_map.passable?(x - @tiles_left + i, y, d, self) then return false end
      unless $game_map.passable?(new_x - @tiles_left + i, new_y, 10 - d) then return false end
      (0...@size_y.to_i).each {|j|
        unless $game_map.passable?(x, y - j, d, self) then return false end
        unless $game_map.passable?(new_x, new_y - j, 10 - d) then return false end
        unless $game_map.passable?(x - @tiles_left + i, y - j, d, self) then return false end
        unless $game_map.passable?(new_x - @tiles_left + i, new_y - j, 10 - d) then return false end
      }}
    $game_map.events.each_value {|event|
      return false if event_collide?(self, event, new_x, new_y)}
    if event_collide?(self, $game_player, new_x, new_y)
      return false if self.is_a?(Game_Event)
    end
    return result
  end

  def event_collide?(event1, event2, new_x, new_y)
    return false if event1.id == event2.id
    collision = false
    event1.size_y = 1 if event1.size_y.nil?
    event2.size_y = 1 if event2.size_y.nil?
    event1.size_x = 1 if event1.size_x.nil?
    event2.size_x = 1 if event2.size_x.nil?
    event1.tiles_left = 0  if event1.tiles_left.nil?
    event2.tiles_left = 0  if event2.tiles_left.nil?
    event1.tiles_right = 0 if event1.tiles_right.nil?
    event2.tiles_right = 0 if event2.tiles_right.nil?
    ((new_y - (event1.size_y - 1))..new_y).each {|i|
    ((event2.y - (event2.size_y - 1))..event2.y).each {|j|
        if i == j && event1.character_name != "" && event2.character_name != ""
          unless event1.through or event2.through then collision = true end
        end }}
    ((new_x - event1.tiles_left)..(new_x + event1.tiles_right)).each {|i|
    ((event2.x - event2.tiles_left)..(event2.x + event2.tiles_right)).each {|j|
        if i == j && event1.character_name != "" && event2.character_name != ""
          unless event1.through or event2.through then return true end
        end}} if collision
    return false
  end
end

class Game_Player

  alias check_size_here check_event_trigger_here
  alias check_size_there check_event_trigger_there
  alias check_size_touch check_event_trigger_touch
  def check_event_trigger_here(triggers)
    result = check_size_here(triggers) #false
    return result if $game_system.map_interpreter.running?
    $game_map.events.each_value {|event|
      if @x >= event.x - event.tiles_left &&
        @x <= event.x + event.tiles_right &&
        @y >= event.y - (event.size_y - 1) && @y <= event.y &&
        triggers.include?(event.trigger)
        if !event.jumping? && event.over_trigger?
          event.start
          result = true
        end
      end }
    return result
  end

  def check_event_trigger_there(triggers)
    result = check_size_there(triggers) #false
    return result if $game_system.map_interpreter.running?
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    $game_map.events.each_value {|event|
      if new_x >= event.x - event.tiles_left &&
        new_x <= event.x + event.tiles_right &&
        new_y >= event.y - (event.size_y - 1) && new_y <= event.y &&
        triggers.include?(event.trigger)
        if !event.jumping? && !event.over_trigger?
          event.start
          result = true
        end
      end }
    if result == false
      if $game_map.counter?(new_x, new_y)
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        $game_map.events.each_value {|event|
          if new_x >= event.x - event.tiles_left &&
            new_x <= event.x + event.tiles_right &&
             new_y >= event.y - (event.size_y - 1) && new_y <= event.y &&
             triggers.include?(event.trigger)
            if !event.jumping? && !event.over_trigger?
              event.start
              result = true
            end
          end }
      end
    end
    return result
  end

  def check_event_trigger_touch(x, y)
    result = check_size_touch(x, y)# false
    return result if $game_system.map_interpreter.running?
    $game_map.events.each_value {|event|
      if x >= event.x - event.tiles_left &&
        x <= event.x + event.tiles_right &&
         y >= event.y - (event.size_y - 1) &&
         y <= event.y && [1,2].include?(event.trigger)
        event.start
        result = true
      end }
    return result
  end
end

class Sprite_Character
  alias update_size update
  def update
    update_size
    return if @character.is_a?(Game_Player)
    if @character.size_x == 1 && @character.size_y == 1
      @character.size(self.bitmap.width/128, self.bitmap.height/160)
    end
  end
end

Jragyn

Does LittleDrago's script(let) work as the request suggested?
Haha, if it does, perhaps this should be released publicly. :o
A bright light can either illuminate or blind, but how will you know which until you open your eyes?

LiTTleDRAgo