#=============================================================================
#弹出菜单脚本.西瓜版V0.1
#作者:伊吹西瓜(朱鹭子)
#此脚本为学习用原创的脚本,程序如有雷同(不包括效果),纯属巧合。
#转载如果可以的话保留一下该信息吧。
#应援幻想天空:[url]http://www.rpgsky.net/forum.php[/url]
#=============================================================================
 
 
 
#-----------------------------------------------------------------------------
#●弹出菜单窗口
#-----------------------------------------------------------------------------
class Window_Mapcd < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化窗口
  #--------------------------------------------------------------------------
  def initialize
    super(640, 0, 200, 480)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    #self.windowskin = RPG::Cache.windowskin("")
    @dtcd1 = Bitmap.new("Graphics/Pictures/Equip.png")
    rect1 = Rect.new(0,0,80,132)
    self.contents.blt(0, 0, @dtcd1, rect1)
 
    @dtcd2 = Bitmap.new("Graphics/Pictures/magic.png")
    rect2 = Rect.new(0,0,80,132)
    self.contents.blt(0, 120, @dtcd2, rect2)
 
    @dtcd3 = Bitmap.new("Graphics/Pictures/target.png")
    rect3 = Rect.new(0,0,80,132)
    self.contents.blt(0, 240, @dtcd3, rect3)
 
    @dtcd4 = Bitmap.new("Graphics/Pictures/caidan.png")
    rect4 = Rect.new(0,0,80,132)
    self.contents.blt(0, 360, @dtcd4, rect4)
  end
end
 
#-----------------------------------------------------------------------------
#●弹出菜单的鼠标
#-----------------------------------------------------------------------------
class Window_MapSb < Window_Base
  #--------------------------------------------------------------------------
  # ● 初始化窗口
  #--------------------------------------------------------------------------
  def initialize
    super(540, 20, 100,132)
    self.contents = Bitmap.new(width - 32, height - 32)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.windowskin = RPG::Cache.windowskin("")
    @shubiao = Bitmap.new("Graphics/Pictures/shubiao.png")
    shubiao = Rect.new(0,0,200,132)
    self.contents.blt(0, 0, @shubiao, shubiao)
  end
end
 
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  处理地图画面的类。
#==============================================================================
 
