# # ランダムマップ作成スクリプト v0.80 by tonbi # # # ランダムなマップを自動作成するスクリプトです # Scene_Debugより下、Mainより上に、新規セッションを作り、貼り付けてください。 # # マップ処理軽量化スクリプト(簡易版)と同等の機能を内包していますので、 # 軽量化スクリプトは入れないでください。 # # ●使い方 # # まずマップ名を「XXXXX,ランダム,YYY,ZZZ」としてください。 # XXXXXは好きな名前を入れてください。 # YYYには、生成のパターン番号を入れます。サンプルを参照にしてください。 # ZZZには、障害物の多さを入れてください。これもサンプルを参考にしてください。 # # 次に、マップタイルをこのマップに一定の法則で並べます # これも書けませんのでサンプルを参考にしてください。 # 特にレイヤーに注意してください。レイヤーもサンプル通りに。補完されます。 # # 最後にイベントを設定します # # イベントの名前を「XXXXX,中継点」 # とすると、その位置は必ず地面になります。 # この中継点を、イベントIDの順に繋いでいってマップを作ります。 # (直線で結んでいるわけではもちろんありません) # なるべく、マップの両淵に中継点を作ってください。 # また、淵は少し空けてください。(5タイル程度)壁が無くなります。 # ただし、この中継点が無くても、一応マップは作成されます。 # また、中継点を増やしすぎると、壁が減ります。 # 数個で十分なので気をつけてください。 # オススメは3つで3角形の形に設定です # # 中継点以外のイベントで、特に指定の無いものはランダムな地面に移動されます。 # # イベントの名前を「XXXXX,固定」 # とすると、そのイベントはその位置の近くの地面に移動されます。 # イベントの1ページ目の初めを注釈にして、「◆注釈 : 固定」としても可です。 # # イベントの名前を「XXXXX,完全固定」 # とすると、そのイベントはその位置のままになります。 # 自動開始のイベントや並列処理のイベントで、淵に置いておきたい物に。 # イベントの1ページ目の初めを注釈にして、「◆注釈 : 完全固定」としても可です。 # # イベントの1ページ目の初めを注釈にして、「◆注釈 : 壁設置」 # とすると、そのイベントはランダムな壁の位置に移動されます。 # 扉や松明などのイベント用です。「壁設置,1」とコンマに続いて数字を指定すると、 # その分の横幅が[追加]で確保されます。(横幅1タイルなら0を、3タイルなら1を。) # これによって大きいイベントも使うことができます # # イベントの1ページ目の初めを注釈にして、「◆注釈 : 壁設置固定」 # とすると、上記「壁設置」と「固定」が適応されます。 # つまり、元の位置の近くの壁に移動されます。 # また「壁設置固定,1」と、追加幅も指定できます。 # # また、使用する際は、↓の部分を必用に応じて書き換えてください。 #======================================================================== #======================================================================== #★スクリプトシェルフの福山さんのパーティ列車移動とあわせて使う場合は、 # このスクリプトを列車移動よりも下にして、 # ↓を、 USE_TRAIN_ACTOR = true としてください。(使わないときは = false) USE_TRAIN_ACTOR = false #======================================================================== #======================================================================== #★クリッピングの距離指定(意味わかんなかったらこのままで。) class Game_Character DRAWRANGEX = 1920 # マップキャラのスプライトを更新する距離 DRAWRANGEY = 1664 # かなり大きいキャラチップを使う場合は増やしてください。 # X:14 Y:12タイル前後推奨 タイル数に128掛けた数値を指定。 # ちなみに上がX(横)下がY(縦)です。 end #======================================================================== #======================================================================== #★保存するか否か。(実際にランダム機能は使わないけど、作る手間は省きたい方に。) # これで保存されたマップを、他のマップにコピーすれば、制作の手間が省けます。 class Game_Map AUTO_MAP_SAVE = true # マップをID:999に保存するかどうか。 # true なら保存 false なら保存しない # 完成したゲームを公開する際はfalseにしてください。 end #------------------------------------------------------------------- # ●Game_Tempクラス #-------------------------------------------------------------------- class Game_Temp alias initialize_tonbi1 initialize def initialize initialize_tonbi1 $onscreen = [] # スプライト画面内フラグ end end #-------------------------------------------------------------------------- # ● Game_Characterクラス #-------------------------------------------------------------------------- class Game_Character #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias update_tonbi1 update def update #画面上での位置 sx = @real_x - $game_map.display_x - 1280 sy = @real_y - $game_map.display_y - 960 # 絶対値を求める abs_sx = sx > 0 ? sx : -sx abs_sy = sy > 0 ? sy-3 : -sy # 縦か横が DRAWRANGE タイル以上離れている場合 if abs_sx > DRAWRANGEX or abs_sy > DRAWRANGEY # スプライト非更新にする $onscreen[@id]=false else # スプライト更新ありにする $onscreen[@id]=true end update_tonbi1 end end class Spriteset_Map #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- attr_accessor :character_sprites def initialize $onscreen = [] # ビューポートを作成 @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 = [] @party_sprites = [] for i in $game_map.events.keys.sort sprite = Sprite_Character.new(@viewport1, $game_map.events[i]) @character_sprites[i]=sprite $onscreen[i] = true end @party_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 ############################################################★変更 # キャラクタースプライトを解放 # nil なら開放しない for i in @character_sprites if i != nil i.dispose end end for i in @party_sprites if i != nil i.dispose end end ############################################################ # 天候を解放 @weather.dispose # ピクチャを解放 for sprite in @picture_sprites sprite.dispose end # タイマースプライトを解放 @timer_sprite.dispose # ビューポートを解放 @viewport1.dispose @viewport2.dispose @viewport3.dispose end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update # パノラマが現在のものと異なる場合 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 i in $game_map.events.keys if $onscreen[i] @character_sprites[i].update end end # プレイヤーキャラ更新 for i in @party_sprites i.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 if USE_TRAIN_ACTOR == true module Train_Actor module Spriteset_Map_Module def setup_actor_character_sprites(characters) if !setup_actor_character_sprites? for character in characters.reverse @party_sprites.unshift( Sprite_Character.new(@viewport1, character) ) end @setup_actor_character_sprites_flag = true end end end end end #============================================================================== # ■ Game_Map #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ● セットアップ # map_id : マップ ID #-------------------------------------------------------------------------- def setup(map_id) # マップ ID を @map_id に記憶 @map_id = map_id # マップをファイルからロードし、@map に設定 @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 check_special_map #★ # リフレッシュ要求フラグをクリア @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 end #-------------------------------------------------------------------------- # ● マップを読み込んだ直後の処理 #-------------------------------------------------------------------------- def check_special_map # マップの名前のデータを取得 mapinfo = load_data("Data/MapInfos.rxdata") # マップのサブネームが"ランダム"なら if mapinfo[@map_id].subname == "ランダム" if mapinfo[@map_id].subname(3)=="" or mapinfo[@map_id].subname(3) == nil p3 = 0 else p3 = mapinfo[@map_id].subname(3).to_i end if mapinfo[@map_id].subname(4)=="false" p4 = false end make_random_map(2,mapinfo[@map_id].subname(2).to_i,p3,p4) end end #-------------------------------------------------------------------------- # ● ランダムマップを作成する # wall = 壁の高さ >> 現時点では無効 # type = 壁製作タイプ >> 0しか作ってません(汗 指定方法も未定 # thoughplayer = プレイヤーも中継点に含めるか? # connect = 中継点の結び方 >> true=連続 false=2個ずつ独立 # # ※すべての引数省略化  下の用に飛ばすことも可能 # ex. make_random_map(2,0,,true) #-------------------------------------------------------------------------- def make_random_map(wall = 2, type = 0, objcnt = 0, connect = true) # パラメータ異常の対策 wall = 0 if wall == nil type = 0 if type == nil objcnt = 0 if objcnt == nil unless objcnt.is_a?(Numeric) objcnt = 0 end if objcnt < 0 objcnt = 0 end connect = true if connect != false # 高さデータ配列 @heightdata = Table.new(@map.width,@map.height) # 地形データ配列 @maskdata = Table.new(@map.width,@map.height) # イベント等配置データ配列 @oneventdata = Table.new(@map.width,@map.height) # マスク設定データ配列 @masksetting = [] # 製作方法データ @makedata = [] # 演算方法初期化 @targettype=0 @chgtype=0 time = -1 # 各データ初期化 for i in 0...@map.width for j in 0...@map.height time += 1 if time%2000 == 0 Graphics.update end @heightdata[i,j] = 0 @maskdata[i,j] = 0 end end for i in 0...100 @masksetting[i] = true end # 中継点情報取得 needposx = [] needposy = [] # イベント「中継点」を追加 for i in @map.events.keys.sort time += 1 if time%200 == 0 Graphics.update end if event_settype(i) == 1 if connect == true needposx.push(@map.events[i].x) needposy.push(@map.events[i].y) needposx.push(@map.events[i].x) needposy.push(@map.events[i].y) else needposx.push(@map.events[i].x) needposy.push(@map.events[i].y) end end end if connect == true needposx.shift needposy.shift end loop do if needposx.size <= 2 needposx.push(rand(@map.width)) needposy.push(rand(@map.height)) else break end end # ここで製作方法データをセットする case type when 0 # タイプ0 >> 2層自然タイプ @makedata.push([0,1,0]) @makedata.push([5,1]) for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,0,-15,4,0]) @makedata.push([1,1,1,1,1]) @makedata.push([6,0,needposx[i*2],needposy[i*2]]) @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) end @makedata.push([4,0,1,1,1]) @makedata.push([4,0,1,1,1]) @makedata.push([4,1,1,1,1]) @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,0]) @makedata.push([2,1,2]) @makedata.push([5,1]) when 1 # タイプ1 >> 2層人工タイプ @makedata.push([0,1,0]) @makedata.push([5,1]) for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,0,-6,4,1,10]) @makedata.push([1,1,1,1,1]) @makedata.push([6,0,needposx[i*2],needposy[i*2]]) @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) end @makedata.push([4,0,2,3,1]) @makedata.push([4,1,2,2,1]) @makedata.push([4,0,1,1,1]) @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,0]) @makedata.push([2,1,2]) @makedata.push([5,1]) when 2 # タイプ2 >> 2層自然凸タイプ @makedata.push([0,1,0]) @makedata.push([5,1]) for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,0,-15,4,0]) @makedata.push([1,1,1,1,1]) @makedata.push([6,0,needposx[i*2],needposy[i*2]]) @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) end @makedata.push([4,0,2,2,1]) @makedata.push([4,1,1,1,1]) @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,0]) @makedata.push([2,1,2]) @makedata.push([5,-1]) when 3 # タイプ2 >> 2層人工凸タイプ @makedata.push([0,1,0]) @makedata.push([5,1]) for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,0,-15,4,1,10]) @makedata.push([1,1,1,1,1]) @makedata.push([6,0,needposx[i*2],needposy[i*2]]) @makedata.push([6,0,needposx[i*2+1],needposy[i*2+1]]) end @makedata.push([4,0,2,2,1]) @makedata.push([4,1,1,1,1]) @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,0]) @makedata.push([2,1,2]) @makedata.push([5,-1]) when 4 # タイプ4 >> 2層自然タイプ その1 # 地形[0:穴 1:地面 2:壁] # 基本設定 @makedata.push([0,1,0]) @makedata.push([5,0]) # 壁を置く @makedata.push([1,0,0,-1,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,0,-1,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,-1,0,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,0,-1,0,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([4,2,2,2,1]) # 穴をランダムで置く for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) @makedata.push([1,3,3,8,8]) @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) end # 周囲に壁作成 @makedata.push([7,2]) @makedata.push([4,2,1,1,1]) # 道作成 for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,1,-8,4,0,5]) @makedata.push([1,1,1,1,1]) @makedata.push([6,1,needposx[i*2],needposy[i*2]]) @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) end # 拡張処理 @makedata.push([4,1,1,1,1]) @makedata.push([4,1,0,1,1]) @makedata.push([2,0,0]) @makedata.push([4,1,1,0,1]) @makedata.push([2,-1,1]) @makedata.push([4,2,1,1,1]) # 高さ設定 @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,-1]) @makedata.push([2,1,2]) @makedata.push([5,0]) @makedata.push([2,2,2]) @makedata.push([5,1]) when 5 # タイプ5 >> 2層人工タイプ その1 # 地形[0:穴 1:地面 2:壁] # 基本設定 @makedata.push([0,1,0]) @makedata.push([5,0]) # 壁を置く @makedata.push([1,0,0,-1,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,0,-1,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,-1,0,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,0,-1,0,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([4,2,2,2,1]) # 穴をランダムで置く for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) @makedata.push([1,3,3,8,8]) @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) end # 周囲に壁作成 @makedata.push([7,2]) @makedata.push([4,2,1,1,1]) # 道作成 for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,1,-8,4,1,5]) @makedata.push([1,1,1,1,1]) @makedata.push([6,1,needposx[i*2],needposy[i*2]]) @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) end # 拡張処理 @makedata.push([4,1,1,1,1]) @makedata.push([4,1,0,1,1]) @makedata.push([2,0,0]) @makedata.push([4,1,1,0,1]) @makedata.push([2,-1,1]) @makedata.push([4,2,1,1,1]) # 高さ設定 @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,-1]) @makedata.push([2,1,2]) @makedata.push([5,0]) @makedata.push([2,2,2]) @makedata.push([5,1]) when 6 # タイプ6 >> 2層自然タイプ その2 # 地形[0:穴 1:地面 2:壁] # 基本設定 @makedata.push([0,1,0]) @makedata.push([5,0]) # 壁を置く @makedata.push([1,0,0,-1,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,0,-1,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,-1,0,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,0,-1,0,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([4,2,2,2,1]) # 穴をランダムで置く for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) @makedata.push([1,1,1,3,3]) @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) end # 穴拡大 @makedata.push([4,0,2,2,0]) @makedata.push([4,0,1,2,1]) # 周囲に壁作成 @makedata.push([7,2]) @makedata.push([4,2,1,1,1]) # 道作成 for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,1,-15,4,0,5]) @makedata.push([1,1,1,1,1]) @makedata.push([6,1,needposx[i*2],needposy[i*2]]) @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) end # 拡張処理 @makedata.push([4,1,1,1,1]) @makedata.push([4,1,0,1,1]) @makedata.push([2,0,0]) @makedata.push([4,1,1,0,1]) @makedata.push([2,-1,1]) @makedata.push([4,2,1,1,1]) # 高さ設定 @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,-1]) @makedata.push([2,1,2]) @makedata.push([5,0]) @makedata.push([2,2,2]) @makedata.push([5,1]) when 7 # タイプ7 >> 2層人工タイプ その2 # 地形[0:穴 1:地面 2:壁] # 基本設定 @makedata.push([0,1,0]) @makedata.push([5,0]) # 壁を置く @makedata.push([1,0,0,-1,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,0,-1,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,-1,-1,0,-1]) @makedata.push([3,2,-6,1,0]) @makedata.push([1,0,-1,0,0]) @makedata.push([3,2,-6,1,0]) @makedata.push([4,2,2,2,1]) # 穴をランダムで置く for i in 0...(rand(12*@map.width*@map.height/40/40)+(5*@map.width*@map.height/40/40)) @makedata.push([1,1,1,3,3]) @makedata.push([6,0,rand(@map.width-10)+5,rand(@map.height-10)+5]) end # 穴拡大 @makedata.push([4,0,2,2,0]) @makedata.push([4,0,1,2,1]) # 周囲に壁作成 @makedata.push([7,2]) @makedata.push([4,2,1,1,1]) # 道作成 for i in 0...(needposx.size/2) @makedata.push([1,needposx[i*2],needposy[i*2],needposx[i*2+1],needposy[i*2+1]]) @makedata.push([3,1,-15,4,1,5]) @makedata.push([1,1,1,1,1]) @makedata.push([6,1,needposx[i*2],needposy[i*2]]) @makedata.push([6,1,needposx[i*2+1],needposy[i*2+1]]) end # 拡張処理 @makedata.push([4,1,1,1,1]) @makedata.push([4,1,0,1,1]) @makedata.push([2,0,0]) @makedata.push([4,1,1,0,1]) @makedata.push([2,-1,1]) @makedata.push([4,2,1,1,1]) # 高さ設定 @makedata.push([0,0,0]) @makedata.push([2,0,2]) @makedata.push([5,-1]) @makedata.push([2,1,2]) @makedata.push([5,0]) @makedata.push([2,2,2]) @makedata.push([5,1]) end # 実際に作る for make_stat in @makedata time += 1 if time%2 == 0 Graphics.update end case make_stat[0] when 0 # 対象変更 (p1[0=高さ 1=地形], p2[0=代入 1=加算]) rndmap_chtarget(make_stat[1],make_stat[2]) when 1 # 引数設定 (minx, miny, maxz, maxy) rndmap_setstat(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) when 2 # マスク変更 (p1[-1:全部], p2[ 0=false 1=true 2=onlytrue]) rndmap_chmask(make_stat[1],make_stat[2]) when 3 # 道作成 (値,中継点数,淵確保,タイプ) rndmap_mkroad(make_stat[1],make_stat[2],make_stat[3],make_stat[4],make_stat[5]) when 4 # 拡張 (対象,縦幅,横幅,タイプ) rndmap_plus(make_stat[1],make_stat[2],make_stat[3],make_stat[4]) when 5 # 全変更 (値) rndmap_allchg(make_stat[1]) when 6 # 指定点 (値,位置X,位置Y) rndmap_putpos(make_stat[1],make_stat[2],make_stat[3]) when 7 # 周囲 (値) rndmap_edge(make_stat[1]) end end # 使用マップタイル取得 @tilesetting = Table.new(3,40,3) for i in [0,1,2] for k in 0...40 for j in [0,1,2] @tilesetting[j,k,i] = @map.data[j,k,i] end end end # 補正する time = 0 for k in 0...@map.height for j in 0...@map.width time += 1 # 時間かかるので、定期的に画面更新 if time%500 == 0 Graphics.update end # 壁の下のタイルが穴なら地面に変更 if @heightdata[j,k] == 1 if @heightdata[j,k+1]==-1 @heightdata[j,k+1] = 0 if @heightdata[j,k+2]==-1 and @heightdata[j,k+3] == 0 @heightdata[j,k+2] = 0 end end end end end # 地面作成 その壱 >> とりあえず敷き詰める time = 0 for k in 0...@map.height for j in 0...@map.width time += 1 # 時間かかるので、定期的に画面更新 if time%500 == 0 Graphics.update end if @heightdata[j,k] == 0 if @heightdata[j,k+1] == -1 or @heightdata[j,k-1] == -1 or @heightdata[j+1,k] == -1 or @heightdata[j-1,k] == -1 set_mapdata2(j,k,0,8) else set_mapdata2(j,k,0,0) end elsif @heightdata[j,k] == 1 if @heightdata[j,k+1] == -1 or @heightdata[j,k-1] == -1 or @heightdata[j+1,k] == -1 or @heightdata[j-1,k] == -1 set_mapdata2(j,k,0,8) elsif @heightdata[j,k+1] == 0 or @heightdata[j,k-1] == 0 or @heightdata[j+1,k] == 0 or @heightdata[j-1,k] == 0 set_mapdata2(j,k,0,0) else set_mapdata2(j,k,1,4) end else set_mapdata2(j,k,0,8) end end end # 地面作成 その弐 >> 穴とのエッヂ作成 time = 0 for k in 0...@map.height for j in 0...@map.width time += 1 # 時間かかるので、定期的に画面更新 if time%500 == 0 Graphics.update end if @heightdata[j,k] == 0 if @heightdata[j,k+1] == -1 # 下が穴------------------ if @heightdata[j-1,k] == -1 # 左も穴 for i in [0,1,2] set_mapdata(j,k+i,0,13+i,1) end elsif @heightdata[j+1,k] == -1 # 右も穴 for i in [0,1,2] set_mapdata(j,k+i,2,13+i,1) end else # 両脇も地面 for i in [0,1,2] set_mapdata(j,k+i,1,13+i,1) end end elsif @heightdata[j,k-1] == -1 # 上が穴------------------ if @heightdata[j-1,k] == -1 or (@heightdata[j-1,k] == 1 and @heightdata[j-1,k-1] == -1) # 左も穴 set_mapdata(j,k,0,11,2) elsif @heightdata[j+1,k] == -1 or (@heightdata[j+1,k] == 1 and @heightdata[j+1,k-1] == -1) # 右も穴 set_mapdata(j,k,2,11,2) else # 両脇も地面 set_mapdata(j,k,1,11,2) end elsif @heightdata[j-1,k] == -1 or (@heightdata[j-1,k] == 1 and @heightdata[j-1,k-1] == -1) # 左が穴------------------ set_mapdata(j,k,0,12,1) elsif @heightdata[j+1,k] == -1 or (@heightdata[j+1,k] == 1 and @heightdata[j+1,k-1] == -1) # 右が穴------------------ set_mapdata(j,k,2,12,1) elsif @heightdata[j-1,k-1] == -1 # 左上が穴------------------ set_mapdata(j,k,0,9,1) elsif @heightdata[j-1,k+1] == -1 # 左下が穴------------------ set_mapdata(j,k,0,10,1) elsif @heightdata[j+1,k-1] == -1 # 右上が穴------------------ set_mapdata(j,k,1,9,1) elsif @heightdata[j+1,k+1] == -1 # 右下が穴------------------ set_mapdata(j,k,1,10,1) end end if @heightdata[j,k] == 1 and @heightdata[j,k-1] != -1 if @heightdata[j,k+1] == -1 # 下が穴------------------ if @heightdata[j-1,k] == -1 # 左も穴 for i in [0,1,2] # set_mapdata(j,k+i,0,13+i,1) end elsif @heightdata[j+1,k] == -1 # 右も穴 for i in [0,1,2] # set_mapdata(j,k+i,2,13+i,1) end else # 両脇も地面 for i in [0,1,2] # set_mapdata(j,k+i,1,13+i,1) end end elsif @heightdata[j,k-1] == -1 # 上が穴------------------ if @heightdata[j-1,k] == -1 # 左も穴 set_mapdata(j,k,0,11,2) elsif @heightdata[j+1,k] == -1 # 右も穴 set_mapdata(j,k,2,11,2) else # 両脇も地面 set_mapdata(j,k,1,11,2) end elsif @heightdata[j-1,k] == -1 # 左が穴------------------ set_mapdata(j,k,0,12,1) elsif @heightdata[j+1,k] == -1 # 右が穴------------------ set_mapdata(j,k,2,12,1) elsif @heightdata[j-1,k-1] == -1 # 左上が穴------------------ set_mapdata(j,k,0,9,1) elsif @heightdata[j-1,k+1] == -1 # 左下が穴------------------ set_mapdata(j,k,0,10,1) elsif @heightdata[j+1,k-1] == -1 # 右上が穴------------------ set_mapdata(j,k,1,9,1) elsif @heightdata[j+1,k+1] == -1 # 右下が穴------------------ set_mapdata(j,k,1,10,1) end end end end # 地面作成 その参 >> 壁とのエッヂ作成 time = 0 for k in 0...@map.height for j in 0...@map.width time += 1 # 時間かかるので、定期的に画面更新 if time%500 == 0 Graphics.update end if @heightdata[j,k] == 1 if @heightdata[j,k+1] == 0 or @heightdata[j,k+1] == -1 # 下が穴------------------ if @heightdata[j-1,k] == 0 or @heightdata[j-1,k] == -1 # 左も穴 set_mapdata(j,k+0,0,5+0,5) set_mapdata(j,k+1,0,5+1,5) set_mapdata(j,k+2,0,5+2,4) if @heightdata[j,k+3] != 0 and @heightdata[j,k+2] != 1 and (@heightdata[j,k+2] != 0 or @heightdata[j-1,k+2] != 0) set_mapdata(j,k+2,0,16,5) for i in [0,1] set_mapdata(j,k+3+i,0,14+i,1) if @heightdata[j,k+3+i] != -1 break end end end elsif @heightdata[j+1,k] == 0 or @heightdata[j+1,k] == -1 # 右も穴 set_mapdata(j,k+0,2,5+0,5) set_mapdata(j,k+1,2,5+1,5) set_mapdata(j,k+2,2,5+2,4) if @heightdata[j,k+3] != 0 and @heightdata[j,k+2] != 1 and (@heightdata[j,k+2] != 0 or @heightdata[j+1,k+2] != 0) set_mapdata(j,k+2,2,16,5) for i in [0,1] set_mapdata(j,k+3+i,2,14+i,1) if @heightdata[j,k+3+i] != -1 break end end end else # 両脇も地面 set_mapdata(j,k+0,1,5+0,5) set_mapdata(j,k+1,1,5+1,5) set_mapdata(j,k+2,1,5+2,4) if @heightdata[j,k+3] != 0 and @heightdata[j,k+2] != 1 set_mapdata(j,k+2,1,16,5) for i in [0,1] set_mapdata(j,k+3+i,1,14+i,1) if @heightdata[j,k+3+i] != -1 break end end end end elsif @heightdata[j,k-1] == 0 or @heightdata[j,k-1] == -1 # 上が穴------------------ if @heightdata[j-1,k] == 0 or @heightdata[j-1,k] == -1 # 左も穴 set_mapdata(j,k,0,3,4) elsif @heightdata[j+1,k] == 0 or @heightdata[j+1,k] == -1 # 右も穴 set_mapdata(j,k,2,3,4) else # 両脇も地面 set_mapdata(j,k,1,3,4) end elsif @heightdata[j-1,k] == 0 or @heightdata[j-1,k] == -1 # 左が穴------------------ set_mapdata(j,k,0,4,4) elsif @heightdata[j+1,k] == 0 or @heightdata[j+1,k] == -1 # 右が穴------------------ set_mapdata(j,k,2,4,4) elsif @heightdata[j-1,k-1] == 0 or @heightdata[j-1,k-1] == -1 # 左上が穴------------------ set_mapdata(j,k,0,1,4) elsif @heightdata[j-1,k+1] == 0 or @heightdata[j-1,k+1] == -1 # 左下が穴------------------ set_mapdata(j,k,0,2,4) elsif @heightdata[j+1,k-1] == 0 or @heightdata[j+1,k-1] == -1 # 右上が穴------------------ set_mapdata(j,k,1,1,4) elsif @heightdata[j+1,k+1] == 0 or @heightdata[j+1,k+1] == -1 # 右下が穴------------------ set_mapdata(j,k,1,2,4) end end end end # プレイヤーの位置を調節 playerpos_reset($game_temp.player_new_x,$game_temp.player_new_y) @oneventdata[$game_temp.player_new_x,$game_temp.player_new_y] = 1 time = 0 for i in @map.events.keys.sort time += 1 if time%100 == 0 Graphics.update end # イベント設置タイプ>>完全固定(最優先) case event_settype(i) when 3 @oneventdata[@map.events[i].x,@map.events[i].y] = 1 end end for i in @map.events.keys.sort time += 1 if time%100 == 0 Graphics.update end # イベント設置タイプ>>中継点 case event_settype(i) when 1 set_defeventpos(i,@map.events[i].x,@map.events[i].y) @oneventdata[@map.events[i].x,@map.events[i].y] = 1 end end # イベントの位置を調節 for i in @map.events.keys.sort time += 1 if time%100 == 0 Graphics.update end j = event_settype(i) case j when 0 # ランダム set_defeventpos(i,rand(@map.width-4)+2,rand(@map.width-4)+2) @oneventdata[@map.events[i].x,@map.events[i].y] = 1 when 2 # 固定 set_defeventpos(i,@map.events[i].x,@map.events[i].y) @oneventdata[@map.events[i].x,@map.events[i].y] = 1 when 100..199 # 壁設置 set_defeventpos_wall(i,rand(@map.width-4)+2,rand(@map.width-4)+2,j-100) @oneventdata[@map.events[i].x,@map.events[i].y] = 1 @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 for k in 1..(j-100) @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 end when 200..299 # 壁設置固定 set_defeventpos_wall(i,@map.events[i].x,@map.events[i].y,j-200) @oneventdata[@map.events[i].x,@map.events[i].y] = 1 @oneventdata[@map.events[i].x,@map.events[i].y-1] = 1 for k in 1..(j-200) @oneventdata[@map.events[i].x+k,@map.events[i].y] = 1 @oneventdata[@map.events[i].x+k,@map.events[i].y-1] = 1 @oneventdata[@map.events[i].x-k,@map.events[i].y] = 1 @oneventdata[@map.events[i].x-k,@map.events[i].y-1] = 1 end end end # 障害物を置く for i in 0...(rand(objcnt)+objcnt/2) time += 1 if time%500 == 0 Graphics.update end j = rand(@map.width) k = rand(@map.width) case rand(10) when 0..4 if standable_newtile?(1,0) if standable?(j,k) set_mapdata(j,k,1,0,6) end else if standable2?(j,k) set_mapdata(j,k,1,0,6) end end when 5..7 if standable_newtile?(2,0) if standable?(j,k) set_mapdata(j,k,2,0,6) end else if standable2?(j,k) set_mapdata(j,k,2,0,6) end end when 8..9 if standable2?(j,k) if @map.data[j,k-1,2]==0 and (@map.data[j,k,1]==0 or @map.data[j,k,2]==0) set_mapdata(j,k,2,2,4) # 4>6? set_mapdata(j,k-1,2,1,4) # 4>2? end end end end # 変数の内容開放(これでされるのかな?) @heightdata.resize(0,0) @maskdata.resize(0,0) @oneventdata.resize(0,0) @masksetting.clear @makedata.clear @tilesetting.resize(0,0,0) if AUTO_MAP_SAVE # 保存機能 save_data(@map,sprintf("Data/Map%03d.rxdata", 999)) maplist = load_data("Data/MapInfos.rxdata") mapinfo = RPG::MapInfo.new mapinfo.name = sprintf("ランダム自動保存(%s)", maplist[@map_id].name) mapinfo.parent_id = 0 mapinfo.order = 999 mapinfo.expanded = true mapinfo.scroll_x = 0 mapinfo.scroll_y = 0 maplist[999]=mapinfo save_data(maplist,"Data/MapInfos.rxdata") end end #-------------------------------------------------------------------------- # ● イベントの位置タイプ取得 #-------------------------------------------------------------------------- def event_settype(i) if @map.events[i].subname == "中継点" return 1 end if @map.events[i].subname == "固定" return 2 end if @map.events[i].subname == "完全固定" return 3 end for j in 0..1000 if @map.events[i].pages[0].list[j].code != 108 break end # コメントに中継点とあれば if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "中継点" return 1 end # コメントに完全固定とあれば if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "完全固定" return 3 end # コメントに固定とあれば if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "固定" return 2 end # コメントに壁設置とあれば if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁設置" if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil return 100 else k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] k = k.to_i return 100+k end end # コメントに壁設置固定とあれば if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[0] == "壁設置固定" if @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] == nil return 200 else k = @map.events[i].pages[0].list[j].parameters[0].split(/,/)[1] k = k.to_i return 200+k end end end return 0 end #-------------------------------------------------------------------------- # ● イベントを指定位置付近に設置 #-------------------------------------------------------------------------- def set_defeventpos(id,x,y) if standable2?(x,y) @map.events[id].x=x @map.events[id].y=y return end for i in 1..([@map.width,@map.height].max) if standable2?(x,y+i) @map.events[id].x=x @map.events[id].y=y+i return end for j in 1..i if standable2?(x-j,y+i) @map.events[id].x=x-j @map.events[id].y=y+i return end if standable2?(x+j,y+i) @map.events[id].x=x+j @map.events[id].y=y+i return end if standable2?(x-j,y-i) @map.events[id].x=x-j @map.events[id].y=y-i return end if standable2?(x+j,y-i) @map.events[id].x=x+j @map.events[id].y=y-i return end end end end #-------------------------------------------------------------------------- # ● イベントを指定位置付近の壁に設置 # p4 幅 #-------------------------------------------------------------------------- def set_defeventpos_wall(id,x,y,p4) if standable3?(x,y,p4) @map.events[id].x=x @map.events[id].y=y return end for i in 1..([@map.width,@map.height].max) if standable3?(x,y+i,p4) @map.events[id].x=x @map.events[id].y=y+i return end for j in 1..i if standable3?(x-j,y+i,p4) @map.events[id].x=x-j @map.events[id].y=y+i return end if standable3?(x+j,y+i,p4) @map.events[id].x=x+j @map.events[id].y=y+i return end if standable3?(x-j,y-i,p4) @map.events[id].x=x-j @map.events[id].y=y-i return end if standable3?(x+j,y-i,p4) @map.events[id].x=x+j @map.events[id].y=y-i return end end end end #-------------------------------------------------------------------------- # ● プレイヤーを指定位置付近に設置 #-------------------------------------------------------------------------- def playerpos_reset(x,y) if standable?(x,y) $game_temp.player_new_x=x $game_temp.player_new_y=y return end for i in 1..([@map.width,@map.height].max) if standable?(x,y+i) $game_temp.player_new_x=x $game_temp.player_new_y=y+i return end for j in 0..i if standable?(x-j,y+i) $game_temp.player_new_x=x-j $game_temp.player_new_y=y+i return end if standable?(x+j,y+i) $game_temp.player_new_x=x+j $game_temp.player_new_y=y+i return end if standable?(x-j,y-i) $game_temp.player_new_x=x-j $game_temp.player_new_y=y-i return end if standable?(x+j,y-i) $game_temp.player_new_x=x+j $game_temp.player_new_y=y-i return end end end end #-------------------------------------------------------------------------- # ● 自分は通れるか?(障害物タイル) # p1,p2 位置X,Y #-------------------------------------------------------------------------- def standable_newtile?(p1,p2) for i in [2, 1, 0] tile_id = @tilesetting[p1, p2, i] if tile_id == nil return false elsif @passages[tile_id] & 0x0f == 0x0f return false elsif @priorities[tile_id] == 0 return true end end return true end #-------------------------------------------------------------------------- # ● 指定位置に立てるか? # p1,p2 位置X,Y #-------------------------------------------------------------------------- def standable?(p1,p2) if @heightdata[p1,p2] != 0 return false end if @oneventdata[p1,p2] ==1 return false end for i in [2, 1, 0] tile_id = @map.data[p1, p2, i] if tile_id == nil return false elsif @passages[tile_id] & 0x0f == 0x0f return false elsif @priorities[tile_id] == 0 return true end end return true end #-------------------------------------------------------------------------- # ● 指定位置に置いても大丈夫か?(周囲のイベントなど考慮版) # p1,p2 位置X,Y #-------------------------------------------------------------------------- def standable2?(p1,p2) # その位置判定 unless standable?(p1,p2) return false end # 周囲のイベントチェック(行き止まりにならないか?) # 縦へ抜けれるか if standable?(p1+1,p2-1) == false or standable?(p1+1,p2) == false or standable?(p1+1,p2+1) == false if standable?(p1-1,p2-1) == false or standable?(p1-1,p2) == false or standable?(p1-1,p2+1) == false # もともと縦へ抜けれない時は無視 if standable?(p1,p2-1) == true and standable?(p1,p2+1) == true return false end end end # 横へ抜けれるか if standable?(p1+1,p2+1) == false or standable?(p1,p2+1) == false or standable?(p1-1,p2+1) == false if standable?(p1+1,p2-1) == false or standable?(p1,p2-1) == false or standable?(p1-1,p2-1) == false # もともと横へ抜けれない時は無視 if standable?(p1-1,p2) == true and standable?(p1+1,p2) == true return false end end end if standable?(p1,p2-1) == false and (standable?(p1-1,p2+1) == false or standable?(p1,p2+1) == false or standable?(p1+1,p2+1) == false) return false end if standable?(p1,p2+1) == false and (standable?(p1-1,p2-1) == false or standable?(p1+1,p2-1) == false or standable?(p1+1,p2-1) == false) return false end if standable?(p1-1,p2) == false and (standable?(p1+1,p2-1) == false or standable?(p1+1,p2) == false or standable?(p1+1,p2+1) == false) return false end if standable?(p1+1,p2) == false and (standable?(p1-1,p2-1) == false or standable?(p1-1,p2) == false or standable?(p1-1,p2+1) == false) return false end return true end #-------------------------------------------------------------------------- # ● 指定位置に置いても大丈夫か?(壁版) # p1,p2 位置X,Y # p3 幅 #-------------------------------------------------------------------------- def standable3?(p1,p2,p3) # 下がもともと立てないなら不可 unless standable?(p1,p2+1) return false end # その位置判定 if @oneventdata[p1,p2] == 1 or @oneventdata[p1,p2-1] == 1 or @heightdata[p1,p2-2] != 1 or @heightdata[p1,p2-1] == 1 or @heightdata[p1,p2+1] != 0 return false end for i in 1...p3+1 if@heightdata[p1+i,p2-2] != 1 or @heightdata[p1+i,p2-1] == 1 or @heightdata[p1+i,p2+1] != 0 return false end if@heightdata[p1-i,p2-2] != 1 or @heightdata[p1-i,p2-1] == 1 or @heightdata[p1-i,p2+1] != 0 return false end end for i in 1...p3+1 if @oneventdata[p1+i,p2] == 1 or @oneventdata[p1+i,p2-1] == 1 return false end if @oneventdata[p1-i,p2] == 1 or @oneventdata[p1-i,p2-1] == 1 return false end end return true end #-------------------------------------------------------------------------- # ● マップタイル情報変更 # p1,p2 書き出し先位置X,Y # p3,p4 元参照位置X,Y # p5 挿入方法 0:通常 1:下レイヤ 2:上レイヤ 3:下から 4:上から 5:両方 #-------------------------------------------------------------------------- def set_mapdata(p1,p2,p3,p4,p5 = 0) unless self.valid?(p1, p2) return end if @tilesetting[p3,p4,0] != 0 # レイヤー0は普通に置く @map.data[p1,p2,0] = @tilesetting[p3,p4,0] end case p5 when 0 # 通常 if @tilesetting[p3,p4,1] != 0 @map.data[p1,p2,1] = @tilesetting[p3,p4,1] end if @tilesetting[p3,p4,2] != 0 @map.data[p1,p2,2] = @tilesetting[p3,p4,2] end when 1 # 下に置く if @tilesetting[p3,p4,1] != 0 @map.data[p1,p2,1] = @tilesetting[p3,p4,1] end when 2 # 上に置く if @tilesetting[p3,p4,1] != 0 @map.data[p1,p2,2] = @tilesetting[p3,p4,1] end when 3 # 下から置く if @tilesetting[p3,p4,1] != 0 if @map.data[p1,p2,1] != 0 @map.data[p1,p2,2] = @map.data[p1,p2,1] end @map.data[p1,p2,1] = @tilesetting[p3,p4,1] end when 4 # 上から置く if @tilesetting[p3,p4,1] != 0 if @map.data[p1,p2,2] != 0 @map.data[p1,p2,1] = @map.data[p1,p2,2] end @map.data[p1,p2,2] = @tilesetting[p3,p4,1] end when 5 # 両方に置く if @tilesetting[p3,p4,1] != 0 @map.data[p1,p2,1] = @tilesetting[p3,p4,1] end if @tilesetting[p3,p4,1] != 0 @map.data[p1,p2,2] = @tilesetting[p3,p4,1] end when 6 # 置けるなら置く if @map.data[p1,p2,1] == 0 @map.data[p1,p2,1] = @tilesetting[p3,p4,1] elsif @map.data[p1,p2,2] == 0 @map.data[p1,p2,2] = @tilesetting[p3,p4,1] end end end #-------------------------------------------------------------------------- # ● マップタイル情報変更2 >>範囲外判定など無しver # p1,p2 書き出し先位置X,Y # p3,p4 元参照位置X,Y #-------------------------------------------------------------------------- def set_mapdata2(p1,p2,p3,p4) @map.data[p1,p2,0] = @tilesetting[p3,p4,0] @map.data[p1,p2,1] = @tilesetting[p3,p4,1] @map.data[p1,p2,2] = @tilesetting[p3,p4,2] end #-------------------------------------------------------------------------- # ● 指定位置の情報変更 # p1,p2 位置X,Y # p3 値 #-------------------------------------------------------------------------- def set_height(p1,p2,p3) return if p1<0 return if p1>=@map.width return if p2<0 return if p2>=@map.height @heightdata[p1,p2]=p3 end #-------------------------------------------------------------------------- # ● 指定位置の情報変更 # p1,p2 位置X,Y # p3 値 #-------------------------------------------------------------------------- def set_grounddata(p1,p2,p3) return if p1<0 return if p1>=@map.width return if p2<0 return if p2>=@map.height if @masksetting[@maskdata[p1,p2]] == true if @targettype==0 if @chgtype==0 @heightdata[p1,p2]=p3 elsif @chgtype==1 @heightdata[p1,p2]+=p3 end elsif @targettype==1 if @chgtype==0 @maskdata[p1,p2]=p3 elsif @chgtype==1 @maskdata[p1,p2]+=p3 end end end end #-------------------------------------------------------------------------- # ● 演算方法指定 # p1 対象 >> =0:高さ =1:地形 (現在、高さ0=地面 1=壁 # p2 方法 >> =0:代入 =1:加算 地形はマスク判定にのみ使用 #-------------------------------------------------------------------------- def rndmap_chtarget(p1,p2) @targettype=p1 @chgtype=p2 end #-------------------------------------------------------------------------- # ● ほかのコマンドで使用する値をセット # p1,p2 最小 X,Y # p3,p4 最大 X,Y 道製作の開始点、終了点セットなどに使用 #-------------------------------------------------------------------------- def rndmap_setstat(p1,p2,p3,p4) @minx=p1 @miny=p2 @maxx=p3 @maxy=p4 end #-------------------------------------------------------------------------- # ● 地形マスクを設定 # p1 = 対象地形 (-1= すべて) # p2 = 変更値 (0= 書き換え禁止 1= 書き換え許可 2= その地形のみ許可) #-------------------------------------------------------------------------- def rndmap_chmask(p1,p2) if p1>=0 if p2==0 @masksetting[p1]=false elsif p2 == 1 @masksetting[p1]=true elsif p2 == 2 for i in 0...100 @masksetting[i]=false end @masksetting[p1]=true end end if p1==-1 if p2==0 for i in 0...100 @masksetting[i]=false end else for i in 0...100 @masksetting[i]=true end end end end #-------------------------------------------------------------------------- # ● 2点を繋ぐ道作成 # 始点、終点はrndmap_setstatで設定 # p1 = 書き変える値 # p2 = 途中点数(マイナスならマップサイズ40*40を基準に相対変化) # p3 = 淵に確保する幅 # p4 = 途中点の結び方 (0=直線で結ぶ 1=直角ライン(?)で結ぶ) # p5 = 無視する中継点の距離 #-------------------------------------------------------------------------- def rndmap_mkroad(p1,p2,p3,p4,p5 = 5) p5 = 5 if p5 == nil localdata = Table.new(@map.width,@map.height) aposx = [] aposy = [] aflag = [] for i in 0...@map.width for j in 0...@map.height localdata[i,j] = 0 end end if p2<0 p2=(p2*-1)*@map.width*@map.height/40/40 end aposx[0]=@minx aposy[0]=@miny aposx[1]=@maxx aposy[1]=@maxy if aposx[0]<0 aposx[0]=@map.width+aposx[0] end if (aposx[0]>=1000) and (aposx[0]<=1100) aposx[0]=@map.width*(aposx[0]-1000)/100 end if aposy[0]<0 aposy[0]=@map.height+aposy[0] end if (aposy[0]>=1000) and (aposy[0]<=1100) aposy[0]=@map.height*(aposy[0]-1000)/100 end if aposx[1]<0 aposx[1]=@map.width+aposx[1] end if (aposx[1]>=1000) and (aposx[1]<=1100) aposx[1]=@map.width*(aposx[1]-1000)/100 end if aposy[1]<0 aposy[1]=@map.height+aposy[1] end if (aposy[1]>=1000) and (aposy[1]<=1100) aposy[1]=@map.height*(aposy[1]-1000)/100 end if p4==0 or p4==1 or p4==2 if p4 == 2 i4 = rand(2) end aflag[0] = true aflag[1] = false for i in 2...(p2+2) aposx[i] = rand(@map.width-p3*2) + p3 aposy[i] = rand(@map.height-p3*2) + p3 aflag[i] = false end i3=0 i1=aposx[i3] i2=aposy[i3] localdata[i1,i2] = 1 for i in 0...p2+2 i7=5000000 for j in 0...p2+2 if aflag[j] == false i4 = aposx[j]-i1 i4=i4*-1 if i4 < 0 i5 = aposy[j]-i2 i5=i5*-1 if i5 < 0 if (i4**2+i5**2) <=(p5**2) and j != 1 aflag[j] = true elsif i7 > (i4**2+i5**2) i7=(i4**2+i5**2) i6=j end end end # 始点ID:i3 終点ID:i6 if p4==0 if aposx[i3] > aposx[i6] i8 = aposx[i3] i9 = aposy[i3] i10 = aposx[i6] i11 = aposy[i6] else i8 = aposx[i6] i9 = aposy[i6] i10 = aposx[i3] i11 = aposy[i3] end if i8!=i10 for i in 0..(i8-i10) localdata[i+i10,(i9-i11)*i/(i8-i10)+i11] = 1 end end if aposy[i3] > aposy[i6] i8 = aposx[i3] i9 = aposy[i3] i10 = aposx[i6] i11 = aposy[i6] else i8 = aposx[i6] i9 = aposy[i6] i10 = aposx[i3] i11 = aposy[i3] end if i9!=i11 for i in 0..(i9-i11) localdata[(i8-i10)*i/(i9-i11)+i10,i+i11] = 1 end end end if p4==1 i4 = rand(2) if i4==0 for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) localdata[i+[aposx[i3],aposx[i6]].min,aposy[i3]] = 1 end for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) localdata[aposx[i6],i+[aposy[i3],aposy[i6]].min] = 1 end else for i in 0..([aposx[i3]-aposx[i6],aposx[i6]-aposx[i3]].max) localdata[i+[aposx[i3],aposx[i6]].min,aposy[i6]] = 1 end for i in 0..([aposy[i3]-aposy[i6],aposy[i6]-aposy[i3]].max) localdata[aposx[i3],i+[aposy[i3],aposy[i6]].min] = 1 end end end i3=i6 i1=aposx[i3] i2=aposy[i3] aflag[i3]=true if i3==1 break end end end for i in 0...@map.width for j in 0...@map.height if localdata[i,j] == 1 set_grounddata(i,j,p1) end end end end #-------------------------------------------------------------------------- # ● 対象を拡張 # p1 対象 # p2,p3 拡張する幅X,Y # p4 拡張方法 (0=十字 1=四角) #-------------------------------------------------------------------------- def rndmap_plus(p1,p2,p3,p4) localdata = Table.new(@map.width,@map.height) for i in 0...@map.width for j in 0...@map.height if @targettype==0 localdata[i,j] = @heightdata[i,j] elsif @targettype==1 localdata[i,j] = @maskdata[i,j] end end end if p4 == 0 for i in 0...@map.width for j in 0...@map.height if p1==localdata[i,j] for k in 1..p2 set_grounddata(i+k,j,p1) set_grounddata(i-k,j,p1) end for k in 1..p3 set_grounddata(i,j+k,p1) set_grounddata(i,j-k,p1) end end end end elsif p4 == 1 for i in 0...@map.width for j in 0...@map.height if p1==localdata[i,j] for k in (i-p2)..(i+p2) for l in (j-p3)..(j+p3) set_grounddata(k,l,p1) end end end end end end end #-------------------------------------------------------------------------- # ● すべてに設定 # p1 値 #-------------------------------------------------------------------------- def rndmap_allchg(p1) for i in 0...@map.width for j in 0...@map.height set_grounddata(i,j,p1) end end end #-------------------------------------------------------------------------- # ● 指定点 # p1 値 # p2,p3 位置X,Y #-------------------------------------------------------------------------- def rndmap_putpos(p1,p2,p3) i = rand(@maxx-@minx+1)+@minx j = rand(@maxy-@miny+1)+@miny for k in (p2-i)..(p2+i) for l in (p3-j)..(p3+j) set_grounddata(k,l,p1) end end end #-------------------------------------------------------------------------- # ● 周囲 # p1 値 #-------------------------------------------------------------------------- def rndmap_edge(p1) for i in 0...@map.width set_grounddata(i,0,p1) set_grounddata(i,@map.height-1,p1) end for i in 0...@map.height set_grounddata(0,i,p1) set_grounddata(@map.width-1,i,p1) end end end #============================================================================== # □ RPG::MapInfo >>サブネーム..","以降の文字のことを subname に取得 #============================================================================== module RPG class MapInfo def name name = @name.split(/,/)[0] return name != nil ? name : '' end def name=(str) str2 = @name[/^[^,]*(,.*)/, 1] @name = str2 != nil ? str + str2 : str end def subname(i = 1) name = @name.split(/,/)[i] return name != nil ? name : "" end end end #============================================================================== # □ RPG::Event >>サブネーム..","以降の文字のことを subname に取得 #============================================================================== module RPG class Event def name name = @name.split(/,/)[0] return name != nil ? name : '' end def name=(str) str2 = @name[/^[^,]*(,.*)/, 1] @name = str2 != nil ? str + str2 : str end def subname(i = 1) name = @name.split(/,/)[i] return name != nil ? name : "" end end end