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