class Scene_Map
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    $mune = 0 
    $sbwz = 1  #这个是菜单栏目的数量
    # 生成活动块
    @spriteset = Spriteset_Map.new
    # 生成信息窗口
    @message_window = Window_Message.new
    #生成弹出菜单
    @mapcd_window = Window_Mapcd.new
    @mapcd_window.z = 10001
    #生成弹出鼠标
    @mapsb_window = Window_MapSb.new
    @mapsb_window.visible = false
    @mapsb_window.z = 10004
 
    tempBitmap = Sprite.new
    tempBitmap.bitmap = Bitmap.new(640,480)
    tempBitmap.bitmap.fill_rect(0, 0, 640, 480, Color.new(0,0,0,255))
     # 执行过渡
    Graphics.transition(0)
    for i in 0..10
      tempBitmap.opacity-=25
      Graphics.update
    end
    tempBitmap.bitmap.dispose
    tempBitmap.dispose
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      if $mune == 0 #如果菜单弹出来的话,默认键盘无效,否则可能会发生冲突
        Input.update
      end
 
      Keyboard.update
 
      if $mune == 1  #判定菜单是否弹出来
        if Keyboard.trigger?(Keyboard::VK_ESCAPE)
          Audio.se_play("Audio/SE/005-System05",80,100)
          if $mune == 1
            $mune = 0
          elsif $mune == 0
            $mune = 1
          end
        end
 
        if Keyboard.trigger?(Keyboard::VK_UP)
          Audio.se_play("Audio/SE/005-System05",80,100)
          @mapsb_window.y -= 120
          $sbwz -= 1
          if @mapsb_window.y < 20
            @mapsb_window.y = 380
            $sbwz = 4
          end
        end
 
        if Keyboard.trigger?(Keyboard::VK_DOWN)
          Audio.se_play("Audio/SE/005-System05",80,100)
          @mapsb_window.y += 120
          $sbwz += 1
          if @mapsb_window.y > 380
            @mapsb_window.y = 20
            $sbwz = 1
          end
        end
 
        if Keyboard.trigger?(Keyboard::VK_RETURN)
          Audio.se_play("Audio/SE/005-System05",80,100)
          case $sbwz
          when 1
            $scene = Scene_Equip.new
          when 2
            $scene = Scene_Skill.new
          when 3
            $scene = Scene_Item.new
          when 4
            $scene = Scene_Menu.new
          end
        end
      end
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if Keyboard.trigger?(Keyboard::VK_M)
        Audio.se_play("Audio/SE/005-System05",80,100)
          if $mune == 1
            $mune = 0
          elsif $mune == 0
            $mune = 1
          end
      end
      if $scene != self
        break
      end
 
    end
    # 标题画面切换中的情况下
    if $scene.is_a?(Scene_Title)
      @message_window.dispose
      tempBitmap = Sprite.new
      tempBitmap.bitmap = Bitmap.new(640,480)
      tempBitmap.bitmap.fill_rect(0, 0, 640,480, Color.new(0,0,0,255))
      tempBitmap.opacity = 0
      for i in 0..25
        tempBitmap.opacity +=11
        Graphics.update
      end
      tempBitmap.bitmap.dispose
      tempBitmap.dispose
      Graphics.transition(0)
      @spriteset.dispose
    else
      @message_window.dispose
      @mapcd_window.dispose
      @mapsb_window.dispose
      @spriteset.dispose
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
     if $mune == 1
       if @mapcd_window.x != 440
         @mapcd_window.x -= 10
       end
     end
 
     if $mune == 0
       if @mapcd_window.x != 640
         @mapcd_window.x += 10
       end
     end
 
     if @mapcd_window.x == 440
       @mapsb_window.visible = true
     else
       @mapsb_window.visible = false
       $sbwz = 1  
       @mapsb_window.y = 20
     end
 
    @mapcd_window.update
    # 循环
    loop do
      # 按照地图、实例、主角的顺序刷新
      # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
      #  的机会的重要因素)
      $game_map.update
      $game_system.map_interpreter.update
      $game_player.update
      # 系统 (计时器)、画面刷新
      $game_system.update
      $game_screen.update
      # 如果主角在场所移动中就中断循环
      unless $game_temp.player_transferring
        break
      end
      # 执行场所移动
      transfer_player
      # 处理过渡中的情况下、中断循环
      if $game_temp.transition_processing
        break
      end
    end
    # 刷新活动块
    @spriteset.update
    # 刷新信息窗口
    @message_window.update
    # 刷新弹出窗口
    @mapcd_window.update
    # 刷新鼠标
    @mapsb_window.update
    # 游戏结束的情况下
    if $game_temp.gameover
      # 切换的游戏结束画面
      $scene = Scene_Gameover.new
      return
    end
    # 返回标题画面的情况下
    if $game_temp.to_title
      # 切换到标题画面
      $scene = Scene_Title.new
      return
    end
    # 处理过渡中的情况下
    if $game_temp.transition_processing
      # 清除过渡处理中标志
      $game_temp.transition_processing = false
      # 执行过渡
      Graphics.transition(0)
    end
    # 显示信息窗口中的情况下
    if $game_temp.message_window_showing
      return
    end
    # 遇敌计数为 0 且、且遇敌列表不为空的情况下
    if $game_player.encounter_count == 0 and $game_map.encounter_list != []
      # 不是在事件执行中或者禁止遇敌中
      unless $game_system.map_interpreter.running? or
             $game_system.encounter_disabled
        # 确定队伍
        n = rand($game_map.encounter_list.size)
        troop_id = $game_map.encounter_list[n]
        # 队伍有效的话
        if $data_troops[troop_id] != nil
          # 设置调用战斗标志
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 不是在事件执行中或菜单禁止中
      unless $game_system.map_interpreter.running? or
             $game_system.menu_disabled
        # 设置菜单调用标志以及 SE 演奏
        $game_temp.menu_calling = true
        $game_temp.menu_beep = true
      end
    end
    # 调试模式为 ON 并且按下 F9 键的情况下
    if $DEBUG and Input.press?(Input::F9)
      # 设置调用调试标志
      $game_temp.debug_calling = true
    end
    # 不在主角移动中的情况下
    unless $game_player.moving?
      # 执行各种画面的调用
      if $game_temp.battle_calling
        call_battle
      elsif $game_temp.shop_calling
        call_shop
      elsif $game_temp.name_calling
        call_name
      elsif $game_temp.menu_calling
        call_menu
      elsif $game_temp.save_calling
        call_save
      elsif $game_temp.debug_calling
        call_debug
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 调用战斗
  #--------------------------------------------------------------------------
  def call_battle
    # 清除战斗调用标志
    $game_temp.battle_calling = false
    # 清除菜单调用标志
    $game_temp.menu_calling = false
    $game_temp.menu_beep = false
    # 生成遇敌计数
    $game_player.make_encounter_count
    # 记忆地图 BGM 、停止 BGM
    $game_temp.map_bgm = $game_system.playing_bgm
    $game_system.bgm_stop
    # 演奏战斗开始 SE
    $game_system.se_play($data_system.battle_start_se)
    # 演奏战斗 BGM
    $game_system.bgm_play($game_system.battle_bgm)
    # 矫正主角姿势
    $game_player.straighten
    # 切换到战斗画面
    $scene = Scene_Battle.new
  end
  #--------------------------------------------------------------------------
  # ● 调用商店
  #--------------------------------------------------------------------------
  def call_shop
    # 清除商店调用标志
    $game_temp.shop_calling = false
    # 矫正主角姿势
    $game_player.straighten
    # 切换到商店画面
    $scene = Scene_Shop.new
  end
  #--------------------------------------------------------------------------
  # ● 调用名称输入
  #--------------------------------------------------------------------------
  def call_name
    # 清除商店调用名称输入标志
    $game_temp.name_calling = false
    # 矫正主角姿势
    $game_player.straighten
    # 切换到名称输入画面
    $scene = Scene_Name.new
  end
  #--------------------------------------------------------------------------
  # ● 调用菜单
  #--------------------------------------------------------------------------
  def call_menu
