注册会员 登录
Project1 返回首页

汪汪的个人空间 https://rpg.blue/?171386 [收藏] [复制] [分享] [RSS]

日志

【xp】关于地图的修改加强脚本整合1.2

已有 361 次阅读2015-4-14 22:28 |个人分类:脚本·修改·整合·胡编

  #--------------------------------------------------------------------------
  # Mod地图修改 1.2
  # ● 参考 yangff 先生 的
  #     我要造房子!修改地图元件 - RPG Maker 技术区 - 66RPG
  #     http://rm.66rpg.com/forum.php?mod=viewthread&tid=88421
  #    额,主要是不读取所有地图,好像也没什么作用。。
  # ● 参考 某位 的 事件位置保存脚本,
  #    由于种种原因,未能找到脚本作者名,十分抱歉。
  # ● 额,
  #    主要是脚本合并,bug 未知,如有请告知,
  #    若原作者不允许对脚本进行修改或有其他意见,万望告知。
  #  
  #--------------------------------------------------------------------------

class Game_Map
attr_accessor :mod
attr_accessor :map
attr_accessor :events
  def initialize
    @map_id = 0
    @display_x = 0
    @display_y = 0
    @mod={}
  end
  #--------------------------------------------------------------------------
  # ● 设置
  #     map_id : 地图 ID
  #--------------------------------------------------------------------------
  def setup(map_id)
    save_event_pos
    
    load(map_id)
    
    @map_id = 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
    # 清除刷新要求标志
    @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
    
    load_event_pos
    
  end

  #--------------------------------------------------------------------------
  # ● 读取  map_id : 地图 ID
  #--------------------------------------------------------------------------
  def load(mapid)
    if FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid))
      @map = load_data(sprintf("Data/Map%03d.rxdata", mapid))
    end
    loadmod(mapid)
  end

  def loadmod(mapid)
   chushimap(mapid)
      mod =@mod[mapid].clone 
    if mod != nil
   #地图
      if mod[0] != nil
        w = mod[0][0]
        h = mod[0][1]
        @map=RPG::Map.new(w,h) 
      end
        #图块 
      if mod[1] != nil
        mod[1].each {|wz,dat|@map.data[wz[0],wz[1],wz[2]]=dat}
      end
       #新事件 
      if mod[2] != nil
        mod[2].each {|id,ev|@map.events[id] = ev }
      end
        #事件位置保存记录
      if mod[3] != nil
        mod[3].each {|id,pos|
          @map.events[id].x=pos[0] if pos[0] != nil 
          @map.events[id].y=pos[1] if pos[1] != nil 
        }
      end
        #事件位置开始页显示
      if mod[4] != nil
        mod[4].each {|id,pos|
       @map.events[id].x=pos[0] if pos[0] != nil 
       @map.events[id].y=pos[1] if pos[1] != nil 
       @map.events[id].startpage=pos[2] if pos[2] != nil  
       @map.events[id].erased = pos[3] if pos[3] != nil 
        }
      end
    end
  end
  
  def chushimap(mapid)
    @mod[mapid]={} if  @mod[mapid]==nil 
    @mod[mapid][1]={} if @mod[mapid][1] == nil
    @mod[mapid][2]={} if @mod[mapid][2] == nil
    @mod[mapid][3]={} if @mod[mapid][3] == nil
    @mod[mapid][4]={} if @mod[mapid][4] == nil
    @mod[mapid][5]={} if @mod[mapid][5] == nil
  end

  
  #--------------------------------------------------------------------------
  # ●  Mod用图块id改变地图
  #--------------------------------------------------------------------------
  def edit(mapid,x,y,lv,dat)
    @map.data[x,y,lv] = dat if mapid == $game_map.map_id
    chushimap(mapid)
    @mod[mapid][1][[x,y,lv]] = dat 
  end
  #--------------------------------------------------------------------------
  # ●  Mod用图块id改变地图区域
  #--------------------------------------------------------------------------
  def editarea(mapid,x,y,w,h,lv,dat) #lv=0,1,2
    for x1 in x...w+x
      for y1 in y...y+h
        @map.data[x1,y1,lv] = dat if mapid==$game_map.map_id
        chushimap(mapid)
        @mod[mapid][1][[x1,y1,lv]] = dat 
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Mod用地图的区域改变地图
  #--------------------------------------------------------------------------
  def editbymap(mapid,x,y,lv,mapid1,x1,y1,lv1,w1,h1)
    chushimap(mapid)
    if FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid1))
      map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid1))
    end
    x3 = x
    for y2 in x1..h1+(x1-1)
      for x2 in y1..w1+(y1-1)
        dat = @mod[mapid1][1][x2,y2,lv1] 
        dat = map1.data[x2,y2,lv1] if dat == nil
        @map.data[x3,y,lv] = dat  if mapid==$game_map.map_id
        @mod[mapid][1][[x3,y,lv]] = dat 
        x3 = x3+1
      end
      y = y+1
      x3 = x
    end
  end

  #--------------------------------------------------------------------------
  # ●  Mod创建新地图
  #--------------------------------------------------------------------------
  def newmap(mapid,w,h)
    @map=RPG::Map.new(w,h) if mapid==$game_map.map_id
    chushimap(mapid)
    @mod[mapid][0] = [w,h] 
  end
  #--------------------------------------------------------------------------
  # ●  Mod创建新事件
  #--------------------------------------------------------------------------
  def newev(ev=nil)
    if ev.is_a?(RPG::Event)
      @map.events[ev.id] =  ev
      @events[ev.id] = Game_Event.new(@map_id , ev)     
      $game_map.need_refresh = true
      $game_map.update
      if $scene.is_a?(Scene_Map) 
        $scene.refresh_spriteset       #这里要修改
      end
    end
  end
  #--------------------------------------------------------------------------
  # ●  Mod复制地图事件到       #添加++++++++++
  #--------------------------------------------------------------------------
  def copyev(fomap=1,foevid=1,tomap=1,x=0,y=0,id=nil)
    ev = nil
    if @mod[fomap] != nil and @mod[fomap][2] != nil
      ev = @mod[fomap][2][foevid].clone if 
      @mod[fomap][2][foevid].is_a?(RPG::Event)
    end
    if !ev.is_a?(RPG::Event)
      if FileTest.exist?(sprintf("Data/Map%03d.rxdata", fomap))
        map1 = load_data(sprintf("Data/Map%03d.rxdata", fomap))
        ev = map1.events[foevid].clone if 
        map1.events[foevid].is_a?(RPG::Event)
      end
    end
    if ev.is_a?(RPG::Event) 
      chushimap(tomap)
      if tomap == @map_id
        if id ==nil 
          id=1
          until @events[id] == nil
            id+=1
          end
        end
        ev.id = id
        ev.x = x
        ev.y = y
        @mod[tomap][3].delete(ev.id) 
        @mod[tomap][2][ev.id]= ev
        newev(ev)
      else
        if FileTest.exist?(sprintf("Data/Map%03d.rxdata", tomap))
          map0 = load_data(sprintf("Data/Map%03d.rxdata", tomap))
        end
        if id ==nil 
          id=1
          until (map0.events[id] == nil and @mod[tomap][2][id] == nil )
            id+=1
          end
        end
        ev.id=id
        ev.x=x
        ev.y=y
        @mod[tomap][3].delete(ev.id) 
        @mod[tomap][2][ev.id]= ev
      end
    end
  end
  #--------------------------------------------------------------------------
  #  Mod更改事件初始页       #添加++++++++++
  #--------------------------------------------------------------------------
  def evst(mapid=1,id=1,startpage = 0)      
    chushimap(mapid)
    if mapid == @map_id
      @events[id].startpage = startpage
      @events[id].refresh
      @mod[mapid][4][id]||=[]
      @mod[mapid][4][id][2] = startpage
    else
      ev = false
      if @mod[mapid][2][id].is_a?(RPG::Event)
        ev = true
      end
      if ev !=true and 
        FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid)) 
        map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid))
        ev = true  if map1.events[id].is_a?(RPG::Event)
      end
      if ev = true
        @mod[mapid][4][id]||=[]
        @mod[mapid][4][id][2] = startpage
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Mod移动事件       #添加++++++++++
  #--------------------------------------------------------------------------
  def evxy(mapid=1,id=1,x=0,y=0)
    chushimap(mapid)
    if mapid == @map_id
      @events[id].moveto(x, y)
      @mod[mapid][4][id]||=[]
      @mod[mapid][4][id][0] = x
      @mod[mapid][4][id][1] = y      
    else
      ev = false
      if @mod[mapid][2][id].is_a?(RPG::Event)
        ev = true
      end
      if ev !=true and 
        FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid)) 
        map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid))
        ev = true  if map1.events[id].is_a?(RPG::Event)
      end
      if ev = true
        @mod[mapid][4][id]||=[]
        @mod[mapid][4][id][0] = x
        @mod[mapid][4][id][1] = y      
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Mod更改事件朝向       #添加++++++++++
  #--------------------------------------------------------------------------
  def evdic(mapid=1,id=1,dic = 0)
    chushimap(mapid)
    if mapid == @map_id
      case dic
      when 2
        @events[id].turn_down
      when 4
        @events[id].turn_left
      when 6
        @events[id].turn_right
      when 8
        @events[id].turn_up
      end
      @mod[mapid][4][id]||=[]
      @mod[mapid][4][id][3] = dic
    else
      ev = false
      if @mod[mapid][2][id].is_a?(RPG::Event)
        ev = true
      end
      if ev !=true and 
        FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid)) 
        map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid))
        ev = true  if map1.events[id].is_a?(RPG::Event)
      end
      if ev = true
        @mod[mapid][4][id]||=[]
        @mod[mapid][4][id][3] = dic
      end
    end
  end  
  #--------------------------------------------------------------------------
  # ● Mod改变事件 位置 开始页,方向     #添加++++++++++
  #--------------------------------------------------------------------------
  def changev(mapid=1,id=1,x=0,y=0,startpage =0,dic=nil)
    chushimap(mapid)
    if mapid == @map_id
      @events[id].moveto(x, y) 
      @events[id].startpage = startpage
      @events[id].refresh
      case dic
      when 2
        @events[id].turn_down
      when 4
        @events[id].turn_left
      when 6
        @events[id].turn_right
      when 8
        @events[id].turn_up
      end
      @mod[mapid][3].delete(id) 
      @mod[mapid][4][id] = [x,y,startpage,dic]
    else
      ev = false
      if @mod[mapid][2][id].is_a?(RPG::Event)
        ev = true
      end
      if ev !=true and 
        FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid)) 
        map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid))
        ev = true  if map1.events[id].is_a?(RPG::Event)
      end
      if ev = true
        @mod[mapid][3].delete(id) 
        @mod[mapid][4][id] = [x,y,startpage,dic]
      end
    end
  end
  
  #--------------------------------------------------------------------------
  # ●  Mod显示隐藏新事件       #添加++++++++++
  #--------------------------------------------------------------------------
  def evxs(mapid,id,erased = true)
 chushimap(mapid)
    if mapid == @map_id
      @events[id].erased = erased
      @events[id].refresh
      @mod[mapid][4][id]||=[]
      @mod[mapid][4][id][3] = erased
    else
      ev = false
      if @mod[mapid][2][id].is_a?(RPG::Event)
        ev = true
      end
      if ev !=true and 
        FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid)) 
        map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid))
        ev = true  if map1.events[id].is_a?(RPG::Event)
      end
      if ev = true
        @mod[mapid][4][id]||=[]
        @mod[mapid][4][id][3] = erased
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Mod事件初始页重置     #添加++++++++++
  #--------------------------------------------------------------------------
  def evstre(mapid=1,id=1)
    chushimap(mapid)
    if mapid == @map_id
      @events[id].startpage = 0
      @events[id].refresh
      @mod[mapid][4][id]||=[]
      @mod[mapid][4][id][2] = 0
    else
      ev = false
      if @mod[mapid][2][id].is_a?(RPG::Event)
        ev = true
      end
      if ev !=true and 
        FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid)) 
        map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid))
        ev = true  if map1.events[id].is_a?(RPG::Event)
      end
      if ev = true
        @mod[mapid][4][id]||=[]
        @mod[mapid][4][id][2] = 0
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Mod事件位置重置     #添加++++++++++
  #--------------------------------------------------------------------------
  def evxyre(mapid=1,id=1)
    chushimap(mapid)
    if mapid == @map_id
      @mod[mapid][4][id]||=[]
      @mod[mapid][4][id][0] = nil
      @mod[mapid][4][id][1] = nil   
    else
      ev = false
      if @mod[mapid][2][id].is_a?(RPG::Event)
        ev = true
      end
      if ev !=true and 
        FileTest.exist?(sprintf("Data/Map%03d.rxdata", mapid)) 
        map1 = load_data(sprintf("Data/Map%03d.rxdata", mapid))
        ev = true  if map1.events[id].is_a?(RPG::Event)
      end
      if ev = true
        @mod[mapid][4][id]||=[]
        @mod[mapid][4][id][0] = nil
        @mod[mapid][4][id][1] = nil      
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● Mod事件重置     #添加++++++++++
  #--------------------------------------------------------------------------
  def evre(mapid=1,id=1)
    chushimap(mapid)
    if mapid == @map_id
      @mod[mapid][3].delete(id) 
      @mod[mapid][4].delete(id)
    else
      @mod[mapid][3].delete(id) 
      @mod[mapid][4].delete(id) 
    end
  end  
  
  
  
  #--------------------------------------------------------------------------
  # ● 保存事件位置    #添加++++++++++
  #--------------------------------------------------------------------------
  def save_event_pos
    chushimap(@map_id)
    if @events != nil
      @events.each{|i,e|
      if e.save_pos?
        @mod[@map_id][3][i]= [e.x,e.y,e.pagenum,e.direction]
      else
        @mod[@map_id][3][i]= nil
      end}
    end
  end
  #--------------------------------------------------------------------------
  # ● 读取事件位置    #添加++++++++++
  #--------------------------------------------------------------------------
  def load_event_pos
    chushimap(@map_id)
    mod =@mod[@map_id].clone 
    if mod[3] != nil
      mod[3].each {|id,pos|
      next if @events[id] == nil 
      next if @events[id].pagenum != pos[2]
      case pos[3]
      when 2
        @events[id].turn_down
      when 4
        @events[id].turn_left
      when 6
        @events[id].turn_right
      when 8
        @events[id].turn_up
      end}
    end
    if mod[4] != nil
      mod[4].each {|id,pos|
      next if @events[id] == nil 
      case pos[3]
      when 2
        @events[id].turn_down
      when 4
        @events[id].turn_left
      when 6
        @events[id].turn_right
      when 8
        @events[id].turn_up
      end}
    end
  end
