Zitat
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#_/ ??????? - KGC_MapLoop?
#_/----------------------------------------------------------------------------
#_/ ????????????????????(?????)
#_/ Provides the function which is map loop of four directions.
#_/ (There are various problems.)
#_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
#==============================================================================
# ? ???????? - Customize ?
#==============================================================================
module KGC
# ????????????????????
# (false ????????????)
ML_EDGE_SHOW = true
end
#### ML_EDGE_SHOW
### Shows events of edge of map when looping.
# (The load probably decreases a little if this is false.)
#???????????????????????????????????????
$imported = {} if $imported == nil
$imported["MapLoop"] = true
#==============================================================================
# ¦ RPG::MapInfo
#==============================================================================
class RPG::MapInfo
#--------------------------------------------------------------------------
# ? ????
#--------------------------------------------------------------------------
def name
return @name.gsub(/\[.*\]/) {""}
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def original_name
return @name
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def horizontal_loop?
return @name =~ /\[L[ ]*([HV]+)\]/i && $1.upcase.scan(/./).include?("H")
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def vertical_loop?
return @name =~ /\[L[ ]*([HV]+)\]/i && $1.upcase.scan(/./).include?("V")
end
end
#???????????????????????????????????????
#==============================================================================
# ¦ Game_Map
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ? ??????
# map_id : ??? ID
#--------------------------------------------------------------------------
alias setup_KGC_MapLoop setup
def setup(map_id)
@map_info = load_data("Data/MapInfos.rxdata")[map_id]
@bottom_over = false
@left_over = false
@right_over = false
@top_over = false
@last_x = @last_y = 0
@horizontal_loop = @map_info.horizontal_loop?
@vertical_loop = @map_info.vertical_loop?
setup_KGC_MapLoop(map_id)
end
#--------------------------------------------------------------------------
# ? ?????? (??????????????????)
#--------------------------------------------------------------------------
def valid?(x, y)
result = true
unless horizontal_loop?
result &= x >= 0 && x < self.width
end
unless vertical_loop?
result &= y >= 0 && y < self.height
end
return result
end
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
alias scroll_down_KGC_MapLoop scroll_down
def scroll_down(distance)
if $game_map.vertical_loop?
@display_y += distance
restore_display
else
scroll_down_KGC_MapLoop(distance)
end
end
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
alias scroll_left_KGC_MapLoop scroll_left
def scroll_left(distance)
if $game_map.horizontal_loop?
@display_x -= distance
restore_display
else
scroll_left_KGC_MapLoop(distance)
end
end
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
alias scroll_right_KGC_MapLoop scroll_right
def scroll_right(distance)
if $game_map.horizontal_loop?
@display_x += distance
restore_display
else
scroll_right_KGC_MapLoop(distance)
end
end
#--------------------------------------------------------------------------
# ? ???????
#--------------------------------------------------------------------------
alias scroll_up_KGC_MapLoop scroll_up
def scroll_up(distance)
if $game_map.vertical_loop?
@display_y -= distance
restore_display
else
scroll_up_KGC_MapLoop(distance)
end
end
#--------------------------------------------------------------------------
# ? ??????? (private)
#--------------------------------------------------------------------------
def restore_display
# ????????????????????????
if @last_y > 0 && @display_y < 0
@bottom_over = true
elsif @last_y < 0 && @display_y > 0
@top_over = true
end
if @last_x > 0 && @display_x < 0
@right_over = true
elsif @last_x < 0 && @display_x > 0
@left_over = true
end
# ????????
@last_x = @display_x
@last_y = @display_y
end
private :restore_display
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
alias update_KGC_MapLoop update
def update
# ????????(?????)
if @bottom_over
@fog_oy += (self.height - 16) << 5
@bottom_over = false
elsif @top_over
@fog_oy -= (self.height - 16) << 5
@top_over = false
end
if @right_over
@fog_ox += (self.width - 16) << 5
@right_over = false
elsif @left_over
@fog_ox -= (self.width - 16) << 5
@left_over = false
end
update_KGC_MapLoop
end
#--------------------------------------------------------------------------
# ? ????????
#--------------------------------------------------------------------------
def horizontal_loop?
return @horizontal_loop
end
#--------------------------------------------------------------------------
# ? ????????
#--------------------------------------------------------------------------
def vertical_loop?
return @vertical_loop
end
#--------------------------------------------------------------------------
# ? ??????????????
# ??????????????:[X, Y]
#--------------------------------------------------------------------------
def pass_position_revise(x, y, d)
result = [x, y]
# ??????????
dx = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
dy = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
# ??????????????????????????
if horizontal_loop?
if dx < 0
result[0] += self.width
elsif dx >= self.width
result[0] -= self.width
end
end
if vertical_loop?
if dy < 0
result[1] += self.height
elsif dy >= self.height
result[1] -= self.height
end
end
# ??????
return result
end
#--------------------------------------------------------------------------
# ? ????????
#--------------------------------------------------------------------------
def horizontal_edge
if horizontal_loop?
if @display_x < 0
return -1
elsif @display_x > (self.width - 20) << 7
return 1
end
end
return 0
end
#--------------------------------------------------------------------------
# ? ????????
#--------------------------------------------------------------------------
def vertical_edge
if vertical_loop?
if @display_y < 0
return -1
elsif @display_y > (self.height - 15) << 7
return 1
end
end
return 0
end
end
#???????????????????????????????????????
#==============================================================================
# ¦ Game_Character (???? 1)
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
def passable?(x, y, d)
# ????
dx, dy = $game_map.pass_position_revise(x, y, d)
# ?????????
new_x = dx + (d == 6 ? 1 : d == 4 ? -1 : 0)
new_y = dy + (d == 2 ? 1 : d == 8 ? -1 : 0)
# ??????????
unless $game_map.valid?(new_x, new_y)
# ????
return false
end
# ???? ON ???
if @through
# ???
return true
end
# ?????????????????????
unless $game_map.passable?(x, y, d, self)
# ????
return false
end
# ????????????????????
unless $game_map.passable?(new_x, new_y, 10 - d)
# ????
return false
end
# ?????????
for event in $game_map.events.values
# ??????????????????
if event.x == new_x and event.y == new_y
# ???? OFF ??
unless event.through
# ??????????
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
# ???? OFF ??
unless $game_player.through
# ???????????????????
if @character_name != ""
# ????
return false
end
end
end
# ???
return true
end
end
#???????????????????????????????????????
#==============================================================================
# ¦ Game_Character (???? 2)
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# ? ?????? (??)
#--------------------------------------------------------------------------
alias update_move_KGC_MapLoop update_move
def update_move
update_move_KGC_MapLoop
# ????????
if $game_map.horizontal_loop? && @x << 7 == @real_x
if @x == -1
@x = $game_map.width - 1
@real_x = @x << 7
elsif @x == $game_map.width
@x = @real_x = 0
end
end
# ????????
if $game_map.vertical_loop? && @y << 7 == @real_y
if @y == -1
@y = $game_map.height - 1
@real_y = @y << 7
elsif @y == $game_map.height
@y = @real_y = 0
end
end
end
end
#???????????????????????????????????????
#==============================================================================
# ¦ Spriteset_Map
#==============================================================================
class Spriteset_Map
if KGC::ML_EDGE_SHOW
#--------------------------------------------------------------------------
# ? ??
#--------------------------------------------------------------------------
alias dispose_KGC_MapLoop dispose
def dispose
if @character_sprites_h != nil
@character_sprites_h.each { |sprite| sprite.dispose }
end
if @character_sprites_v != nil
@character_sprites_v.each { |sprite| sprite.dispose }
end
dispose_KGC_MapLoop
end
#--------------------------------------------------------------------------
# ? ??????
#--------------------------------------------------------------------------
alias update_KGC_MapLoop update
def update
update_KGC_MapLoop
# ??????????
if $game_map.horizontal_loop?
if @character_sprites_h == nil
@character_sprites_h = []
$game_map.events.keys.sort.each { |i|
sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
@character_sprites_h << sprite
}
end
edge = $game_map.horizontal_edge
@character_sprites_h.each { |sprite|
sprite.update
if edge == -1
sprite.x -= $game_map.width << 5
elsif edge == 1
sprite.x += $game_map.width << 5
end
}
end
# ??????????
if $game_map.vertical_loop?
if @character_sprites_v == nil
@character_sprites_v = []
$game_map.events.keys.sort.each { |i|
sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
@character_sprites_v << sprite
}
end
edge = $game_map.vertical_edge
@character_sprites_v.each { |sprite|
sprite.update
if edge == -1
sprite.y -= $game_map.height << 5
sprite.z -= $game_map.height << 5 if sprite.z < 999
elsif edge == 1
sprite.y += $game_map.height << 5
sprite.z += $game_map.height << 5 if sprite.z < 999
end
}
end
end
end
end
...