赞 | 1 |
VIP | 0 |
好人卡 | 12 |
积分 | 2 |
经验 | 52910 |
最后登录 | 2024-8-20 |
在线时间 | 835 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 196
- 在线时间
- 835 小时
- 注册时间
- 2012-9-16
- 帖子
- 1811
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 yangjunyin2002 于 2014-1-15 21:20 编辑
来自rpgmakerweb.com,注意请在使用时注明来自rpgmakerweb.com
本脚本由小y(yangjunyin2002)汉化,另外注释请不要删除(保留原日站和美站上的作者)。- #==============================================================================
- # ■ 地牢创造 6
- # 版本: 0.14版 12/01/21 RGSS3
- # 作者: Saba Kan
- # 英文翻译: kirinelf
- # 汉化:yangjunyin2002(66RPG)
- #------------------------------------------------------------------------------
- #
- #==============================================================================
- module Saba
- module Dungeon
- # 最小的图块的大小(很难解释,自己尝试一下)
- # 默认: 7
- MINIMUM_RECT_SIZE = 7
- # 最小的房间地图大小
- # 默认: 3
- MINIMUM_ROOM_SIZE = 3
- # 房间地图和图块的间距
- # 默认: 2
- MARGIN_BETWEEN_RECT_ROOM = 2
- # 走廊的百分比(1/n)
- # Works best with lower values.
- # 默认: 35
- MORE_COUPLE_RATE = 35
- # 储存敌人的变量
- ENEMY_COUNT_VARIABLE = 1
- # 调试模式
- # ・总是在小地图上显示敌人
- DEBUG_MODE = false
- end
- end
- #=========================================================================
- # Do not edit anything under this line unless you know what you're doing!
- #=========================================================================
- #==============================================================================
- # ■ Dungeon_Rect
- #------------------------------------------------------------------------------
- # ダンジョンを区切った領域を表します。
- # 各 Dungeon_Rect に一つづつ Room が存在します。
- #==============================================================================
- class Dungeon_Rect
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_accessor :lx
- attr_accessor :ly
- attr_accessor :hx
- attr_accessor :hy
- attr_accessor :room
- attr_accessor :done_split_v
- attr_accessor :done_split_h
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- def initialize(lx, ly, hx, hy)
- self.lx = lx
- self.ly = ly
- self.hx = hx
- self.hy = hy
- self.done_split_v = false
- self.done_split_h = false
- end
- end
- #==============================================================================
- # ■ Room
- #------------------------------------------------------------------------------
- # 部屋です。
- #==============================================================================
- class Room
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_accessor :lx
- attr_accessor :ly
- attr_accessor :hx
- attr_accessor :hy
- attr_accessor :mapping
- attr_reader :width
- attr_reader :height
- attr_reader :couple_areas # 通路に面している[x, y]のリスト
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- def initialize(lx, ly, hx, hy)
- self.lx = lx
- self.ly = ly
- self.hx = hx
- self.hy = hy
- @width = hx - lx
- [url=home.php?mod=space&uid=291977]@height[/url] = hy - ly
- @events = {}
- @couple_areas = []
- @mapping = false
- end
- #--------------------------------------------------------------------------
- # ● イベント配置可能数残りを取得
- #--------------------------------------------------------------------------
- def remain
- return (hx - lx) * (hy - ly) - @events.size - @couple_areas.size
- end
- #--------------------------------------------------------------------------
- # ● 指定のイベントをこの部屋のランダムな場所に配置
- #--------------------------------------------------------------------------
- def put_to_random_place(event)
- begin
- key = [rand(hx - lx) + lx, rand(hy - ly) + ly]
- end while @events[key] != nil || @couple_areas.include?(key)
- @events[key] = event
- event.moveto(key[0], key[1])
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標を含んでいるかを取得
- #--------------------------------------------------------------------------
- def contains(x, y)
- return lx <= x && x < hx && ly <= y && y < hy
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標を明るくするかを取得
- #--------------------------------------------------------------------------
- def right_area?(x, y)
- return lx-1 <= x && x < hx+1 && ly-1 <= y && y < hy+1
- end
- end
- #==============================================================================
- # ■ Couple
- #------------------------------------------------------------------------------
- # 通路です。
- #==============================================================================
- class Couple
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_accessor :rect0
- attr_accessor :rect1
- attr_accessor :direction
- end
- class Game_Map
- attr_reader :map
- attr_accessor :new_events
- #--------------------------------------------------------------------------
- # ● 定数
- #--------------------------------------------------------------------------
- COUPLE_VERTICAL = 0
- COUPLE_HORIZONAL = 1
- #--------------------------------------------------------------------------
- # ● セットアップ
- # map_id : マップ ID
- #--------------------------------------------------------------------------
- alias saba_setup setup
- def setup(map_id)
- saba_setup(map_id)
- @random_dungeon = nil
- make_random_dungeon if dungeon?
- end
- #--------------------------------------------------------------------------
- # ● ランダムダンジョンを作成
- #--------------------------------------------------------------------------
- def make_random_dungeon
- @rect_list = []
- @room_list = []
- @couple_list = []
- @map = load_data(sprintf("Data/Map%03d.rvdata2", @map_id))
- @floor_chip_id = @map.data[0, 0, 0]
- @floor_chip_id1 = @map.data[1, 0, 0]
- @edge_chip_id = @map.data[0, 1, 0]
- @wall_chip_id = @map.data[0, 2, 0]
- @blank_chip_id = @map.data[0, 4, 0]
- @object_chip_id0 = @map.data[0, 3, 0]
- @object_chip_id1 = @map.data[0, 3, 1]
- @object_chip_id2 = @map.data[0, 3, 2]
- make_rect
- make_room
- make_couple_more
- @init_phase = true
- put_blank_tiles
- put_couple_tiles
- put_room_tiles
- put_shadow
- put_wall_tiles
- put_edge_tiles
- setup_dungeon_events
- @random_data = @map.data
- @last_moving = false
- end
- #--------------------------------------------------------------------------
- # ● 区切りを作成
- #--------------------------------------------------------------------------
- def make_rect
- split_rect(add_rect(0, 1, @map.width, @map.height))
- end
- #--------------------------------------------------------------------------
- # ● 指定の DungeonRect を区切る
- #--------------------------------------------------------------------------
- def split_rect(parent)
- if (parent.hy - parent.ly <= Saba::Dungeon::MINIMUM_RECT_SIZE * 2)
- parent.done_split_v = true
- end
- if (parent.hx - parent.lx <= Saba::Dungeon::MINIMUM_RECT_SIZE * 2)
- parent.done_split_h = true;
- end
- if ((parent.done_split_v) && (parent.done_split_h))
- return
- end
- child = add_rect(parent.lx, parent.ly, parent.hx, parent.hy)
- unless parent.done_split_v
- split_coord_y = random_range(parent.ly + Saba::Dungeon::MINIMUM_RECT_SIZE, parent.hy - Saba::Dungeon::MINIMUM_RECT_SIZE)
- parent.hy = split_coord_y
- child.ly = split_coord_y
- parent.done_split_v = true
- child.done_split_v = true
- add_couple(COUPLE_VERTICAL, parent, child)
- split_rect(parent)
- split_rect(child)
- else
- split_coord_x = random_range(parent.lx + Saba::Dungeon::MINIMUM_RECT_SIZE, parent.hx - Saba::Dungeon::MINIMUM_RECT_SIZE)
- parent.hx = split_coord_x
- child.lx = split_coord_x
- parent.done_split_h = true
- child.done_split_h = true
- add_couple(COUPLE_HORIZONAL, parent, child)
- split_rect(parent)
- split_rect(child)
- end
- end
- #--------------------------------------------------------------------------
- # ● さらに道を作成
- #--------------------------------------------------------------------------
- def make_couple_more
- rectmap = {}
- for rect in @rect_list
- for i in rect.lx...rect.hx
- for j in rect.ly...rect.hy
- rectmap[[i, j]] = rect
- end
- end
- end
- for i in 0..(@map.width-2)
- for j in 1..(@map.height-2)
- if rectmap[[i, j]] != rectmap[[i, j + 1]]
- if rand(Saba::Dungeon::MORE_COUPLE_RATE) == 0
- add_couple(COUPLE_VERTICAL, rectmap[[i,j]], rectmap[[i, j + 1]])
- end
- end
- if rectmap[[i, j]] != rectmap[[i + 1, j]]
- if rand(Saba::Dungeon::MORE_COUPLE_RATE) == 0
- add_couple(COUPLE_HORIZONAL, rectmap[[i, j]], rectmap[[i + 1, j]])
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● ランダムダンジョンか?
- #--------------------------------------------------------------------------
- def dungeon?
- if @random_dungeon != nil
- return @random_dungeon
- end
- unless @map_infos
- @map_infos = load_data("Data/MapInfos.rvdata2")
- end
- @random_dungeon = @map_infos[@map_id].name.include?("@")
- return @random_dungeon
- end
- #--------------------------------------------------------------------------
- # ● 指定の区間の中でランダムな値を取得
- #--------------------------------------------------------------------------
- def random_range(b, e)
- return (rand(e - <img src='http://forums.rpgmakerweb.com/public/style_emoticons/<#EMO_DIR#>/cool.png' class='bbc_emoticon' alt='B)' /> + <img src='http://forums.rpgmakerweb.com/public/style_emoticons/<#EMO_DIR#>/cool.png' class='bbc_emoticon' alt='B)' />.to_i
- end
- #--------------------------------------------------------------------------
- # ● DungeonRect を作成して追加
- #--------------------------------------------------------------------------
- def add_rect(lx, ly, hx, hy)
- rect = Dungeon_Rect.new(lx, ly, hx, hy)
- @rect_list.push(rect)
- return rect
- end
- #--------------------------------------------------------------------------
- # ● Room を作成して追加
- #--------------------------------------------------------------------------
- def add_room(lx, ly, hx, hy)
- room = Room.new(lx, ly, hx, hy)
- @room_list.push(room)
- return room
- end
- #--------------------------------------------------------------------------
- # ● 部屋を作成
- #--------------------------------------------------------------------------
- def make_room
- for rect in @rect_list
- w = random_range(Saba::Dungeon::MINIMUM_ROOM_SIZE, rect.hx - rect.lx - (Saba::Dungeon::MARGIN_BETWEEN_RECT_ROOM * 2) + 1);
- h = random_range(Saba::Dungeon::MINIMUM_ROOM_SIZE, rect.hy - rect.ly - (Saba::Dungeon::MARGIN_BETWEEN_RECT_ROOM * 2) + 1);
- x = random_range(rect.lx + Saba::Dungeon::MARGIN_BETWEEN_RECT_ROOM, rect.hx - Saba::Dungeon::MARGIN_BETWEEN_RECT_ROOM - w + 1);
- y = random_range(rect.ly + Saba::Dungeon::MARGIN_BETWEEN_RECT_ROOM, rect.hy - Saba::Dungeon::MARGIN_BETWEEN_RECT_ROOM - h + 1);
- rect.room = add_room(x, y, x + w, y + h);
- end
- end
- #--------------------------------------------------------------------------
- # ● 通路 を作成して追加
- #--------------------------------------------------------------------------
- def add_couple(direction, rect0, rect1)
- @couple_list.each {|c|
- if (c.rect0 == rect0 && c.rect1 == rect1) ||
- (c.rect0 == rect1 && c.rect1 == rect0)
- # 重複はつくらない
- return
- end
- }
- couple = Couple.new
- couple.direction = direction
- couple.rect0 = rect0
- couple.rect1 = rect1
- @couple_list.push(couple)
- return couple
- end
- #--------------------------------------------------------------------------
- # ● 空きチップを配置
- #--------------------------------------------------------------------------
- def put_blank_tiles
- for x in [email protected]
- for y in [email protected]
- @map.data[x, y, 0] = @blank_chip_id
- @map.data[x, y, 1] = 0
- @map.data[x, y, 2] = 0
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 床チップを配置
- #--------------------------------------------------------------------------
- def put_room_tiles
- for rect in @rect_list
- room = rect.room
- (room.hx - room.lx).times do |x|
- (room.hy - room.ly).times do |y|
- put_floor_tile(x + room.lx, y + room.ly)
- end
- end
- end
- end
- def put_floor_tile(x, y)
- if @floor_chip_id1 > 0 && rand(10) == 0
- @map.data[x, y, 0] = @floor_chip_id1
- else
- @map.data[x, y, 0] = @floor_chip_id
- end
- end
- #--------------------------------------------------------------------------
- # ● 通路チップを配置
- #--------------------------------------------------------------------------
- def put_couple_tiles
- for couple in @couple_list
- case couple.direction
- when COUPLE_HORIZONAL then
- unless couple.rect0.hx == couple.rect1.lx
- p "Errorx:" + couple.rect0.hx.to_s + couple.rect1.lx .to_s
- next
- end
- c0x = couple.rect0.hx
- c0y = random_range(couple.rect0.room.ly + 1, couple.rect0.room.hy)
- c1x = couple.rect1.lx
- c1y = random_range(couple.rect1.room.ly + 1, couple.rect1.room.hy)
- line(c0x, c0y, c1x, c1y);
- line(couple.rect0.room.hx, c0y, c0x, c0y)
- line(couple.rect1.room.lx, c1y, c1x, c1y)
- couple.rect0.room.couple_areas.push([couple.rect0.room.hx-1, c0y])
- couple.rect1.room.couple_areas.push([couple.rect1.room.lx, c1y])
- when COUPLE_VERTICAL then
- unless couple.rect0.hy == couple.rect1.ly
- p "Errory:" + couple.rect0.hy.to_s + " " + couple.rect1.ly .to_s
- next
- end
- c0x = random_range(couple.rect0.room.lx + 1, couple.rect0.room.hx)
- c0y = couple.rect0.hy
- c1x = random_range(couple.rect1.room.lx + 1, couple.rect1.room.hx)
- c1y = couple.rect1.ly
- line(c0x, c0y, c1x, c1y)
- line(c0x, couple.rect0.room.hy, c0x, c0y)
- line(c1x, couple.rect1.room.ly, c1x, c1y)
- couple.rect0.room.couple_areas.push([c0x, couple.rect0.room.hy-1])
- couple.rect1.room.couple_areas.push([c1x, couple.rect1.room.ly])
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標間で床を配置
- #--------------------------------------------------------------------------
- def line(x0, y0, x1, y1)
- min_x = [x0, x1].min
- max_x = [x0, x1].max
- min_y = [y0, y1].min
- max_y = [y0, y1].max
- if ((x0 <= x1) && (y0 >= y1))
- for i in min_x..max_x
- put_floor_tile(i, max_y)
- end
- for j in min_y..max_y
- put_floor_tile(max_x, j)
- end
- elsif ((x0 > x1) && (y0 > y1))
- for i in min_x..max_x
- put_floor_tile(i, min_y)
- end
- for j in min_y..max_y
- put_floor_tile(max_x, j)
- end
- elsif ((x0 > x1) && (y0 <= y1))
- for i in min_x..max_x
- put_floor_tile(i, min_y)
- end
- for j in min_y..max_y
- put_floor_tile(max_x, j)
- end
- elsif ((x0 <= x1) && (y0 < y1))
- for i in min_x..max_x
- put_floor_tile(i, max_y)
- end
- for j in min_y..max_y
- put_floor_tile(min_x, j)
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 壁チップを配置
- #--------------------------------------------------------------------------
- def put_wall_tiles
- for y in ([email protected]).to_a.reverse
- for x in [email protected]
- next unless floor?(x, y)
- next if floor?(x, y-1)
- @map.data[x, y-1, 0] = @wall_chip_id + 15
- end
- end
- for y in ([email protected]).to_a.reverse
- for x in [email protected]
- tile = @map.data[x, y, 0]
- next unless tile == @wall_chip_id + 15
- if floor?(x, y-1)
- put_object_tile(x, y)
- next
- end
- if floor?(x-1, y) || blank?(x-1, y)
- if floor?(x+1, y) || blank?(x+1, y)
- @map.data[x, y, 0] = @wall_chip_id + 15
- else
- @map.data[x, y, 0] = @wall_chip_id + 11
- end
- else
- if floor?(x+1, y) || blank?(x+1, y)
- @map.data[x, y, 0] = @wall_chip_id + 14
- else
- @map.data[x, y, 0] = @wall_chip_id + 10
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 障害物チップを配置
- #--------------------------------------------------------------------------
- def put_object_tile(x, y)
- @map.data[x, y, 0] = @object_chip_id0
- @map.data[x, y, 1] = @object_chip_id1
- @map.data[x, y, 2] = @object_chip_id2
- end
- #--------------------------------------------------------------------------
- # ● 境界チップを配置
- #--------------------------------------------------------------------------
- def put_edge_tiles
- for y in ([email protected]).to_a.reverse
- for x in [email protected]
- tile = @map.data[x, y, 0]
- next if inner?(x, y)
- if inner?(x, y-1)
- if inner?(x, y+1)
- if inner?(x-1, y)
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 46
- else
- @map.data[x, y, 0] = @edge_chip_id + 43
- end
- else
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 45
- else
- @map.data[x, y, 0] = @edge_chip_id + 33
- end
- end
- else
- if inner?(x-1, y)
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 42
- else
- @map.data[x, y, 0] = @edge_chip_id + 34
- end
- else
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 36
- else
- @map.data[x, y, 0] = @edge_chip_id + 20
- end
- end
- end
- else
- if inner?(x, y+1)
- if inner?(x-1, y)
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 44
- else
- @map.data[x, y, 0] = @edge_chip_id + 40
- end
- else
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 38
- else
- @map.data[x, y, 0] = @edge_chip_id + 28
- end
- end
- else
- if inner?(x-1, y)
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 32
- else
- @map.data[x, y, 0] = @edge_chip_id + 16
- end
- else
- if inner?(x+1, y)
- @map.data[x, y, 0] = @edge_chip_id + 24
- else
- if inner?(x+1, y+1) || inner?(x+1, y-1) ||
- inner?(x-1, y-1) || inner?(x-1, y+1)
- @map.data[x, y, 0] = @edge_chip_id
- else
- @map.data[x, y, 0] = @blank_chip_id
- end
- end
- end
- end
- end
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 影タイルを置きます
- #--------------------------------------------------------------------------
- def put_shadow
- for y in [email protected]
- for x in [email protected]
- next unless floor?(x, y)
- next if floor?(x-1, y-1)
- next unless blank?(x-1, y)
- @map.data[x, y, 3] = 5
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標が境界の内側かどうか
- #--------------------------------------------------------------------------
- def inner?(x, y)
- return floor?(x, y) || wall?(x, y) || object?(x, y)
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標が床かどうか
- #--------------------------------------------------------------------------
- def floor?(x, y)
- return false if @map.data[x, y, 2] == @object_chip_id2
- return true if @floor_chip_id1 && @map.data[x, y, 0] == @floor_chip_id1
- return @map.data[x, y, 0] == @floor_chip_id
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標がカラかどうか
- #--------------------------------------------------------------------------
- def blank?(x, y)
- return @map.data[x, y, 0] == @blank_chip_id
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標が障害物かどうか
- #--------------------------------------------------------------------------
- def object?(x, y)
- return @map.data[x, y, 0] == @object_chip_id0
- end
- #--------------------------------------------------------------------------
- # ● 指定の座標が壁かどうか
- #--------------------------------------------------------------------------
- def wall?(x, y)
- tile = @map.data[x, y, 0]
- return false if tile == nil || tile == 0
- return tile >= @wall_chip_id && tile <= @wall_chip_id + 15
- end
- #--------------------------------------------------------------------------
- # ● プレイヤーをランダムな位置に配置
- #--------------------------------------------------------------------------
- def setup_player_initial_position
- put_to_random_place($game_player) unless floor?($game_player.x, $game_player.y)
- end
- #--------------------------------------------------------------------------
- # ● ダンジョンの特殊なイベントをランダムな場所に配置する
- #--------------------------------------------------------------------------
- def setup_dungeon_events
- @next_enemy_event_id = 10000
- @enemy_events = []
- for event in @events.values
- if event.event.name.include?("*")
- @enemy_events.push(event.event)
- self.events[event.id].erase
- else
- put_to_random_place(event)
- end
- end
- setup_enemy
- end
- #--------------------------------------------------------------------------
- # ● 敵イベントの初期設定
- #--------------------------------------------------------------------------
- def setup_enemy
- $game_variables[Saba::Dungeon::ENEMY_COUNT_VARIABLE] = 0
- return if @enemy_events.count == 0
- @map.encounter_step.times do |i|
- add_random_enemy
- end
- end
- #--------------------------------------------------------------------------
- # ● ランダムな敵イベントをランダムな場所に配置する
- #--------------------------------------------------------------------------
- def add_random_enemy
- add_enemy(rand(@enemy_events.count))
- end
- #--------------------------------------------------------------------------
- # ● 指定の敵イベントを複製してランダムな場所に配置する
- #--------------------------------------------------------------------------
- def add_enemy(event_id)
- enemy_event = @enemy_events[event_id]
- event = Game_Event.new(@map_id, enemy_event)
- # イベントのループ内では新しいイベントを追加できないので、
- # 一旦別の場所に格納
- @new_events = {} unless @new_events
- @new_events[@next_enemy_event_id] = event
- event.event_id = @next_enemy_event_id
- @next_enemy_event_id += 1
- $game_variables[Saba::Dungeon::ENEMY_COUNT_VARIABLE] += 1
- end
- alias saba_randomdungeon_update_events update_events
- def update_events
- saba_randomdungeon_update_events
- if @new_events
- for key in @new_events.keys
- @events[key] = @new_events[key]
- put_to_random_place(@events[key])
- $game_minimap.add_event(@events[key]) if $game_minimap
- end
- end
- @init_phase = false
- end
- #--------------------------------------------------------------------------
- # ● 指定のイベントをランダムな場所に配置する
- #--------------------------------------------------------------------------
- def put_to_random_place(event)
- if @init_phase
- room_list = @room_list.select {|room| room.remain != 0 }
- else
- room_list = @room_list.select {|room| room.remain != 0 && room != $game_player.room }
- end
- room = room_list[rand(room_list.size)]
- room.put_to_random_place(event)
- end
- #--------------------------------------------------------------------------
- # ● 起動中のマップイベントを検出/セットアップ
- #--------------------------------------------------------------------------
- def setup_starting_map_event
- event = @events.values.find {|event| event.starting }
- event.clear_starting_flag if event
- @interpreter.setup(event.list, event.event_id) if event
- event
- end
- def room(x, y)
- for rect in @rect_list
- if rect.room.contains(x, y)
- return rect.room
- end
- end
- return nil
- end
- end
- class Spriteset_Map
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- alias saba_dungeon_initialize initialize
- def initialize
- saba_dungeon_initialize
- @dark_sprite = Sprite_Dark.new(@viewport_dark)
- update_dark_sprite_visible
- end
- #--------------------------------------------------------------------------
- # ● ビューポートの作成
- #--------------------------------------------------------------------------
- alias saba_dungeon_create_viewports create_viewports
- def create_viewports
- saba_dungeon_create_viewports
- @viewport_dark = Viewport.new
- end
- #--------------------------------------------------------------------------
- # ● フレーム更新
- #--------------------------------------------------------------------------
- alias saba_dungeon_update update
- def update
- if $game_map.new_events
- $game_map.new_events.values.each do |event|
- @character_sprites.push(Sprite_Character.new(@viewport1, event))
- end
- $game_map.new_events = nil
- end
- saba_dungeon_update
- update_dark_sprite_visible
- end
- #--------------------------------------------------------------------------
- # ● 暗闇スプライトの表示更新
- #--------------------------------------------------------------------------
- def update_dark_sprite_visible
- if @dark_sprite
- if $game_map.dungeon?
- @dark_sprite.visible = true
- @dark_sprite.update
- else
- @dark_sprite.visible = false
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 解放
- #--------------------------------------------------------------------------
- alias saba_dungeon_dispose dispose
- def dispose
- @dark_sprite.dispose if @dark_sprite
- saba_dungeon_dispose
- end
- #--------------------------------------------------------------------------
- # ● ビューポートの解放
- #--------------------------------------------------------------------------
- alias saba_dungeon_dispose_viewports dispose_viewports
- def dispose_viewports
- saba_dungeon_dispose_viewports
- @viewport_dark.dispose
- end
- #--------------------------------------------------------------------------
- # ● キャラクタースプライトの作成
- #--------------------------------------------------------------------------
- alias saba_dungeon_create_characters create_characters
- def create_characters
- saba_dungeon_create_characters
- $game_map.new_events = nil
- end
- end
- class Sprite_Character
- alias saba_dangeon_update update
- def update
- saba_dangeon_update
- return unless $game_map.dungeon?
- if @character.is_a?(Game_Event)
- #~ if [url=home.php?mod=space&uid=33356]@Static[/url] == nil
- #~ @static = @character.name.to_i > 1000
- #~ end
- #~ if @static
- #~ self.visible = true
- self.visible = false
- if $game_player.room
- self.visible = $game_player.room.contains(@character.x, @character.y)
- end
- case $game_player.distance(@character)
- when 1;
- self.visible = true
- @last_visible = self.visible
- when 2;
- self.visible |= @last_visible
- @last_visible = false
- end
- end
- end
- end
- class Sprite_Dark < Sprite_Base
- def initialize(viewport)
- super(viewport)
- self.bitmap = Bitmap.new(Graphics.width+32*32, Graphics.height+32*32)
- refresh
- update
- end
- def update
- super
- if @last_room != $game_player.room
- refresh
- @last_room = $game_player.room
- end
- if @last_room
- self.viewport.ox = -@start_x + $game_map.display_x*32
- self.viewport.oy = -@start_y + $game_map.display_y*32
- if (self.viewport.ox - self.bitmap.width / 2 + Graphics.width / 2).abs > Graphics.width / 2 ||
- (self.viewport.oy - self.bitmap.height / 2 + Graphics.height / 2).abs > Graphics.height / 2
- refresh
- end
- self.viewport.ox = -@start_x + $game_map.display_x*32
- self.viewport.oy = -@start_y + $game_map.display_y*32
- else
- self.viewport.ox = -$game_player.screen_x + self.bitmap.width / 2
- self.viewport.oy = -$game_player.screen_y + self.bitmap.height / 2 + 16
- end
- end
- def refresh
- self.bitmap.clear
- self.bitmap.fill_rect(0, 0, self.bitmap.width, self.bitmap.height, Color.new(0, 0, 0, 100))
- room = $game_player.room
- if room == nil
- rect = Rect.new
- rect.x = self.bitmap.width / 2 - 48
- rect.y = self.bitmap.height / 2 - 45
- rect.width = 96
- rect.height = 96
- self.bitmap.clear_rect(rect)
- edge = Cache.system("dark_edge2")
- self.bitmap.blt(rect.x, rect.y, edge, edge.rect)
- else
- rect = Rect.new
- rect.x = self.bitmap.width / 2 - ($game_player.x - room.lx) * 32
- rect.y = self.bitmap.height / 2 - ($game_player.y - room.ly) * 32
- rect.width = (room.hx - room.lx+2) * 32
- rect.height = (room.hy - room.ly+2) * 32
- self.bitmap.clear_rect(rect)
- @start_x = $game_map.display_x*32 - self.bitmap.width / 2 + ($game_player.x - $game_map.display_x - 1)*32
- @start_y = $game_map.display_y*32 - self.bitmap.height / 2 + ($game_player.y - $game_map.display_y - 1)*32
- edge = Cache.system("dark_edge")
- self.bitmap.blt(rect.x, rect.y, edge, Rect.new(0, 0, 32, 32))
- self.bitmap.blt(rect.x+rect.width-32, rect.y, edge, Rect.new(32, 0, 32, 32))
- self.bitmap.blt(rect.x, rect.y+rect.height-32, edge, Rect.new(0, 32, 32, 32))
- self.bitmap.blt(rect.x+rect.width-32, rect.y+rect.height-32, edge, Rect.new(32, 32, 32, 32))
- end
- end
- end
- class Game_Event
- attr_reader :event
- attr_accessor :event_id
- attr_reader :erased
- def name
- @event.name
- end
- alias saba_dungeon_erase erase
- def erase
- saba_dungeon_erase
- return unless enemy?
- $game_variables[Saba::Dungeon::ENEMY_COUNT_VARIABLE] -= 1
- end
- def enemy?
- return name.include?("*")
- end
- end
- class Game_Player
- #--------------------------------------------------------------------------
- # ● 指定位置に移動
- #--------------------------------------------------------------------------
- alias saba_dungeon_moveto moveto
- def moveto(x, y)
- saba_dungeon_moveto(x, y)
- $game_map.setup_player_initial_position if $game_map.dungeon?
- end
- def distance(event)
- min = $game_player.distance_xy_from(event.x, event.y)
- return min unless $game_player.followers.visible
- $game_player.followers.each do |character|
- dist = character.distance_xy_from(event.x, event.y)
- if dist < min
- min = dist
- end
- end
- return min
- end
- end
- class Game_Character
- #--------------------------------------------------------------------------
- # ● 距離計算
- #--------------------------------------------------------------------------
- def distance_xy_from(x, y)
- sx = distance_x_from(x)
- sy = distance_y_from(y)
- return [sx.abs, sy.abs].max
- end
- end
复制代码 |
评分
-
查看全部评分
|