end

#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
#  处理事件的类。条件判断、事件页的切换、并行处理、执行事件功能
# 在 Game_Map 类的内部使用。
#==============================================================================
module RPG
  class Event
    attr_accessor :startpage
    attr_accessor :erased
  end
end


class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_reader   :trigger                  # 目标
  attr_reader   :list                     # 执行内容
  attr_reader   :starting                 # 启动中标志
  attr_accessor :erased
  attr_accessor :pagenum
  attr_accessor :startpage 
  
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     map_id : 地图 ID
  #     event  : 事件 (RPG::Event)
  #--------------------------------------------------------------------------
  def initialize(map_id, event)
    super()
    @map_id = map_id
    @event = event
    @id = @event.id    
    #修改++++++++++
    if event.erased == nil
      @erased = false
    else
      @erased = event.erased
    end
    #修改++++++++++
    @starting = false
    @through = true
    # 初期位置的移动
    moveto(@event.x, @event.y)
    
    #修改
    @pagenum = nil
    if event.startpage == nil
      @startpage = 0 
    else
      @startpage = event.startpage
    end
    #修改
    
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 启动事件    #修改++++++++++
  #--------------------------------------------------------------------------
  def start(num = nil)
    @startpage = num if num != nil
    refresh if num != nil
    # 执行内容不为空的情况下
    if @list != nil and @list.size > 1 
      @starting = true
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新    #修改++++++++++
  #--------------------------------------------------------------------------
  def refresh
    # 初始化本地变量 new_page
    new_page = nil
    # 无法暂时消失的情况下
    unless @erased
      # 从编号大的事件页按顺序调查
      @pagenum = @event.pages.size + 1
      for page in @event.pages.reverse
        
        #修改++++++++++
        @pagenum -= 1
        new_page = page if @startpage == @pagenum 
        break if @startpage == @pagenum 
        next if @startpage != 0
        #修改++++++++++
        
        
        # 可以参考事件条件 c
        c = page.condition
        # 确认开关条件 1 
        if c.switch1_valid
          if $game_switches[c.switch1_id] == false
            next
          end
        end
        # 确认开关条件 2 
        if c.switch2_valid
          if $game_switches[c.switch2_id] == false
            next
          end
        end
        # 确认变量条件
        if c.variable_valid
          if $game_variables[c.variable_id] < c.variable_value
            next
          end
        end
        # 确认独立开关条件
        if c.self_switch_valid
          key = [@map_id, @event.id, c.self_switch_ch]
          if $game_self_switches[key] != true
            next
          end
        end
        # 设置本地变量 new_page
        new_page = page
        # 跳出循环
        break
      end
    end
    # 与上次同一事件页的情况下
    if new_page == @page
      # 过程结束
      return
    end
    # @page 设置为现在的事件页
    @page = new_page
    # 清除启动中标志
    clear_starting
    # 没有满足条件的页面的时候
    if @page == nil
      # 设置各实例变量
      @tile_id = 0
      @character_name = ""
      @character_hue = 0
      @move_type = 0
      @through = true
      @trigger = nil
      @list = nil
      @interpreter = nil
      # 过程结束
      return
    end
    # 设置各实例变量
    @tile_id = @page.graphic.tile_id
    @character_name = @page.graphic.character_name
    @character_hue = @page.graphic.character_hue
    if @original_direction != @page.graphic.direction
      @direction = @page.graphic.direction
      @original_direction = @direction
      @prelock_direction = 0
    end
    if @original_pattern != @page.graphic.pattern
      @pattern = @page.graphic.pattern
      @original_pattern = @pattern
    end
    @opacity = @page.graphic.opacity
    @blend_type = @page.graphic.blend_type
    @move_type = @page.move_type
    @move_speed = @page.move_speed
    @move_frequency = @page.move_frequency
    @move_route = @page.move_route
    @move_route_index = 0
    @move_route_forcing = false
    @walk_anime = @page.walk_anime
    @step_anime = @page.step_anime
    @direction_fix = @page.direction_fix
    @through = @page.through
    @always_on_top = @page.always_on_top
    @trigger = @page.trigger
    @list = @page.list
    @interpreter = nil
    # 目标是 [并行处理] 的情况下
    if @trigger == 4
      # 生成并行处理用解释器
      @interpreter = Interpreter.new
    end
    # 自动事件启动判定
    check_event_trigger_auto
  end

  #--------------------------------------------------------------------------
  # ● 是否储存位置     #修改++++++++++
  #--------------------------------------------------------------------------
  def save_pos?
    return true unless @list
    return true if @list[0].code != 108
    return !@list[0].parameters[0].include?("不保存事件位置") 
  end
end

class Scene_Map
  #--------------------------------------------------------------------------
  # ● 重新描绘地图     #修改++++++++++
  #--------------------------------------------------------------------------
  def refresh_spriteset
    @spriteset.dispose
    @spriteset = Spriteset_Map.new
  end
end 


鸡蛋

鲜花

评论 (0 个评论)

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-20 04:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部