=begin
    # 清除商店调用菜单标志
    $game_temp.menu_calling = false
    # 已经设置了菜单 SE 演奏标志的情况下
    if $game_temp.menu_beep
      # 演奏确定 SE
      $game_system.se_play($data_system.decision_se)
      # 清除菜单演奏 SE 标志
      $game_temp.menu_beep = false
    end
    # 矫正主角姿势
    $game_player.straighten
    # 切换到菜单画面
    $scene = Scene_Menu.new
=end
  end
  #--------------------------------------------------------------------------
  # ● 调用存档
  #--------------------------------------------------------------------------
  def call_save
    # 矫正主角姿势
    $game_player.straighten
    # 切换到存档画面
    $scene = Scene_Save.new
  end
  #--------------------------------------------------------------------------
  # ● 调用调试
  #--------------------------------------------------------------------------
  def call_debug
    # 清除商店调用调试标志
    $game_temp.debug_calling = false
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # 矫正主角姿势
    $game_player.straighten
    # 切换到调试画面
    $scene = Scene_Debug.new
  end
  #--------------------------------------------------------------------------
  # ● 主角的场所移动
  #--------------------------------------------------------------------------
  def transfer_player
    # 清除主角场所移动调试标志
    $game_temp.player_transferring = false
    # 移动目标与现在的地图有差异的情况下
    if $game_map.map_id != $game_temp.player_new_map_id
      # 设置新地图
      $game_map.setup($game_temp.player_new_map_id)
    end
    # 设置主角位置
    $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
    # 设置主角朝向
    case $game_temp.player_new_direction
    when 2  # 下
      $game_player.turn_down
    when 4  # 左
      $game_player.turn_left
    when 6  # 右
      $game_player.turn_right
    when 8  # 上
      $game_player.turn_up
    end
    # 矫正主角姿势
    $game_player.straighten
    # 刷新地图 (执行并行事件)
    $game_map.update
    # 在生成活动块
    @spriteset.dispose
    @spriteset = Spriteset_Map.new
    # 处理过渡中的情况下
    if $game_temp.transition_processing
      # 清除过渡处理中标志
      $game_temp.transition_processing = false
      # 执行过渡
      $_t_Bitmap=Sprite.new
      $_t_Bitmap.bitmap = Bitmap.new(640,480)
      $_t_Bitmap.bitmap.fill_rect(0,0,640,480,Color.new(0,0,0,255))
      Graphics.transition(0)
      for i in 0..10
        $_t_Bitmap.opacity-=26
        Graphics.update
      end
      $_t_Bitmap.bitmap.dispose
      $_t_Bitmap.dispose
    end
    # 执行地图设置的 BGM、BGS 的自动切换
    $game_map.autoplay
    # 设置画面
    Graphics.frame_reset
    # 刷新输入信息
    Input.update
  end
end