设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2546|回复: 9
打印 上一主题 下一主题

[已经过期] 目前有完善的突破分辨率限制的脚本么?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
30 小时
注册时间
2007-2-17
帖子
80
跳转到指定楼层
1
发表于 2010-6-20 19:28:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
记得遥远以前好像有讨论把分辨率突破640*480,找不到了。。。趁6r复活之际问问~

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
2
发表于 2010-6-20 21:45:56 | 只看该作者
  1. # ————————————————————————————————————
  2. # 本脚本来自www.66rpg.com,转载请保留此信息
  3. # ————————————————————————————————————

  4. class Win32API
  5.   GAME_INI_FILE = ".\\Game.ini"
  6.   HWND_TOPMOST = 0
  7.   HWND_TOP = -1
  8.   SWP_NOMOVE   = 0
  9.   SWP_FRAMECHANGED = 0
  10.   HWND_NOTTOPMOST = 0
  11.   WM_GETMINMAXINFO = 24
  12.   #——————————————————————————————————————
  13.   def Win32API.GetPrivateProfileString(section, key)
  14.     val = "\0"*256
  15.     gps = Win32API.new('kernel32', 'GetPrivateProfileString',%w(p p p p l p), 'l')
  16.     gps.call(section, key, "", val, 256, GAME_INI_FILE)
  17.     val.delete!("\0")
  18.     return val
  19.   end
  20.   #——————————————————————————————————————
  21.   def Win32API.FindWindow(class_name, title)
  22.     fw = Win32API.new('user32', 'FindWindow', %(p, p), 'i')
  23.     hWnd = fw.call(class_name, title)
  24.     return hWnd
  25.   end
  26.   #——————————————————————————————————————
  27.   def Win32API.SetWindowPos(w, h)
  28.     title =  Win32API.GetPrivateProfileString("Game", "Title")
  29.     hWnd = Win32API.FindWindow("RGSS Player", title)
  30.     swp = Win32API.new('user32', 'SetWindowPos', %(l, l, i, i, i, i, i), 'i')
  31.     win = swp.call(hWnd, HWND_TOP, 100, 50,  w + 6, h+32, WM_GETMINMAXINFO)
  32.     return win
  33.   end
  34.   #——————————————————————————————————————
  35.   def Win32API.client_size
  36.     title =  Win32API.GetPrivateProfileString("Game", "Title")
  37.     hWnd = Win32API.FindWindow("RGSS Player", title)
  38.     rect = [0, 0, 0, 0].pack('l4')
  39.     Win32API.new('user32', 'GetClientRect', %w(l p), 'i').call(hWnd, rect)
  40.     width, height = rect.unpack('l4')[2..3]
  41.     return width, height
  42.   end
  43. end
  44. $width = 800
  45. $height = 600
  46. win = Win32API.SetWindowPos($width, $height)
  47. if(win == 0)
  48.   p "Size change has failed!"
  49. end
  50. #==============================================================================
  51. # ■ Spriteset_Map
  52. #------------------------------------------------------------------------------
  53. #  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
  54. #==============================================================================
  55. class Spriteset_Map
  56.   #--------------------------------------------------------------------------
  57.   # ● 初始化对像
  58.   #--------------------------------------------------------------------------
  59.   def initialize
  60.     @viewport2 = Viewport.new(0, 0, $width, $height)  #——生成图片
  61.     @viewport3 = Viewport.new(0, 0, $width, $height)  #——生成画面闪烁用的部分
  62.     $viewport4 = Viewport.new(640, 0, $width-640, 480)  #——右侧
  63.     $viewport5 = Viewport.new(0, 480, 640, $height-480) #——下侧
  64.     $viewport6 = Viewport.new(640, 480, $width-640, $height-480) #——右下角
  65.     $viewport1 = Viewport.new(0, 0, 640, 480) #——主窗口
  66.     @viewport_weather = Viewport.new(0, 0, $width, $height) #——生成天气专用
  67.     @viewport2.z = 200  #——生成图片的深度
  68.     @viewport3.z = 5000 #——生成画面闪烁用的深度
  69.     @tilemap = Tilemap.new($viewport1)  #——主窗口
  70.     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  71.     @tilemap2 = Tilemap.new($viewport4) #——右侧
  72.     @tilemap2.tileset = RPG::Cache.tileset($game_map.tileset_name)
  73.     @tilemap3 = Tilemap.new($viewport5) #——下侧
  74.     @tilemap3.tileset = RPG::Cache.tileset($game_map.tileset_name)
  75.     @tilemap4 = Tilemap.new($viewport6) #——右下角
  76.     @tilemap4.tileset = RPG::Cache.tileset($game_map.tileset_name)
  77.     for i in 0..6 #——生成自动元件
  78.       autotile_name = $game_map.autotile_names[i]
  79.       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  80.       @tilemap2.autotiles[i] = RPG::Cache.autotile(autotile_name)
  81.       @tilemap3.autotiles[i] = RPG::Cache.autotile(autotile_name)
  82.       @tilemap4.autotiles[i] = RPG::Cache.autotile(autotile_name)
  83.     end
  84.     @tilemap.map_data = $game_map.data  #——生成地图数据
  85.     @tilemap2.map_data = $game_map.data
  86.     @tilemap3.map_data = $game_map.data
  87.     @tilemap4.map_data = $game_map.data
  88.     @tilemap.priorities = $game_map.priorities  #——生成优先
  89.     @tilemap2.priorities = $game_map.priorities
  90.     @tilemap3.priorities = $game_map.priorities
  91.     @tilemap4.priorities = $game_map.priorities
  92.     @character_sprites = [] #——生成事件
  93.     for i in $game_map.events.keys.sort
  94.       sprite = Sprite_Character.new($viewport1, $game_map.events[i])
  95.       @character_sprites.push(sprite)
  96.       sprite = Sprite_Character.new($viewport4, $game_map.events[i])
  97.       @character_sprites.push(sprite)
  98.       sprite = Sprite_Character.new($viewport5, $game_map.events[i])
  99.       @character_sprites.push(sprite)
  100.       sprite = Sprite_Character.new($viewport6, $game_map.events[i])
  101.       @character_sprites.push(sprite)
  102.     end  #——下面继续生成角色
  103.     @character_sprites.push(Sprite_Character.new($viewport1, $game_player))
  104.     @character_sprites.push(Sprite_Character.new($viewport4, $game_player))
  105.     @character_sprites.push(Sprite_Character.new($viewport5, $game_player))
  106.     @character_sprites.push(Sprite_Character.new($viewport6, $game_player))
  107.     #——下面生成远景
  108.     @panorama = Plane.new($viewport1)
  109.     @panorama.z = -1000
  110.     @panorama2 = Plane.new($viewport4)
  111.     @panorama2.z = -1000
  112.     @panorama3 = Plane.new($viewport5)
  113.     @panorama3.z = -1000
  114.     @panorama4 = Plane.new($viewport6)
  115.     @panorama4.z = -1000
  116.     #——下面生成雾   
  117.     @fog = Plane.new($viewport1)
  118.     @fog.z = 3000
  119.     @fog2 = Plane.new($viewport4)
  120.     @fog2.z = 3000
  121.     @fog3 = Plane.new($viewport5)
  122.     @fog3.z = 3000
  123.     @fog4 = Plane.new($viewport6)
  124.     @fog4.z = 3000
  125.     #——下面生成天气
  126.     @weather = Weather.new(@viewport_weather)
  127.     @picture_sprites = [] #——这里生成图片
  128.     for i in 1..50
  129.       @picture_sprites.push(Sprite_Picture.new(@viewport2, $game_screen.pictures[i]))
  130.     end
  131.     @timer_sprite = Sprite_Timer.new #——生成计时器
  132.     #——刷新
  133.     update
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 释放
  137.   #--------------------------------------------------------------------------
  138.   def dispose
  139.     @tilemap.tileset.dispose    #——释放元件地图
  140.     @tilemap2.tileset.dispose
  141.     @tilemap3.tileset.dispose
  142.     @tilemap4.tileset.dispose
  143.     for i in 0..6
  144.       @tilemap.autotiles[i].dispose
  145.       @tilemap2.autotiles[i].dispose
  146.       @tilemap3.autotiles[i].dispose
  147.       @tilemap4.autotiles[i].dispose
  148.     end
  149.     @tilemap.dispose
  150.     @tilemap2.dispose
  151.     @tilemap3.dispose
  152.     @tilemap4.dispose
  153.     @panorama.dispose    #——释放远景平面
  154.     @panorama2.dispose
  155.     @panorama3.dispose
  156.     @panorama4.dispose
  157.     @fog.dispose    #——释放雾平面
  158.     @fog2.dispose
  159.     @fog3.dispose
  160.     @fog4.dispose
  161.     for sprite in @character_sprites    #——释放角色活动块
  162.       sprite.dispose
  163.     end
  164.     @weather.dispose   
  165.     for sprite in @picture_sprites
  166.       sprite.dispose
  167.     end
  168.     # 释放计时器块
  169.     @timer_sprite.dispose
  170.     # 释放显示端口
  171.     $viewport1.dispose
  172.     @viewport2.dispose
  173.     @viewport3.dispose
  174.     $viewport4.dispose
  175.     $viewport5.dispose
  176.     $viewport6.dispose
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 刷新画面
  180.   #--------------------------------------------------------------------------
  181.   def update
  182.     # 远景与现在的情况有差异发情况下
  183.     if @panorama_name != $game_map.panorama_name or  @panorama_hue != $game_map.panorama_hue
  184.       @panorama_name = $game_map.panorama_name
  185.       @panorama_hue = $game_map.panorama_hue
  186.       if @panorama.bitmap != nil
  187.         @panorama.bitmap.dispose
  188.         @panorama.bitmap = nil
  189.         @panorama2.bitmap.dispose
  190.         @panorama2.bitmap = nil
  191.         @panorama3.bitmap.dispose
  192.         @panorama3.bitmap = nil
  193.         @panorama4.bitmap.dispose
  194.         @panorama4.bitmap = nil
  195.       end
  196.       if @panorama_name != ""
  197.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  198.         @panorama2.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  199.         @panorama3.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  200.         @panorama4.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  201.       end
  202.       Graphics.frame_reset
  203.     end
  204.     # 雾与现在的情况有差异的情况下
  205.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  206.       @fog_name = $game_map.fog_name
  207.       @fog_hue = $game_map.fog_hue
  208.     if @fog.bitmap != nil
  209.       @fog.bitmap.dispose
  210.       @fog.bitmap = nil
  211.       @fog2.bitmap.dispose
  212.       @fog2.bitmap = nil
  213.       @fog3.bitmap.dispose
  214.       @fog3.bitmap = nil
  215.       @fog4.bitmap.dispose
  216.       @fog4.bitmap = nil
  217.     end
  218.     if @fog_name != ""
  219.       @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  220.       @fog2.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  221.       @fog3.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  222.       @fog4.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  223.     end
  224.       Graphics.frame_reset
  225.     end
  226.     # 刷新元件地图
  227.     @tilemap.ox = $game_map.display_x / 4
  228.     @tilemap.oy = $game_map.display_y / 4
  229.     @tilemap.update
  230.     @tilemap2.ox = @tilemap.ox
  231.     @tilemap2.oy = @tilemap.oy
  232.     @tilemap2.update
  233.     @tilemap3.ox = @tilemap.ox
  234.     @tilemap3.oy = @tilemap.oy + 480
  235.     @tilemap3.update
  236.     @tilemap4.ox = @tilemap.ox
  237.     @tilemap4.oy = @tilemap.oy + 480
  238.     @tilemap4.update
  239.     # 刷新远景平面
  240.     @panorama.ox = $game_map.display_x / 8
  241.     @panorama.oy = $game_map.display_y / 8
  242.     @panorama2.ox = @panorama.ox
  243.     @panorama2.oy = @panorama.oy
  244.     @panorama3.ox = @panorama.ox
  245.     @panorama3.oy = @panorama.oy + 480
  246.     @panorama4.ox = @panorama.ox
  247.     @panorama4.oy = @panorama.oy + 480
  248.     # 刷新雾平面
  249.     @[email protected][email protected][email protected]_x = $game_map.fog_zoom / 100.0
  250.     @[email protected][email protected][email protected]_y = $game_map.fog_zoom / 100.0
  251.     @[email protected][email protected][email protected] = $game_map.fog_opacity
  252.     @[email protected][email protected][email protected]_type = $game_map.fog_blend_type
  253.     @fog4.tone = @fog3.tone = @fog2.tone = @fog.tone = $game_map.fog_tone
  254.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  255.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  256.     @fog2.ox = @fog.ox #+ 140#*@fog.zoom_x
  257.     @fog2.oy = @fog.oy
  258.     @fog3.ox = @fog.ox
  259.     @fog3.oy = @fog.oy + 480
  260.     @fog4.ox = @fog.ox
  261.     @fog4.oy = @fog.oy + 480
  262.     # 刷新角色活动块
  263.     for sprite in @character_sprites
  264.       sprite.update
  265.     end
  266.     # 刷新天候图形
  267.     @weather.type = $game_screen.weather_type
  268.     @weather.max = $game_screen.weather_max
  269.     @weather.ox = $game_map.display_x / 4
  270.     @weather.oy = $game_map.display_y / 4
  271.     @weather.update  
  272.     # 刷新图片
  273.     for sprite in @picture_sprites
  274.       sprite.update
  275.     end
  276.     # 刷新计时器块
  277.     @timer_sprite.update
  278.     # 设置画面的色调与震动位置
  279.     $viewport1.tone = $game_screen.tone
  280.     $viewport1.ox = $game_screen.shake
  281.     $viewport4.tone = $game_screen.tone
  282.     $viewport4.ox = $game_screen.shake+640
  283.     $viewport5.tone = $game_screen.tone
  284.     $viewport5.ox = $game_screen.shake  
  285.     $viewport6.tone = $game_screen.tone
  286.     $viewport6.ox = $game_screen.shake+640
  287.     # 设置画面的闪烁色
  288.     @viewport3.color = $game_screen.flash_color
  289.     # 刷新显示端口
  290.     $viewport1.update
  291.     @viewport3.update
  292.     $viewport4.update
  293.     $viewport5.update
  294.     $viewport6.update
  295.   end
  296. end
  297.   class Weather
  298.     def initialize(viewport = nil)
  299.       @type = 0
  300.       @max = 0
  301.       @ox = 0
  302.       @oy = 0
  303.       color1 = Color.new(255, 255, 255, 255)
  304.       color2 = Color.new(255, 255, 255, 128)
  305.       @rain_bitmap = Bitmap.new(7, 56)
  306.       for i in 0..6
  307.         @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
  308.       end
  309.       @storm_bitmap = Bitmap.new(34, 64)
  310.       for i in 0..31
  311.         @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
  312.         @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
  313.         @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
  314.       end
  315.       @snow_bitmap = Bitmap.new(6, 6)
  316.       @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
  317.       @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
  318.       @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
  319.       @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
  320.       @sprites = []
  321.       for i in 1..40
  322.         sprite = Sprite.new(viewport)
  323.         sprite.z = 1000
  324.         sprite.visible = false
  325.         sprite.opacity = 0
  326.         @sprites.push(sprite)
  327.       end
  328.     end
  329.     def dispose
  330.       for sprite in @sprites
  331.         sprite.dispose
  332.       end
  333.       @rain_bitmap.dispose
  334.       @storm_bitmap.dispose
  335.       @snow_bitmap.dispose
  336.     end
  337.     def type=(type)
  338.       return if @type == type
  339.       @type = type
  340.       case @type
  341.       when 1
  342.         bitmap = @rain_bitmap
  343.       when 2
  344.         bitmap = @storm_bitmap
  345.       when 3
  346.         bitmap = @snow_bitmap
  347.       else
  348.         bitmap = nil
  349.       end
  350.       for i in 1..40
  351.         sprite = @sprites[i]
  352.         if sprite != nil
  353.           sprite.visible = (i <= @max)
  354.           sprite.bitmap = bitmap
  355.         end
  356.       end
  357.     end
  358.     def ox=(ox)
  359.       return if @ox == ox;
  360.       @ox = ox
  361.       for sprite in @sprites
  362.         sprite.ox = @ox
  363.       end
  364.     end
  365.     def oy=(oy)
  366.       return if @oy == oy;
  367.       @oy = oy
  368.       for sprite in @sprites
  369.         sprite.oy = @oy
  370.       end
  371.     end
  372.     def max=(max)
  373.       return if @max == max;
  374.       @max = [[max, 0].max, 40].min
  375.       for i in 1..40
  376.         sprite = @sprites[i]
  377.         if sprite != nil
  378.           sprite.visible = (i <= @max)
  379.         end
  380.       end
  381.     end
  382.     def update
  383.       return if @type == 0
  384.       for i in 1..@max
  385.         sprite = @sprites[i]
  386.         if sprite == nil
  387.           break
  388.         end
  389.         if @type == 1
  390.           sprite.x -= 2
  391.           sprite.y += 16
  392.           sprite.opacity -= 8
  393.         end
  394.         if @type == 2
  395.           sprite.x -= 8
  396.           sprite.y += 16
  397.           sprite.opacity -= 12
  398.         end
  399.         if @type == 3
  400.           sprite.x -= 2
  401.           sprite.y += 8
  402.           sprite.opacity -= 8
  403.         end
  404.         x = sprite.x - @ox
  405.         y = sprite.y - @oy
  406.         if sprite.opacity < 64 or x < -50 or x > $width+150 or y < -300 or y > $height+100
  407.           sprite.x = rand($width+150) - 50 + @ox
  408.           sprite.y = rand($height+100) - 200 + @oy
  409.           sprite.opacity = 255
  410.         end
  411.       end
  412.     end
  413.     attr_reader :type
  414.     attr_reader :max
  415.     attr_reader :ox
  416.     attr_reader :oy
  417.   end
  418. #==============================================================================
  419. # ■ Game_Player
  420. #------------------------------------------------------------------------------
  421. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  422. # 本类的实例请参考 $game_player。
  423. #==============================================================================

  424. class Game_Player < Game_Character
  425.   #--------------------------------------------------------------------------
  426.   # ● 恒量
  427.   #--------------------------------------------------------------------------
  428.   CENTER_X = ($width/2 - 16) * 4   
  429.   CENTER_Y = ($height/2 - 16) * 4   
  430.   #--------------------------------------------------------------------------
  431.   # ● 可以通行判定
  432.   #     x : X 坐标
  433.   #     y : Y 坐标
  434.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  435.   #--------------------------------------------------------------------------
  436.   def passable?(x, y, d)
  437.     # 求得新的坐标
  438.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  439.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  440.     # 坐标在地图外的情况下
  441.     unless $game_map.valid?(new_x, new_y)
  442.       # 不能通行
  443.       return false
  444.     end
  445.     # 调试模式为 ON 并且 按下 CTRL 键的情况下
  446.     if $DEBUG and Input.press?(Input::CTRL)
  447.       # 可以通行
  448.       return true
  449.     end
  450.     super
  451.   end
  452.   #--------------------------------------------------------------------------
  453.   # ● 像通到画面中央一样的设置地图的显示位置
  454.   #--------------------------------------------------------------------------
  455.   def center(x, y)
  456.     max_x = ($game_map.width - 20) * 128
  457.     max_y = ($game_map.height - 15) * 128
  458.     $game_map.display_x = [0, [x * 128 - CENTER_X, max_x].min].max
  459.     $game_map.display_y = [0, [y * 128 - CENTER_Y, max_y].min].max
  460.     $game_map.scroll_down(0)
  461.     $game_map.scroll_right(0)
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ● 向指定的位置移动
  465.   #     x : X 座標
  466.   #     y : Y 座標
  467.   #--------------------------------------------------------------------------
  468.   def moveto(x, y)
  469.     super
  470.     # 自连接
  471.     center(x, y)
  472.     # 生成遇敌计数
  473.     make_encounter_count
  474.   end
  475.   #--------------------------------------------------------------------------
  476.   # ● 增加步数
  477.   #--------------------------------------------------------------------------
  478.   def increase_steps
  479.     super
  480.     # 不是强制移动路线的场合
  481.     unless @move_route_forcing
  482.       # 增加步数
  483.       $game_party.increase_steps
  484.       # 步数是偶数的情况下
  485.       if $game_party.steps % 2 == 0
  486.         # 检查连续伤害
  487.         $game_party.check_map_slip_damage
  488.       end
  489.     end
  490.   end
  491.   #--------------------------------------------------------------------------
  492.   # ● 获取遇敌计数
  493.   #--------------------------------------------------------------------------
  494.   def encounter_count
  495.     return @encounter_count
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 生成遇敌计数
  499.   #--------------------------------------------------------------------------
  500.   def make_encounter_count
  501.     # 两种颜色震动的图像
  502.     if $game_map.map_id != 0
  503.       n = $game_map.encounter_step
  504.       @encounter_count = rand(n) + rand(n) + 1
  505.     end
  506.   end
  507.   #--------------------------------------------------------------------------
  508.   # ● 刷新
  509.   #--------------------------------------------------------------------------
  510.   def refresh
  511.     # 同伴人数为 0 的情况下
  512.     if $game_party.actors.size == 0
  513.       # 清除角色的文件名及对像
  514.       @character_name = ""
  515.       @character_hue = 0
  516.       # 分支结束
  517.       return
  518.     end
  519.     # 获取带头的角色
  520.     actor = $game_party.actors[0]
  521.     # 设置角色的文件名及对像
  522.     @character_name = actor.character_name
  523.     @character_hue = actor.character_hue
  524.     # 初始化不透明度和合成方式子
  525.     @opacity = 255
  526.     @blend_type = 0
  527.   end
  528.   #--------------------------------------------------------------------------
  529.   # ● 同位置的事件启动判定
  530.   #--------------------------------------------------------------------------
  531.   def check_event_trigger_here(triggers)
  532.     result = false
  533.     # 事件执行中的情况下
  534.     if $game_system.map_interpreter.running?
  535.       return result
  536.     end
  537.     # 全部事件的循环
  538.     for event in $game_map.events.values
  539.       # 事件坐标与目标一致的情况下
  540.       if event.x == @x and event.y == @y and triggers.include?(event.trigger)
  541.         # 跳跃中以外的情况下、启动判定是同位置的事件
  542.         if not event.jumping? and event.over_trigger?
  543.           event.start
  544.           result = true
  545.         end
  546.       end
  547.     end
  548.     return result
  549.   end
  550.   #--------------------------------------------------------------------------
  551.   # ● 正面事件的启动判定
  552.   #--------------------------------------------------------------------------
  553.   def check_event_trigger_there(triggers)
  554.     result = false
  555.     # 事件执行中的情况下
  556.     if $game_system.map_interpreter.running?
  557.       return result
  558.     end
  559.     # 计算正面坐标
  560.     new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  561.     new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  562.     # 全部事件的循环
  563.     for event in $game_map.events.values
  564.       # 事件坐标与目标一致的情况下
  565.       if event.x == new_x and event.y == new_y and
  566.          triggers.include?(event.trigger)
  567.         # 跳跃中以外的情况下、启动判定是正面的事件
  568.         if not event.jumping? and not event.over_trigger?
  569.           event.start
  570.           result = true
  571.         end
  572.       end
  573.     end
  574.     # 找不到符合条件的事件的情况下
  575.     if result == false
  576.       # 正面的元件是计数器的情况下
  577.       if $game_map.counter?(new_x, new_y)
  578.         # 计算 1 元件里侧的坐标
  579.         new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  580.         new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  581.         # 全事件的循环
  582.         for event in $game_map.events.values
  583.           # 事件坐标与目标一致的情况下
  584.           if event.x == new_x and event.y == new_y and
  585.              triggers.include?(event.trigger)
  586.             # 跳跃中以外的情况下、启动判定是正面的事件
  587.             if not event.jumping? and not event.over_trigger?
  588.               event.start
  589.               result = true
  590.             end
  591.           end
  592.         end
  593.       end
  594.     end
  595.     return result
  596.   end
  597.   #--------------------------------------------------------------------------
  598.   # ● 接触事件启动判定
  599.   #--------------------------------------------------------------------------
  600.   def check_event_trigger_touch(x, y)
  601.     result = false
  602.     # 事件执行中的情况下
  603.     if $game_system.map_interpreter.running?
  604.       return result
  605.     end
  606.     # 全事件的循环
  607.     for event in $game_map.events.values
  608.       # 事件坐标与目标一致的情况下
  609.       if event.x == x and event.y == y and [1,2].include?(event.trigger)
  610.         # 跳跃中以外的情况下、启动判定是正面的事件
  611.         if not event.jumping? and not event.over_trigger?
  612.           event.start
  613.           result = true
  614.         end
  615.       end
  616.     end
  617.     return result
  618.   end
  619.   #--------------------------------------------------------------------------
  620.   # ● 画面更新
  621.   #--------------------------------------------------------------------------
  622.   def update
  623.     # 本地变量记录移动信息
  624.     last_moving = moving?
  625.     # 移动中、事件执行中、强制移动路线中、
  626.     # 信息窗口一个也不显示的时候
  627.     unless moving? or $game_system.map_interpreter.running? or
  628.            @move_route_forcing or $game_temp.message_window_showing
  629.       # 如果方向键被按下、主角就朝那个方向移动
  630.       case Input.dir4
  631.       when 2
  632.         move_down
  633.       when 4
  634.         move_left
  635.       when 6
  636.         move_right
  637.       when 8
  638.         move_up
  639.       end
  640.     end
  641.     # 本地变量记忆坐标
  642.     last_real_x = @real_x
  643.     last_real_y = @real_y
  644.     super
  645.     # 角色向下移动、画面上的位置在中央下方的情况下
  646.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  647.       # 画面向下卷动
  648.       $game_map.scroll_down(@real_y - last_real_y)
  649.     end
  650.     # 角色向左移动、画面上的位置在中央左方的情况下
  651.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  652.       # 画面向左卷动
  653.       $game_map.scroll_left(last_real_x - @real_x)
  654.     end
  655.     # 角色向右移动、画面上的位置在中央右方的情况下
  656.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  657.       # 画面向右卷动
  658.       $game_map.scroll_right(@real_x - last_real_x)
  659.     end
  660.     # 角色向上移动、画面上的位置在中央上方的情况下
  661.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  662.       # 画面向上卷动
  663.       $game_map.scroll_up(last_real_y - @real_y)
  664.     end
  665.     # 不在移动中的情况下
  666.     unless moving?
  667.       # 上次主角移动中的情况
  668.       if last_moving
  669.         # 与同位置的事件接触就判定为事件启动
  670.         result = check_event_trigger_here([1,2])
  671.         # 没有可以启动的事件的情况下
  672.         if result == false
  673.           # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  674.           unless $DEBUG and Input.press?(Input::CTRL)
  675.             # 遇敌计数下降
  676.             if @encounter_count > 0
  677.               @encounter_count -= 1
  678.             end
  679.           end
  680.         end
  681.       end
  682.       # 按下 C 键的情况下
  683.       if Input.trigger?(Input::C)
  684.         # 判定为同位置以及正面的事件启动
  685.         check_event_trigger_here([0])
  686.         check_event_trigger_there([0,1,2])
  687.       end
  688.     end
  689.   end
  690. end
  691. #==============================================================================
  692. # ■ Scene_Gameover
  693. #------------------------------------------------------------------------------
  694. #  处理游戏结束画面的类。
  695. #==============================================================================

  696. class Scene_Gameover
  697.   #--------------------------------------------------------------------------
  698.   # ● 主处理
  699.   #--------------------------------------------------------------------------
  700.   def main
  701.     # 生成游戏结束图形
  702.     if $game_temp.in_battle
  703.       @temp_sprite = Spriteset_Battle.new
  704.     else
  705.       @temp_sprite = Spriteset_Map.new
  706.     end
  707.     @sprite = Sprite.new
  708.     @sprite.bitmap = RPG::Cache.gameover($data_system.gameover_name)
  709.     @sprite.opacity = 0
  710.     # 停止 BGM、BGS
  711.     $game_system.bgm_play(nil)
  712.     $game_system.bgs_play(nil)
  713.     # 演奏游戏结束 ME
  714.     $game_system.me_play($data_system.gameover_me)
  715.     # 执行过渡
  716.     Graphics.transition(0)
  717.     # 主循环
  718.     for i in 0..120
  719.       @sprite.opacity +=4
  720.       Graphics.update
  721.     end
  722.     @temp_sprite.dispose
  723.     loop do
  724.       # 刷新游戏画面
  725.       Graphics.update
  726.       # 刷新输入信息
  727.       Input.update
  728.       # 刷新画面情报
  729.       update
  730.       # 如果画面被切换的话就中断循环
  731.       if $scene != self
  732.         break
  733.       end
  734.     end
  735.     # 释放游戏结束图形
  736.     @sprite.bitmap.dispose
  737.     @sprite.dispose
  738.     # 执行过度
  739.     Graphics.transition(0)
  740.     # 准备过渡
  741.     if $BTEST
  742.       $scene = nil
  743.     end
  744.   end
  745.   #--------------------------------------------------------------------------
  746.   # ● 刷新画面
  747.   #--------------------------------------------------------------------------
  748.   def update
  749.     # 按下 C 键的情况下
  750.     if Input.trigger?(Input::C)
  751.       for i in 0..30
  752.         @sprite.opacity -=10
  753.         Graphics.update
  754.       end      
  755.       # 切换到标题画面
  756.       $scene = Scene_Title.new
  757.     end
  758.   end
  759. end
  760. #==============================================================================
  761. # ■ Scene_Title
  762. #------------------------------------------------------------------------------
  763. #  处理标题画面的类。
  764. #==============================================================================

  765. class Scene_Title
  766.   #--------------------------------------------------------------------------
  767.   # ● 住处理
  768.   #--------------------------------------------------------------------------
  769.   def main
  770.     # 战斗测试的情况下
  771.     if $BTEST
  772.       battle_test
  773.       return
  774.     end
  775.     # 载入数据库
  776.     $data_actors        = load_data("Data/Actors.rxdata")
  777.     $data_classes       = load_data("Data/Classes.rxdata")
  778.     $data_skills        = load_data("Data/Skills.rxdata")
  779.     $data_items         = load_data("Data/Items.rxdata")
  780.     $data_weapons       = load_data("Data/Weapons.rxdata")
  781.     $data_armors        = load_data("Data/Armors.rxdata")
  782.     $data_enemies       = load_data("Data/Enemies.rxdata")
  783.     $data_troops        = load_data("Data/Troops.rxdata")
  784.     $data_states        = load_data("Data/States.rxdata")
  785.     $data_animations    = load_data("Data/Animations.rxdata")
  786.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  787.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  788.     $data_system        = load_data("Data/System.rxdata")
  789.     # 生成系统对像
  790.     $game_system = Game_System.new
  791.     # 生成标题图形
  792.     @sprite = Sprite.new
  793.     @sprite.bitmap = RPG::Cache.title($data_system.title_name)
  794.     @sprite.opacity = 0
  795.     # 生成命令窗口
  796.     s1 = "新游戏"
  797.     s2 = "继续"
  798.     s3 = "退出"
  799.     @command_window = Window_Command.new(192, [s1, s2, s3])
  800.     @command_window.back_opacity = 160
  801.     @command_window.x = $width /2 - @command_window.width / 2
  802.     @command_window.y = $height  /2 +132
  803.     # 判定继续的有效性
  804.     # 存档文件一个也不存在的时候也调查
  805.     # 有効为 @continue_enabled 为 true、無効为 false
  806.     @continue_enabled = false
  807.     for i in 0..3
  808.       if FileTest.exist?("Save#{i+1}.rxdata")
  809.         @continue_enabled = true
  810.       end
  811.     end
  812.     # 继续为有效的情况下、光标停止在继续上
  813.     # 无效的情况下、继续的文字显示为灰色
  814.     if @continue_enabled
  815.       @command_window.index = 1
  816.     else
  817.       @command_window.disable_item(1)
  818.     end
  819.     # 演奏标题 BGM
  820.     $game_system.bgm_play($data_system.title_bgm)
  821.     # 停止演奏 ME、BGS
  822.     Audio.me_stop
  823.     Audio.bgs_stop
  824.     # 执行过渡
  825.     Graphics.transition(0)
  826.     # 主循环
  827.     loop do
  828.       # 刷新游戏画面
  829.       Graphics.update
  830.       # 刷新输入信息
  831.       Input.update
  832.       # 刷新画面
  833.       update
  834.       # 如果画面被切换就中断循环
  835.       if $scene != self
  836.         break
  837.       end
  838.     end
  839.     # 装备过渡
  840.     Graphics.freeze
  841.     # 释放命令窗口
  842.     @command_window.dispose
  843.     # 释放标题图形
  844.     @sprite.bitmap.dispose
  845.     @sprite.dispose
  846.   end
  847.   #--------------------------------------------------------------------------
  848.   # ● 刷新画面
  849.   #--------------------------------------------------------------------------
  850.   def update
  851.     if @sprite.opacity < 255
  852.       @sprite.opacity += 15
  853.     end   
  854.     # 刷新命令窗口
  855.     @command_window.update
  856.     # 按下 C 键的情况下
  857.     if Input.trigger?(Input::C)
  858.       # 命令窗口的光标位置的分支
  859.       case @command_window.index
  860.       when 0  # 新游戏
  861.         command_new_game
  862.       when 1  # 继续
  863.         command_continue
  864.       when 2  # 退出
  865.         command_shutdown
  866.       end
  867.     end
  868.   end
  869.   #--------------------------------------------------------------------------
  870.   # ● 命令 : 新游戏
  871.   #--------------------------------------------------------------------------
  872.   def command_new_game
  873.     # 演奏确定 SE
  874.     $game_system.se_play($data_system.decision_se)
  875.     # 停止 BGM
  876.     Audio.bgm_stop
  877.     # 重置测量游戏时间用的画面计数器
  878.     Graphics.frame_count = 0
  879.     # 生成各种游戏对像
  880.     $game_temp          = Game_Temp.new
  881.     $game_system        = Game_System.new
  882.     $game_switches      = Game_Switches.new
  883.     $game_variables     = Game_Variables.new
  884.     $game_self_switches = Game_SelfSwitches.new
  885.     $game_screen        = Game_Screen.new
  886.     $game_actors        = Game_Actors.new
  887.     $game_party         = Game_Party.new
  888.     $game_troop         = Game_Troop.new
  889.     $game_map           = Game_Map.new
  890.     $game_player        = Game_Player.new
  891.     # 设置初期同伴位置
  892.     $game_party.setup_starting_members
  893.     # 设置初期位置的地图
  894.     $game_map.setup($data_system.start_map_id)
  895.     # 主角向初期位置移动
  896.     $game_player.moveto($data_system.start_x, $data_system.start_y)
  897.     # 刷新主角
  898.     $game_player.refresh
  899.     # 执行地图设置的 BGM 与 BGS 的自动切换
  900.     $game_map.autoplay
  901.     # 刷新地图 (执行并行事件)
  902.     $game_map.update
  903.     # 切换地图画面
  904.     $scene = Scene_Map.new
  905.   end
  906.   #--------------------------------------------------------------------------
  907.   # ● 命令 : 继续
  908.   #--------------------------------------------------------------------------
  909.   def command_continue
  910.     # 继续无效的情况下
  911.     unless @continue_enabled
  912.       # 演奏无效 SE
  913.       $game_system.se_play($data_system.buzzer_se)
  914.       return
  915.     end
  916.     # 演奏确定 SE
  917.     $game_system.se_play($data_system.decision_se)
  918.     # 切换到读档画面
  919.     $scene = Scene_Load.new
  920.   end
  921.   #--------------------------------------------------------------------------
  922.   # ● 命令 : 退出
  923.   #--------------------------------------------------------------------------
  924.   def command_shutdown
  925.     # 演奏确定 SE
  926.     $game_system.se_play($data_system.decision_se)
  927.     # BGM、BGS、ME 的淡入淡出
  928.     Audio.bgm_fade(800)
  929.     Audio.bgs_fade(800)
  930.     Audio.me_fade(800)
  931.     # 退出
  932.     tempBitmap = Sprite.new
  933.     tempBitmap.bitmap = Bitmap.new($width,$height)
  934.     tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  935.     tempBitmap.opacity = 0
  936.     for i in 0..20
  937.       tempBitmap.opacity+=14
  938.       Graphics.update
  939.     end
  940.     $scene = nil
  941.   end
  942.   #--------------------------------------------------------------------------
  943.   # ● 战斗测试
  944.   #--------------------------------------------------------------------------
  945.   def battle_test
  946.     # 载入数据库 (战斗测试用)
  947.     $data_actors        = load_data("Data/BT_Actors.rxdata")
  948.     $data_classes       = load_data("Data/BT_Classes.rxdata")
  949.     $data_skills        = load_data("Data/BT_Skills.rxdata")
  950.     $data_items         = load_data("Data/BT_Items.rxdata")
  951.     $data_weapons       = load_data("Data/BT_Weapons.rxdata")
  952.     $data_armors        = load_data("Data/BT_Armors.rxdata")
  953.     $data_enemies       = load_data("Data/BT_Enemies.rxdata")
  954.     $data_troops        = load_data("Data/BT_Troops.rxdata")
  955.     $data_states        = load_data("Data/BT_States.rxdata")
  956.     $data_animations    = load_data("Data/BT_Animations.rxdata")
  957.     $data_tilesets      = load_data("Data/BT_Tilesets.rxdata")
  958.     $data_common_events = load_data("Data/BT_CommonEvents.rxdata")
  959.     $data_system        = load_data("Data/BT_System.rxdata")
  960.     # 重置测量游戏时间用的画面计数器
  961.     Graphics.frame_count = 0
  962.     # 生成各种游戏对像
  963.     $game_temp          = Game_Temp.new
  964.     $game_system        = Game_System.new
  965.     $game_switches      = Game_Switches.new
  966.     $game_variables     = Game_Variables.new
  967.     $game_self_switches = Game_SelfSwitches.new
  968.     $game_screen        = Game_Screen.new
  969.     $game_actors        = Game_Actors.new
  970.     $game_party         = Game_Party.new
  971.     $game_troop         = Game_Troop.new
  972.     $game_map           = Game_Map.new
  973.     $game_player        = Game_Player.new
  974.     # 设置战斗测试用同伴
  975.     $game_party.setup_battle_test_members
  976.     # 设置队伍 ID、可以逃走标志、战斗背景
  977.     $game_temp.battle_troop_id = $data_system.test_troop_id
  978.     $game_temp.battle_can_escape = true
  979.     $game_map.battleback_name = $data_system.battleback_name
  980.     # 演奏战斗开始 BGM
  981.     $game_system.se_play($data_system.battle_start_se)
  982.     # 演奏战斗 BGM
  983.     $game_system.bgm_play($game_system.battle_bgm)
  984.     # 切换到战斗画面
  985.     $scene = Scene_Battle.new
  986.   end
  987. end
  988. #==============================================================================
  989. # ■ Scene_Map
  990. #------------------------------------------------------------------------------
  991. #  处理地图画面的类。
  992. #==============================================================================

  993. class Scene_Map
  994.   #--------------------------------------------------------------------------
  995.   # ● 主处理
  996.   #--------------------------------------------------------------------------
  997.   def main
  998.    
  999.    
  1000.     # @@@@@@@@@@@@@@@@@@
  1001.     @window_hp = Window_ARPGStatus.new(@actor)
  1002.    # @@@@@@@@@@@@@@@@@@@@
  1003.    
  1004.    
  1005.     # 生成活动块
  1006.     @spriteset = Spriteset_Map.new
  1007.     # 生成信息窗口
  1008.     @message_window = Window_Message.new
  1009.     tempBitmap = Sprite.new
  1010.     tempBitmap.bitmap = Bitmap.new($width,$height)
  1011.     tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  1012.      # 执行过渡
  1013.     Graphics.transition(0)
  1014.     for i in 0..10
  1015.       tempBitmap.opacity-=25
  1016.       Graphics.update
  1017.     end
  1018.     tempBitmap.bitmap.dispose
  1019.     tempBitmap.dispose
  1020.     # 主循环
  1021.     loop do
  1022.       # 刷新游戏画面
  1023.       Graphics.update
  1024.       # 刷新输入信息
  1025.       Input.update
  1026.       # 刷新画面
  1027.       update
  1028.       # 如果画面切换的话就中断循环
  1029.       if $scene != self
  1030.         break
  1031.       end
  1032.     end
  1033.     # 标题画面切换中的情况下
  1034.     if $scene.is_a?(Scene_Title)
  1035.       @message_window.dispose
  1036.       tempBitmap = Sprite.new
  1037.       tempBitmap.bitmap = Bitmap.new($width,$height)
  1038.       tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  1039.       tempBitmap.opacity = 0
  1040.       for i in 0..25
  1041.         tempBitmap.opacity +=11
  1042.         Graphics.update
  1043.       end
  1044.       tempBitmap.bitmap.dispose
  1045.       tempBitmap.dispose
  1046.       Graphics.transition(0)
  1047.       @spriteset.dispose
  1048.     else
  1049.       @message_window.dispose
  1050.       #@@@@@@@@@@@@@@@@@@@@@@@@
  1051.     @window_hp.dispose
  1052.     # @@@@@@@@@@@@@@@@@@@@@@@
  1053.       @spriteset.dispose
  1054.     end
  1055.   end
  1056.   #--------------------------------------------------------------------------
  1057.   # ● 刷新画面
  1058.   #--------------------------------------------------------------------------
  1059.   def update
  1060.      #@@@@@@@@@@@@@@@@@@@@@@@@
  1061.     @window_hp.update
  1062.      #@@@@@@@@@@@@@@@@@@@@@@@@
  1063.     # 循环
  1064.     loop do
  1065.       # 按照地图、实例、主角的顺序刷新
  1066.       # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
  1067.       #  的机会的重要因素)
  1068.       $game_map.update
  1069.       $game_system.map_interpreter.update
  1070.       $game_player.update
  1071.       # 系统 (计时器)、画面刷新
  1072.       $game_system.update
  1073.       $game_screen.update
  1074.       # 如果主角在场所移动中就中断循环
  1075.       unless $game_temp.player_transferring
  1076.         break
  1077.       end
  1078.       # 执行场所移动
  1079.       transfer_player
  1080.       # 处理过渡中的情况下、中断循环
  1081.       if $game_temp.transition_processing
  1082.         break
  1083.       end
  1084.     end
  1085.     # 刷新活动块
  1086.     @spriteset.update
  1087.     # 刷新信息窗口
  1088.     @message_window.update
  1089.     # 游戏结束的情况下
  1090.     if $game_temp.gameover
  1091.       # 切换的游戏结束画面
  1092.       $scene = Scene_Gameover.new
  1093.       return
  1094.     end
  1095.     # 返回标题画面的情况下
  1096.     if $game_temp.to_title
  1097.       # 切换到标题画面
  1098.       $scene = Scene_Title.new
  1099.       return
  1100.     end
  1101.     # 处理过渡中的情况下
  1102.     if $game_temp.transition_processing
  1103.       # 清除过渡处理中标志
  1104.       $game_temp.transition_processing = false
  1105.       # 执行过渡
  1106.       Graphics.transition(0)
  1107.     end
  1108.     # 显示信息窗口中的情况下
  1109.     if $game_temp.message_window_showing
  1110.       return
  1111.     end
  1112.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
  1113.     if $game_player.encounter_count == 0 and $game_map.encounter_list != []
  1114.       # 不是在事件执行中或者禁止遇敌中
  1115.       unless $game_system.map_interpreter.running? or
  1116.              $game_system.encounter_disabled
  1117.         # 确定队伍
  1118.         n = rand($game_map.encounter_list.size)
  1119.         troop_id = $game_map.encounter_list[n]
  1120.         # 队伍有效的话
  1121.         if $data_troops[troop_id] != nil
  1122.           # 设置调用战斗标志
  1123.           $game_temp.battle_calling = true
  1124.           $game_temp.battle_troop_id = troop_id
  1125.           $game_temp.battle_can_escape = true
  1126.           $game_temp.battle_can_lose = false
  1127.           $game_temp.battle_proc = nil
  1128.         end
  1129.       end
  1130.     end
  1131.     # 按下 B 键的情况下
  1132.     if Input.trigger?(Input::B)
  1133.       # 不是在事件执行中或菜单禁止中
  1134.       unless $game_system.map_interpreter.running? or
  1135.              $game_system.menu_disabled
  1136.         # 设置菜单调用标志以及 SE 演奏
  1137.         $game_temp.menu_calling = true
  1138.         $game_temp.menu_beep = true
  1139.       end
  1140.     end
  1141.     # 调试模式为 ON 并且按下 F9 键的情况下
  1142.     if $DEBUG and Input.press?(Input::F9)
  1143.       # 设置调用调试标志
  1144.       $game_temp.debug_calling = true
  1145.     end
  1146.     # 不在主角移动中的情况下
  1147.     unless $game_player.moving?
  1148.       # 执行各种画面的调用
  1149.       if $game_temp.battle_calling
  1150.         call_battle
  1151.       elsif $game_temp.shop_calling
  1152.         call_shop
  1153.       elsif $game_temp.name_calling
  1154.         call_name
  1155.       elsif $game_temp.menu_calling
  1156.         call_menu
  1157.       elsif $game_temp.save_calling
  1158.         call_save
  1159.       elsif $game_temp.debug_calling
  1160.         call_debug
  1161.       end
  1162.     end
  1163.   end
  1164.   #--------------------------------------------------------------------------
  1165.   # ● 调用战斗
  1166.   #--------------------------------------------------------------------------
  1167.   def call_battle
  1168.     # 清除战斗调用标志
  1169.     $game_temp.battle_calling = false
  1170.     # 清除菜单调用标志
  1171.     $game_temp.menu_calling = false
  1172.     $game_temp.menu_beep = false
  1173.     # 生成遇敌计数
  1174.     $game_player.make_encounter_count
  1175.     # 记忆地图 BGM 、停止 BGM
  1176.     $game_temp.map_bgm = $game_system.playing_bgm
  1177.     $game_system.bgm_stop
  1178.     # 演奏战斗开始 SE
  1179.     $game_system.se_play($data_system.battle_start_se)
  1180.     # 演奏战斗 BGM
  1181.     $game_system.bgm_play($game_system.battle_bgm)
  1182.     # 矫正主角姿势
  1183.     $game_player.straighten
  1184.     # 切换到战斗画面
  1185.     $scene = Scene_Battle.new
  1186.   end
  1187.   #--------------------------------------------------------------------------
  1188.   # ● 调用商店
  1189.   #--------------------------------------------------------------------------
  1190.   def call_shop
  1191.     # 清除商店调用标志
  1192.     $game_temp.shop_calling = false
  1193.     # 矫正主角姿势
  1194.     $game_player.straighten
  1195.     # 切换到商店画面
  1196.     $scene = Scene_Shop.new
  1197.   end
  1198.   #--------------------------------------------------------------------------
  1199.   # ● 调用名称输入
  1200.   #--------------------------------------------------------------------------
  1201.   def call_name
  1202.     # 清除商店调用名称输入标志
  1203.     $game_temp.name_calling = false
  1204.     # 矫正主角姿势
  1205.     $game_player.straighten
  1206.     # 切换到名称输入画面
  1207.     $scene = Scene_Name.new
  1208.   end
  1209.   #--------------------------------------------------------------------------
  1210.   # ● 调用菜单
  1211.   #--------------------------------------------------------------------------
  1212.   def call_menu
  1213.     # 清除商店调用菜单标志
  1214.     $game_temp.menu_calling = false
  1215.     # 已经设置了菜单 SE 演奏标志的情况下
  1216.     if $game_temp.menu_beep
  1217.       # 演奏确定 SE
  1218.       $game_system.se_play($data_system.decision_se)
  1219.       # 清除菜单演奏 SE 标志
  1220.       $game_temp.menu_beep = false
  1221.     end
  1222.     # 矫正主角姿势
  1223.     $game_player.straighten
  1224.     # 切换到菜单画面
  1225.     $scene = Scene_Menu.new
  1226.   end
  1227.   #--------------------------------------------------------------------------
  1228.   # ● 调用存档
  1229.   #--------------------------------------------------------------------------
  1230.   def call_save
  1231.     # 矫正主角姿势
  1232.     $game_player.straighten
  1233.     # 切换到存档画面
  1234.     $scene = Scene_Save.new
  1235.   end
  1236.   #--------------------------------------------------------------------------
  1237.   # ● 调用调试
  1238.   #--------------------------------------------------------------------------
  1239.   def call_debug
  1240.     # 清除商店调用调试标志
  1241.     $game_temp.debug_calling = false
  1242.     # 演奏确定 SE
  1243.     $game_system.se_play($data_system.decision_se)
  1244.     # 矫正主角姿势
  1245.     $game_player.straighten
  1246.     # 切换到调试画面
  1247.     $scene = Scene_Debug.new
  1248.   end
  1249.   #--------------------------------------------------------------------------
  1250.   # ● 主角的场所移动
  1251.   #--------------------------------------------------------------------------
  1252.   def transfer_player
  1253.     # 清除主角场所移动调试标志
  1254.     $game_temp.player_transferring = false
  1255.     # 移动目标与现在的地图有差异的情况下
  1256.     if $game_map.map_id != $game_temp.player_new_map_id
  1257.       # 设置新地图
  1258.       $game_map.setup($game_temp.player_new_map_id)
  1259.     end
  1260.     # 设置主角位置
  1261.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  1262.     # 设置主角朝向
  1263.     case $game_temp.player_new_direction
  1264.     when 2  # 下
  1265.       $game_player.turn_down
  1266.     when 4  # 左
  1267.       $game_player.turn_left
  1268.     when 6  # 右
  1269.       $game_player.turn_right
  1270.     when 8  # 上
  1271.       $game_player.turn_up
  1272.     end
  1273.     # 矫正主角姿势
  1274.     $game_player.straighten
  1275.     # 刷新地图 (执行并行事件)
  1276.     $game_map.update
  1277.     # 在生成活动块
  1278.     @spriteset.dispose
  1279.     @spriteset = Spriteset_Map.new
  1280.     # 处理过渡中的情况下
  1281.     if $game_temp.transition_processing
  1282.       # 清除过渡处理中标志
  1283.       $game_temp.transition_processing = false
  1284.       # 执行过渡
  1285.       $_t_Bitmap=Sprite.new
  1286.       $_t_Bitmap.bitmap = Bitmap.new($width,$height)
  1287.       $_t_Bitmap.bitmap.fill_rect(0,0,$width,$height,Color.new(0,0,0,255))
  1288.       Graphics.transition(0)
  1289.       for i in 0..10
  1290.         $_t_Bitmap.opacity-=26
  1291.         Graphics.update
  1292.       end
  1293.       $_t_Bitmap.bitmap.dispose
  1294.       $_t_Bitmap.dispose
  1295.     end
  1296.     # 执行地图设置的 BGM、BGS 的自动切换
  1297.     $game_map.autoplay
  1298.     # 设置画面
  1299.     Graphics.frame_reset
  1300.     # 刷新输入信息
  1301.     Input.update
  1302.   end
  1303. end
  1304. #==============================================================================
  1305. # ■ Interpreter (分割定义 5)
  1306. #------------------------------------------------------------------------------
  1307. #  执行事件命令的注释器。本类在 Game_System 类
  1308. # 和 Game_Event 类的内部使用。
  1309. #==============================================================================

  1310. class Interpreter
  1311.   #--------------------------------------------------------------------------
  1312.   # ● 场所移动
  1313.   #--------------------------------------------------------------------------
  1314.   def command_201
  1315.     # 战斗中的情况
  1316.     if $game_temp.in_battle
  1317.       # 继续
  1318.       return true
  1319.     end
  1320.     # 场所移动中、信息显示中、过渡处理中的情况下
  1321.     if $game_temp.player_transferring or
  1322.        $game_temp.message_window_showing or
  1323.        $game_temp.transition_processing
  1324.       # 结束
  1325.       return false
  1326.     end
  1327.     # 设置场所移动标志
  1328.     $game_temp.player_transferring = true
  1329.     # 指定方法为 [直接指定] 的情况下
  1330.     if @parameters[0] == 0
  1331.       # 设置主角的移动目标
  1332.       $game_temp.player_new_map_id = @parameters[1]
  1333.       $game_temp.player_new_x = @parameters[2]
  1334.       $game_temp.player_new_y = @parameters[3]
  1335.       $game_temp.player_new_direction = @parameters[4]
  1336.     # 指定方法为 [使用变量指定] 的情况下
  1337.     else
  1338.       # 设置主角的移动目标
  1339.       $game_temp.player_new_map_id = $game_variables[@parameters[1]]
  1340.       $game_temp.player_new_x = $game_variables[@parameters[2]]
  1341.       $game_temp.player_new_y = $game_variables[@parameters[3]]
  1342.       $game_temp.player_new_direction = @parameters[4]
  1343.     end
  1344.     # 推进索引
  1345.     @index += 1
  1346.     # 有淡入淡出的情况下
  1347.     if @parameters[5] == 0
  1348.       # 准备过渡   
  1349.       tempBitmap = Sprite.new
  1350.       tempBitmap.bitmap = Bitmap.new($width,$height)
  1351.       tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  1352.       tempBitmap.opacity = 0
  1353.       for i in 0..10
  1354.         tempBitmap.opacity+=26
  1355.         Graphics.update
  1356.       end
  1357.       Graphics.freeze
  1358.       tempBitmap.bitmap.dispose
  1359.       tempBitmap.dispose
  1360.       # 设置过渡处理中标志
  1361.       $game_temp.transition_processing = true
  1362.       $game_temp.transition_name = ""
  1363.     end
  1364.     # 结束
  1365.     return false
  1366.   end
  1367.   #--------------------------------------------------------------------------
  1368.   # ● 设置事件位置
  1369.   #--------------------------------------------------------------------------
  1370.   def command_202
  1371.     # 战斗中的情况下
  1372.     if $game_temp.in_battle
  1373.       # 继续
  1374.       return true
  1375.     end
  1376.     # 获取角色
  1377.     character = get_character(@parameters[0])
  1378.     # 角色不存在的情况下
  1379.     if character == nil
  1380.       # 继续
  1381.       return true
  1382.     end
  1383.     # 指定方法为 [直接指定] 的情况下
  1384.     if @parameters[1] == 0
  1385.       # 设置角色的位置
  1386.       character.moveto(@parameters[2], @parameters[3])
  1387.     # 指定方法为 [使用变量指定] 的情况下
  1388.     elsif @parameters[1] == 1
  1389.       # 设置角色的位置
  1390.       character.moveto($game_variables[@parameters[2]],
  1391.         $game_variables[@parameters[3]])
  1392.     # 指定方法为 [与其它事件交换] 的情况下
  1393.     else
  1394.       old_x = character.x
  1395.       old_y = character.y
  1396.       character2 = get_character(@parameters[2])
  1397.       if character2 != nil
  1398.         character.moveto(character2.x, character2.y)
  1399.         character2.moveto(old_x, old_y)
  1400.       end
  1401.     end
  1402.     # 设置觉得的朝向
  1403.     case @parameters[4]
  1404.     when 8  # 上
  1405.       character.turn_up
  1406.     when 6  # 右
  1407.       character.turn_right
  1408.     when 2  # 下
  1409.       character.turn_down
  1410.     when 4  # 左
  1411.       character.turn_left
  1412.     end
  1413.     # 继续
  1414.     return true
  1415.   end
  1416.   #--------------------------------------------------------------------------
  1417.   # ● 地图的滚动
  1418.   #--------------------------------------------------------------------------
  1419.   def command_203
  1420.     # 战斗中的情况下
  1421.     if $game_temp.in_battle
  1422.       # 继续
  1423.       return true
  1424.     end
  1425.     # 已经在滚动中的情况下
  1426.     if $game_map.scrolling?
  1427.       # 结束
  1428.       return false
  1429.     end
  1430.     # 开始滚动
  1431.     $game_map.start_scroll(@parameters[0], @parameters[1], @parameters[2])
  1432.     # 继续
  1433.     return true
  1434.   end
  1435.   #--------------------------------------------------------------------------
  1436.   # ● 更改地图设置
  1437.   #--------------------------------------------------------------------------
  1438.   def command_204
  1439.     case @parameters[0]
  1440.     when 0  # 远景
  1441.       $game_map.panorama_name = @parameters[1]
  1442.       $game_map.panorama_hue = @parameters[2]
  1443.     when 1  # 雾
  1444.       $game_map.fog_name = @parameters[1]
  1445.       $game_map.fog_hue = @parameters[2]
  1446.       $game_map.fog_opacity = @parameters[3]
  1447.       $game_map.fog_blend_type = @parameters[4]
  1448.       $game_map.fog_zoom = @parameters[5]
  1449.       $game_map.fog_sx = @parameters[6]
  1450.       $game_map.fog_sy = @parameters[7]
  1451.     when 2  # 战斗背景
  1452.       $game_map.battleback_name = @parameters[1]
  1453.       $game_temp.battleback_name = @parameters[1]
  1454.     end
  1455.     # 继续
  1456.     return true
  1457.   end
  1458.   #--------------------------------------------------------------------------
  1459.   # ● 更改雾的色调
  1460.   #--------------------------------------------------------------------------
  1461.   def command_205
  1462.     # 开始更改色调
  1463.     $game_map.start_fog_tone_change(@parameters[0], @parameters[1] * 2)
  1464.     # 继续
  1465.     return true
  1466.   end
  1467.   #--------------------------------------------------------------------------
  1468.   # ● 更改雾的不透明度
  1469.   #--------------------------------------------------------------------------
  1470.   def command_206
  1471.     # 开始更改不透明度
  1472.     $game_map.start_fog_opacity_change(@parameters[0], @parameters[1] * 2)
  1473.     # 继续
  1474.     return true
  1475.   end
  1476.   #--------------------------------------------------------------------------
  1477.   # ● 显示动画
  1478.   #--------------------------------------------------------------------------
  1479.   def command_207
  1480.     # 获取角色
  1481.     character = get_character(@parameters[0])
  1482.     # 角色不存在的情况下
  1483.     if character == nil
  1484.       # 继续
  1485.       return true
  1486.     end
  1487.     # 设置动画 ID
  1488.     character.animation_id = @parameters[1]
  1489.     # 继续
  1490.     return true
  1491.   end
  1492.   #--------------------------------------------------------------------------
  1493.   # ● 更改透明状态
  1494.   #--------------------------------------------------------------------------
  1495.   def command_208
  1496.     # 设置主角的透明状态
  1497.     $game_player.transparent = (@parameters[0] == 0)
  1498.     # 继续
  1499.     return true
  1500.   end
  1501.   #--------------------------------------------------------------------------
  1502.   # ● 设置移动路线
  1503.   #--------------------------------------------------------------------------
  1504.   def command_209
  1505.     # 获取角色
  1506.     character = get_character(@parameters[0])
  1507.     # 角色不存在的情况下
  1508.     if character == nil
  1509.       # 继续
  1510.       return true
  1511.     end
  1512.     # 强制移动路线
  1513.     character.force_move_route(@parameters[1])
  1514.     # 继续
  1515.     return true
  1516.   end
  1517.   #--------------------------------------------------------------------------
  1518.   # ● 移动结束后等待
  1519.   #--------------------------------------------------------------------------
  1520.   def command_210
  1521.     # 如果不在战斗中
  1522.     unless $game_temp.in_battle
  1523.       # 设置移动结束后待机标志
  1524.       @move_route_waiting = true
  1525.     end
  1526.     # 继续
  1527.     return true
  1528.   end
  1529.   #--------------------------------------------------------------------------
  1530.   # ● 开始过渡
  1531.   #--------------------------------------------------------------------------
  1532.   def command_221
  1533.     # 显示信息窗口中的情况下
  1534.     if $game_temp.message_window_showing
  1535.       # 结束
  1536.       return false
  1537.     end
  1538.     # 准备过渡
  1539.     Graphics.freeze
  1540.     # 继续
  1541.     return true
  1542.   end
  1543.   #--------------------------------------------------------------------------
  1544.   # ● 执行过渡
  1545.   #--------------------------------------------------------------------------
  1546.   def command_222
  1547.     # 已经设置了过渡处理中标志的情况下
  1548.     if $game_temp.transition_processing
  1549.       # 结束
  1550.       return false
  1551.     end
  1552.     # 设置过渡处理中标志
  1553.     $game_temp.transition_processing = true
  1554.     $game_temp.transition_name = @parameters[0]
  1555.     # 推进索引
  1556.     @index += 1
  1557.     # 结束
  1558.     return false
  1559.   end
  1560.   #--------------------------------------------------------------------------
  1561.   # ● 更改画面色调
  1562.   #--------------------------------------------------------------------------
  1563.   def command_223
  1564.     # 开始更改色调
  1565.     $game_screen.start_tone_change(@parameters[0], @parameters[1] * 2)
  1566.     # 继续
  1567.     return true
  1568.   end
  1569.   #--------------------------------------------------------------------------
  1570.   # ● 画面闪烁
  1571.   #--------------------------------------------------------------------------
  1572.   def command_224
  1573.     # 开始闪烁
  1574.     $game_screen.start_flash(@parameters[0], @parameters[1] * 2)
  1575.     # 继续
  1576.     return true
  1577.   end
  1578.   #--------------------------------------------------------------------------
  1579.   # ● 画面震动
  1580.   #--------------------------------------------------------------------------
  1581.   def command_225
  1582.     # 震动开始
  1583.     $game_screen.start_shake(@parameters[0], @parameters[1],
  1584.       @parameters[2] * 2)
  1585.     # 继续
  1586.     return true
  1587.   end
  1588.   #--------------------------------------------------------------------------
  1589.   # ● 显示图片
  1590.   #--------------------------------------------------------------------------
  1591.   def command_231
  1592.     # 获取图片编号
  1593.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1594.     # 指定方法为 [直接指定] 的情况下
  1595.     if @parameters[3] == 0
  1596.       x = @parameters[4]
  1597.       y = @parameters[5]
  1598.     # 指定方法为 [使用变量指定] 的情况下
  1599.     else
  1600.       x = $game_variables[@parameters[4]]
  1601.       y = $game_variables[@parameters[5]]
  1602.     end
  1603.     # 显示图片
  1604.     $game_screen.pictures[number].show(@parameters[1], @parameters[2],
  1605.       x, y, @parameters[6], @parameters[7], @parameters[8], @parameters[9])
  1606.     # 继续
  1607.     return true
  1608.   end
  1609.   #--------------------------------------------------------------------------
  1610.   # ● 移动图片
  1611.   #--------------------------------------------------------------------------
  1612.   def command_232
  1613.     # 获取图片编号
  1614.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1615.     # 指定方法为 [直接指定] 的情况下
  1616.     if @parameters[3] == 0
  1617.       x = @parameters[4]
  1618.       y = @parameters[5]
  1619.     # 指定方法为 [使用变量指定] 的情况下
  1620.     else
  1621.       x = $game_variables[@parameters[4]]
  1622.       y = $game_variables[@parameters[5]]
  1623.     end
  1624.     # 移动图片
  1625.     $game_screen.pictures[number].move(@parameters[1] * 2, @parameters[2],
  1626.       x, y, @parameters[6], @parameters[7], @parameters[8], @parameters[9])
  1627.     # 继续
  1628.     return true
  1629.   end
  1630.   #--------------------------------------------------------------------------
  1631.   # ● 旋转图片
  1632.   #--------------------------------------------------------------------------
  1633.   def command_233
  1634.     # 获取图片编号
  1635.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1636.     # 设置旋转速度
  1637.     $game_screen.pictures[number].rotate(@parameters[1])
  1638.     # 继续
  1639.     return true
  1640.   end
  1641.   #--------------------------------------------------------------------------
  1642.   # ● 更改图片色调
  1643.   #--------------------------------------------------------------------------
  1644.   def command_234
  1645.     # 获取图片编号
  1646.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1647.     # 开始更改色调
  1648.     $game_screen.pictures[number].start_tone_change(@parameters[1],
  1649.       @parameters[2] * 2)
  1650.     # 继续
  1651.     return true
  1652.   end
  1653.   #--------------------------------------------------------------------------
  1654.   # ● 删除图片
  1655.   #--------------------------------------------------------------------------
  1656.   def command_235
  1657.     # 获取图片编号
  1658.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1659.     # 删除图片
  1660.     $game_screen.pictures[number].erase
  1661.     # 继续
  1662.     return true
  1663.   end
  1664.   #--------------------------------------------------------------------------
  1665.   # ● 天候设置
  1666.   #--------------------------------------------------------------------------
  1667.   def command_236
  1668.     # 设置天候
  1669.     $game_screen.weather(@parameters[0], @parameters[1], @parameters[2])
  1670.     # 继续
  1671.     return true
  1672.   end
  1673.   #--------------------------------------------------------------------------
  1674.   # ● 演奏 BGM
  1675.   #--------------------------------------------------------------------------
  1676.   def command_241
  1677.     # 演奏 BGM
  1678.     $game_system.bgm_play(@parameters[0])
  1679.     # 继续
  1680.     return true
  1681.   end
  1682.   #--------------------------------------------------------------------------
  1683.   # ● BGM 的淡入淡出
  1684.   #--------------------------------------------------------------------------
  1685.   def command_242
  1686.     # 淡入淡出 BGM
  1687.     $game_system.bgm_fade(@parameters[0])
  1688.     # 继续
  1689.     return true
  1690.   end
  1691.   #--------------------------------------------------------------------------
  1692.   # ● 演奏 BGS
  1693.   #--------------------------------------------------------------------------
  1694.   def command_245
  1695.     # 演奏 BGS
  1696.     $game_system.bgs_play(@parameters[0])
  1697.     # 继续
  1698.     return true
  1699.   end
  1700.   #--------------------------------------------------------------------------
  1701.   # ● BGS 的淡入淡出
  1702.   #--------------------------------------------------------------------------
  1703.   def command_246
  1704.     # 淡入淡出 BGS
  1705.     $game_system.bgs_fade(@parameters[0])
  1706.     # 继续
  1707.     return true
  1708.   end
  1709.   #--------------------------------------------------------------------------
  1710.   # ● 记忆 BGM / BGS
  1711.   #--------------------------------------------------------------------------
  1712.   def command_247
  1713.     # 记忆 BGM / BGS
  1714.     $game_system.bgm_memorize
  1715.     $game_system.bgs_memorize
  1716.     # 继续
  1717.     return true
  1718.   end
  1719.   #--------------------------------------------------------------------------
  1720.   # ● 还原 BGM / BGS
  1721.   #--------------------------------------------------------------------------
  1722.   def command_248
  1723.     # 还原 BGM / BGS
  1724.     $game_system.bgm_restore
  1725.     $game_system.bgs_restore
  1726.     # 继续
  1727.     return true
  1728.   end
  1729.   #--------------------------------------------------------------------------
  1730.   # ● 演奏 ME
  1731.   #--------------------------------------------------------------------------
  1732.   def command_249
  1733.     # 演奏 ME
  1734.     $game_system.me_play(@parameters[0])
  1735.     # 继续
  1736.     return true
  1737.   end
  1738.   #--------------------------------------------------------------------------
  1739.   # ● 演奏 SE
  1740.   #--------------------------------------------------------------------------
  1741.   def command_250
  1742.     # 演奏 SE
  1743.     $game_system.se_play(@parameters[0])
  1744.     # 继续
  1745.     return true
  1746.   end
  1747.   #--------------------------------------------------------------------------
  1748.   # ● 停止 SE
  1749.   #--------------------------------------------------------------------------
  1750.   def command_251
  1751.     # 停止 SE
  1752.     Audio.se_stop
  1753.     # 继续
  1754.     return true
  1755.   end
  1756. end
  1757. #==============================================================================
  1758. # ■ Game_Enemy
  1759. #------------------------------------------------------------------------------
  1760. #  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
  1761. # 内部使用。
  1762. #==============================================================================

  1763. class Game_Enemy < Game_Battler
  1764.   #--------------------------------------------------------------------------
  1765.   # ● 初始化对像
  1766.   #     troop_id     : 循环 ID
  1767.   #     member_index : 循环成员的索引
  1768.   #--------------------------------------------------------------------------
  1769.   def initialize(troop_id, member_index)
  1770.     super()
  1771.     @troop_id = troop_id
  1772.     @member_index = member_index
  1773.     troop = $data_troops[@troop_id]
  1774.     @enemy_id = troop.members[@member_index].enemy_id
  1775.     enemy = $data_enemies[@enemy_id]
  1776.     @battler_name = enemy.battler_name
  1777.     @battler_hue = enemy.battler_hue
  1778.     @hp = maxhp
  1779.     @sp = maxsp
  1780.     @hidden = troop.members[@member_index].hidden
  1781.     @immortal = troop.members[@member_index].immortal
  1782.   end
  1783.   #--------------------------------------------------------------------------
  1784.   # ● 获取敌人 ID
  1785.   #--------------------------------------------------------------------------
  1786.   def id
  1787.     return @enemy_id
  1788.   end
  1789.   #--------------------------------------------------------------------------
  1790.   # ● 获取索引
  1791.   #--------------------------------------------------------------------------
  1792.   def index
  1793.     return @member_index
  1794.   end
  1795.   #--------------------------------------------------------------------------
  1796.   # ● 获取名称
  1797.   #--------------------------------------------------------------------------
  1798.   def name
  1799.     return $data_enemies[@enemy_id].name
  1800.   end
  1801.   #--------------------------------------------------------------------------
  1802.   # ● 获取基本 MaxHP
  1803.   #--------------------------------------------------------------------------
  1804.   def base_maxhp
  1805.     return $data_enemies[@enemy_id].maxhp
  1806.   end
  1807.   #--------------------------------------------------------------------------
  1808.   # ● 获取基本 MaxSP
  1809.   #--------------------------------------------------------------------------
  1810.   def base_maxsp
  1811.     return $data_enemies[@enemy_id].maxsp
  1812.   end
  1813.   #--------------------------------------------------------------------------
  1814.   # ● 获取基本力量
  1815.   #--------------------------------------------------------------------------
  1816.   def base_str
  1817.     return $data_enemies[@enemy_id].str
  1818.   end
  1819.   #--------------------------------------------------------------------------
  1820.   # ● 获取基本灵巧
  1821.   #--------------------------------------------------------------------------
  1822.   def base_dex
  1823.     return $data_enemies[@enemy_id].dex
  1824.   end
  1825.   #--------------------------------------------------------------------------
  1826.   # ● 获取基本速度
  1827.   #--------------------------------------------------------------------------
  1828.   def base_agi
  1829.     return $data_enemies[@enemy_id].agi
  1830.   end
  1831.   #--------------------------------------------------------------------------
  1832.   # ● 获取基本魔力
  1833.   #--------------------------------------------------------------------------
  1834.   def base_int
  1835.     return $data_enemies[@enemy_id].int
  1836.   end
  1837.   #--------------------------------------------------------------------------
  1838.   # ● 获取基本攻击力
  1839.   #--------------------------------------------------------------------------
  1840.   def base_atk
  1841.     return $data_enemies[@enemy_id].atk
  1842.   end
  1843.   #--------------------------------------------------------------------------
  1844.   # ● 获取基本物理防御
  1845.   #--------------------------------------------------------------------------
  1846.   def base_pdef
  1847.     return $data_enemies[@enemy_id].pdef
  1848.   end
  1849.   #--------------------------------------------------------------------------
  1850.   # ● 获取基本魔法防御
  1851.   #--------------------------------------------------------------------------
  1852.   def base_mdef
  1853.     return $data_enemies[@enemy_id].mdef
  1854.   end
  1855.   #--------------------------------------------------------------------------
  1856.   # ● 获取基本回避修正
  1857.   #--------------------------------------------------------------------------
  1858.   def base_eva
  1859.     return $data_enemies[@enemy_id].eva
  1860.   end
  1861.   #--------------------------------------------------------------------------
  1862.   # ● 普通攻击 获取攻击方动画 ID
  1863.   #--------------------------------------------------------------------------
  1864.   def animation1_id
  1865.     return $data_enemies[@enemy_id].animation1_id
  1866.   end
  1867.   #--------------------------------------------------------------------------
  1868.   # ● 普通攻击 获取对像方动画 ID
  1869.   #--------------------------------------------------------------------------
  1870.   def animation2_id
  1871.     return $data_enemies[@enemy_id].animation2_id
  1872.   end
  1873.   #--------------------------------------------------------------------------
  1874.   # ● 获取属性修正值
  1875.   #     element_id : 属性 ID
  1876.   #--------------------------------------------------------------------------
  1877.   def element_rate(element_id)
  1878.     # 获取对应属性有效度的数值
  1879.     table = [0,200,150,100,50,0,-100]
  1880.     result = table[$data_enemies[@enemy_id].element_ranks[element_id]]
  1881.     # 状态能防御本属性的情况下效果减半
  1882.     for i in @states
  1883.       if $data_states[i].guard_element_set.include?(element_id)
  1884.         result /= 2
  1885.       end
  1886.     end
  1887.     # 过程结束
  1888.     return result
  1889.   end
  1890.   #--------------------------------------------------------------------------
  1891.   # ● 获取属性有效度
  1892.   #--------------------------------------------------------------------------
  1893.   def state_ranks
  1894.     return $data_enemies[@enemy_id].state_ranks
  1895.   end
  1896.   #--------------------------------------------------------------------------
  1897.   # ● 属性防御判定
  1898.   #     state_id : 状态 ID
  1899.   #--------------------------------------------------------------------------
  1900.   def state_guard?(state_id)
  1901.     return false
  1902.   end
  1903.   #--------------------------------------------------------------------------
  1904.   # ● 获取普通攻击属性
  1905.   #--------------------------------------------------------------------------
  1906.   def element_set
  1907.     return []
  1908.   end
  1909.   #--------------------------------------------------------------------------
  1910.   # ● 获取普通攻击的状态变化 (+)
  1911.   #--------------------------------------------------------------------------
  1912.   def plus_state_set
  1913.     return []
  1914.   end
  1915.   #--------------------------------------------------------------------------
  1916.   # ● 获取普通攻击的状态变化 (-)
  1917.   #--------------------------------------------------------------------------
  1918.   def minus_state_set
  1919.     return []
  1920.   end
  1921.   #--------------------------------------------------------------------------
  1922.   # ● 获取行动
  1923.   #--------------------------------------------------------------------------
  1924.   def actions
  1925.     return $data_enemies[@enemy_id].actions
  1926.   end
  1927.   #--------------------------------------------------------------------------
  1928.   # ● 获取 EXP
  1929.   #--------------------------------------------------------------------------
  1930.   def exp
  1931.     return $data_enemies[@enemy_id].exp
  1932.   end
  1933.   #--------------------------------------------------------------------------
  1934.   # ● 获取金钱
  1935.   #--------------------------------------------------------------------------
  1936.   def gold
  1937.     return $data_enemies[@enemy_id].gold
  1938.   end
  1939.   #--------------------------------------------------------------------------
  1940.   # ● 获取物品 ID
  1941.   #--------------------------------------------------------------------------
  1942.   def item_id
  1943.     return $data_enemies[@enemy_id].item_id
  1944.   end
  1945.   #--------------------------------------------------------------------------
  1946.   # ● 获取武器 ID
  1947.   #--------------------------------------------------------------------------
  1948.   def weapon_id
  1949.     return $data_enemies[@enemy_id].weapon_id
  1950.   end
  1951.   #--------------------------------------------------------------------------
  1952.   # ● 获取放具 ID
  1953.   #--------------------------------------------------------------------------
  1954.   def armor_id
  1955.     return $data_enemies[@enemy_id].armor_id
  1956.   end
  1957.   #--------------------------------------------------------------------------
  1958.   # ● 获取宝物出现率
  1959.   #--------------------------------------------------------------------------
  1960.   def treasure_prob
  1961.     return $data_enemies[@enemy_id].treasure_prob
  1962.   end
  1963.   #--------------------------------------------------------------------------
  1964.   # ● 取得战斗画面 X 坐标
  1965.   #--------------------------------------------------------------------------
  1966.   def screen_x
  1967.     return $data_troops[@troop_id].members[@member_index].x*$width/640
  1968.   end
  1969.   #--------------------------------------------------------------------------
  1970.   # ● 取得战斗画面 Y 坐标
  1971.   #--------------------------------------------------------------------------
  1972.   def screen_y
  1973.     return $data_troops[@troop_id].members[@member_index].y*$height/480
  1974.   end
  1975.   #--------------------------------------------------------------------------
  1976.   # ● 取得战斗画面 Z 坐标
  1977.   #--------------------------------------------------------------------------
  1978.   def screen_z
  1979.     return screen_y
  1980.   end
  1981.   #--------------------------------------------------------------------------
  1982.   # ● 逃跑
  1983.   #--------------------------------------------------------------------------
  1984.   def escape
  1985.     # 设置击中标志
  1986.     @hidden = true
  1987.     # 清除当前行动
  1988.     self.current_action.clear
  1989.   end
  1990.   #--------------------------------------------------------------------------
  1991.   # ● 变身
  1992.   #     enemy_id : 变身为的敌人 ID
  1993.   #--------------------------------------------------------------------------
  1994.   def transform(enemy_id)
  1995.     # 更改敌人 ID
  1996.     @enemy_id = enemy_id
  1997.     # 更改战斗图形
  1998.     @battler_name = $data_enemies[@enemy_id].battler_name
  1999.     @battler_hue = $data_enemies[@enemy_id].battler_hue
  2000.     # 在生成行动
  2001.     make_action
  2002.   end
  2003.   #--------------------------------------------------------------------------
  2004.   # ● 生成行动
  2005.   #--------------------------------------------------------------------------
  2006.   def make_action
  2007.     # 清除当前行动
  2008.     self.current_action.clear
  2009.     # 无法行动的情况
  2010.     unless self.movable?
  2011.       # 过程结束
  2012.       return
  2013.     end
  2014.     # 抽取现在有效的行动
  2015.     available_actions = []
  2016.     rating_max = 0
  2017.     for action in self.actions
  2018.       # 确认回合条件
  2019.       n = $game_temp.battle_turn
  2020.       a = action.condition_turn_a
  2021.       b = action.condition_turn_b
  2022.       if (b == 0 and n != a) or
  2023.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  2024.         next
  2025.       end
  2026.       # 确认 HP 条件
  2027.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  2028.         next
  2029.       end
  2030.       # 确认等级条件
  2031.       if $game_party.max_level < action.condition_level
  2032.         next
  2033.       end
  2034.       # 确认开关条件
  2035.       switch_id = action.condition_switch_id
  2036.       if switch_id > 0 and $game_switches[switch_id] == false
  2037.         next
  2038.       end
  2039.       # 符合条件 : 添加本行动
  2040.       available_actions.push(action)
  2041.       if action.rating > rating_max
  2042.         rating_max = action.rating
  2043.       end
  2044.     end
  2045.     # 最大概率值作为 3 合计计算(0 除外)
  2046.     ratings_total = 0
  2047.     for action in available_actions
  2048.       if action.rating > rating_max - 3
  2049.         ratings_total += action.rating - (rating_max - 3)
  2050.       end
  2051.     end
  2052.     # 概率合计不为 0 的情况下
  2053.     if ratings_total > 0
  2054.       # 生成随机数
  2055.       value = rand(ratings_total)
  2056.       # 设置对应生成随机数的当前行动
  2057.       for action in available_actions
  2058.         if action.rating > rating_max - 3
  2059.           if value < action.rating - (rating_max - 3)
  2060.             self.current_action.kind = action.kind
  2061.             self.current_action.basic = action.basic
  2062.             self.current_action.skill_id = action.skill_id
  2063.             self.current_action.decide_random_target_for_enemy
  2064.             return
  2065.           else
  2066.             value -= action.rating - (rating_max - 3)
  2067.           end
  2068.         end
  2069.       end
  2070.     end
  2071.   end
  2072. end
  2073. #==============================================================================
  2074. # ■ Game_Map
  2075. #------------------------------------------------------------------------------
  2076. #  处理地图的类。包含卷动以及可以通行的判断功能。
  2077. # 本类的实例请参考 $game_map 。
  2078. #==============================================================================

  2079. class Game_Map
  2080.   #--------------------------------------------------------------------------
  2081.   # ● 定义实例变量
  2082.   #--------------------------------------------------------------------------
  2083.   attr_accessor :tileset_name             # 元件 文件名
  2084.   attr_accessor :autotile_names           # 自动元件 文件名
  2085.   attr_accessor :panorama_name            # 全景 文件名
  2086.   attr_accessor :panorama_hue             # 全景 色相
  2087.   attr_accessor :fog_name                 # 雾 文件名
  2088.   attr_accessor :fog_hue                  # 雾 色相
  2089.   attr_accessor :fog_opacity              # 雾 不透明度
  2090.   attr_accessor :fog_blend_type           # 雾 混合方式
  2091.   attr_accessor :fog_zoom                 # 雾 放大率
  2092.   attr_accessor :fog_sx                   # 雾 SX
  2093.   attr_accessor :fog_sy                   # 雾 SY
  2094.   attr_accessor :battleback_name          # 战斗背景 文件名
  2095.   attr_accessor :display_x                # 显示 X 坐标 * 128
  2096.   attr_accessor :display_y                # 显示 Y 坐标 * 128
  2097.   attr_accessor :need_refresh             # 刷新要求标志
  2098.   attr_reader   :passages                 # 通行表
  2099.   attr_reader   :priorities               # 优先表
  2100.   attr_reader   :terrain_tags             # 地形标记表
  2101.   attr_reader   :events                   # 事件
  2102.   attr_reader   :fog_ox                   # 雾 原点 X 坐标
  2103.   attr_reader   :fog_oy                   # 雾 原点 Y 坐标
  2104.   attr_reader   :fog_tone                 # 雾 色调
  2105.   #--------------------------------------------------------------------------
  2106.   # ● 初始化条件
  2107.   #--------------------------------------------------------------------------
  2108.   def initialize
  2109.     @map_id = 0
  2110.     @display_x = 0
  2111.     @display_y = 0
  2112.   end
  2113.   #--------------------------------------------------------------------------
  2114.   # ● 设置
  2115.   #     map_id : 地图 ID
  2116.   #--------------------------------------------------------------------------
  2117.   def setup(map_id)
  2118.     # 地图 ID 记录到 @map_id
  2119.     @map_id = map_id
  2120.     # 地图文件装载后、设置到 @map
  2121.     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  2122.     # 定义实例变量设置地图元件信息
  2123.     tileset = $data_tilesets[@map.tileset_id]
  2124.     @tileset_name = tileset.tileset_name
  2125.     @autotile_names = tileset.autotile_names
  2126.     @panorama_name = tileset.panorama_name
  2127.     @panorama_hue = tileset.panorama_hue
  2128.     @fog_name = tileset.fog_name
  2129.     @fog_hue = tileset.fog_hue
  2130.     @fog_opacity = tileset.fog_opacity
  2131.     @fog_blend_type = tileset.fog_blend_type
  2132.     @fog_zoom = tileset.fog_zoom
  2133.     @fog_sx = tileset.fog_sx
  2134.     @fog_sy = tileset.fog_sy
  2135.     @battleback_name = tileset.battleback_name
  2136.     @passages = tileset.passages
  2137.     @priorities = tileset.priorities
  2138.     @terrain_tags = tileset.terrain_tags
  2139.     # 初始化显示坐标
  2140.     @display_x = 0
  2141.     @display_y = 0
  2142.     # 清除刷新要求标志
  2143.     @need_refresh = false
  2144.     # 设置地图事件数据
  2145.     @events = {}
  2146.     for i in @map.events.keys
  2147.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  2148.     end
  2149.     # 设置公共事件数据
  2150.     @common_events = {}
  2151.     for i in 1...$data_common_events.size
  2152.       @common_events[i] = Game_CommonEvent.new(i)
  2153.     end
  2154.     # 初始化雾的各种信息
  2155.     @fog_ox = 0
  2156.     @fog_oy = 0
  2157.     @fog_tone = Tone.new(0, 0, 0, 0)
  2158.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  2159.     @fog_tone_duration = 0
  2160.     @fog_opacity_duration = 0
  2161.     @fog_opacity_target = 0
  2162.     # 初始化滚动信息
  2163.     @scroll_direction = 2
  2164.     @scroll_rest = 0
  2165.     @scroll_speed = 4
  2166.   end
  2167.   #--------------------------------------------------------------------------
  2168.   # ● 获取地图 ID
  2169.   #--------------------------------------------------------------------------
  2170.   def map_id
  2171.     return @map_id
  2172.   end
  2173.   #--------------------------------------------------------------------------
  2174.   # ● 获取宽度
  2175.   #--------------------------------------------------------------------------
  2176.   def width
  2177.     return @map.width
  2178.   end
  2179.   #--------------------------------------------------------------------------
  2180.   # ● 获取高度
  2181.   #--------------------------------------------------------------------------
  2182.   def height
  2183.     return @map.height
  2184.   end
  2185.   #--------------------------------------------------------------------------
  2186.   # ● 获取遇敌列表
  2187.   #--------------------------------------------------------------------------
  2188.   def encounter_list
  2189.     return @map.encounter_list
  2190.   end
  2191.   #--------------------------------------------------------------------------
  2192.   # ● 获取遇敌步数
  2193.   #--------------------------------------------------------------------------
  2194.   def encounter_step
  2195.     return @map.encounter_step
  2196.   end
  2197.   #--------------------------------------------------------------------------
  2198.   # ● 获取地图数据
  2199.   #--------------------------------------------------------------------------
  2200.   def data
  2201.     return @map.data
  2202.   end
  2203.   #--------------------------------------------------------------------------
  2204.   # ● BGM / BGS 自动切换
  2205.   #--------------------------------------------------------------------------
  2206.   def autoplay
  2207.     if @map.autoplay_bgm
  2208.       $game_system.bgm_play(@map.bgm)
  2209.     end
  2210.     if @map.autoplay_bgs
  2211.       $game_system.bgs_play(@map.bgs)
  2212.     end
  2213.   end
  2214.   #--------------------------------------------------------------------------
  2215.   # ● 刷新
  2216.   #--------------------------------------------------------------------------
  2217.   def refresh
  2218.     # 地图 ID 有效
  2219.     if @map_id > 0
  2220.       # 刷新全部的地图事件
  2221.       for event in @events.values
  2222.         event.refresh
  2223.       end
  2224.       # 刷新全部的公共事件
  2225.       for common_event in @common_events.values
  2226.         common_event.refresh
  2227.       end
  2228.     end
  2229.     # 清除刷新要求标志
  2230.     @need_refresh = false
  2231.   end
  2232.   #--------------------------------------------------------------------------
  2233.   # ● 滚动
  2234.   #     distance : 滚动距离
  2235.   #--------------------------------------------------------------------------
  2236.   def scroll_down(distance)
  2237.     @display_y = [@display_y + distance, (self.height - ($height / 32.0)) * 128].min
  2238.   end
  2239.   #--------------------------------------------------------------------------
  2240.   def scroll_left(distance)
  2241.     @display_x = [@display_x - distance, 0].max
  2242.   end
  2243.   #--------------------------------------------------------------------------
  2244.   def scroll_right(distance)
  2245.     @display_x = [@display_x + distance, (self.width - ($width / 32.0)) * 128].min
  2246.   end
  2247.   #--------------------------------------------------------------------------
  2248.   def scroll_up(distance)
  2249.     @display_y = [@display_y - distance, 0].max
  2250.   end
  2251.   #--------------------------------------------------------------------------
  2252.   # ● 有效坐标判定
  2253.   #     x          : X 坐标
  2254.   #     y          : Y 坐标
  2255.   #--------------------------------------------------------------------------
  2256.   def valid?(x, y)
  2257.     return (x >= 0 and x < width and y >= 0 and y < height)
  2258.   end
  2259.   #--------------------------------------------------------------------------
  2260.   # ● 可以通行判定
  2261.   #     x          : X 坐标
  2262.   #     y          : Y 坐标
  2263.   #     d          : 方向 (0,2,4,6,8,10)
  2264.   #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  2265.   #     self_event : 自己 (判定事件可以通行的情况下)
  2266.   #--------------------------------------------------------------------------
  2267.   def passable?(x, y, d, self_event = nil)
  2268.     # 被给予的坐标地图外的情况下
  2269.     unless valid?(x, y)
  2270.       # 不能通行
  2271.       return false
  2272.     end
  2273.     # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
  2274.     bit = (1 << (d / 2 - 1)) & 0x0f
  2275.     # 循环全部的事件
  2276.     for event in events.values
  2277.       # 自己以外的元件与坐标相同的情况
  2278.       if event.tile_id >= 0 and event != self_event and
  2279.          event.x == x and event.y == y and not event.through
  2280.         # 如果障碍物的接触被设置的情况下
  2281.         if @passages[event.tile_id] & bit != 0
  2282.           # 不能通行
  2283.           return false
  2284.         # 如果全方向的障碍物的接触被设置的情况下
  2285.         elsif @passages[event.tile_id] & 0x0f == 0x0f
  2286.           # 不能通行
  2287.           return false
  2288.         # 这以外的优先度为 0 的情况下
  2289.         elsif @priorities[event.tile_id] == 0
  2290.           # 可以通行
  2291.           return true
  2292.         end
  2293.       end
  2294.     end
  2295.     # 从层按从上到下的顺序调查循环
  2296.     for i in [2, 1, 0]
  2297.       # 取得元件 ID
  2298.       tile_id = data[x, y, i]
  2299.       # 取得元件 ID 失败
  2300.       if tile_id == nil
  2301.         # 不能通行
  2302.         return false
  2303.       # 如果障碍物的接触被设置的情况下
  2304.       elsif @passages[tile_id] & bit != 0
  2305.         # 不能通行
  2306.         return false
  2307.       # 如果全方向的障碍物的接触被设置的情况下
  2308.       elsif @passages[tile_id] & 0x0f == 0x0f
  2309.         # 不能通行
  2310.         return false
  2311.       # 这以外的优先度为 0 的情况下
  2312.       elsif @priorities[tile_id] == 0
  2313.         # 可以通行
  2314.         return true
  2315.       end
  2316.     end
  2317.     # 可以通行
  2318.     return true
  2319.   end
  2320.   #--------------------------------------------------------------------------
  2321.   # ● 茂密判定
  2322.   #     x          : X 坐标
  2323.   #     y          : Y 坐标
  2324.   #--------------------------------------------------------------------------
  2325.   def bush?(x, y)
  2326.     if @map_id != 0
  2327.       for i in [2, 1, 0]
  2328.         tile_id = data[x, y, i]
  2329.         if tile_id == nil
  2330.           return false
  2331.         elsif @passages[tile_id] & 0x40 == 0x40
  2332.           return true
  2333.         end
  2334.       end
  2335.     end
  2336.     return false
  2337.   end
  2338.   #--------------------------------------------------------------------------
  2339.   # ● 反击判定
  2340.   #     x          : X 坐标
  2341.   #     y          : Y 坐标
  2342.   #--------------------------------------------------------------------------
  2343.   def counter?(x, y)
  2344.     if @map_id != 0
  2345.       for i in [2, 1, 0]
  2346.         tile_id = data[x, y, i]
  2347.         if tile_id == nil
  2348.           return false
  2349.         elsif @passages[tile_id] & 0x80 == 0x80
  2350.           return true
  2351.         end
  2352.       end
  2353.     end
  2354.     return false
  2355.   end
  2356.   #--------------------------------------------------------------------------
  2357.   # ● 地获取地形标志
  2358.   #     x          : X 坐标
  2359.   #     y          : Y 坐标
  2360.   #--------------------------------------------------------------------------
  2361.   def terrain_tag(x, y)
  2362.     if @map_id != 0
  2363.       for i in [2, 1, 0]
  2364.         tile_id = data[x, y, i]
  2365.         if tile_id == nil
  2366.           return 0
  2367.         elsif @terrain_tags[tile_id] > 0
  2368.           return @terrain_tags[tile_id]
  2369.         end
  2370.       end
  2371.     end
  2372.     return 0
  2373.   end
  2374.   #--------------------------------------------------------------------------
  2375.   # ● 获取指定位置的事件 ID
  2376.   #     x          : X 坐标
  2377.   #     y          : Y 坐标
  2378.   #--------------------------------------------------------------------------
  2379.   def check_event(x, y)
  2380.     for event in $game_map.events.values
  2381.       if event.x == x and event.y == y
  2382.         return event.id
  2383.       end
  2384.     end
  2385.   end
  2386.   #--------------------------------------------------------------------------
  2387.   # ● 滚动开始
  2388.   #     direction : 滚动方向
  2389.   #     distance  : 滚动距离
  2390.   #     speed     : 滚动速度
  2391.   #--------------------------------------------------------------------------
  2392.   def start_scroll(direction, distance, speed)
  2393.     @scroll_direction = direction
  2394.     @scroll_rest = distance * 128
  2395.     @scroll_speed = speed
  2396.   end
  2397.   #--------------------------------------------------------------------------
  2398.   # ● 滚动中判定
  2399.   #--------------------------------------------------------------------------
  2400.   def scrolling?
  2401.     return @scroll_rest > 0
  2402.   end
  2403.   #--------------------------------------------------------------------------
  2404.   # ● 开始变更雾的色调
  2405.   #     tone     : 色调
  2406.   #     duration : 时间
  2407.   #--------------------------------------------------------------------------
  2408.   def start_fog_tone_change(tone, duration)
  2409.     @fog_tone_target = tone.clone
  2410.     @fog_tone_duration = duration
  2411.     if @fog_tone_duration == 0
  2412.       @fog_tone = @fog_tone_target.clone
  2413.     end
  2414.   end
  2415.   #--------------------------------------------------------------------------
  2416.   # ● 开始变更雾的不透明度
  2417.   #     opacity  : 不透明度
  2418.   #     duration : 时间
  2419.   #--------------------------------------------------------------------------
  2420.   def start_fog_opacity_change(opacity, duration)
  2421.     @fog_opacity_target = opacity * 1.0
  2422.     @fog_opacity_duration = duration
  2423.     if @fog_opacity_duration == 0
  2424.       @fog_opacity = @fog_opacity_target
  2425.     end
  2426.   end
  2427.   #--------------------------------------------------------------------------
  2428.   # ● 刷新画面
  2429.   #--------------------------------------------------------------------------
  2430.   def update
  2431.     # 还原必要的地图
  2432.     if $game_map.need_refresh
  2433.       refresh
  2434.     end
  2435.     # 滚动中的情况下
  2436.     if @scroll_rest > 0
  2437.       # 滚动速度变化为地图坐标系的距离
  2438.       distance = 2 ** @scroll_speed
  2439.       # 执行滚动
  2440.       case @scroll_direction
  2441.       when 2  # 下
  2442.         scroll_down(distance)
  2443.       when 4  # 左
  2444.         scroll_left(distance)
  2445.       when 6  # 右
  2446.         scroll_right(distance)
  2447.       when 8  # 上
  2448.         scroll_up(distance)
  2449.       end
  2450.       # 滚动距离的减法运算
  2451.       @scroll_rest -= distance
  2452.     end
  2453.     # 更新地图事件
  2454.     for event in @events.values
  2455.       event.update
  2456.     end
  2457.     # 更新公共事件
  2458.     for common_event in @common_events.values
  2459.       common_event.update
  2460.     end
  2461.     # 处理雾的滚动
  2462.     @fog_ox -= @fog_sx / 8.0
  2463.     @fog_oy -= @fog_sy / 8.0
  2464.     # 处理雾的色调变更
  2465.     if @fog_tone_duration >= 1
  2466.       d = @fog_tone_duration
  2467.       target = @fog_tone_target
  2468.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  2469.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  2470.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  2471.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  2472.       @fog_tone_duration -= 1
  2473.     end
  2474.     # 处理雾的不透明度变更
  2475.     if @fog_opacity_duration >= 1
  2476.       d = @fog_opacity_duration
  2477.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  2478.       @fog_opacity_duration -= 1
  2479.     end
  2480.   end
  2481. end
  2482. #==============================================================================
  2483. # ■ Sprite_Character
  2484. #------------------------------------------------------------------------------
  2485. #  角色显示用脚本。监视 Game_Character 类的实例、
  2486. # 自动变化脚本状态。
  2487. #==============================================================================

  2488. class Sprite_Character < RPG::Sprite
  2489.   #--------------------------------------------------------------------------
  2490.   # ● 定义实例变量
  2491.   #--------------------------------------------------------------------------
  2492.   attr_accessor :character                # 角色
  2493.   #--------------------------------------------------------------------------
  2494.   # ● 初始化对像
  2495.   #     viewport  : 查看端口
  2496.   #     character : 角色 (Game_Character)
  2497.   #--------------------------------------------------------------------------
  2498.   def initialize(viewport, character = nil)
  2499.     super(viewport)
  2500.     @vp = viewport
  2501.     @character = character
  2502.     update
  2503.   end
  2504.   #--------------------------------------------------------------------------
  2505.   # ● 更新画面
  2506.   #--------------------------------------------------------------------------
  2507.   def update
  2508.     super
  2509.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  2510.     if @tile_id != @character.tile_id or
  2511.        @character_name != @character.character_name or
  2512.        @character_hue != @character.character_hue
  2513.       # 记忆元件 ID 与文件名、色相
  2514.       @tile_id = @character.tile_id
  2515.       @character_name = @character.character_name
  2516.       @character_hue = @character.character_hue
  2517.       # 元件 ID 为有效值的情况下
  2518.       if @tile_id >= 384
  2519.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  2520.           @tile_id, @character.character_hue)
  2521.         self.src_rect.set(0, 0, 32, 32)
  2522.         self.ox = 16
  2523.         self.oy = 32
  2524.       # 元件 ID 为无效值的情况下
  2525.       else
  2526.         self.bitmap = RPG::Cache.character(@character.character_name,
  2527.           @character.character_hue)
  2528.         @cw = bitmap.width / 4
  2529.         @ch = bitmap.height / 4
  2530.         self.ox = @cw / 2
  2531.         self.oy = @ch
  2532.       end
  2533.     end
  2534.     # 设置可视状态
  2535.     self.visible = (not @character.transparent)
  2536.     # 图形是角色的情况下
  2537.     if @tile_id == 0
  2538.       # 设置传送目标的矩形
  2539.       sx = @character.pattern * @cw
  2540.       sy = (@character.direction - 2) / 2 * @ch
  2541.       self.src_rect.set(sx, sy, @cw, @ch)
  2542.     end
  2543.     # 设置脚本的坐标
  2544.     self.x = @character.screen_x
  2545.     #if @character == $game_player
  2546.       if @vp == $viewport5 or @vp == $viewport6
  2547.         self.y = @character.screen_y-480
  2548.         self.z = @character.screen_z(@ch)-480
  2549.       else
  2550.         self.y = @character.screen_y
  2551.         self.z = @character.screen_z(@ch)
  2552.       end
  2553.     #else
  2554.       #self.y = @character.screen_y
  2555.       #self.z = @character.screen_z(@ch)
  2556.     #end
  2557.     # 设置不透明度、合成方式、茂密
  2558.     self.opacity = @character.opacity
  2559.     self.blend_type = @character.blend_type
  2560.     self.bush_depth = @character.bush_depth
  2561.     # 动画
  2562.     if @character.animation_id != 0
  2563.       animation = $data_animations[@character.animation_id]
  2564.       animation(animation, true)
  2565.       @character.animation_id = 0
  2566.     end
  2567.   end
  2568. end

  2569.   class Weather
  2570.     def initialize(viewport = nil)
  2571.       @type = 0
  2572.       @max = 0
  2573.       @ox = 0
  2574.       @oy = 0
  2575.       color1 = Color.new(255, 255, 255, 255)
  2576.       color2 = Color.new(255, 255, 255, 128)
  2577.       @rain_bitmap = Bitmap.new(7, 56)
  2578.       for i in 0..6
  2579.         @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
  2580.       end
  2581.       @storm_bitmap = Bitmap.new(34, 64)
  2582.       for i in 0..31
  2583.         @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
  2584.         @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
  2585.         @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
  2586.       end
  2587.       @snow_bitmap = Bitmap.new(6, 6)
  2588.       @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
  2589.       @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
  2590.       @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
  2591.       @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
  2592.       @sprites = []
  2593.       for i in 1..40
  2594.         sprite = Sprite.new(viewport)
  2595.         sprite.z = 1000
  2596.         sprite.visible = false
  2597.         sprite.opacity = 0
  2598.         @sprites.push(sprite)
  2599.       end
  2600.     end
  2601.     def dispose
  2602.       for sprite in @sprites
  2603.         sprite.dispose
  2604.       end
  2605.       @rain_bitmap.dispose
  2606.       @storm_bitmap.dispose
  2607.       @snow_bitmap.dispose
  2608.     end
  2609.     def type=(type)
  2610.       return if @type == type
  2611.       @type = type
  2612.       case @type
  2613.       when 1
  2614.         bitmap = @rain_bitmap
  2615.       when 2
  2616.         bitmap = @storm_bitmap
  2617.       when 3
  2618.         bitmap = @snow_bitmap
  2619.       else
  2620.         bitmap = nil
  2621.       end
  2622.       for i in 1..40
  2623.         sprite = @sprites[i]
  2624.         if sprite != nil
  2625.           sprite.visible = (i <= @max)
  2626.           sprite.bitmap = bitmap
  2627.         end
  2628.       end
  2629.     end
  2630.     def ox=(ox)
  2631.       return if @ox == ox;
  2632.       @ox = ox
  2633.       for sprite in @sprites
  2634.         sprite.ox = @ox
  2635.       end
  2636.     end
  2637.     def oy=(oy)
  2638.       return if @oy == oy;
  2639.       @oy = oy
  2640.       for sprite in @sprites
  2641.         sprite.oy = @oy
  2642.       end
  2643.     end
  2644.     def max=(max)
  2645.       return if @max == max;
  2646.       @max = [[max, 0].max, 40].min
  2647.       for i in 1..40
  2648.         sprite = @sprites[i]
  2649.         if sprite != nil
  2650.           sprite.visible = (i <= @max)
  2651.         end
  2652.       end
  2653.     end
  2654.     def update
  2655.       return if @type == 0
  2656.       for i in 1..@max
  2657.         sprite = @sprites[i]
  2658.         if sprite == nil
  2659.           break
  2660.         end
  2661.         if @type == 1
  2662.           sprite.x -= 2
  2663.           sprite.y += 16
  2664.           sprite.opacity -= 8
  2665.         end
  2666.         if @type == 2
  2667.           sprite.x -= 8
  2668.           sprite.y += 16
  2669.           sprite.opacity -= 12
  2670.         end
  2671.         if @type == 3
  2672.           sprite.x -= 2
  2673.           sprite.y += 8
  2674.           sprite.opacity -= 8
  2675.         end
  2676.         x = sprite.x - @ox
  2677.         y = sprite.y - @oy
  2678.         if sprite.opacity < 64 or x < -50 or x > $width+150 or y < -300 or y > $height+100
  2679.           sprite.x = rand($width+150) - 50 + @ox
  2680.           sprite.y = rand($height+100) - 200 + @oy
  2681.           sprite.opacity = 255
  2682.         end
  2683.       end
  2684.     end
  2685.     attr_reader :type
  2686.     attr_reader :max
  2687.     attr_reader :ox
  2688.     attr_reader :oy
  2689.   end
复制代码
不建议使用,因为所有窗口都要重新设置!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
3
发表于 2010-6-20 21:47:03 | 只看该作者

  1. # ————————————————————————————————————
  2. # 本脚本来自www.66rpg.com,转载请保留此信息
  3. # ————————————————————————————————————

  4. class Win32API
  5.   GAME_INI_FILE = ".\\Game.ini"
  6.   HWND_TOPMOST = 0
  7.   HWND_TOP = -1
  8.   SWP_NOMOVE   = 0
  9.   SWP_FRAMECHANGED = 0
  10.   HWND_NOTTOPMOST = 0
  11.   WM_GETMINMAXINFO = 24
  12.   #——————————————————————————————————————
  13.   def Win32API.GetPrivateProfileString(section, key)
  14.     val = "\0"*256
  15.     gps = Win32API.new('kernel32', 'GetPrivateProfileString',%w(p p p p l p), 'l')
  16.     gps.call(section, key, "", val, 256, GAME_INI_FILE)
  17.     val.delete!("\0")
  18.     return val
  19.   end
  20.   #——————————————————————————————————————
  21.   def Win32API.FindWindow(class_name, title)
  22.     fw = Win32API.new('user32', 'FindWindow', %(p, p), 'i')
  23.     hWnd = fw.call(class_name, title)
  24.     return hWnd
  25.   end
  26.   #——————————————————————————————————————
  27.   def Win32API.SetWindowPos(w, h)
  28.     title =  Win32API.GetPrivateProfileString("Game", "Title")
  29.     hWnd = Win32API.FindWindow("RGSS Player", title)
  30.     swp = Win32API.new('user32', 'SetWindowPos', %(l, l, i, i, i, i, i), 'i')
  31.     win = swp.call(hWnd, HWND_TOP, 100, 50,  w + 6, h+32, WM_GETMINMAXINFO)
  32.     return win
  33.   end
  34.   #——————————————————————————————————————
  35.   def Win32API.client_size
  36.     title =  Win32API.GetPrivateProfileString("Game", "Title")
  37.     hWnd = Win32API.FindWindow("RGSS Player", title)
  38.     rect = [0, 0, 0, 0].pack('l4')
  39.     Win32API.new('user32', 'GetClientRect', %w(l p), 'i').call(hWnd, rect)
  40.     width, height = rect.unpack('l4')[2..3]
  41.     return width, height
  42.   end
  43. end
  44. $width = 800
  45. $height = 600
  46. win = Win32API.SetWindowPos($width, $height)
  47. if(win == 0)
  48.   p "Size change has failed!"
  49. end
  50. #==============================================================================
  51. # ■ Spriteset_Map
  52. #------------------------------------------------------------------------------
  53. #  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
  54. #==============================================================================
  55. class Spriteset_Map
  56.   #--------------------------------------------------------------------------
  57.   # ● 初始化对像
  58.   #--------------------------------------------------------------------------
  59.   def initialize
  60.     @viewport2 = Viewport.new(0, 0, $width, $height)  #——生成图片
  61.     @viewport3 = Viewport.new(0, 0, $width, $height)  #——生成画面闪烁用的部分
  62.     $viewport4 = Viewport.new(640, 0, $width-640, 480)  #——右侧
  63.     $viewport5 = Viewport.new(0, 480, 640, $height-480) #——下侧
  64.     $viewport6 = Viewport.new(640, 480, $width-640, $height-480) #——右下角
  65.     $viewport1 = Viewport.new(0, 0, 640, 480) #——主窗口
  66.     @viewport_weather = Viewport.new(0, 0, $width, $height) #——生成天气专用
  67.     @viewport2.z = 200  #——生成图片的深度
  68.     @viewport3.z = 5000 #——生成画面闪烁用的深度
  69.     @tilemap = Tilemap.new($viewport1)  #——主窗口
  70.     @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
  71.     @tilemap2 = Tilemap.new($viewport4) #——右侧
  72.     @tilemap2.tileset = RPG::Cache.tileset($game_map.tileset_name)
  73.     @tilemap3 = Tilemap.new($viewport5) #——下侧
  74.     @tilemap3.tileset = RPG::Cache.tileset($game_map.tileset_name)
  75.     @tilemap4 = Tilemap.new($viewport6) #——右下角
  76.     @tilemap4.tileset = RPG::Cache.tileset($game_map.tileset_name)
  77.     for i in 0..6 #——生成自动元件
  78.       autotile_name = $game_map.autotile_names[i]
  79.       @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
  80.       @tilemap2.autotiles[i] = RPG::Cache.autotile(autotile_name)
  81.       @tilemap3.autotiles[i] = RPG::Cache.autotile(autotile_name)
  82.       @tilemap4.autotiles[i] = RPG::Cache.autotile(autotile_name)
  83.     end
  84.     @tilemap.map_data = $game_map.data  #——生成地图数据
  85.     @tilemap2.map_data = $game_map.data
  86.     @tilemap3.map_data = $game_map.data
  87.     @tilemap4.map_data = $game_map.data
  88.     @tilemap.priorities = $game_map.priorities  #——生成优先
  89.     @tilemap2.priorities = $game_map.priorities
  90.     @tilemap3.priorities = $game_map.priorities
  91.     @tilemap4.priorities = $game_map.priorities
  92.     @character_sprites = [] #——生成事件
  93.     for i in $game_map.events.keys.sort
  94.       sprite = Sprite_Character.new($viewport1, $game_map.events[i])
  95.       @character_sprites.push(sprite)
  96.       sprite = Sprite_Character.new($viewport4, $game_map.events[i])
  97.       @character_sprites.push(sprite)
  98.       sprite = Sprite_Character.new($viewport5, $game_map.events[i])
  99.       @character_sprites.push(sprite)
  100.       sprite = Sprite_Character.new($viewport6, $game_map.events[i])
  101.       @character_sprites.push(sprite)
  102.     end  #——下面继续生成角色
  103.     @character_sprites.push(Sprite_Character.new($viewport1, $game_player))
  104.     @character_sprites.push(Sprite_Character.new($viewport4, $game_player))
  105.     @character_sprites.push(Sprite_Character.new($viewport5, $game_player))
  106.     @character_sprites.push(Sprite_Character.new($viewport6, $game_player))
  107.     #——下面生成远景
  108.     @panorama = Plane.new($viewport1)
  109.     @panorama.z = -1000
  110.     @panorama2 = Plane.new($viewport4)
  111.     @panorama2.z = -1000
  112.     @panorama3 = Plane.new($viewport5)
  113.     @panorama3.z = -1000
  114.     @panorama4 = Plane.new($viewport6)
  115.     @panorama4.z = -1000
  116.     #——下面生成雾   
  117.     @fog = Plane.new($viewport1)
  118.     @fog.z = 3000
  119.     @fog2 = Plane.new($viewport4)
  120.     @fog2.z = 3000
  121.     @fog3 = Plane.new($viewport5)
  122.     @fog3.z = 3000
  123.     @fog4 = Plane.new($viewport6)
  124.     @fog4.z = 3000
  125.     #——下面生成天气
  126.     @weather = Weather.new(@viewport_weather)
  127.     @picture_sprites = [] #——这里生成图片
  128.     for i in 1..50
  129.       @picture_sprites.push(Sprite_Picture.new(@viewport2, $game_screen.pictures[i]))
  130.     end
  131.     @timer_sprite = Sprite_Timer.new #——生成计时器
  132.     #——刷新
  133.     update
  134.   end
  135.   #--------------------------------------------------------------------------
  136.   # ● 释放
  137.   #--------------------------------------------------------------------------
  138.   def dispose
  139.     @tilemap.tileset.dispose    #——释放元件地图
  140.     @tilemap2.tileset.dispose
  141.     @tilemap3.tileset.dispose
  142.     @tilemap4.tileset.dispose
  143.     for i in 0..6
  144.       @tilemap.autotiles[i].dispose
  145.       @tilemap2.autotiles[i].dispose
  146.       @tilemap3.autotiles[i].dispose
  147.       @tilemap4.autotiles[i].dispose
  148.     end
  149.     @tilemap.dispose
  150.     @tilemap2.dispose
  151.     @tilemap3.dispose
  152.     @tilemap4.dispose
  153.     @panorama.dispose    #——释放远景平面
  154.     @panorama2.dispose
  155.     @panorama3.dispose
  156.     @panorama4.dispose
  157.     @fog.dispose    #——释放雾平面
  158.     @fog2.dispose
  159.     @fog3.dispose
  160.     @fog4.dispose
  161.     for sprite in @character_sprites    #——释放角色活动块
  162.       sprite.dispose
  163.     end
  164.     @weather.dispose   
  165.     for sprite in @picture_sprites
  166.       sprite.dispose
  167.     end
  168.     # 释放计时器块
  169.     @timer_sprite.dispose
  170.     # 释放显示端口
  171.     $viewport1.dispose
  172.     @viewport2.dispose
  173.     @viewport3.dispose
  174.     $viewport4.dispose
  175.     $viewport5.dispose
  176.     $viewport6.dispose
  177.   end
  178.   #--------------------------------------------------------------------------
  179.   # ● 刷新画面
  180.   #--------------------------------------------------------------------------
  181.   def update
  182.     # 远景与现在的情况有差异发情况下
  183.     if @panorama_name != $game_map.panorama_name or  @panorama_hue != $game_map.panorama_hue
  184.       @panorama_name = $game_map.panorama_name
  185.       @panorama_hue = $game_map.panorama_hue
  186.       if @panorama.bitmap != nil
  187.         @panorama.bitmap.dispose
  188.         @panorama.bitmap = nil
  189.         @panorama2.bitmap.dispose
  190.         @panorama2.bitmap = nil
  191.         @panorama3.bitmap.dispose
  192.         @panorama3.bitmap = nil
  193.         @panorama4.bitmap.dispose
  194.         @panorama4.bitmap = nil
  195.       end
  196.       if @panorama_name != ""
  197.         @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  198.         @panorama2.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  199.         @panorama3.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  200.         @panorama4.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
  201.       end
  202.       Graphics.frame_reset
  203.     end
  204.     # 雾与现在的情况有差异的情况下
  205.     if @fog_name != $game_map.fog_name or @fog_hue != $game_map.fog_hue
  206.       @fog_name = $game_map.fog_name
  207.       @fog_hue = $game_map.fog_hue
  208.     if @fog.bitmap != nil
  209.       @fog.bitmap.dispose
  210.       @fog.bitmap = nil
  211.       @fog2.bitmap.dispose
  212.       @fog2.bitmap = nil
  213.       @fog3.bitmap.dispose
  214.       @fog3.bitmap = nil
  215.       @fog4.bitmap.dispose
  216.       @fog4.bitmap = nil
  217.     end
  218.     if @fog_name != ""
  219.       @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  220.       @fog2.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  221.       @fog3.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  222.       @fog4.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
  223.     end
  224.       Graphics.frame_reset
  225.     end
  226.     # 刷新元件地图
  227.     @tilemap.ox = $game_map.display_x / 4
  228.     @tilemap.oy = $game_map.display_y / 4
  229.     @tilemap.update
  230.     @tilemap2.ox = @tilemap.ox
  231.     @tilemap2.oy = @tilemap.oy
  232.     @tilemap2.update
  233.     @tilemap3.ox = @tilemap.ox
  234.     @tilemap3.oy = @tilemap.oy + 480
  235.     @tilemap3.update
  236.     @tilemap4.ox = @tilemap.ox
  237.     @tilemap4.oy = @tilemap.oy + 480
  238.     @tilemap4.update
  239.     # 刷新远景平面
  240.     @panorama.ox = $game_map.display_x / 8
  241.     @panorama.oy = $game_map.display_y / 8
  242.     @panorama2.ox = @panorama.ox
  243.     @panorama2.oy = @panorama.oy
  244.     @panorama3.ox = @panorama.ox
  245.     @panorama3.oy = @panorama.oy + 480
  246.     @panorama4.ox = @panorama.ox
  247.     @panorama4.oy = @panorama.oy + 480
  248.     # 刷新雾平面
  249.     @[email protected][email protected][email protected]_x = $game_map.fog_zoom / 100.0
  250.     @[email protected][email protected][email protected]_y = $game_map.fog_zoom / 100.0
  251.     @[email protected][email protected][email protected] = $game_map.fog_opacity
  252.     @[email protected][email protected][email protected]_type = $game_map.fog_blend_type
  253.     @fog4.tone = @fog3.tone = @fog2.tone = @fog.tone = $game_map.fog_tone
  254.     @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
  255.     @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
  256.     @fog2.ox = @fog.ox #+ 140#*@fog.zoom_x
  257.     @fog2.oy = @fog.oy
  258.     @fog3.ox = @fog.ox
  259.     @fog3.oy = @fog.oy + 480
  260.     @fog4.ox = @fog.ox
  261.     @fog4.oy = @fog.oy + 480
  262.     # 刷新角色活动块
  263.     for sprite in @character_sprites
  264.       sprite.update
  265.     end
  266.     # 刷新天候图形
  267.     @weather.type = $game_screen.weather_type
  268.     @weather.max = $game_screen.weather_max
  269.     @weather.ox = $game_map.display_x / 4
  270.     @weather.oy = $game_map.display_y / 4
  271.     @weather.update  
  272.     # 刷新图片
  273.     for sprite in @picture_sprites
  274.       sprite.update
  275.     end
  276.     # 刷新计时器块
  277.     @timer_sprite.update
  278.     # 设置画面的色调与震动位置
  279.     $viewport1.tone = $game_screen.tone
  280.     $viewport1.ox = $game_screen.shake
  281.     $viewport4.tone = $game_screen.tone
  282.     $viewport4.ox = $game_screen.shake+640
  283.     $viewport5.tone = $game_screen.tone
  284.     $viewport5.ox = $game_screen.shake  
  285.     $viewport6.tone = $game_screen.tone
  286.     $viewport6.ox = $game_screen.shake+640
  287.     # 设置画面的闪烁色
  288.     @viewport3.color = $game_screen.flash_color
  289.     # 刷新显示端口
  290.     $viewport1.update
  291.     @viewport3.update
  292.     $viewport4.update
  293.     $viewport5.update
  294.     $viewport6.update
  295.   end
  296. end
  297.   class Weather
  298.     def initialize(viewport = nil)
  299.       @type = 0
  300.       @max = 0
  301.       @ox = 0
  302.       @oy = 0
  303.       color1 = Color.new(255, 255, 255, 255)
  304.       color2 = Color.new(255, 255, 255, 128)
  305.       @rain_bitmap = Bitmap.new(7, 56)
  306.       for i in 0..6
  307.         @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
  308.       end
  309.       @storm_bitmap = Bitmap.new(34, 64)
  310.       for i in 0..31
  311.         @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
  312.         @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
  313.         @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
  314.       end
  315.       @snow_bitmap = Bitmap.new(6, 6)
  316.       @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
  317.       @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
  318.       @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
  319.       @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
  320.       @sprites = []
  321.       for i in 1..40
  322.         sprite = Sprite.new(viewport)
  323.         sprite.z = 1000
  324.         sprite.visible = false
  325.         sprite.opacity = 0
  326.         @sprites.push(sprite)
  327.       end
  328.     end
  329.     def dispose
  330.       for sprite in @sprites
  331.         sprite.dispose
  332.       end
  333.       @rain_bitmap.dispose
  334.       @storm_bitmap.dispose
  335.       @snow_bitmap.dispose
  336.     end
  337.     def type=(type)
  338.       return if @type == type
  339.       @type = type
  340.       case @type
  341.       when 1
  342.         bitmap = @rain_bitmap
  343.       when 2
  344.         bitmap = @storm_bitmap
  345.       when 3
  346.         bitmap = @snow_bitmap
  347.       else
  348.         bitmap = nil
  349.       end
  350.       for i in 1..40
  351.         sprite = @sprites[i]
  352.         if sprite != nil
  353.           sprite.visible = (i <= @max)
  354.           sprite.bitmap = bitmap
  355.         end
  356.       end
  357.     end
  358.     def ox=(ox)
  359.       return if @ox == ox;
  360.       @ox = ox
  361.       for sprite in @sprites
  362.         sprite.ox = @ox
  363.       end
  364.     end
  365.     def oy=(oy)
  366.       return if @oy == oy;
  367.       @oy = oy
  368.       for sprite in @sprites
  369.         sprite.oy = @oy
  370.       end
  371.     end
  372.     def max=(max)
  373.       return if @max == max;
  374.       @max = [[max, 0].max, 40].min
  375.       for i in 1..40
  376.         sprite = @sprites[i]
  377.         if sprite != nil
  378.           sprite.visible = (i <= @max)
  379.         end
  380.       end
  381.     end
  382.     def update
  383.       return if @type == 0
  384.       for i in 1..@max
  385.         sprite = @sprites[i]
  386.         if sprite == nil
  387.           break
  388.         end
  389.         if @type == 1
  390.           sprite.x -= 2
  391.           sprite.y += 16
  392.           sprite.opacity -= 8
  393.         end
  394.         if @type == 2
  395.           sprite.x -= 8
  396.           sprite.y += 16
  397.           sprite.opacity -= 12
  398.         end
  399.         if @type == 3
  400.           sprite.x -= 2
  401.           sprite.y += 8
  402.           sprite.opacity -= 8
  403.         end
  404.         x = sprite.x - @ox
  405.         y = sprite.y - @oy
  406.         if sprite.opacity < 64 or x < -50 or x > $width+150 or y < -300 or y > $height+100
  407.           sprite.x = rand($width+150) - 50 + @ox
  408.           sprite.y = rand($height+100) - 200 + @oy
  409.           sprite.opacity = 255
  410.         end
  411.       end
  412.     end
  413.     attr_reader :type
  414.     attr_reader :max
  415.     attr_reader :ox
  416.     attr_reader :oy
  417.   end
  418. #==============================================================================
  419. # ■ Game_Player
  420. #------------------------------------------------------------------------------
  421. #  处理主角的类。事件启动的判定、以及地图的滚动等功能。
  422. # 本类的实例请参考 $game_player。
  423. #==============================================================================

  424. class Game_Player < Game_Character
  425.   #--------------------------------------------------------------------------
  426.   # ● 恒量
  427.   #--------------------------------------------------------------------------
  428.   CENTER_X = ($width/2 - 16) * 4   
  429.   CENTER_Y = ($height/2 - 16) * 4   
  430.   #--------------------------------------------------------------------------
  431.   # ● 可以通行判定
  432.   #     x : X 坐标
  433.   #     y : Y 坐标
  434.   #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  435.   #--------------------------------------------------------------------------
  436.   def passable?(x, y, d)
  437.     # 求得新的坐标
  438.     new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
  439.     new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
  440.     # 坐标在地图外的情况下
  441.     unless $game_map.valid?(new_x, new_y)
  442.       # 不能通行
  443.       return false
  444.     end
  445.     # 调试模式为 ON 并且 按下 CTRL 键的情况下
  446.     if $DEBUG and Input.press?(Input::CTRL)
  447.       # 可以通行
  448.       return true
  449.     end
  450.     super
  451.   end
  452.   #--------------------------------------------------------------------------
  453.   # ● 像通到画面中央一样的设置地图的显示位置
  454.   #--------------------------------------------------------------------------
  455.   def center(x, y)
  456.     max_x = ($game_map.width - 20) * 128
  457.     max_y = ($game_map.height - 15) * 128
  458.     $game_map.display_x = [0, [x * 128 - CENTER_X, max_x].min].max
  459.     $game_map.display_y = [0, [y * 128 - CENTER_Y, max_y].min].max
  460.     $game_map.scroll_down(0)
  461.     $game_map.scroll_right(0)
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # ● 向指定的位置移动
  465.   #     x : X 座標
  466.   #     y : Y 座標
  467.   #--------------------------------------------------------------------------
  468.   def moveto(x, y)
  469.     super
  470.     # 自连接
  471.     center(x, y)
  472.     # 生成遇敌计数
  473.     make_encounter_count
  474.   end
  475.   #--------------------------------------------------------------------------
  476.   # ● 增加步数
  477.   #--------------------------------------------------------------------------
  478.   def increase_steps
  479.     super
  480.     # 不是强制移动路线的场合
  481.     unless @move_route_forcing
  482.       # 增加步数
  483.       $game_party.increase_steps
  484.       # 步数是偶数的情况下
  485.       if $game_party.steps % 2 == 0
  486.         # 检查连续伤害
  487.         $game_party.check_map_slip_damage
  488.       end
  489.     end
  490.   end
  491.   #--------------------------------------------------------------------------
  492.   # ● 获取遇敌计数
  493.   #--------------------------------------------------------------------------
  494.   def encounter_count
  495.     return @encounter_count
  496.   end
  497.   #--------------------------------------------------------------------------
  498.   # ● 生成遇敌计数
  499.   #--------------------------------------------------------------------------
  500.   def make_encounter_count
  501.     # 两种颜色震动的图像
  502.     if $game_map.map_id != 0
  503.       n = $game_map.encounter_step
  504.       @encounter_count = rand(n) + rand(n) + 1
  505.     end
  506.   end
  507.   #--------------------------------------------------------------------------
  508.   # ● 刷新
  509.   #--------------------------------------------------------------------------
  510.   def refresh
  511.     # 同伴人数为 0 的情况下
  512.     if $game_party.actors.size == 0
  513.       # 清除角色的文件名及对像
  514.       @character_name = ""
  515.       @character_hue = 0
  516.       # 分支结束
  517.       return
  518.     end
  519.     # 获取带头的角色
  520.     actor = $game_party.actors[0]
  521.     # 设置角色的文件名及对像
  522.     @character_name = actor.character_name
  523.     @character_hue = actor.character_hue
  524.     # 初始化不透明度和合成方式子
  525.     @opacity = 255
  526.     @blend_type = 0
  527.   end
  528.   #--------------------------------------------------------------------------
  529.   # ● 同位置的事件启动判定
  530.   #--------------------------------------------------------------------------
  531.   def check_event_trigger_here(triggers)
  532.     result = false
  533.     # 事件执行中的情况下
  534.     if $game_system.map_interpreter.running?
  535.       return result
  536.     end
  537.     # 全部事件的循环
  538.     for event in $game_map.events.values
  539.       # 事件坐标与目标一致的情况下
  540.       if event.x == @x and event.y == @y and triggers.include?(event.trigger)
  541.         # 跳跃中以外的情况下、启动判定是同位置的事件
  542.         if not event.jumping? and event.over_trigger?
  543.           event.start
  544.           result = true
  545.         end
  546.       end
  547.     end
  548.     return result
  549.   end
  550.   #--------------------------------------------------------------------------
  551.   # ● 正面事件的启动判定
  552.   #--------------------------------------------------------------------------
  553.   def check_event_trigger_there(triggers)
  554.     result = false
  555.     # 事件执行中的情况下
  556.     if $game_system.map_interpreter.running?
  557.       return result
  558.     end
  559.     # 计算正面坐标
  560.     new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  561.     new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  562.     # 全部事件的循环
  563.     for event in $game_map.events.values
  564.       # 事件坐标与目标一致的情况下
  565.       if event.x == new_x and event.y == new_y and
  566.          triggers.include?(event.trigger)
  567.         # 跳跃中以外的情况下、启动判定是正面的事件
  568.         if not event.jumping? and not event.over_trigger?
  569.           event.start
  570.           result = true
  571.         end
  572.       end
  573.     end
  574.     # 找不到符合条件的事件的情况下
  575.     if result == false
  576.       # 正面的元件是计数器的情况下
  577.       if $game_map.counter?(new_x, new_y)
  578.         # 计算 1 元件里侧的坐标
  579.         new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
  580.         new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
  581.         # 全事件的循环
  582.         for event in $game_map.events.values
  583.           # 事件坐标与目标一致的情况下
  584.           if event.x == new_x and event.y == new_y and
  585.              triggers.include?(event.trigger)
  586.             # 跳跃中以外的情况下、启动判定是正面的事件
  587.             if not event.jumping? and not event.over_trigger?
  588.               event.start
  589.               result = true
  590.             end
  591.           end
  592.         end
  593.       end
  594.     end
  595.     return result
  596.   end
  597.   #--------------------------------------------------------------------------
  598.   # ● 接触事件启动判定
  599.   #--------------------------------------------------------------------------
  600.   def check_event_trigger_touch(x, y)
  601.     result = false
  602.     # 事件执行中的情况下
  603.     if $game_system.map_interpreter.running?
  604.       return result
  605.     end
  606.     # 全事件的循环
  607.     for event in $game_map.events.values
  608.       # 事件坐标与目标一致的情况下
  609.       if event.x == x and event.y == y and [1,2].include?(event.trigger)
  610.         # 跳跃中以外的情况下、启动判定是正面的事件
  611.         if not event.jumping? and not event.over_trigger?
  612.           event.start
  613.           result = true
  614.         end
  615.       end
  616.     end
  617.     return result
  618.   end
  619.   #--------------------------------------------------------------------------
  620.   # ● 画面更新
  621.   #--------------------------------------------------------------------------
  622.   def update
  623.     # 本地变量记录移动信息
  624.     last_moving = moving?
  625.     # 移动中、事件执行中、强制移动路线中、
  626.     # 信息窗口一个也不显示的时候
  627.     unless moving? or $game_system.map_interpreter.running? or
  628.            @move_route_forcing or $game_temp.message_window_showing
  629.       # 如果方向键被按下、主角就朝那个方向移动
  630.       case Input.dir4
  631.       when 2
  632.         move_down
  633.       when 4
  634.         move_left
  635.       when 6
  636.         move_right
  637.       when 8
  638.         move_up
  639.       end
  640.     end
  641.     # 本地变量记忆坐标
  642.     last_real_x = @real_x
  643.     last_real_y = @real_y
  644.     super
  645.     # 角色向下移动、画面上的位置在中央下方的情况下
  646.     if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
  647.       # 画面向下卷动
  648.       $game_map.scroll_down(@real_y - last_real_y)
  649.     end
  650.     # 角色向左移动、画面上的位置在中央左方的情况下
  651.     if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
  652.       # 画面向左卷动
  653.       $game_map.scroll_left(last_real_x - @real_x)
  654.     end
  655.     # 角色向右移动、画面上的位置在中央右方的情况下
  656.     if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
  657.       # 画面向右卷动
  658.       $game_map.scroll_right(@real_x - last_real_x)
  659.     end
  660.     # 角色向上移动、画面上的位置在中央上方的情况下
  661.     if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
  662.       # 画面向上卷动
  663.       $game_map.scroll_up(last_real_y - @real_y)
  664.     end
  665.     # 不在移动中的情况下
  666.     unless moving?
  667.       # 上次主角移动中的情况
  668.       if last_moving
  669.         # 与同位置的事件接触就判定为事件启动
  670.         result = check_event_trigger_here([1,2])
  671.         # 没有可以启动的事件的情况下
  672.         if result == false
  673.           # 调试模式为 ON 并且按下 CTRL 键的情况下除外
  674.           unless $DEBUG and Input.press?(Input::CTRL)
  675.             # 遇敌计数下降
  676.             if @encounter_count > 0
  677.               @encounter_count -= 1
  678.             end
  679.           end
  680.         end
  681.       end
  682.       # 按下 C 键的情况下
  683.       if Input.trigger?(Input::C)
  684.         # 判定为同位置以及正面的事件启动
  685.         check_event_trigger_here([0])
  686.         check_event_trigger_there([0,1,2])
  687.       end
  688.     end
  689.   end
  690. end
  691. #==============================================================================
  692. # ■ Scene_Gameover
  693. #------------------------------------------------------------------------------
  694. #  处理游戏结束画面的类。
  695. #==============================================================================

  696. class Scene_Gameover
  697.   #--------------------------------------------------------------------------
  698.   # ● 主处理
  699.   #--------------------------------------------------------------------------
  700.   def main
  701.     # 生成游戏结束图形
  702.     if $game_temp.in_battle
  703.       @temp_sprite = Spriteset_Battle.new
  704.     else
  705.       @temp_sprite = Spriteset_Map.new
  706.     end
  707.     @sprite = Sprite.new
  708.     @sprite.bitmap = RPG::Cache.gameover($data_system.gameover_name)
  709.     @sprite.opacity = 0
  710.     # 停止 BGM、BGS
  711.     $game_system.bgm_play(nil)
  712.     $game_system.bgs_play(nil)
  713.     # 演奏游戏结束 ME
  714.     $game_system.me_play($data_system.gameover_me)
  715.     # 执行过渡
  716.     Graphics.transition(0)
  717.     # 主循环
  718.     for i in 0..120
  719.       @sprite.opacity +=4
  720.       Graphics.update
  721.     end
  722.     @temp_sprite.dispose
  723.     loop do
  724.       # 刷新游戏画面
  725.       Graphics.update
  726.       # 刷新输入信息
  727.       Input.update
  728.       # 刷新画面情报
  729.       update
  730.       # 如果画面被切换的话就中断循环
  731.       if $scene != self
  732.         break
  733.       end
  734.     end
  735.     # 释放游戏结束图形
  736.     @sprite.bitmap.dispose
  737.     @sprite.dispose
  738.     # 执行过度
  739.     Graphics.transition(0)
  740.     # 准备过渡
  741.     if $BTEST
  742.       $scene = nil
  743.     end
  744.   end
  745.   #--------------------------------------------------------------------------
  746.   # ● 刷新画面
  747.   #--------------------------------------------------------------------------
  748.   def update
  749.     # 按下 C 键的情况下
  750.     if Input.trigger?(Input::C)
  751.       for i in 0..30
  752.         @sprite.opacity -=10
  753.         Graphics.update
  754.       end      
  755.       # 切换到标题画面
  756.       $scene = Scene_Title.new
  757.     end
  758.   end
  759. end
  760. #==============================================================================
  761. # ■ Scene_Title
  762. #------------------------------------------------------------------------------
  763. #  处理标题画面的类。
  764. #==============================================================================

  765. class Scene_Title
  766.   #--------------------------------------------------------------------------
  767.   # ● 住处理
  768.   #--------------------------------------------------------------------------
  769.   def main
  770.     # 战斗测试的情况下
  771.     if $BTEST
  772.       battle_test
  773.       return
  774.     end
  775.     # 载入数据库
  776.     $data_actors        = load_data("Data/Actors.rxdata")
  777.     $data_classes       = load_data("Data/Classes.rxdata")
  778.     $data_skills        = load_data("Data/Skills.rxdata")
  779.     $data_items         = load_data("Data/Items.rxdata")
  780.     $data_weapons       = load_data("Data/Weapons.rxdata")
  781.     $data_armors        = load_data("Data/Armors.rxdata")
  782.     $data_enemies       = load_data("Data/Enemies.rxdata")
  783.     $data_troops        = load_data("Data/Troops.rxdata")
  784.     $data_states        = load_data("Data/States.rxdata")
  785.     $data_animations    = load_data("Data/Animations.rxdata")
  786.     $data_tilesets      = load_data("Data/Tilesets.rxdata")
  787.     $data_common_events = load_data("Data/CommonEvents.rxdata")
  788.     $data_system        = load_data("Data/System.rxdata")
  789.     # 生成系统对像
  790.     $game_system = Game_System.new
  791.     # 生成标题图形
  792.     @sprite = Sprite.new
  793.     @sprite.bitmap = RPG::Cache.title($data_system.title_name)
  794.     @sprite.opacity = 0
  795.     # 生成命令窗口
  796.     s1 = "新游戏"
  797.     s2 = "继续"
  798.     s3 = "退出"
  799.     @command_window = Window_Command.new(192, [s1, s2, s3])
  800.     @command_window.back_opacity = 160
  801.     @command_window.x = $width /2 - @command_window.width / 2
  802.     @command_window.y = $height  /2 +132
  803.     # 判定继续的有效性
  804.     # 存档文件一个也不存在的时候也调查
  805.     # 有効为 @continue_enabled 为 true、無効为 false
  806.     @continue_enabled = false
  807.     for i in 0..3
  808.       if FileTest.exist?("Save#{i+1}.rxdata")
  809.         @continue_enabled = true
  810.       end
  811.     end
  812.     # 继续为有效的情况下、光标停止在继续上
  813.     # 无效的情况下、继续的文字显示为灰色
  814.     if @continue_enabled
  815.       @command_window.index = 1
  816.     else
  817.       @command_window.disable_item(1)
  818.     end
  819.     # 演奏标题 BGM
  820.     $game_system.bgm_play($data_system.title_bgm)
  821.     # 停止演奏 ME、BGS
  822.     Audio.me_stop
  823.     Audio.bgs_stop
  824.     # 执行过渡
  825.     Graphics.transition(0)
  826.     # 主循环
  827.     loop do
  828.       # 刷新游戏画面
  829.       Graphics.update
  830.       # 刷新输入信息
  831.       Input.update
  832.       # 刷新画面
  833.       update
  834.       # 如果画面被切换就中断循环
  835.       if $scene != self
  836.         break
  837.       end
  838.     end
  839.     # 装备过渡
  840.     Graphics.freeze
  841.     # 释放命令窗口
  842.     @command_window.dispose
  843.     # 释放标题图形
  844.     @sprite.bitmap.dispose
  845.     @sprite.dispose
  846.   end
  847.   #--------------------------------------------------------------------------
  848.   # ● 刷新画面
  849.   #--------------------------------------------------------------------------
  850.   def update
  851.     if @sprite.opacity < 255
  852.       @sprite.opacity += 15
  853.     end   
  854.     # 刷新命令窗口
  855.     @command_window.update
  856.     # 按下 C 键的情况下
  857.     if Input.trigger?(Input::C)
  858.       # 命令窗口的光标位置的分支
  859.       case @command_window.index
  860.       when 0  # 新游戏
  861.         command_new_game
  862.       when 1  # 继续
  863.         command_continue
  864.       when 2  # 退出
  865.         command_shutdown
  866.       end
  867.     end
  868.   end
  869.   #--------------------------------------------------------------------------
  870.   # ● 命令 : 新游戏
  871.   #--------------------------------------------------------------------------
  872.   def command_new_game
  873.     # 演奏确定 SE
  874.     $game_system.se_play($data_system.decision_se)
  875.     # 停止 BGM
  876.     Audio.bgm_stop
  877.     # 重置测量游戏时间用的画面计数器
  878.     Graphics.frame_count = 0
  879.     # 生成各种游戏对像
  880.     $game_temp          = Game_Temp.new
  881.     $game_system        = Game_System.new
  882.     $game_switches      = Game_Switches.new
  883.     $game_variables     = Game_Variables.new
  884.     $game_self_switches = Game_SelfSwitches.new
  885.     $game_screen        = Game_Screen.new
  886.     $game_actors        = Game_Actors.new
  887.     $game_party         = Game_Party.new
  888.     $game_troop         = Game_Troop.new
  889.     $game_map           = Game_Map.new
  890.     $game_player        = Game_Player.new
  891.     # 设置初期同伴位置
  892.     $game_party.setup_starting_members
  893.     # 设置初期位置的地图
  894.     $game_map.setup($data_system.start_map_id)
  895.     # 主角向初期位置移动
  896.     $game_player.moveto($data_system.start_x, $data_system.start_y)
  897.     # 刷新主角
  898.     $game_player.refresh
  899.     # 执行地图设置的 BGM 与 BGS 的自动切换
  900.     $game_map.autoplay
  901.     # 刷新地图 (执行并行事件)
  902.     $game_map.update
  903.     # 切换地图画面
  904.     $scene = Scene_Map.new
  905.   end
  906.   #--------------------------------------------------------------------------
  907.   # ● 命令 : 继续
  908.   #--------------------------------------------------------------------------
  909.   def command_continue
  910.     # 继续无效的情况下
  911.     unless @continue_enabled
  912.       # 演奏无效 SE
  913.       $game_system.se_play($data_system.buzzer_se)
  914.       return
  915.     end
  916.     # 演奏确定 SE
  917.     $game_system.se_play($data_system.decision_se)
  918.     # 切换到读档画面
  919.     $scene = Scene_Load.new
  920.   end
  921.   #--------------------------------------------------------------------------
  922.   # ● 命令 : 退出
  923.   #--------------------------------------------------------------------------
  924.   def command_shutdown
  925.     # 演奏确定 SE
  926.     $game_system.se_play($data_system.decision_se)
  927.     # BGM、BGS、ME 的淡入淡出
  928.     Audio.bgm_fade(800)
  929.     Audio.bgs_fade(800)
  930.     Audio.me_fade(800)
  931.     # 退出
  932.     tempBitmap = Sprite.new
  933.     tempBitmap.bitmap = Bitmap.new($width,$height)
  934.     tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  935.     tempBitmap.opacity = 0
  936.     for i in 0..20
  937.       tempBitmap.opacity+=14
  938.       Graphics.update
  939.     end
  940.     $scene = nil
  941.   end
  942.   #--------------------------------------------------------------------------
  943.   # ● 战斗测试
  944.   #--------------------------------------------------------------------------
  945.   def battle_test
  946.     # 载入数据库 (战斗测试用)
  947.     $data_actors        = load_data("Data/BT_Actors.rxdata")
  948.     $data_classes       = load_data("Data/BT_Classes.rxdata")
  949.     $data_skills        = load_data("Data/BT_Skills.rxdata")
  950.     $data_items         = load_data("Data/BT_Items.rxdata")
  951.     $data_weapons       = load_data("Data/BT_Weapons.rxdata")
  952.     $data_armors        = load_data("Data/BT_Armors.rxdata")
  953.     $data_enemies       = load_data("Data/BT_Enemies.rxdata")
  954.     $data_troops        = load_data("Data/BT_Troops.rxdata")
  955.     $data_states        = load_data("Data/BT_States.rxdata")
  956.     $data_animations    = load_data("Data/BT_Animations.rxdata")
  957.     $data_tilesets      = load_data("Data/BT_Tilesets.rxdata")
  958.     $data_common_events = load_data("Data/BT_CommonEvents.rxdata")
  959.     $data_system        = load_data("Data/BT_System.rxdata")
  960.     # 重置测量游戏时间用的画面计数器
  961.     Graphics.frame_count = 0
  962.     # 生成各种游戏对像
  963.     $game_temp          = Game_Temp.new
  964.     $game_system        = Game_System.new
  965.     $game_switches      = Game_Switches.new
  966.     $game_variables     = Game_Variables.new
  967.     $game_self_switches = Game_SelfSwitches.new
  968.     $game_screen        = Game_Screen.new
  969.     $game_actors        = Game_Actors.new
  970.     $game_party         = Game_Party.new
  971.     $game_troop         = Game_Troop.new
  972.     $game_map           = Game_Map.new
  973.     $game_player        = Game_Player.new
  974.     # 设置战斗测试用同伴
  975.     $game_party.setup_battle_test_members
  976.     # 设置队伍 ID、可以逃走标志、战斗背景
  977.     $game_temp.battle_troop_id = $data_system.test_troop_id
  978.     $game_temp.battle_can_escape = true
  979.     $game_map.battleback_name = $data_system.battleback_name
  980.     # 演奏战斗开始 BGM
  981.     $game_system.se_play($data_system.battle_start_se)
  982.     # 演奏战斗 BGM
  983.     $game_system.bgm_play($game_system.battle_bgm)
  984.     # 切换到战斗画面
  985.     $scene = Scene_Battle.new
  986.   end
  987. end
  988. #==============================================================================
  989. # ■ Scene_Map
  990. #------------------------------------------------------------------------------
  991. #  处理地图画面的类。
  992. #==============================================================================

  993. class Scene_Map
  994.   #--------------------------------------------------------------------------
  995.   # ● 主处理
  996.   #--------------------------------------------------------------------------
  997.   def main
  998.    
  999.    
  1000.     # @@@@@@@@@@@@@@@@@@
  1001.     @window_hp = Window_ARPGStatus.new(@actor)
  1002.    # @@@@@@@@@@@@@@@@@@@@
  1003.    
  1004.    
  1005.     # 生成活动块
  1006.     @spriteset = Spriteset_Map.new
  1007.     # 生成信息窗口
  1008.     @message_window = Window_Message.new
  1009.     tempBitmap = Sprite.new
  1010.     tempBitmap.bitmap = Bitmap.new($width,$height)
  1011.     tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  1012.      # 执行过渡
  1013.     Graphics.transition(0)
  1014.     for i in 0..10
  1015.       tempBitmap.opacity-=25
  1016.       Graphics.update
  1017.     end
  1018.     tempBitmap.bitmap.dispose
  1019.     tempBitmap.dispose
  1020.     # 主循环
  1021.     loop do
  1022.       # 刷新游戏画面
  1023.       Graphics.update
  1024.       # 刷新输入信息
  1025.       Input.update
  1026.       # 刷新画面
  1027.       update
  1028.       # 如果画面切换的话就中断循环
  1029.       if $scene != self
  1030.         break
  1031.       end
  1032.     end
  1033.     # 标题画面切换中的情况下
  1034.     if $scene.is_a?(Scene_Title)
  1035.       @message_window.dispose
  1036.       tempBitmap = Sprite.new
  1037.       tempBitmap.bitmap = Bitmap.new($width,$height)
  1038.       tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  1039.       tempBitmap.opacity = 0
  1040.       for i in 0..25
  1041.         tempBitmap.opacity +=11
  1042.         Graphics.update
  1043.       end
  1044.       tempBitmap.bitmap.dispose
  1045.       tempBitmap.dispose
  1046.       Graphics.transition(0)
  1047.       @spriteset.dispose
  1048.     else
  1049.       @message_window.dispose
  1050.       #@@@@@@@@@@@@@@@@@@@@@@@@
  1051.     @window_hp.dispose
  1052.     # @@@@@@@@@@@@@@@@@@@@@@@
  1053.       @spriteset.dispose
  1054.     end
  1055.   end
  1056.   #--------------------------------------------------------------------------
  1057.   # ● 刷新画面
  1058.   #--------------------------------------------------------------------------
  1059.   def update
  1060.      #@@@@@@@@@@@@@@@@@@@@@@@@
  1061.     @window_hp.update
  1062.      #@@@@@@@@@@@@@@@@@@@@@@@@
  1063.     # 循环
  1064.     loop do
  1065.       # 按照地图、实例、主角的顺序刷新
  1066.       # (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
  1067.       #  的机会的重要因素)
  1068.       $game_map.update
  1069.       $game_system.map_interpreter.update
  1070.       $game_player.update
  1071.       # 系统 (计时器)、画面刷新
  1072.       $game_system.update
  1073.       $game_screen.update
  1074.       # 如果主角在场所移动中就中断循环
  1075.       unless $game_temp.player_transferring
  1076.         break
  1077.       end
  1078.       # 执行场所移动
  1079.       transfer_player
  1080.       # 处理过渡中的情况下、中断循环
  1081.       if $game_temp.transition_processing
  1082.         break
  1083.       end
  1084.     end
  1085.     # 刷新活动块
  1086.     @spriteset.update
  1087.     # 刷新信息窗口
  1088.     @message_window.update
  1089.     # 游戏结束的情况下
  1090.     if $game_temp.gameover
  1091.       # 切换的游戏结束画面
  1092.       $scene = Scene_Gameover.new
  1093.       return
  1094.     end
  1095.     # 返回标题画面的情况下
  1096.     if $game_temp.to_title
  1097.       # 切换到标题画面
  1098.       $scene = Scene_Title.new
  1099.       return
  1100.     end
  1101.     # 处理过渡中的情况下
  1102.     if $game_temp.transition_processing
  1103.       # 清除过渡处理中标志
  1104.       $game_temp.transition_processing = false
  1105.       # 执行过渡
  1106.       Graphics.transition(0)
  1107.     end
  1108.     # 显示信息窗口中的情况下
  1109.     if $game_temp.message_window_showing
  1110.       return
  1111.     end
  1112.     # 遇敌计数为 0 且、且遇敌列表不为空的情况下
  1113.     if $game_player.encounter_count == 0 and $game_map.encounter_list != []
  1114.       # 不是在事件执行中或者禁止遇敌中
  1115.       unless $game_system.map_interpreter.running? or
  1116.              $game_system.encounter_disabled
  1117.         # 确定队伍
  1118.         n = rand($game_map.encounter_list.size)
  1119.         troop_id = $game_map.encounter_list[n]
  1120.         # 队伍有效的话
  1121.         if $data_troops[troop_id] != nil
  1122.           # 设置调用战斗标志
  1123.           $game_temp.battle_calling = true
  1124.           $game_temp.battle_troop_id = troop_id
  1125.           $game_temp.battle_can_escape = true
  1126.           $game_temp.battle_can_lose = false
  1127.           $game_temp.battle_proc = nil
  1128.         end
  1129.       end
  1130.     end
  1131.     # 按下 B 键的情况下
  1132.     if Input.trigger?(Input::B)
  1133.       # 不是在事件执行中或菜单禁止中
  1134.       unless $game_system.map_interpreter.running? or
  1135.              $game_system.menu_disabled
  1136.         # 设置菜单调用标志以及 SE 演奏
  1137.         $game_temp.menu_calling = true
  1138.         $game_temp.menu_beep = true
  1139.       end
  1140.     end
  1141.     # 调试模式为 ON 并且按下 F9 键的情况下
  1142.     if $DEBUG and Input.press?(Input::F9)
  1143.       # 设置调用调试标志
  1144.       $game_temp.debug_calling = true
  1145.     end
  1146.     # 不在主角移动中的情况下
  1147.     unless $game_player.moving?
  1148.       # 执行各种画面的调用
  1149.       if $game_temp.battle_calling
  1150.         call_battle
  1151.       elsif $game_temp.shop_calling
  1152.         call_shop
  1153.       elsif $game_temp.name_calling
  1154.         call_name
  1155.       elsif $game_temp.menu_calling
  1156.         call_menu
  1157.       elsif $game_temp.save_calling
  1158.         call_save
  1159.       elsif $game_temp.debug_calling
  1160.         call_debug
  1161.       end
  1162.     end
  1163.   end
  1164.   #--------------------------------------------------------------------------
  1165.   # ● 调用战斗
  1166.   #--------------------------------------------------------------------------
  1167.   def call_battle
  1168.     # 清除战斗调用标志
  1169.     $game_temp.battle_calling = false
  1170.     # 清除菜单调用标志
  1171.     $game_temp.menu_calling = false
  1172.     $game_temp.menu_beep = false
  1173.     # 生成遇敌计数
  1174.     $game_player.make_encounter_count
  1175.     # 记忆地图 BGM 、停止 BGM
  1176.     $game_temp.map_bgm = $game_system.playing_bgm
  1177.     $game_system.bgm_stop
  1178.     # 演奏战斗开始 SE
  1179.     $game_system.se_play($data_system.battle_start_se)
  1180.     # 演奏战斗 BGM
  1181.     $game_system.bgm_play($game_system.battle_bgm)
  1182.     # 矫正主角姿势
  1183.     $game_player.straighten
  1184.     # 切换到战斗画面
  1185.     $scene = Scene_Battle.new
  1186.   end
  1187.   #--------------------------------------------------------------------------
  1188.   # ● 调用商店
  1189.   #--------------------------------------------------------------------------
  1190.   def call_shop
  1191.     # 清除商店调用标志
  1192.     $game_temp.shop_calling = false
  1193.     # 矫正主角姿势
  1194.     $game_player.straighten
  1195.     # 切换到商店画面
  1196.     $scene = Scene_Shop.new
  1197.   end
  1198.   #--------------------------------------------------------------------------
  1199.   # ● 调用名称输入
  1200.   #--------------------------------------------------------------------------
  1201.   def call_name
  1202.     # 清除商店调用名称输入标志
  1203.     $game_temp.name_calling = false
  1204.     # 矫正主角姿势
  1205.     $game_player.straighten
  1206.     # 切换到名称输入画面
  1207.     $scene = Scene_Name.new
  1208.   end
  1209.   #--------------------------------------------------------------------------
  1210.   # ● 调用菜单
  1211.   #--------------------------------------------------------------------------
  1212.   def call_menu
  1213.     # 清除商店调用菜单标志
  1214.     $game_temp.menu_calling = false
  1215.     # 已经设置了菜单 SE 演奏标志的情况下
  1216.     if $game_temp.menu_beep
  1217.       # 演奏确定 SE
  1218.       $game_system.se_play($data_system.decision_se)
  1219.       # 清除菜单演奏 SE 标志
  1220.       $game_temp.menu_beep = false
  1221.     end
  1222.     # 矫正主角姿势
  1223.     $game_player.straighten
  1224.     # 切换到菜单画面
  1225.     $scene = Scene_Menu.new
  1226.   end
  1227.   #--------------------------------------------------------------------------
  1228.   # ● 调用存档
  1229.   #--------------------------------------------------------------------------
  1230.   def call_save
  1231.     # 矫正主角姿势
  1232.     $game_player.straighten
  1233.     # 切换到存档画面
  1234.     $scene = Scene_Save.new
  1235.   end
  1236.   #--------------------------------------------------------------------------
  1237.   # ● 调用调试
  1238.   #--------------------------------------------------------------------------
  1239.   def call_debug
  1240.     # 清除商店调用调试标志
  1241.     $game_temp.debug_calling = false
  1242.     # 演奏确定 SE
  1243.     $game_system.se_play($data_system.decision_se)
  1244.     # 矫正主角姿势
  1245.     $game_player.straighten
  1246.     # 切换到调试画面
  1247.     $scene = Scene_Debug.new
  1248.   end
  1249.   #--------------------------------------------------------------------------
  1250.   # ● 主角的场所移动
  1251.   #--------------------------------------------------------------------------
  1252.   def transfer_player
  1253.     # 清除主角场所移动调试标志
  1254.     $game_temp.player_transferring = false
  1255.     # 移动目标与现在的地图有差异的情况下
  1256.     if $game_map.map_id != $game_temp.player_new_map_id
  1257.       # 设置新地图
  1258.       $game_map.setup($game_temp.player_new_map_id)
  1259.     end
  1260.     # 设置主角位置
  1261.     $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
  1262.     # 设置主角朝向
  1263.     case $game_temp.player_new_direction
  1264.     when 2  # 下
  1265.       $game_player.turn_down
  1266.     when 4  # 左
  1267.       $game_player.turn_left
  1268.     when 6  # 右
  1269.       $game_player.turn_right
  1270.     when 8  # 上
  1271.       $game_player.turn_up
  1272.     end
  1273.     # 矫正主角姿势
  1274.     $game_player.straighten
  1275.     # 刷新地图 (执行并行事件)
  1276.     $game_map.update
  1277.     # 在生成活动块
  1278.     @spriteset.dispose
  1279.     @spriteset = Spriteset_Map.new
  1280.     # 处理过渡中的情况下
  1281.     if $game_temp.transition_processing
  1282.       # 清除过渡处理中标志
  1283.       $game_temp.transition_processing = false
  1284.       # 执行过渡
  1285.       $_t_Bitmap=Sprite.new
  1286.       $_t_Bitmap.bitmap = Bitmap.new($width,$height)
  1287.       $_t_Bitmap.bitmap.fill_rect(0,0,$width,$height,Color.new(0,0,0,255))
  1288.       Graphics.transition(0)
  1289.       for i in 0..10
  1290.         $_t_Bitmap.opacity-=26
  1291.         Graphics.update
  1292.       end
  1293.       $_t_Bitmap.bitmap.dispose
  1294.       $_t_Bitmap.dispose
  1295.     end
  1296.     # 执行地图设置的 BGM、BGS 的自动切换
  1297.     $game_map.autoplay
  1298.     # 设置画面
  1299.     Graphics.frame_reset
  1300.     # 刷新输入信息
  1301.     Input.update
  1302.   end
  1303. end
  1304. #==============================================================================
  1305. # ■ Interpreter (分割定义 5)
  1306. #------------------------------------------------------------------------------
  1307. #  执行事件命令的注释器。本类在 Game_System 类
  1308. # 和 Game_Event 类的内部使用。
  1309. #==============================================================================

  1310. class Interpreter
  1311.   #--------------------------------------------------------------------------
  1312.   # ● 场所移动
  1313.   #--------------------------------------------------------------------------
  1314.   def command_201
  1315.     # 战斗中的情况
  1316.     if $game_temp.in_battle
  1317.       # 继续
  1318.       return true
  1319.     end
  1320.     # 场所移动中、信息显示中、过渡处理中的情况下
  1321.     if $game_temp.player_transferring or
  1322.        $game_temp.message_window_showing or
  1323.        $game_temp.transition_processing
  1324.       # 结束
  1325.       return false
  1326.     end
  1327.     # 设置场所移动标志
  1328.     $game_temp.player_transferring = true
  1329.     # 指定方法为 [直接指定] 的情况下
  1330.     if @parameters[0] == 0
  1331.       # 设置主角的移动目标
  1332.       $game_temp.player_new_map_id = @parameters[1]
  1333.       $game_temp.player_new_x = @parameters[2]
  1334.       $game_temp.player_new_y = @parameters[3]
  1335.       $game_temp.player_new_direction = @parameters[4]
  1336.     # 指定方法为 [使用变量指定] 的情况下
  1337.     else
  1338.       # 设置主角的移动目标
  1339.       $game_temp.player_new_map_id = $game_variables[@parameters[1]]
  1340.       $game_temp.player_new_x = $game_variables[@parameters[2]]
  1341.       $game_temp.player_new_y = $game_variables[@parameters[3]]
  1342.       $game_temp.player_new_direction = @parameters[4]
  1343.     end
  1344.     # 推进索引
  1345.     @index += 1
  1346.     # 有淡入淡出的情况下
  1347.     if @parameters[5] == 0
  1348.       # 准备过渡   
  1349.       tempBitmap = Sprite.new
  1350.       tempBitmap.bitmap = Bitmap.new($width,$height)
  1351.       tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
  1352.       tempBitmap.opacity = 0
  1353.       for i in 0..10
  1354.         tempBitmap.opacity+=26
  1355.         Graphics.update
  1356.       end
  1357.       Graphics.freeze
  1358.       tempBitmap.bitmap.dispose
  1359.       tempBitmap.dispose
  1360.       # 设置过渡处理中标志
  1361.       $game_temp.transition_processing = true
  1362.       $game_temp.transition_name = ""
  1363.     end
  1364.     # 结束
  1365.     return false
  1366.   end
  1367.   #--------------------------------------------------------------------------
  1368.   # ● 设置事件位置
  1369.   #--------------------------------------------------------------------------
  1370.   def command_202
  1371.     # 战斗中的情况下
  1372.     if $game_temp.in_battle
  1373.       # 继续
  1374.       return true
  1375.     end
  1376.     # 获取角色
  1377.     character = get_character(@parameters[0])
  1378.     # 角色不存在的情况下
  1379.     if character == nil
  1380.       # 继续
  1381.       return true
  1382.     end
  1383.     # 指定方法为 [直接指定] 的情况下
  1384.     if @parameters[1] == 0
  1385.       # 设置角色的位置
  1386.       character.moveto(@parameters[2], @parameters[3])
  1387.     # 指定方法为 [使用变量指定] 的情况下
  1388.     elsif @parameters[1] == 1
  1389.       # 设置角色的位置
  1390.       character.moveto($game_variables[@parameters[2]],
  1391.         $game_variables[@parameters[3]])
  1392.     # 指定方法为 [与其它事件交换] 的情况下
  1393.     else
  1394.       old_x = character.x
  1395.       old_y = character.y
  1396.       character2 = get_character(@parameters[2])
  1397.       if character2 != nil
  1398.         character.moveto(character2.x, character2.y)
  1399.         character2.moveto(old_x, old_y)
  1400.       end
  1401.     end
  1402.     # 设置觉得的朝向
  1403.     case @parameters[4]
  1404.     when 8  # 上
  1405.       character.turn_up
  1406.     when 6  # 右
  1407.       character.turn_right
  1408.     when 2  # 下
  1409.       character.turn_down
  1410.     when 4  # 左
  1411.       character.turn_left
  1412.     end
  1413.     # 继续
  1414.     return true
  1415.   end
  1416.   #--------------------------------------------------------------------------
  1417.   # ● 地图的滚动
  1418.   #--------------------------------------------------------------------------
  1419.   def command_203
  1420.     # 战斗中的情况下
  1421.     if $game_temp.in_battle
  1422.       # 继续
  1423.       return true
  1424.     end
  1425.     # 已经在滚动中的情况下
  1426.     if $game_map.scrolling?
  1427.       # 结束
  1428.       return false
  1429.     end
  1430.     # 开始滚动
  1431.     $game_map.start_scroll(@parameters[0], @parameters[1], @parameters[2])
  1432.     # 继续
  1433.     return true
  1434.   end
  1435.   #--------------------------------------------------------------------------
  1436.   # ● 更改地图设置
  1437.   #--------------------------------------------------------------------------
  1438.   def command_204
  1439.     case @parameters[0]
  1440.     when 0  # 远景
  1441.       $game_map.panorama_name = @parameters[1]
  1442.       $game_map.panorama_hue = @parameters[2]
  1443.     when 1  # 雾
  1444.       $game_map.fog_name = @parameters[1]
  1445.       $game_map.fog_hue = @parameters[2]
  1446.       $game_map.fog_opacity = @parameters[3]
  1447.       $game_map.fog_blend_type = @parameters[4]
  1448.       $game_map.fog_zoom = @parameters[5]
  1449.       $game_map.fog_sx = @parameters[6]
  1450.       $game_map.fog_sy = @parameters[7]
  1451.     when 2  # 战斗背景
  1452.       $game_map.battleback_name = @parameters[1]
  1453.       $game_temp.battleback_name = @parameters[1]
  1454.     end
  1455.     # 继续
  1456.     return true
  1457.   end
  1458.   #--------------------------------------------------------------------------
  1459.   # ● 更改雾的色调
  1460.   #--------------------------------------------------------------------------
  1461.   def command_205
  1462.     # 开始更改色调
  1463.     $game_map.start_fog_tone_change(@parameters[0], @parameters[1] * 2)
  1464.     # 继续
  1465.     return true
  1466.   end
  1467.   #--------------------------------------------------------------------------
  1468.   # ● 更改雾的不透明度
  1469.   #--------------------------------------------------------------------------
  1470.   def command_206
  1471.     # 开始更改不透明度
  1472.     $game_map.start_fog_opacity_change(@parameters[0], @parameters[1] * 2)
  1473.     # 继续
  1474.     return true
  1475.   end
  1476.   #--------------------------------------------------------------------------
  1477.   # ● 显示动画
  1478.   #--------------------------------------------------------------------------
  1479.   def command_207
  1480.     # 获取角色
  1481.     character = get_character(@parameters[0])
  1482.     # 角色不存在的情况下
  1483.     if character == nil
  1484.       # 继续
  1485.       return true
  1486.     end
  1487.     # 设置动画 ID
  1488.     character.animation_id = @parameters[1]
  1489.     # 继续
  1490.     return true
  1491.   end
  1492.   #--------------------------------------------------------------------------
  1493.   # ● 更改透明状态
  1494.   #--------------------------------------------------------------------------
  1495.   def command_208
  1496.     # 设置主角的透明状态
  1497.     $game_player.transparent = (@parameters[0] == 0)
  1498.     # 继续
  1499.     return true
  1500.   end
  1501.   #--------------------------------------------------------------------------
  1502.   # ● 设置移动路线
  1503.   #--------------------------------------------------------------------------
  1504.   def command_209
  1505.     # 获取角色
  1506.     character = get_character(@parameters[0])
  1507.     # 角色不存在的情况下
  1508.     if character == nil
  1509.       # 继续
  1510.       return true
  1511.     end
  1512.     # 强制移动路线
  1513.     character.force_move_route(@parameters[1])
  1514.     # 继续
  1515.     return true
  1516.   end
  1517.   #--------------------------------------------------------------------------
  1518.   # ● 移动结束后等待
  1519.   #--------------------------------------------------------------------------
  1520.   def command_210
  1521.     # 如果不在战斗中
  1522.     unless $game_temp.in_battle
  1523.       # 设置移动结束后待机标志
  1524.       @move_route_waiting = true
  1525.     end
  1526.     # 继续
  1527.     return true
  1528.   end
  1529.   #--------------------------------------------------------------------------
  1530.   # ● 开始过渡
  1531.   #--------------------------------------------------------------------------
  1532.   def command_221
  1533.     # 显示信息窗口中的情况下
  1534.     if $game_temp.message_window_showing
  1535.       # 结束
  1536.       return false
  1537.     end
  1538.     # 准备过渡
  1539.     Graphics.freeze
  1540.     # 继续
  1541.     return true
  1542.   end
  1543.   #--------------------------------------------------------------------------
  1544.   # ● 执行过渡
  1545.   #--------------------------------------------------------------------------
  1546.   def command_222
  1547.     # 已经设置了过渡处理中标志的情况下
  1548.     if $game_temp.transition_processing
  1549.       # 结束
  1550.       return false
  1551.     end
  1552.     # 设置过渡处理中标志
  1553.     $game_temp.transition_processing = true
  1554.     $game_temp.transition_name = @parameters[0]
  1555.     # 推进索引
  1556.     @index += 1
  1557.     # 结束
  1558.     return false
  1559.   end
  1560.   #--------------------------------------------------------------------------
  1561.   # ● 更改画面色调
  1562.   #--------------------------------------------------------------------------
  1563.   def command_223
  1564.     # 开始更改色调
  1565.     $game_screen.start_tone_change(@parameters[0], @parameters[1] * 2)
  1566.     # 继续
  1567.     return true
  1568.   end
  1569.   #--------------------------------------------------------------------------
  1570.   # ● 画面闪烁
  1571.   #--------------------------------------------------------------------------
  1572.   def command_224
  1573.     # 开始闪烁
  1574.     $game_screen.start_flash(@parameters[0], @parameters[1] * 2)
  1575.     # 继续
  1576.     return true
  1577.   end
  1578.   #--------------------------------------------------------------------------
  1579.   # ● 画面震动
  1580.   #--------------------------------------------------------------------------
  1581.   def command_225
  1582.     # 震动开始
  1583.     $game_screen.start_shake(@parameters[0], @parameters[1],
  1584.       @parameters[2] * 2)
  1585.     # 继续
  1586.     return true
  1587.   end
  1588.   #--------------------------------------------------------------------------
  1589.   # ● 显示图片
  1590.   #--------------------------------------------------------------------------
  1591.   def command_231
  1592.     # 获取图片编号
  1593.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1594.     # 指定方法为 [直接指定] 的情况下
  1595.     if @parameters[3] == 0
  1596.       x = @parameters[4]
  1597.       y = @parameters[5]
  1598.     # 指定方法为 [使用变量指定] 的情况下
  1599.     else
  1600.       x = $game_variables[@parameters[4]]
  1601.       y = $game_variables[@parameters[5]]
  1602.     end
  1603.     # 显示图片
  1604.     $game_screen.pictures[number].show(@parameters[1], @parameters[2],
  1605.       x, y, @parameters[6], @parameters[7], @parameters[8], @parameters[9])
  1606.     # 继续
  1607.     return true
  1608.   end
  1609.   #--------------------------------------------------------------------------
  1610.   # ● 移动图片
  1611.   #--------------------------------------------------------------------------
  1612.   def command_232
  1613.     # 获取图片编号
  1614.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1615.     # 指定方法为 [直接指定] 的情况下
  1616.     if @parameters[3] == 0
  1617.       x = @parameters[4]
  1618.       y = @parameters[5]
  1619.     # 指定方法为 [使用变量指定] 的情况下
  1620.     else
  1621.       x = $game_variables[@parameters[4]]
  1622.       y = $game_variables[@parameters[5]]
  1623.     end
  1624.     # 移动图片
  1625.     $game_screen.pictures[number].move(@parameters[1] * 2, @parameters[2],
  1626.       x, y, @parameters[6], @parameters[7], @parameters[8], @parameters[9])
  1627.     # 继续
  1628.     return true
  1629.   end
  1630.   #--------------------------------------------------------------------------
  1631.   # ● 旋转图片
  1632.   #--------------------------------------------------------------------------
  1633.   def command_233
  1634.     # 获取图片编号
  1635.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1636.     # 设置旋转速度
  1637.     $game_screen.pictures[number].rotate(@parameters[1])
  1638.     # 继续
  1639.     return true
  1640.   end
  1641.   #--------------------------------------------------------------------------
  1642.   # ● 更改图片色调
  1643.   #--------------------------------------------------------------------------
  1644.   def command_234
  1645.     # 获取图片编号
  1646.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1647.     # 开始更改色调
  1648.     $game_screen.pictures[number].start_tone_change(@parameters[1],
  1649.       @parameters[2] * 2)
  1650.     # 继续
  1651.     return true
  1652.   end
  1653.   #--------------------------------------------------------------------------
  1654.   # ● 删除图片
  1655.   #--------------------------------------------------------------------------
  1656.   def command_235
  1657.     # 获取图片编号
  1658.     number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
  1659.     # 删除图片
  1660.     $game_screen.pictures[number].erase
  1661.     # 继续
  1662.     return true
  1663.   end
  1664.   #--------------------------------------------------------------------------
  1665.   # ● 天候设置
  1666.   #--------------------------------------------------------------------------
  1667.   def command_236
  1668.     # 设置天候
  1669.     $game_screen.weather(@parameters[0], @parameters[1], @parameters[2])
  1670.     # 继续
  1671.     return true
  1672.   end
  1673.   #--------------------------------------------------------------------------
  1674.   # ● 演奏 BGM
  1675.   #--------------------------------------------------------------------------
  1676.   def command_241
  1677.     # 演奏 BGM
  1678.     $game_system.bgm_play(@parameters[0])
  1679.     # 继续
  1680.     return true
  1681.   end
  1682.   #--------------------------------------------------------------------------
  1683.   # ● BGM 的淡入淡出
  1684.   #--------------------------------------------------------------------------
  1685.   def command_242
  1686.     # 淡入淡出 BGM
  1687.     $game_system.bgm_fade(@parameters[0])
  1688.     # 继续
  1689.     return true
  1690.   end
  1691.   #--------------------------------------------------------------------------
  1692.   # ● 演奏 BGS
  1693.   #--------------------------------------------------------------------------
  1694.   def command_245
  1695.     # 演奏 BGS
  1696.     $game_system.bgs_play(@parameters[0])
  1697.     # 继续
  1698.     return true
  1699.   end
  1700.   #--------------------------------------------------------------------------
  1701.   # ● BGS 的淡入淡出
  1702.   #--------------------------------------------------------------------------
  1703.   def command_246
  1704.     # 淡入淡出 BGS
  1705.     $game_system.bgs_fade(@parameters[0])
  1706.     # 继续
  1707.     return true
  1708.   end
  1709.   #--------------------------------------------------------------------------
  1710.   # ● 记忆 BGM / BGS
  1711.   #--------------------------------------------------------------------------
  1712.   def command_247
  1713.     # 记忆 BGM / BGS
  1714.     $game_system.bgm_memorize
  1715.     $game_system.bgs_memorize
  1716.     # 继续
  1717.     return true
  1718.   end
  1719.   #--------------------------------------------------------------------------
  1720.   # ● 还原 BGM / BGS
  1721.   #--------------------------------------------------------------------------
  1722.   def command_248
  1723.     # 还原 BGM / BGS
  1724.     $game_system.bgm_restore
  1725.     $game_system.bgs_restore
  1726.     # 继续
  1727.     return true
  1728.   end
  1729.   #--------------------------------------------------------------------------
  1730.   # ● 演奏 ME
  1731.   #--------------------------------------------------------------------------
  1732.   def command_249
  1733.     # 演奏 ME
  1734.     $game_system.me_play(@parameters[0])
  1735.     # 继续
  1736.     return true
  1737.   end
  1738.   #--------------------------------------------------------------------------
  1739.   # ● 演奏 SE
  1740.   #--------------------------------------------------------------------------
  1741.   def command_250
  1742.     # 演奏 SE
  1743.     $game_system.se_play(@parameters[0])
  1744.     # 继续
  1745.     return true
  1746.   end
  1747.   #--------------------------------------------------------------------------
  1748.   # ● 停止 SE
  1749.   #--------------------------------------------------------------------------
  1750.   def command_251
  1751.     # 停止 SE
  1752.     Audio.se_stop
  1753.     # 继续
  1754.     return true
  1755.   end
  1756. end
  1757. #==============================================================================
  1758. # ■ Game_Enemy
  1759. #------------------------------------------------------------------------------
  1760. #  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
  1761. # 内部使用。
  1762. #==============================================================================

  1763. class Game_Enemy < Game_Battler
  1764.   #--------------------------------------------------------------------------
  1765.   # ● 初始化对像
  1766.   #     troop_id     : 循环 ID
  1767.   #     member_index : 循环成员的索引
  1768.   #--------------------------------------------------------------------------
  1769.   def initialize(troop_id, member_index)
  1770.     super()
  1771.     @troop_id = troop_id
  1772.     @member_index = member_index
  1773.     troop = $data_troops[@troop_id]
  1774.     @enemy_id = troop.members[@member_index].enemy_id
  1775.     enemy = $data_enemies[@enemy_id]
  1776.     @battler_name = enemy.battler_name
  1777.     @battler_hue = enemy.battler_hue
  1778.     @hp = maxhp
  1779.     @sp = maxsp
  1780.     @hidden = troop.members[@member_index].hidden
  1781.     @immortal = troop.members[@member_index].immortal
  1782.   end
  1783.   #--------------------------------------------------------------------------
  1784.   # ● 获取敌人 ID
  1785.   #--------------------------------------------------------------------------
  1786.   def id
  1787.     return @enemy_id
  1788.   end
  1789.   #--------------------------------------------------------------------------
  1790.   # ● 获取索引
  1791.   #--------------------------------------------------------------------------
  1792.   def index
  1793.     return @member_index
  1794.   end
  1795.   #--------------------------------------------------------------------------
  1796.   # ● 获取名称
  1797.   #--------------------------------------------------------------------------
  1798.   def name
  1799.     return $data_enemies[@enemy_id].name
  1800.   end
  1801.   #--------------------------------------------------------------------------
  1802.   # ● 获取基本 MaxHP
  1803.   #--------------------------------------------------------------------------
  1804.   def base_maxhp
  1805.     return $data_enemies[@enemy_id].maxhp
  1806.   end
  1807.   #--------------------------------------------------------------------------
  1808.   # ● 获取基本 MaxSP
  1809.   #--------------------------------------------------------------------------
  1810.   def base_maxsp
  1811.     return $data_enemies[@enemy_id].maxsp
  1812.   end
  1813.   #--------------------------------------------------------------------------
  1814.   # ● 获取基本力量
  1815.   #--------------------------------------------------------------------------
  1816.   def base_str
  1817.     return $data_enemies[@enemy_id].str
  1818.   end
  1819.   #--------------------------------------------------------------------------
  1820.   # ● 获取基本灵巧
  1821.   #--------------------------------------------------------------------------
  1822.   def base_dex
  1823.     return $data_enemies[@enemy_id].dex
  1824.   end
  1825.   #--------------------------------------------------------------------------
  1826.   # ● 获取基本速度
  1827.   #--------------------------------------------------------------------------
  1828.   def base_agi
  1829.     return $data_enemies[@enemy_id].agi
  1830.   end
  1831.   #--------------------------------------------------------------------------
  1832.   # ● 获取基本魔力
  1833.   #--------------------------------------------------------------------------
  1834.   def base_int
  1835.     return $data_enemies[@enemy_id].int
  1836.   end
  1837.   #--------------------------------------------------------------------------
  1838.   # ● 获取基本攻击力
  1839.   #--------------------------------------------------------------------------
  1840.   def base_atk
  1841.     return $data_enemies[@enemy_id].atk
  1842.   end
  1843.   #--------------------------------------------------------------------------
  1844.   # ● 获取基本物理防御
  1845.   #--------------------------------------------------------------------------
  1846.   def base_pdef
  1847.     return $data_enemies[@enemy_id].pdef
  1848.   end
  1849.   #--------------------------------------------------------------------------
  1850.   # ● 获取基本魔法防御
  1851.   #--------------------------------------------------------------------------
  1852.   def base_mdef
  1853.     return $data_enemies[@enemy_id].mdef
  1854.   end
  1855.   #--------------------------------------------------------------------------
  1856.   # ● 获取基本回避修正
  1857.   #--------------------------------------------------------------------------
  1858.   def base_eva
  1859.     return $data_enemies[@enemy_id].eva
  1860.   end
  1861.   #--------------------------------------------------------------------------
  1862.   # ● 普通攻击 获取攻击方动画 ID
  1863.   #--------------------------------------------------------------------------
  1864.   def animation1_id
  1865.     return $data_enemies[@enemy_id].animation1_id
  1866.   end
  1867.   #--------------------------------------------------------------------------
  1868.   # ● 普通攻击 获取对像方动画 ID
  1869.   #--------------------------------------------------------------------------
  1870.   def animation2_id
  1871.     return $data_enemies[@enemy_id].animation2_id
  1872.   end
  1873.   #--------------------------------------------------------------------------
  1874.   # ● 获取属性修正值
  1875.   #     element_id : 属性 ID
  1876.   #--------------------------------------------------------------------------
  1877.   def element_rate(element_id)
  1878.     # 获取对应属性有效度的数值
  1879.     table = [0,200,150,100,50,0,-100]
  1880.     result = table[$data_enemies[@enemy_id].element_ranks[element_id]]
  1881.     # 状态能防御本属性的情况下效果减半
  1882.     for i in @states
  1883.       if $data_states[i].guard_element_set.include?(element_id)
  1884.         result /= 2
  1885.       end
  1886.     end
  1887.     # 过程结束
  1888.     return result
  1889.   end
  1890.   #--------------------------------------------------------------------------
  1891.   # ● 获取属性有效度
  1892.   #--------------------------------------------------------------------------
  1893.   def state_ranks
  1894.     return $data_enemies[@enemy_id].state_ranks
  1895.   end
  1896.   #--------------------------------------------------------------------------
  1897.   # ● 属性防御判定
  1898.   #     state_id : 状态 ID
  1899.   #--------------------------------------------------------------------------
  1900.   def state_guard?(state_id)
  1901.     return false
  1902.   end
  1903.   #--------------------------------------------------------------------------
  1904.   # ● 获取普通攻击属性
  1905.   #--------------------------------------------------------------------------
  1906.   def element_set
  1907.     return []
  1908.   end
  1909.   #--------------------------------------------------------------------------
  1910.   # ● 获取普通攻击的状态变化 (+)
  1911.   #--------------------------------------------------------------------------
  1912.   def plus_state_set
  1913.     return []
  1914.   end
  1915.   #--------------------------------------------------------------------------
  1916.   # ● 获取普通攻击的状态变化 (-)
  1917.   #--------------------------------------------------------------------------
  1918.   def minus_state_set
  1919.     return []
  1920.   end
  1921.   #--------------------------------------------------------------------------
  1922.   # ● 获取行动
  1923.   #--------------------------------------------------------------------------
  1924.   def actions
  1925.     return $data_enemies[@enemy_id].actions
  1926.   end
  1927.   #--------------------------------------------------------------------------
  1928.   # ● 获取 EXP
  1929.   #--------------------------------------------------------------------------
  1930.   def exp
  1931.     return $data_enemies[@enemy_id].exp
  1932.   end
  1933.   #--------------------------------------------------------------------------
  1934.   # ● 获取金钱
  1935.   #--------------------------------------------------------------------------
  1936.   def gold
  1937.     return $data_enemies[@enemy_id].gold
  1938.   end
  1939.   #--------------------------------------------------------------------------
  1940.   # ● 获取物品 ID
  1941.   #--------------------------------------------------------------------------
  1942.   def item_id
  1943.     return $data_enemies[@enemy_id].item_id
  1944.   end
  1945.   #--------------------------------------------------------------------------
  1946.   # ● 获取武器 ID
  1947.   #--------------------------------------------------------------------------
  1948.   def weapon_id
  1949.     return $data_enemies[@enemy_id].weapon_id
  1950.   end
  1951.   #--------------------------------------------------------------------------
  1952.   # ● 获取放具 ID
  1953.   #--------------------------------------------------------------------------
  1954.   def armor_id
  1955.     return $data_enemies[@enemy_id].armor_id
  1956.   end
  1957.   #--------------------------------------------------------------------------
  1958.   # ● 获取宝物出现率
  1959.   #--------------------------------------------------------------------------
  1960.   def treasure_prob
  1961.     return $data_enemies[@enemy_id].treasure_prob
  1962.   end
  1963.   #--------------------------------------------------------------------------
  1964.   # ● 取得战斗画面 X 坐标
  1965.   #--------------------------------------------------------------------------
  1966.   def screen_x
  1967.     return $data_troops[@troop_id].members[@member_index].x*$width/640
  1968.   end
  1969.   #--------------------------------------------------------------------------
  1970.   # ● 取得战斗画面 Y 坐标
  1971.   #--------------------------------------------------------------------------
  1972.   def screen_y
  1973.     return $data_troops[@troop_id].members[@member_index].y*$height/480
  1974.   end
  1975.   #--------------------------------------------------------------------------
  1976.   # ● 取得战斗画面 Z 坐标
  1977.   #--------------------------------------------------------------------------
  1978.   def screen_z
  1979.     return screen_y
  1980.   end
  1981.   #--------------------------------------------------------------------------
  1982.   # ● 逃跑
  1983.   #--------------------------------------------------------------------------
  1984.   def escape
  1985.     # 设置击中标志
  1986.     @hidden = true
  1987.     # 清除当前行动
  1988.     self.current_action.clear
  1989.   end
  1990.   #--------------------------------------------------------------------------
  1991.   # ● 变身
  1992.   #     enemy_id : 变身为的敌人 ID
  1993.   #--------------------------------------------------------------------------
  1994.   def transform(enemy_id)
  1995.     # 更改敌人 ID
  1996.     @enemy_id = enemy_id
  1997.     # 更改战斗图形
  1998.     @battler_name = $data_enemies[@enemy_id].battler_name
  1999.     @battler_hue = $data_enemies[@enemy_id].battler_hue
  2000.     # 在生成行动
  2001.     make_action
  2002.   end
  2003.   #--------------------------------------------------------------------------
  2004.   # ● 生成行动
  2005.   #--------------------------------------------------------------------------
  2006.   def make_action
  2007.     # 清除当前行动
  2008.     self.current_action.clear
  2009.     # 无法行动的情况
  2010.     unless self.movable?
  2011.       # 过程结束
  2012.       return
  2013.     end
  2014.     # 抽取现在有效的行动
  2015.     available_actions = []
  2016.     rating_max = 0
  2017.     for action in self.actions
  2018.       # 确认回合条件
  2019.       n = $game_temp.battle_turn
  2020.       a = action.condition_turn_a
  2021.       b = action.condition_turn_b
  2022.       if (b == 0 and n != a) or
  2023.          (b > 0 and (n < 1 or n < a or n % b != a % b))
  2024.         next
  2025.       end
  2026.       # 确认 HP 条件
  2027.       if self.hp * 100.0 / self.maxhp > action.condition_hp
  2028.         next
  2029.       end
  2030.       # 确认等级条件
  2031.       if $game_party.max_level < action.condition_level
  2032.         next
  2033.       end
  2034.       # 确认开关条件
  2035.       switch_id = action.condition_switch_id
  2036.       if switch_id > 0 and $game_switches[switch_id] == false
  2037.         next
  2038.       end
  2039.       # 符合条件 : 添加本行动
  2040.       available_actions.push(action)
  2041.       if action.rating > rating_max
  2042.         rating_max = action.rating
  2043.       end
  2044.     end
  2045.     # 最大概率值作为 3 合计计算(0 除外)
  2046.     ratings_total = 0
  2047.     for action in available_actions
  2048.       if action.rating > rating_max - 3
  2049.         ratings_total += action.rating - (rating_max - 3)
  2050.       end
  2051.     end
  2052.     # 概率合计不为 0 的情况下
  2053.     if ratings_total > 0
  2054.       # 生成随机数
  2055.       value = rand(ratings_total)
  2056.       # 设置对应生成随机数的当前行动
  2057.       for action in available_actions
  2058.         if action.rating > rating_max - 3
  2059.           if value < action.rating - (rating_max - 3)
  2060.             self.current_action.kind = action.kind
  2061.             self.current_action.basic = action.basic
  2062.             self.current_action.skill_id = action.skill_id
  2063.             self.current_action.decide_random_target_for_enemy
  2064.             return
  2065.           else
  2066.             value -= action.rating - (rating_max - 3)
  2067.           end
  2068.         end
  2069.       end
  2070.     end
  2071.   end
  2072. end
  2073. #==============================================================================
  2074. # ■ Game_Map
  2075. #------------------------------------------------------------------------------
  2076. #  处理地图的类。包含卷动以及可以通行的判断功能。
  2077. # 本类的实例请参考 $game_map 。
  2078. #==============================================================================

  2079. class Game_Map
  2080.   #--------------------------------------------------------------------------
  2081.   # ● 定义实例变量
  2082.   #--------------------------------------------------------------------------
  2083.   attr_accessor :tileset_name             # 元件 文件名
  2084.   attr_accessor :autotile_names           # 自动元件 文件名
  2085.   attr_accessor :panorama_name            # 全景 文件名
  2086.   attr_accessor :panorama_hue             # 全景 色相
  2087.   attr_accessor :fog_name                 # 雾 文件名
  2088.   attr_accessor :fog_hue                  # 雾 色相
  2089.   attr_accessor :fog_opacity              # 雾 不透明度
  2090.   attr_accessor :fog_blend_type           # 雾 混合方式
  2091.   attr_accessor :fog_zoom                 # 雾 放大率
  2092.   attr_accessor :fog_sx                   # 雾 SX
  2093.   attr_accessor :fog_sy                   # 雾 SY
  2094.   attr_accessor :battleback_name          # 战斗背景 文件名
  2095.   attr_accessor :display_x                # 显示 X 坐标 * 128
  2096.   attr_accessor :display_y                # 显示 Y 坐标 * 128
  2097.   attr_accessor :need_refresh             # 刷新要求标志
  2098.   attr_reader   :passages                 # 通行表
  2099.   attr_reader   :priorities               # 优先表
  2100.   attr_reader   :terrain_tags             # 地形标记表
  2101.   attr_reader   :events                   # 事件
  2102.   attr_reader   :fog_ox                   # 雾 原点 X 坐标
  2103.   attr_reader   :fog_oy                   # 雾 原点 Y 坐标
  2104.   attr_reader   :fog_tone                 # 雾 色调
  2105.   #--------------------------------------------------------------------------
  2106.   # ● 初始化条件
  2107.   #--------------------------------------------------------------------------
  2108.   def initialize
  2109.     @map_id = 0
  2110.     @display_x = 0
  2111.     @display_y = 0
  2112.   end
  2113.   #--------------------------------------------------------------------------
  2114.   # ● 设置
  2115.   #     map_id : 地图 ID
  2116.   #--------------------------------------------------------------------------
  2117.   def setup(map_id)
  2118.     # 地图 ID 记录到 @map_id
  2119.     @map_id = map_id
  2120.     # 地图文件装载后、设置到 @map
  2121.     @map = load_data(sprintf("Data/Map%03d.rxdata", @map_id))
  2122.     # 定义实例变量设置地图元件信息
  2123.     tileset = $data_tilesets[@map.tileset_id]
  2124.     @tileset_name = tileset.tileset_name
  2125.     @autotile_names = tileset.autotile_names
  2126.     @panorama_name = tileset.panorama_name
  2127.     @panorama_hue = tileset.panorama_hue
  2128.     @fog_name = tileset.fog_name
  2129.     @fog_hue = tileset.fog_hue
  2130.     @fog_opacity = tileset.fog_opacity
  2131.     @fog_blend_type = tileset.fog_blend_type
  2132.     @fog_zoom = tileset.fog_zoom
  2133.     @fog_sx = tileset.fog_sx
  2134.     @fog_sy = tileset.fog_sy
  2135.     @battleback_name = tileset.battleback_name
  2136.     @passages = tileset.passages
  2137.     @priorities = tileset.priorities
  2138.     @terrain_tags = tileset.terrain_tags
  2139.     # 初始化显示坐标
  2140.     @display_x = 0
  2141.     @display_y = 0
  2142.     # 清除刷新要求标志
  2143.     @need_refresh = false
  2144.     # 设置地图事件数据
  2145.     @events = {}
  2146.     for i in @map.events.keys
  2147.       @events[i] = Game_Event.new(@map_id, @map.events[i])
  2148.     end
  2149.     # 设置公共事件数据
  2150.     @common_events = {}
  2151.     for i in 1...$data_common_events.size
  2152.       @common_events[i] = Game_CommonEvent.new(i)
  2153.     end
  2154.     # 初始化雾的各种信息
  2155.     @fog_ox = 0
  2156.     @fog_oy = 0
  2157.     @fog_tone = Tone.new(0, 0, 0, 0)
  2158.     @fog_tone_target = Tone.new(0, 0, 0, 0)
  2159.     @fog_tone_duration = 0
  2160.     @fog_opacity_duration = 0
  2161.     @fog_opacity_target = 0
  2162.     # 初始化滚动信息
  2163.     @scroll_direction = 2
  2164.     @scroll_rest = 0
  2165.     @scroll_speed = 4
  2166.   end
  2167.   #--------------------------------------------------------------------------
  2168.   # ● 获取地图 ID
  2169.   #--------------------------------------------------------------------------
  2170.   def map_id
  2171.     return @map_id
  2172.   end
  2173.   #--------------------------------------------------------------------------
  2174.   # ● 获取宽度
  2175.   #--------------------------------------------------------------------------
  2176.   def width
  2177.     return @map.width
  2178.   end
  2179.   #--------------------------------------------------------------------------
  2180.   # ● 获取高度
  2181.   #--------------------------------------------------------------------------
  2182.   def height
  2183.     return @map.height
  2184.   end
  2185.   #--------------------------------------------------------------------------
  2186.   # ● 获取遇敌列表
  2187.   #--------------------------------------------------------------------------
  2188.   def encounter_list
  2189.     return @map.encounter_list
  2190.   end
  2191.   #--------------------------------------------------------------------------
  2192.   # ● 获取遇敌步数
  2193.   #--------------------------------------------------------------------------
  2194.   def encounter_step
  2195.     return @map.encounter_step
  2196.   end
  2197.   #--------------------------------------------------------------------------
  2198.   # ● 获取地图数据
  2199.   #--------------------------------------------------------------------------
  2200.   def data
  2201.     return @map.data
  2202.   end
  2203.   #--------------------------------------------------------------------------
  2204.   # ● BGM / BGS 自动切换
  2205.   #--------------------------------------------------------------------------
  2206.   def autoplay
  2207.     if @map.autoplay_bgm
  2208.       $game_system.bgm_play(@map.bgm)
  2209.     end
  2210.     if @map.autoplay_bgs
  2211.       $game_system.bgs_play(@map.bgs)
  2212.     end
  2213.   end
  2214.   #--------------------------------------------------------------------------
  2215.   # ● 刷新
  2216.   #--------------------------------------------------------------------------
  2217.   def refresh
  2218.     # 地图 ID 有效
  2219.     if @map_id > 0
  2220.       # 刷新全部的地图事件
  2221.       for event in @events.values
  2222.         event.refresh
  2223.       end
  2224.       # 刷新全部的公共事件
  2225.       for common_event in @common_events.values
  2226.         common_event.refresh
  2227.       end
  2228.     end
  2229.     # 清除刷新要求标志
  2230.     @need_refresh = false
  2231.   end
  2232.   #--------------------------------------------------------------------------
  2233.   # ● 滚动
  2234.   #     distance : 滚动距离
  2235.   #--------------------------------------------------------------------------
  2236.   def scroll_down(distance)
  2237.     @display_y = [@display_y + distance, (self.height - ($height / 32.0)) * 128].min
  2238.   end
  2239.   #--------------------------------------------------------------------------
  2240.   def scroll_left(distance)
  2241.     @display_x = [@display_x - distance, 0].max
  2242.   end
  2243.   #--------------------------------------------------------------------------
  2244.   def scroll_right(distance)
  2245.     @display_x = [@display_x + distance, (self.width - ($width / 32.0)) * 128].min
  2246.   end
  2247.   #--------------------------------------------------------------------------
  2248.   def scroll_up(distance)
  2249.     @display_y = [@display_y - distance, 0].max
  2250.   end
  2251.   #--------------------------------------------------------------------------
  2252.   # ● 有效坐标判定
  2253.   #     x          : X 坐标
  2254.   #     y          : Y 坐标
  2255.   #--------------------------------------------------------------------------
  2256.   def valid?(x, y)
  2257.     return (x >= 0 and x < width and y >= 0 and y < height)
  2258.   end
  2259.   #--------------------------------------------------------------------------
  2260.   # ● 可以通行判定
  2261.   #     x          : X 坐标
  2262.   #     y          : Y 坐标
  2263.   #     d          : 方向 (0,2,4,6,8,10)
  2264.   #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  2265.   #     self_event : 自己 (判定事件可以通行的情况下)
  2266.   #--------------------------------------------------------------------------
  2267.   def passable?(x, y, d, self_event = nil)
  2268.     # 被给予的坐标地图外的情况下
  2269.     unless valid?(x, y)
  2270.       # 不能通行
  2271.       return false
  2272.     end
  2273.     # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
  2274.     bit = (1 << (d / 2 - 1)) & 0x0f
  2275.     # 循环全部的事件
  2276.     for event in events.values
  2277.       # 自己以外的元件与坐标相同的情况
  2278.       if event.tile_id >= 0 and event != self_event and
  2279.          event.x == x and event.y == y and not event.through
  2280.         # 如果障碍物的接触被设置的情况下
  2281.         if @passages[event.tile_id] & bit != 0
  2282.           # 不能通行
  2283.           return false
  2284.         # 如果全方向的障碍物的接触被设置的情况下
  2285.         elsif @passages[event.tile_id] & 0x0f == 0x0f
  2286.           # 不能通行
  2287.           return false
  2288.         # 这以外的优先度为 0 的情况下
  2289.         elsif @priorities[event.tile_id] == 0
  2290.           # 可以通行
  2291.           return true
  2292.         end
  2293.       end
  2294.     end
  2295.     # 从层按从上到下的顺序调查循环
  2296.     for i in [2, 1, 0]
  2297.       # 取得元件 ID
  2298.       tile_id = data[x, y, i]
  2299.       # 取得元件 ID 失败
  2300.       if tile_id == nil
  2301.         # 不能通行
  2302.         return false
  2303.       # 如果障碍物的接触被设置的情况下
  2304.       elsif @passages[tile_id] & bit != 0
  2305.         # 不能通行
  2306.         return false
  2307.       # 如果全方向的障碍物的接触被设置的情况下
  2308.       elsif @passages[tile_id] & 0x0f == 0x0f
  2309.         # 不能通行
  2310.         return false
  2311.       # 这以外的优先度为 0 的情况下
  2312.       elsif @priorities[tile_id] == 0
  2313.         # 可以通行
  2314.         return true
  2315.       end
  2316.     end
  2317.     # 可以通行
  2318.     return true
  2319.   end
  2320.   #--------------------------------------------------------------------------
  2321.   # ● 茂密判定
  2322.   #     x          : X 坐标
  2323.   #     y          : Y 坐标
  2324.   #--------------------------------------------------------------------------
  2325.   def bush?(x, y)
  2326.     if @map_id != 0
  2327.       for i in [2, 1, 0]
  2328.         tile_id = data[x, y, i]
  2329.         if tile_id == nil
  2330.           return false
  2331.         elsif @passages[tile_id] & 0x40 == 0x40
  2332.           return true
  2333.         end
  2334.       end
  2335.     end
  2336.     return false
  2337.   end
  2338.   #--------------------------------------------------------------------------
  2339.   # ● 反击判定
  2340.   #     x          : X 坐标
  2341.   #     y          : Y 坐标
  2342.   #--------------------------------------------------------------------------
  2343.   def counter?(x, y)
  2344.     if @map_id != 0
  2345.       for i in [2, 1, 0]
  2346.         tile_id = data[x, y, i]
  2347.         if tile_id == nil
  2348.           return false
  2349.         elsif @passages[tile_id] & 0x80 == 0x80
  2350.           return true
  2351.         end
  2352.       end
  2353.     end
  2354.     return false
  2355.   end
  2356.   #--------------------------------------------------------------------------
  2357.   # ● 地获取地形标志
  2358.   #     x          : X 坐标
  2359.   #     y          : Y 坐标
  2360.   #--------------------------------------------------------------------------
  2361.   def terrain_tag(x, y)
  2362.     if @map_id != 0
  2363.       for i in [2, 1, 0]
  2364.         tile_id = data[x, y, i]
  2365.         if tile_id == nil
  2366.           return 0
  2367.         elsif @terrain_tags[tile_id] > 0
  2368.           return @terrain_tags[tile_id]
  2369.         end
  2370.       end
  2371.     end
  2372.     return 0
  2373.   end
  2374.   #--------------------------------------------------------------------------
  2375.   # ● 获取指定位置的事件 ID
  2376.   #     x          : X 坐标
  2377.   #     y          : Y 坐标
  2378.   #--------------------------------------------------------------------------
  2379.   def check_event(x, y)
  2380.     for event in $game_map.events.values
  2381.       if event.x == x and event.y == y
  2382.         return event.id
  2383.       end
  2384.     end
  2385.   end
  2386.   #--------------------------------------------------------------------------
  2387.   # ● 滚动开始
  2388.   #     direction : 滚动方向
  2389.   #     distance  : 滚动距离
  2390.   #     speed     : 滚动速度
  2391.   #--------------------------------------------------------------------------
  2392.   def start_scroll(direction, distance, speed)
  2393.     @scroll_direction = direction
  2394.     @scroll_rest = distance * 128
  2395.     @scroll_speed = speed
  2396.   end
  2397.   #--------------------------------------------------------------------------
  2398.   # ● 滚动中判定
  2399.   #--------------------------------------------------------------------------
  2400.   def scrolling?
  2401.     return @scroll_rest > 0
  2402.   end
  2403.   #--------------------------------------------------------------------------
  2404.   # ● 开始变更雾的色调
  2405.   #     tone     : 色调
  2406.   #     duration : 时间
  2407.   #--------------------------------------------------------------------------
  2408.   def start_fog_tone_change(tone, duration)
  2409.     @fog_tone_target = tone.clone
  2410.     @fog_tone_duration = duration
  2411.     if @fog_tone_duration == 0
  2412.       @fog_tone = @fog_tone_target.clone
  2413.     end
  2414.   end
  2415.   #--------------------------------------------------------------------------
  2416.   # ● 开始变更雾的不透明度
  2417.   #     opacity  : 不透明度
  2418.   #     duration : 时间
  2419.   #--------------------------------------------------------------------------
  2420.   def start_fog_opacity_change(opacity, duration)
  2421.     @fog_opacity_target = opacity * 1.0
  2422.     @fog_opacity_duration = duration
  2423.     if @fog_opacity_duration == 0
  2424.       @fog_opacity = @fog_opacity_target
  2425.     end
  2426.   end
  2427.   #--------------------------------------------------------------------------
  2428.   # ● 刷新画面
  2429.   #--------------------------------------------------------------------------
  2430.   def update
  2431.     # 还原必要的地图
  2432.     if $game_map.need_refresh
  2433.       refresh
  2434.     end
  2435.     # 滚动中的情况下
  2436.     if @scroll_rest > 0
  2437.       # 滚动速度变化为地图坐标系的距离
  2438.       distance = 2 ** @scroll_speed
  2439.       # 执行滚动
  2440.       case @scroll_direction
  2441.       when 2  # 下
  2442.         scroll_down(distance)
  2443.       when 4  # 左
  2444.         scroll_left(distance)
  2445.       when 6  # 右
  2446.         scroll_right(distance)
  2447.       when 8  # 上
  2448.         scroll_up(distance)
  2449.       end
  2450.       # 滚动距离的减法运算
  2451.       @scroll_rest -= distance
  2452.     end
  2453.     # 更新地图事件
  2454.     for event in @events.values
  2455.       event.update
  2456.     end
  2457.     # 更新公共事件
  2458.     for common_event in @common_events.values
  2459.       common_event.update
  2460.     end
  2461.     # 处理雾的滚动
  2462.     @fog_ox -= @fog_sx / 8.0
  2463.     @fog_oy -= @fog_sy / 8.0
  2464.     # 处理雾的色调变更
  2465.     if @fog_tone_duration >= 1
  2466.       d = @fog_tone_duration
  2467.       target = @fog_tone_target
  2468.       @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
  2469.       @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
  2470.       @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
  2471.       @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
  2472.       @fog_tone_duration -= 1
  2473.     end
  2474.     # 处理雾的不透明度变更
  2475.     if @fog_opacity_duration >= 1
  2476.       d = @fog_opacity_duration
  2477.       @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
  2478.       @fog_opacity_duration -= 1
  2479.     end
  2480.   end
  2481. end
  2482. #==============================================================================
  2483. # ■ Sprite_Character
  2484. #------------------------------------------------------------------------------
  2485. #  角色显示用脚本。监视 Game_Character 类的实例、
  2486. # 自动变化脚本状态。
  2487. #==============================================================================

  2488. class Sprite_Character < RPG::Sprite
  2489.   #--------------------------------------------------------------------------
  2490.   # ● 定义实例变量
  2491.   #--------------------------------------------------------------------------
  2492.   attr_accessor :character                # 角色
  2493.   #--------------------------------------------------------------------------
  2494.   # ● 初始化对像
  2495.   #     viewport  : 查看端口
  2496.   #     character : 角色 (Game_Character)
  2497.   #--------------------------------------------------------------------------
  2498.   def initialize(viewport, character = nil)
  2499.     super(viewport)
  2500.     @vp = viewport
  2501.     @character = character
  2502.     update
  2503.   end
  2504.   #--------------------------------------------------------------------------
  2505.   # ● 更新画面
  2506.   #--------------------------------------------------------------------------
  2507.   def update
  2508.     super
  2509.     # 元件 ID、文件名、色相与现在的情况存在差异的情况下
  2510.     if @tile_id != @character.tile_id or
  2511.        @character_name != @character.character_name or
  2512.        @character_hue != @character.character_hue
  2513.       # 记忆元件 ID 与文件名、色相
  2514.       @tile_id = @character.tile_id
  2515.       @character_name = @character.character_name
  2516.       @character_hue = @character.character_hue
  2517.       # 元件 ID 为有效值的情况下
  2518.       if @tile_id >= 384
  2519.         self.bitmap = RPG::Cache.tile($game_map.tileset_name,
  2520.           @tile_id, @character.character_hue)
  2521.         self.src_rect.set(0, 0, 32, 32)
  2522.         self.ox = 16
  2523.         self.oy = 32
  2524.       # 元件 ID 为无效值的情况下
  2525.       else
  2526.         self.bitmap = RPG::Cache.character(@character.character_name,
  2527.           @character.character_hue)
  2528.         @cw = bitmap.width / 4
  2529.         @ch = bitmap.height / 4
  2530.         self.ox = @cw / 2
  2531.         self.oy = @ch
  2532.       end
  2533.     end
  2534.     # 设置可视状态
  2535.     self.visible = (not @character.transparent)
  2536.     # 图形是角色的情况下
  2537.     if @tile_id == 0
  2538.       # 设置传送目标的矩形
  2539.       sx = @character.pattern * @cw
  2540.       sy = (@character.direction - 2) / 2 * @ch
  2541.       self.src_rect.set(sx, sy, @cw, @ch)
  2542.     end
  2543.     # 设置脚本的坐标
  2544.     self.x = @character.screen_x
  2545.     #if @character == $game_player
  2546.       if @vp == $viewport5 or @vp == $viewport6
  2547.         self.y = @character.screen_y-480
  2548.         self.z = @character.screen_z(@ch)-480
  2549.       else
  2550.         self.y = @character.screen_y
  2551.         self.z = @character.screen_z(@ch)
  2552.       end
  2553.     #else
  2554.       #self.y = @character.screen_y
  2555.       #self.z = @character.screen_z(@ch)
  2556.     #end
  2557.     # 设置不透明度、合成方式、茂密
  2558.     self.opacity = @character.opacity
  2559.     self.blend_type = @character.blend_type
  2560.     self.bush_depth = @character.bush_depth
  2561.     # 动画
  2562.     if @character.animation_id != 0
  2563.       animation = $data_animations[@character.animation_id]
  2564.       animation(animation, true)
  2565.       @character.animation_id = 0
  2566.     end
  2567.   end
  2568. end

  2569.   class Weather
  2570.     def initialize(viewport = nil)
  2571.       @type = 0
  2572.       @max = 0
  2573.       @ox = 0
  2574.       @oy = 0
  2575.       color1 = Color.new(255, 255, 255, 255)
  2576.       color2 = Color.new(255, 255, 255, 128)
  2577.       @rain_bitmap = Bitmap.new(7, 56)
  2578.       for i in 0..6
  2579.         @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
  2580.       end
  2581.       @storm_bitmap = Bitmap.new(34, 64)
  2582.       for i in 0..31
  2583.         @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
  2584.         @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
  2585.         @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
  2586.       end
  2587.       @snow_bitmap = Bitmap.new(6, 6)
  2588.       @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
  2589.       @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
  2590.       @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
  2591.       @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
  2592.       @sprites = []
  2593.       for i in 1..40
  2594.         sprite = Sprite.new(viewport)
  2595.         sprite.z = 1000
  2596.         sprite.visible = false
  2597.         sprite.opacity = 0
  2598.         @sprites.push(sprite)
  2599.       end
  2600.     end
  2601.     def dispose
  2602.       for sprite in @sprites
  2603.         sprite.dispose
  2604.       end
  2605.       @rain_bitmap.dispose
  2606.       @storm_bitmap.dispose
  2607.       @snow_bitmap.dispose
  2608.     end
  2609.     def type=(type)
  2610.       return if @type == type
  2611.       @type = type
  2612.       case @type
  2613.       when 1
  2614.         bitmap = @rain_bitmap
  2615.       when 2
  2616.         bitmap = @storm_bitmap
  2617.       when 3
  2618.         bitmap = @snow_bitmap
  2619.       else
  2620.         bitmap = nil
  2621.       end
  2622.       for i in 1..40
  2623.         sprite = @sprites[i]
  2624.         if sprite != nil
  2625.           sprite.visible = (i <= @max)
  2626.           sprite.bitmap = bitmap
  2627.         end
  2628.       end
  2629.     end
  2630.     def ox=(ox)
  2631.       return if @ox == ox;
  2632.       @ox = ox
  2633.       for sprite in @sprites
  2634.         sprite.ox = @ox
  2635.       end
  2636.     end
  2637.     def oy=(oy)
  2638.       return if @oy == oy;
  2639.       @oy = oy
  2640.       for sprite in @sprites
  2641.         sprite.oy = @oy
  2642.       end
  2643.     end
  2644.     def max=(max)
  2645.       return if @max == max;
  2646.       @max = [[max, 0].max, 40].min
  2647.       for i in 1..40
  2648.         sprite = @sprites[i]
  2649.         if sprite != nil
  2650.           sprite.visible = (i <= @max)
  2651.         end
  2652.       end
  2653.     end
  2654.     def update
  2655.       return if @type == 0
  2656.       for i in 1..@max
  2657.         sprite = @sprites[i]
  2658.         if sprite == nil
  2659.           break
  2660.         end
  2661.         if @type == 1
  2662.           sprite.x -= 2
  2663.           sprite.y += 16
  2664.           sprite.opacity -= 8
  2665.         end
  2666.         if @type == 2
  2667.           sprite.x -= 8
  2668.           sprite.y += 16
  2669.           sprite.opacity -= 12
  2670.         end
  2671.         if @type == 3
  2672.           sprite.x -= 2
  2673.           sprite.y += 8
  2674.           sprite.opacity -= 8
  2675.         end
  2676.         x = sprite.x - @ox
  2677.         y = sprite.y - @oy
  2678.         if sprite.opacity < 64 or x < -50 or x > $width+150 or y < -300 or y > $height+100
  2679.           sprite.x = rand($width+150) - 50 + @ox
  2680.           sprite.y = rand($height+100) - 200 + @oy
  2681.           sprite.opacity = 255
  2682.         end
  2683.       end
  2684.     end
  2685.     attr_reader :type
  2686.     attr_reader :max
  2687.     attr_reader :ox
  2688.     attr_reader :oy
  2689.   end
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
4
发表于 2010-6-20 21:47:40 | 只看该作者
# ————————————————————————————————————
# 本脚本来自www.66rpg.com,转载请保留此信息
# ————————————————————————————————————

class Win32API
  GAME_INI_FILE = ".\\Game.ini"
  HWND_TOPMOST = 0
  HWND_TOP = -1
  SWP_NOMOVE   = 0
  SWP_FRAMECHANGED = 0
  HWND_NOTTOPMOST = 0
  WM_GETMINMAXINFO = 24
  #——————————————————————————————————————
  def Win32API.GetPrivateProfileString(section, key)
    val = "\0"*256
    gps = Win32API.new('kernel32', 'GetPrivateProfileString',%w(p p p p l p), 'l')
    gps.call(section, key, "", val, 256, GAME_INI_FILE)
    val.delete!("\0")
    return val
  end
  #——————————————————————————————————————
  def Win32API.FindWindow(class_name, title)
    fw = Win32API.new('user32', 'FindWindow', %(p, p), 'i')
    hWnd = fw.call(class_name, title)
    return hWnd
  end
  #——————————————————————————————————————
  def Win32API.SetWindowPos(w, h)
    title =  Win32API.GetPrivateProfileString("Game", "Title")
    hWnd = Win32API.FindWindow("RGSS Player", title)
    swp = Win32API.new('user32', 'SetWindowPos', %(l, l, i, i, i, i, i), 'i')
    win = swp.call(hWnd, HWND_TOP, 100, 50,  w + 6, h+32, WM_GETMINMAXINFO)
    return win
  end
  #——————————————————————————————————————
  def Win32API.client_size
    title =  Win32API.GetPrivateProfileString("Game", "Title")
    hWnd = Win32API.FindWindow("RGSS Player", title)
    rect = [0, 0, 0, 0].pack('l4')
    Win32API.new('user32', 'GetClientRect', %w(l p), 'i').call(hWnd, rect)
    width, height = rect.unpack('l4')[2..3]
    return width, height
  end
end
$width = 800
$height = 600
win = Win32API.SetWindowPos($width, $height)
if(win == 0)
  p "Size change has failed!"
end
#==============================================================================
# ■ Spriteset_Map
#------------------------------------------------------------------------------
#  处理地图画面活动块和元件的类。本类在 Scene_Map 类的内部使用。
#==============================================================================
class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #--------------------------------------------------------------------------
  def initialize
    @viewport2 = Viewport.new(0, 0, $width, $height)  #——生成图片
    @viewport3 = Viewport.new(0, 0, $width, $height)  #——生成画面闪烁用的部分
    $viewport4 = Viewport.new(640, 0, $width-640, 480)  #——右侧
    $viewport5 = Viewport.new(0, 480, 640, $height-480) #——下侧
    $viewport6 = Viewport.new(640, 480, $width-640, $height-480) #——右下角
    $viewport1 = Viewport.new(0, 0, 640, 480) #——主窗口
    @viewport_weather = Viewport.new(0, 0, $width, $height) #——生成天气专用
    @viewport2.z = 200  #——生成图片的深度
    @viewport3.z = 5000 #——生成画面闪烁用的深度
    @tilemap = Tilemap.new($viewport1)  #——主窗口
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
    @tilemap2 = Tilemap.new($viewport4) #——右侧
    @tilemap2.tileset = RPG::Cache.tileset($game_map.tileset_name)
    @tilemap3 = Tilemap.new($viewport5) #——下侧
    @tilemap3.tileset = RPG::Cache.tileset($game_map.tileset_name)
    @tilemap4 = Tilemap.new($viewport6) #——右下角
    @tilemap4.tileset = RPG::Cache.tileset($game_map.tileset_name)
    for i in 0..6 #——生成自动元件
      autotile_name = $game_map.autotile_names
      @tilemap.autotiles = RPG::Cache.autotile(autotile_name)
      @tilemap2.autotiles = RPG::Cache.autotile(autotile_name)
      @tilemap3.autotiles = RPG::Cache.autotile(autotile_name)
      @tilemap4.autotiles = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map.data  #——生成地图数据
    @tilemap2.map_data = $game_map.data
    @tilemap3.map_data = $game_map.data
    @tilemap4.map_data = $game_map.data
    @tilemap.priorities = $game_map.priorities  #——生成优先
    @tilemap2.priorities = $game_map.priorities
    @tilemap3.priorities = $game_map.priorities
    @tilemap4.priorities = $game_map.priorities
    @character_sprites = [] #——生成事件
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new($viewport1, $game_map.events)
      @character_sprites.push(sprite)
      sprite = Sprite_Character.new($viewport4, $game_map.events)
      @character_sprites.push(sprite)
      sprite = Sprite_Character.new($viewport5, $game_map.events)
      @character_sprites.push(sprite)
      sprite = Sprite_Character.new($viewport6, $game_map.events)
      @character_sprites.push(sprite)
    end  #——下面继续生成角色
    @character_sprites.push(Sprite_Character.new($viewport1, $game_player))
    @character_sprites.push(Sprite_Character.new($viewport4, $game_player))
    @character_sprites.push(Sprite_Character.new($viewport5, $game_player))
    @character_sprites.push(Sprite_Character.new($viewport6, $game_player))
    #——下面生成远景
    @panorama = Plane.new($viewport1)
    @panorama.z = -1000
    @panorama2 = Plane.new($viewport4)
    @panorama2.z = -1000
    @panorama3 = Plane.new($viewport5)
    @panorama3.z = -1000
    @panorama4 = Plane.new($viewport6)
    @panorama4.z = -1000
    #——下面生成雾   
    @fog = Plane.new($viewport1)
    @fog.z = 3000
    @fog2 = Plane.new($viewport4)
    @fog2.z = 3000
    @fog3 = Plane.new($viewport5)
    @fog3.z = 3000
    @fog4 = Plane.new($viewport6)
    @fog4.z = 3000
    #——下面生成天气
    @weather = Weather.new(@viewport_weather)
    @picture_sprites = [] #——这里生成图片
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2, $game_screen.pictures))
    end
    @timer_sprite = Sprite_Timer.new #——生成计时器
    #——刷新
    update
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    @tilemap.tileset.dispose    #——释放元件地图
    @tilemap2.tileset.dispose
    @tilemap3.tileset.dispose
    @tilemap4.tileset.dispose
    for i in 0..6
      @tilemap.autotiles.dispose
      @tilemap2.autotiles.dispose
      @tilemap3.autotiles.dispose
      @tilemap4.autotiles.dispose
    end
    @tilemap.dispose
    @tilemap2.dispose
    @tilemap3.dispose
    @tilemap4.dispose
    @panorama.dispose    #——释放远景平面
    @panorama2.dispose
    @panorama3.dispose
    @panorama4.dispose
    @fog.dispose    #——释放雾平面
    @fog2.dispose
    @fog3.dispose
    @fog4.dispose
    for sprite in @character_sprites    #——释放角色活动块
      sprite.dispose
    end
    @weather.dispose   
    for sprite in @picture_sprites
      sprite.dispose
    end
    # 释放计时器块
    @timer_sprite.dispose
    # 释放显示端口
    $viewport1.dispose
    @viewport2.dispose
    @viewport3.dispose
    $viewport4.dispose
    $viewport5.dispose
    $viewport6.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
        @panorama2.bitmap.dispose
        @panorama2.bitmap = nil
        @panorama3.bitmap.dispose
        @panorama3.bitmap = nil
        @panorama4.bitmap.dispose
        @panorama4.bitmap = nil
      end
      if @panorama_name != ""
        @panorama.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
        @panorama2.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
        @panorama3.bitmap = RPG::Cache.panorama(@panorama_name, @panorama_hue)
        @panorama4.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
      @fog2.bitmap.dispose
      @fog2.bitmap = nil
      @fog3.bitmap.dispose
      @fog3.bitmap = nil
      @fog4.bitmap.dispose
      @fog4.bitmap = nil
    end
    if @fog_name != ""
      @fog.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      @fog2.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      @fog3.bitmap = RPG::Cache.fog(@fog_name, @fog_hue)
      @fog4.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
    @tilemap2.ox = @tilemap.ox
    @tilemap2.oy = @tilemap.oy
    @tilemap2.update
    @tilemap3.ox = @tilemap.ox
    @tilemap3.oy = @tilemap.oy + 480
    @tilemap3.update
    @tilemap4.ox = @tilemap.ox
    @tilemap4.oy = @tilemap.oy + 480
    @tilemap4.update
    # 刷新远景平面
    @panorama.ox = $game_map.display_x / 8
    @panorama.oy = $game_map.display_y / 8
    @panorama2.ox = @panorama.ox
    @panorama2.oy = @panorama.oy
    @panorama3.ox = @panorama.ox
    @panorama3.oy = @panorama.oy + 480
    @panorama4.ox = @panorama.ox
    @panorama4.oy = @panorama.oy + 480
    # 刷新雾平面
    @[email protected][email protected][email protected]_x = $game_map.fog_zoom / 100.0
    @[email protected][email protected][email protected]_y = $game_map.fog_zoom / 100.0
    @[email protected][email protected][email protected] = $game_map.fog_opacity
    @[email protected][email protected][email protected]_type = $game_map.fog_blend_type
    @fog4.tone = @fog3.tone = @fog2.tone = @fog.tone = $game_map.fog_tone
    @fog.ox = $game_map.display_x / 4 + $game_map.fog_ox
    @fog.oy = $game_map.display_y / 4 + $game_map.fog_oy
    @fog2.ox = @fog.ox #+ 140#*@fog.zoom_x
    @fog2.oy = @fog.oy
    @fog3.ox = @fog.ox
    @fog3.oy = @fog.oy + 480
    @fog4.ox = @fog.ox
    @fog4.oy = @fog.oy + 480
    # 刷新角色活动块
    for sprite in @character_sprites
      sprite.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
    $viewport4.tone = $game_screen.tone
    $viewport4.ox = $game_screen.shake+640
    $viewport5.tone = $game_screen.tone
    $viewport5.ox = $game_screen.shake  
    $viewport6.tone = $game_screen.tone
    $viewport6.ox = $game_screen.shake+640
    # 设置画面的闪烁色
    @viewport3.color = $game_screen.flash_color
    # 刷新显示端口
    $viewport1.update
    @viewport3.update
    $viewport4.update
    $viewport5.update
    $viewport6.update
  end
end
  class Weather
    def initialize(viewport = nil)
      @type = 0
      @max = 0
      @ox = 0
      @oy = 0
      color1 = Color.new(255, 255, 255, 255)
      color2 = Color.new(255, 255, 255, 128)
      @rain_bitmap = Bitmap.new(7, 56)
      for i in 0..6
        @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
      end
      @storm_bitmap = Bitmap.new(34, 64)
      for i in 0..31
        @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
        @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
        @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
      end
      @snow_bitmap = Bitmap.new(6, 6)
      @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
      @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
      @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
      @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
      @sprites = []
      for i in 1..40
        sprite = Sprite.new(viewport)
        sprite.z = 1000
        sprite.visible = false
        sprite.opacity = 0
        @sprites.push(sprite)
      end
    end
    def dispose
      for sprite in @sprites
        sprite.dispose
      end
      @rain_bitmap.dispose
      @storm_bitmap.dispose
      @snow_bitmap.dispose
    end
    def type=(type)
      return if @type == type
      @type = type
      case @type
      when 1
        bitmap = @rain_bitmap
      when 2
        bitmap = @storm_bitmap
      when 3
        bitmap = @snow_bitmap
      else
        bitmap = nil
      end
      for i in 1..40
        sprite = @sprites
        if sprite != nil
          sprite.visible = (i <= @max)
          sprite.bitmap = bitmap
        end
      end
    end
    def ox=(ox)
      return if @ox == ox;
      @ox = ox
      for sprite in @sprites
        sprite.ox = @ox
      end
    end
    def oy=(oy)
      return if @oy == oy;
      @oy = oy
      for sprite in @sprites
        sprite.oy = @oy
      end
    end
    def max=(max)
      return if @max == max;
      @max = [[max, 0].max, 40].min
      for i in 1..40
        sprite = @sprites
        if sprite != nil
          sprite.visible = (i <= @max)
        end
      end
    end
    def update
      return if @type == 0
      for i in 1..@max
        sprite = @sprites
        if sprite == nil
          break
        end
        if @type == 1
          sprite.x -= 2
          sprite.y += 16
          sprite.opacity -= 8
        end
        if @type == 2
          sprite.x -= 8
          sprite.y += 16
          sprite.opacity -= 12
        end
        if @type == 3
          sprite.x -= 2
          sprite.y += 8
          sprite.opacity -= 8
        end
        x = sprite.x - @ox
        y = sprite.y - @oy
        if sprite.opacity < 64 or x < -50 or x > $width+150 or y < -300 or y > $height+100
          sprite.x = rand($width+150) - 50 + @ox
          sprite.y = rand($height+100) - 200 + @oy
          sprite.opacity = 255
        end
      end
    end
    attr_reader :type
    attr_reader :max
    attr_reader :ox
    attr_reader :oy
  end
#==============================================================================
# ■ Game_Player
#------------------------------------------------------------------------------
#  处理主角的类。事件启动的判定、以及地图的滚动等功能。
# 本类的实例请参考 $game_player。
#==============================================================================

class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 恒量
  #--------------------------------------------------------------------------
  CENTER_X = ($width/2 - 16) * 4   
  CENTER_Y = ($height/2 - 16) * 4   
  #--------------------------------------------------------------------------
  # ● 可以通行判定
  #     x : X 坐标
  #     y : Y 坐标
  #     d : 方向 (0,2,4,6,8)  ※ 0 = 全方向不能通行的情况判定 (跳跃用)
  #--------------------------------------------------------------------------
  def passable?(x, y, d)
    # 求得新的坐标
    new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0)
    new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0)
    # 坐标在地图外的情况下
    unless $game_map.valid?(new_x, new_y)
      # 不能通行
      return false
    end
    # 调试模式为 ON 并且 按下 CTRL 键的情况下
    if $DEBUG and Input.press?(Input::CTRL)
      # 可以通行
      return true
    end
    super
  end
  #--------------------------------------------------------------------------
  # ● 像通到画面中央一样的设置地图的显示位置
  #--------------------------------------------------------------------------
  def center(x, y)
    max_x = ($game_map.width - 20) * 128
    max_y = ($game_map.height - 15) * 128
    $game_map.display_x = [0, [x * 128 - CENTER_X, max_x].min].max
    $game_map.display_y = [0, [y * 128 - CENTER_Y, max_y].min].max
    $game_map.scroll_down(0)
    $game_map.scroll_right(0)
  end
  #--------------------------------------------------------------------------
  # ● 向指定的位置移动
  #     x : X 座標
  #     y : Y 座標
  #--------------------------------------------------------------------------
  def moveto(x, y)
    super
    # 自连接
    center(x, y)
    # 生成遇敌计数
    make_encounter_count
  end
  #--------------------------------------------------------------------------
  # ● 增加步数
  #--------------------------------------------------------------------------
  def increase_steps
    super
    # 不是强制移动路线的场合
    unless @move_route_forcing
      # 增加步数
      $game_party.increase_steps
      # 步数是偶数的情况下
      if $game_party.steps % 2 == 0
        # 检查连续伤害
        $game_party.check_map_slip_damage
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 获取遇敌计数
  #--------------------------------------------------------------------------
  def encounter_count
    return @encounter_count
  end
  #--------------------------------------------------------------------------
  # ● 生成遇敌计数
  #--------------------------------------------------------------------------
  def make_encounter_count
    # 两种颜色震动的图像
    if $game_map.map_id != 0
      n = $game_map.encounter_step
      @encounter_count = rand(n) + rand(n) + 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    # 同伴人数为 0 的情况下
    if $game_party.actors.size == 0
      # 清除角色的文件名及对像
      @character_name = ""
      @character_hue = 0
      # 分支结束
      return
    end
    # 获取带头的角色
    actor = $game_party.actors[0]
    # 设置角色的文件名及对像
    @character_name = actor.character_name
    @character_hue = actor.character_hue
    # 初始化不透明度和合成方式子
    @opacity = 255
    @blend_type = 0
  end
  #--------------------------------------------------------------------------
  # ● 同位置的事件启动判定
  #--------------------------------------------------------------------------
  def check_event_trigger_here(triggers)
    result = false
    # 事件执行中的情况下
    if $game_system.map_interpreter.running?
      return result
    end
    # 全部事件的循环
    for event in $game_map.events.values
      # 事件坐标与目标一致的情况下
      if event.x == @x and event.y == @y and triggers.include?(event.trigger)
        # 跳跃中以外的情况下、启动判定是同位置的事件
        if not event.jumping? and event.over_trigger?
          event.start
          result = true
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # ● 正面事件的启动判定
  #--------------------------------------------------------------------------
  def check_event_trigger_there(triggers)
    result = false
    # 事件执行中的情况下
    if $game_system.map_interpreter.running?
      return result
    end
    # 计算正面坐标
    new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
    new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
    # 全部事件的循环
    for event in $game_map.events.values
      # 事件坐标与目标一致的情况下
      if event.x == new_x and event.y == new_y and
         triggers.include?(event.trigger)
        # 跳跃中以外的情况下、启动判定是正面的事件
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    # 找不到符合条件的事件的情况下
    if result == false
      # 正面的元件是计数器的情况下
      if $game_map.counter?(new_x, new_y)
        # 计算 1 元件里侧的坐标
        new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0)
        new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0)
        # 全事件的循环
        for event in $game_map.events.values
          # 事件坐标与目标一致的情况下
          if event.x == new_x and event.y == new_y and
             triggers.include?(event.trigger)
            # 跳跃中以外的情况下、启动判定是正面的事件
            if not event.jumping? and not event.over_trigger?
              event.start
              result = true
            end
          end
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # ● 接触事件启动判定
  #--------------------------------------------------------------------------
  def check_event_trigger_touch(x, y)
    result = false
    # 事件执行中的情况下
    if $game_system.map_interpreter.running?
      return result
    end
    # 全事件的循环
    for event in $game_map.events.values
      # 事件坐标与目标一致的情况下
      if event.x == x and event.y == y and [1,2].include?(event.trigger)
        # 跳跃中以外的情况下、启动判定是正面的事件
        if not event.jumping? and not event.over_trigger?
          event.start
          result = true
        end
      end
    end
    return result
  end
  #--------------------------------------------------------------------------
  # ● 画面更新
  #--------------------------------------------------------------------------
  def update
    # 本地变量记录移动信息
    last_moving = moving?
    # 移动中、事件执行中、强制移动路线中、
    # 信息窗口一个也不显示的时候
    unless moving? or $game_system.map_interpreter.running? or
           @move_route_forcing or $game_temp.message_window_showing
      # 如果方向键被按下、主角就朝那个方向移动
      case Input.dir4
      when 2
        move_down
      when 4
        move_left
      when 6
        move_right
      when 8
        move_up
      end
    end
    # 本地变量记忆坐标
    last_real_x = @real_x
    last_real_y = @real_y
    super
    # 角色向下移动、画面上的位置在中央下方的情况下
    if @real_y > last_real_y and @real_y - $game_map.display_y > CENTER_Y
      # 画面向下卷动
      $game_map.scroll_down(@real_y - last_real_y)
    end
    # 角色向左移动、画面上的位置在中央左方的情况下
    if @real_x < last_real_x and @real_x - $game_map.display_x < CENTER_X
      # 画面向左卷动
      $game_map.scroll_left(last_real_x - @real_x)
    end
    # 角色向右移动、画面上的位置在中央右方的情况下
    if @real_x > last_real_x and @real_x - $game_map.display_x > CENTER_X
      # 画面向右卷动
      $game_map.scroll_right(@real_x - last_real_x)
    end
    # 角色向上移动、画面上的位置在中央上方的情况下
    if @real_y < last_real_y and @real_y - $game_map.display_y < CENTER_Y
      # 画面向上卷动
      $game_map.scroll_up(last_real_y - @real_y)
    end
    # 不在移动中的情况下
    unless moving?
      # 上次主角移动中的情况
      if last_moving
        # 与同位置的事件接触就判定为事件启动
        result = check_event_trigger_here([1,2])
        # 没有可以启动的事件的情况下
        if result == false
          # 调试模式为 ON 并且按下 CTRL 键的情况下除外
          unless $DEBUG and Input.press?(Input::CTRL)
            # 遇敌计数下降
            if @encounter_count > 0
              @encounter_count -= 1
            end
          end
        end
      end
      # 按下 C 键的情况下
      if Input.trigger?(Input::C)
        # 判定为同位置以及正面的事件启动
        check_event_trigger_here([0])
        check_event_trigger_there([0,1,2])
      end
    end
  end
end
#==============================================================================
# ■ Scene_Gameover
#------------------------------------------------------------------------------
#  处理游戏结束画面的类。
#==============================================================================

class Scene_Gameover
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成游戏结束图形
    if $game_temp.in_battle
      @temp_sprite = Spriteset_Battle.new
    else
      @temp_sprite = Spriteset_Map.new
    end
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.gameover($data_system.gameover_name)
    @sprite.opacity = 0
    # 停止 BGM、BGS
    $game_system.bgm_play(nil)
    $game_system.bgs_play(nil)
    # 演奏游戏结束 ME
    $game_system.me_play($data_system.gameover_me)
    # 执行过渡
    Graphics.transition(0)
    # 主循环
    for i in 0..120
      @sprite.opacity +=4
      Graphics.update
    end
    @temp_sprite.dispose
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面情报
      update
      # 如果画面被切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 释放游戏结束图形
    @sprite.bitmap.dispose
    @sprite.dispose
    # 执行过度
    Graphics.transition(0)
    # 准备过渡
    if $BTEST
      $scene = nil
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      for i in 0..30
        @sprite.opacity -=10
        Graphics.update
      end      
      # 切换到标题画面
      $scene = Scene_Title.new
    end
  end
end
#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  处理标题画面的类。
#==============================================================================

class Scene_Title
  #--------------------------------------------------------------------------
  # ● 住处理
  #--------------------------------------------------------------------------
  def main
    # 战斗测试的情况下
    if $BTEST
      battle_test
      return
    end
    # 载入数据库
    $data_actors        = load_data("Data/Actors.rxdata")
    $data_classes       = load_data("Data/Classes.rxdata")
    $data_skills        = load_data("Data/Skills.rxdata")
    $data_items         = load_data("Data/Items.rxdata")
    $data_weapons       = load_data("Data/Weapons.rxdata")
    $data_armors        = load_data("Data/Armors.rxdata")
    $data_enemies       = load_data("Data/Enemies.rxdata")
    $data_troops        = load_data("Data/Troops.rxdata")
    $data_states        = load_data("Data/States.rxdata")
    $data_animations    = load_data("Data/Animations.rxdata")
    $data_tilesets      = load_data("Data/Tilesets.rxdata")
    $data_common_events = load_data("Data/CommonEvents.rxdata")
    $data_system        = load_data("Data/System.rxdata")
    # 生成系统对像
    $game_system = Game_System.new
    # 生成标题图形
    @sprite = Sprite.new
    @sprite.bitmap = RPG::Cache.title($data_system.title_name)
    @sprite.opacity = 0
    # 生成命令窗口
    s1 = "新游戏"
    s2 = "继续"
    s3 = "退出"
    @command_window = Window_Command.new(192, [s1, s2, s3])
    @command_window.back_opacity = 160
    @command_window.x = $width /2 - @command_window.width / 2
    @command_window.y = $height  /2 +132
    # 判定继续的有效性
    # 存档文件一个也不存在的时候也调查
    # 有効为 @continue_enabled 为 true、無効为 false
    @continue_enabled = false
    for i in 0..3
      if FileTest.exist?("Save#{i+1}.rxdata")
        @continue_enabled = true
      end
    end
    # 继续为有效的情况下、光标停止在继续上
    # 无效的情况下、继续的文字显示为灰色
    if @continue_enabled
      @command_window.index = 1
    else
      @command_window.disable_item(1)
    end
    # 演奏标题 BGM
    $game_system.bgm_play($data_system.title_bgm)
    # 停止演奏 ME、BGS
    Audio.me_stop
    Audio.bgs_stop
    # 执行过渡
    Graphics.transition(0)
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面被切换就中断循环
      if $scene != self
        break
      end
    end
    # 装备过渡
    Graphics.freeze
    # 释放命令窗口
    @command_window.dispose
    # 释放标题图形
    @sprite.bitmap.dispose
    @sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    if @sprite.opacity < 255
      @sprite.opacity += 15
    end   
    # 刷新命令窗口
    @command_window.update
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 命令窗口的光标位置的分支
      case @command_window.index
      when 0  # 新游戏
        command_new_game
      when 1  # 继续
        command_continue
      when 2  # 退出
        command_shutdown
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 命令 : 新游戏
  #--------------------------------------------------------------------------
  def command_new_game
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # 停止 BGM
    Audio.bgm_stop
    # 重置测量游戏时间用的画面计数器
    Graphics.frame_count = 0
    # 生成各种游戏对像
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
    # 设置初期同伴位置
    $game_party.setup_starting_members
    # 设置初期位置的地图
    $game_map.setup($data_system.start_map_id)
    # 主角向初期位置移动
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    # 刷新主角
    $game_player.refresh
    # 执行地图设置的 BGM 与 BGS 的自动切换
    $game_map.autoplay
    # 刷新地图 (执行并行事件)
    $game_map.update
    # 切换地图画面
    $scene = Scene_Map.new
  end
  #--------------------------------------------------------------------------
  # ● 命令 : 继续
  #--------------------------------------------------------------------------
  def command_continue
    # 继续无效的情况下
    unless @continue_enabled
      # 演奏无效 SE
      $game_system.se_play($data_system.buzzer_se)
      return
    end
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # 切换到读档画面
    $scene = Scene_Load.new
  end
  #--------------------------------------------------------------------------
  # ● 命令 : 退出
  #--------------------------------------------------------------------------
  def command_shutdown
    # 演奏确定 SE
    $game_system.se_play($data_system.decision_se)
    # BGM、BGS、ME 的淡入淡出
    Audio.bgm_fade(800)
    Audio.bgs_fade(800)
    Audio.me_fade(800)
    # 退出
    tempBitmap = Sprite.new
    tempBitmap.bitmap = Bitmap.new($width,$height)
    tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
    tempBitmap.opacity = 0
    for i in 0..20
      tempBitmap.opacity+=14
      Graphics.update
    end
    $scene = nil
  end
  #--------------------------------------------------------------------------
  # ● 战斗测试
  #--------------------------------------------------------------------------
  def battle_test
    # 载入数据库 (战斗测试用)
    $data_actors        = load_data("Data/BT_Actors.rxdata")
    $data_classes       = load_data("Data/BT_Classes.rxdata")
    $data_skills        = load_data("Data/BT_Skills.rxdata")
    $data_items         = load_data("Data/BT_Items.rxdata")
    $data_weapons       = load_data("Data/BT_Weapons.rxdata")
    $data_armors        = load_data("Data/BT_Armors.rxdata")
    $data_enemies       = load_data("Data/BT_Enemies.rxdata")
    $data_troops        = load_data("Data/BT_Troops.rxdata")
    $data_states        = load_data("Data/BT_States.rxdata")
    $data_animations    = load_data("Data/BT_Animations.rxdata")
    $data_tilesets      = load_data("Data/BT_Tilesets.rxdata")
    $data_common_events = load_data("Data/BT_CommonEvents.rxdata")
    $data_system        = load_data("Data/BT_System.rxdata")
    # 重置测量游戏时间用的画面计数器
    Graphics.frame_count = 0
    # 生成各种游戏对像
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
    # 设置战斗测试用同伴
    $game_party.setup_battle_test_members
    # 设置队伍 ID、可以逃走标志、战斗背景
    $game_temp.battle_troop_id = $data_system.test_troop_id
    $game_temp.battle_can_escape = true
    $game_map.battleback_name = $data_system.battleback_name
    # 演奏战斗开始 BGM
    $game_system.se_play($data_system.battle_start_se)
    # 演奏战斗 BGM
    $game_system.bgm_play($game_system.battle_bgm)
    # 切换到战斗画面
    $scene = Scene_Battle.new
  end
end
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
#  处理地图画面的类。
#==============================================================================

class Scene_Map
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
   
   
    # @@@@@@@@@@@@@@@@@@
    @window_hp = Window_ARPGStatus.new(@actor)
   # @@@@@@@@@@@@@@@@@@@@
   
   
    # 生成活动块
    @spriteset = Spriteset_Map.new
    # 生成信息窗口
    @message_window = Window_Message.new
    tempBitmap = Sprite.new
    tempBitmap.bitmap = Bitmap.new($width,$height)
    tempBitmap.bitmap.fill_rect(0, 0, $width, $height, 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
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 标题画面切换中的情况下
    if $scene.is_a?(Scene_Title)
      @message_window.dispose
      tempBitmap = Sprite.new
      tempBitmap.bitmap = Bitmap.new($width,$height)
      tempBitmap.bitmap.fill_rect(0, 0, $width, $height, 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
      #@@@@@@@@@@@@@@@@@@@@@@@@
    @window_hp.dispose
    # @@@@@@@@@@@@@@@@@@@@@@@
      @spriteset.dispose
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
     #@@@@@@@@@@@@@@@@@@@@@@@@
    @window_hp.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
    # 游戏结束的情况下
    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
    # 清除商店调用菜单标志
    $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
  #--------------------------------------------------------------------------
  # ● 调用存档
  #--------------------------------------------------------------------------
  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($width,$height)
      $_t_Bitmap.bitmap.fill_rect(0,0,$width,$height,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
#==============================================================================
# ■ Interpreter (分割定义 5)
#------------------------------------------------------------------------------
#  执行事件命令的注释器。本类在 Game_System 类
# 和 Game_Event 类的内部使用。
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # ● 场所移动
  #--------------------------------------------------------------------------
  def command_201
    # 战斗中的情况
    if $game_temp.in_battle
      # 继续
      return true
    end
    # 场所移动中、信息显示中、过渡处理中的情况下
    if $game_temp.player_transferring or
       $game_temp.message_window_showing or
       $game_temp.transition_processing
      # 结束
      return false
    end
    # 设置场所移动标志
    $game_temp.player_transferring = true
    # 指定方法为 [直接指定] 的情况下
    if @parameters[0] == 0
      # 设置主角的移动目标
      $game_temp.player_new_map_id = @parameters[1]
      $game_temp.player_new_x = @parameters[2]
      $game_temp.player_new_y = @parameters[3]
      $game_temp.player_new_direction = @parameters[4]
    # 指定方法为 [使用变量指定] 的情况下
    else
      # 设置主角的移动目标
      $game_temp.player_new_map_id = $game_variables[@parameters[1]]
      $game_temp.player_new_x = $game_variables[@parameters[2]]
      $game_temp.player_new_y = $game_variables[@parameters[3]]
      $game_temp.player_new_direction = @parameters[4]
    end
    # 推进索引
    @index += 1
    # 有淡入淡出的情况下
    if @parameters[5] == 0
      # 准备过渡   
      tempBitmap = Sprite.new
      tempBitmap.bitmap = Bitmap.new($width,$height)
      tempBitmap.bitmap.fill_rect(0, 0, $width, $height, Color.new(0,0,0,255))
      tempBitmap.opacity = 0
      for i in 0..10
        tempBitmap.opacity+=26
        Graphics.update
      end
      Graphics.freeze
      tempBitmap.bitmap.dispose
      tempBitmap.dispose
      # 设置过渡处理中标志
      $game_temp.transition_processing = true
      $game_temp.transition_name = ""
    end
    # 结束
    return false
  end
  #--------------------------------------------------------------------------
  # ● 设置事件位置
  #--------------------------------------------------------------------------
  def command_202
    # 战斗中的情况下
    if $game_temp.in_battle
      # 继续
      return true
    end
    # 获取角色
    character = get_character(@parameters[0])
    # 角色不存在的情况下
    if character == nil
      # 继续
      return true
    end
    # 指定方法为 [直接指定] 的情况下
    if @parameters[1] == 0
      # 设置角色的位置
      character.moveto(@parameters[2], @parameters[3])
    # 指定方法为 [使用变量指定] 的情况下
    elsif @parameters[1] == 1
      # 设置角色的位置
      character.moveto($game_variables[@parameters[2]],
        $game_variables[@parameters[3]])
    # 指定方法为 [与其它事件交换] 的情况下
    else
      old_x = character.x
      old_y = character.y
      character2 = get_character(@parameters[2])
      if character2 != nil
        character.moveto(character2.x, character2.y)
        character2.moveto(old_x, old_y)
      end
    end
    # 设置觉得的朝向
    case @parameters[4]
    when 8  # 上
      character.turn_up
    when 6  # 右
      character.turn_right
    when 2  # 下
      character.turn_down
    when 4  # 左
      character.turn_left
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 地图的滚动
  #--------------------------------------------------------------------------
  def command_203
    # 战斗中的情况下
    if $game_temp.in_battle
      # 继续
      return true
    end
    # 已经在滚动中的情况下
    if $game_map.scrolling?
      # 结束
      return false
    end
    # 开始滚动
    $game_map.start_scroll(@parameters[0], @parameters[1], @parameters[2])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 更改地图设置
  #--------------------------------------------------------------------------
  def command_204
    case @parameters[0]
    when 0  # 远景
      $game_map.panorama_name = @parameters[1]
      $game_map.panorama_hue = @parameters[2]
    when 1  # 雾
      $game_map.fog_name = @parameters[1]
      $game_map.fog_hue = @parameters[2]
      $game_map.fog_opacity = @parameters[3]
      $game_map.fog_blend_type = @parameters[4]
      $game_map.fog_zoom = @parameters[5]
      $game_map.fog_sx = @parameters[6]
      $game_map.fog_sy = @parameters[7]
    when 2  # 战斗背景
      $game_map.battleback_name = @parameters[1]
      $game_temp.battleback_name = @parameters[1]
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 更改雾的色调
  #--------------------------------------------------------------------------
  def command_205
    # 开始更改色调
    $game_map.start_fog_tone_change(@parameters[0], @parameters[1] * 2)
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 更改雾的不透明度
  #--------------------------------------------------------------------------
  def command_206
    # 开始更改不透明度
    $game_map.start_fog_opacity_change(@parameters[0], @parameters[1] * 2)
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 显示动画
  #--------------------------------------------------------------------------
  def command_207
    # 获取角色
    character = get_character(@parameters[0])
    # 角色不存在的情况下
    if character == nil
      # 继续
      return true
    end
    # 设置动画 ID
    character.animation_id = @parameters[1]
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 更改透明状态
  #--------------------------------------------------------------------------
  def command_208
    # 设置主角的透明状态
    $game_player.transparent = (@parameters[0] == 0)
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 设置移动路线
  #--------------------------------------------------------------------------
  def command_209
    # 获取角色
    character = get_character(@parameters[0])
    # 角色不存在的情况下
    if character == nil
      # 继续
      return true
    end
    # 强制移动路线
    character.force_move_route(@parameters[1])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 移动结束后等待
  #--------------------------------------------------------------------------
  def command_210
    # 如果不在战斗中
    unless $game_temp.in_battle
      # 设置移动结束后待机标志
      @move_route_waiting = true
    end
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 开始过渡
  #--------------------------------------------------------------------------
  def command_221
    # 显示信息窗口中的情况下
    if $game_temp.message_window_showing
      # 结束
      return false
    end
    # 准备过渡
    Graphics.freeze
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 执行过渡
  #--------------------------------------------------------------------------
  def command_222
    # 已经设置了过渡处理中标志的情况下
    if $game_temp.transition_processing
      # 结束
      return false
    end
    # 设置过渡处理中标志
    $game_temp.transition_processing = true
    $game_temp.transition_name = @parameters[0]
    # 推进索引
    @index += 1
    # 结束
    return false
  end
  #--------------------------------------------------------------------------
  # ● 更改画面色调
  #--------------------------------------------------------------------------
  def command_223
    # 开始更改色调
    $game_screen.start_tone_change(@parameters[0], @parameters[1] * 2)
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 画面闪烁
  #--------------------------------------------------------------------------
  def command_224
    # 开始闪烁
    $game_screen.start_flash(@parameters[0], @parameters[1] * 2)
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 画面震动
  #--------------------------------------------------------------------------
  def command_225
    # 震动开始
    $game_screen.start_shake(@parameters[0], @parameters[1],
      @parameters[2] * 2)
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 显示图片
  #--------------------------------------------------------------------------
  def command_231
    # 获取图片编号
    number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
    # 指定方法为 [直接指定] 的情况下
    if @parameters[3] == 0
      x = @parameters[4]
      y = @parameters[5]
    # 指定方法为 [使用变量指定] 的情况下
    else
      x = $game_variables[@parameters[4]]
      y = $game_variables[@parameters[5]]
    end
    # 显示图片
    $game_screen.pictures[number].show(@parameters[1], @parameters[2],
      x, y, @parameters[6], @parameters[7], @parameters[8], @parameters[9])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 移动图片
  #--------------------------------------------------------------------------
  def command_232
    # 获取图片编号
    number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
    # 指定方法为 [直接指定] 的情况下
    if @parameters[3] == 0
      x = @parameters[4]
      y = @parameters[5]
    # 指定方法为 [使用变量指定] 的情况下
    else
      x = $game_variables[@parameters[4]]
      y = $game_variables[@parameters[5]]
    end
    # 移动图片
    $game_screen.pictures[number].move(@parameters[1] * 2, @parameters[2],
      x, y, @parameters[6], @parameters[7], @parameters[8], @parameters[9])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 旋转图片
  #--------------------------------------------------------------------------
  def command_233
    # 获取图片编号
    number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
    # 设置旋转速度
    $game_screen.pictures[number].rotate(@parameters[1])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 更改图片色调
  #--------------------------------------------------------------------------
  def command_234
    # 获取图片编号
    number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
    # 开始更改色调
    $game_screen.pictures[number].start_tone_change(@parameters[1],
      @parameters[2] * 2)
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 删除图片
  #--------------------------------------------------------------------------
  def command_235
    # 获取图片编号
    number = @parameters[0] + ($game_temp.in_battle ? 50 : 0)
    # 删除图片
    $game_screen.pictures[number].erase
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 天候设置
  #--------------------------------------------------------------------------
  def command_236
    # 设置天候
    $game_screen.weather(@parameters[0], @parameters[1], @parameters[2])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 演奏 BGM
  #--------------------------------------------------------------------------
  def command_241
    # 演奏 BGM
    $game_system.bgm_play(@parameters[0])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● BGM 的淡入淡出
  #--------------------------------------------------------------------------
  def command_242
    # 淡入淡出 BGM
    $game_system.bgm_fade(@parameters[0])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 演奏 BGS
  #--------------------------------------------------------------------------
  def command_245
    # 演奏 BGS
    $game_system.bgs_play(@parameters[0])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● BGS 的淡入淡出
  #--------------------------------------------------------------------------
  def command_246
    # 淡入淡出 BGS
    $game_system.bgs_fade(@parameters[0])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 记忆 BGM / BGS
  #--------------------------------------------------------------------------
  def command_247
    # 记忆 BGM / BGS
    $game_system.bgm_memorize
    $game_system.bgs_memorize
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 还原 BGM / BGS
  #--------------------------------------------------------------------------
  def command_248
    # 还原 BGM / BGS
    $game_system.bgm_restore
    $game_system.bgs_restore
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 演奏 ME
  #--------------------------------------------------------------------------
  def command_249
    # 演奏 ME
    $game_system.me_play(@parameters[0])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 演奏 SE
  #--------------------------------------------------------------------------
  def command_250
    # 演奏 SE
    $game_system.se_play(@parameters[0])
    # 继续
    return true
  end
  #--------------------------------------------------------------------------
  # ● 停止 SE
  #--------------------------------------------------------------------------
  def command_251
    # 停止 SE
    Audio.se_stop
    # 继续
    return true
  end
end
#==============================================================================
# ■ Game_Enemy
#------------------------------------------------------------------------------
#  处理敌人的类。本类在 Game_Troop 类 ($game_troop) 的
# 内部使用。
#==============================================================================

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     troop_id     : 循环 ID
  #     member_index : 循环成员的索引
  #--------------------------------------------------------------------------
  def initialize(troop_id, member_index)
    super()
    @troop_id = troop_id
    @member_index = member_index
    troop = $data_troops[@troop_id]
    @enemy_id = troop.members[@member_index].enemy_id
    enemy = $data_enemies[@enemy_id]
    @battler_name = enemy.battler_name
    @battler_hue = enemy.battler_hue
    @hp = maxhp
    @sp = maxsp
    @hidden = troop.members[@member_index].hidden
    @immortal = troop.members[@member_index].immortal
  end
  #--------------------------------------------------------------------------
  # ● 获取敌人 ID
  #--------------------------------------------------------------------------
  def id
    return @enemy_id
  end
  #--------------------------------------------------------------------------
  # ● 获取索引
  #--------------------------------------------------------------------------
  def index
    return @member_index
  end
  #--------------------------------------------------------------------------
  # ● 获取名称
  #--------------------------------------------------------------------------
  def name
    return $data_enemies[@enemy_id].name
  end
  #--------------------------------------------------------------------------
  # ● 获取基本 MaxHP
  #--------------------------------------------------------------------------
  def base_maxhp
    return $data_enemies[@enemy_id].maxhp
  end
  #--------------------------------------------------------------------------
  # ● 获取基本 MaxSP
  #--------------------------------------------------------------------------
  def base_maxsp
    return $data_enemies[@enemy_id].maxsp
  end
  #--------------------------------------------------------------------------
  # ● 获取基本力量
  #--------------------------------------------------------------------------
  def base_str
    return $data_enemies[@enemy_id].str
  end
  #--------------------------------------------------------------------------
  # ● 获取基本灵巧
  #--------------------------------------------------------------------------
  def base_dex
    return $data_enemies[@enemy_id].dex
  end
  #--------------------------------------------------------------------------
  # ● 获取基本速度
  #--------------------------------------------------------------------------
  def base_agi
    return $data_enemies[@enemy_id].agi
  end
  #--------------------------------------------------------------------------
  # ● 获取基本魔力
  #--------------------------------------------------------------------------
  def base_int
    return $data_enemies[@enemy_id].int
  end
  #--------------------------------------------------------------------------
  # ● 获取基本攻击力
  #--------------------------------------------------------------------------
  def base_atk
    return $data_enemies[@enemy_id].atk
  end
  #--------------------------------------------------------------------------
  # ● 获取基本物理防御
  #--------------------------------------------------------------------------
  def base_pdef
    return $data_enemies[@enemy_id].pdef
  end
  #--------------------------------------------------------------------------
  # ● 获取基本魔法防御
  #--------------------------------------------------------------------------
  def base_mdef
    return $data_enemies[@enemy_id].mdef
  end
  #--------------------------------------------------------------------------
  # ● 获取基本回避修正
  #--------------------------------------------------------------------------
  def base_eva
    return $data_enemies[@enemy_id].eva
  end
  #--------------------------------------------------------------------------
  # ● 普通攻击 获取攻击方动画 ID
  #--------------------------------------------------------------------------
  def animation1_id
    return $data_enemies[@enemy_id].animation1_id
  end
  #--------------------------------------------------------------------------
  # ● 普通攻击 获取对像方动画 ID
  #--------------------------------------------------------------------------
  def animation2_id
    return $data_enemies[@enemy_id].animation2_id
  end
  #--------------------------------------------------------------------------
  # ● 获取属性修正值
  #     element_id : 属性 ID
  #--------------------------------------------------------------------------
  def element_rate(element_id)
    # 获取对应属性有效度的数值
    table = [0,200,150,100,50,0,-100]
    result = table[$data_enemies[@enemy_id].element_ranks[element_id]]
    # 状态能防御本属性的情况下效果减半
    for i in @states
      if $data_states.guard_element_set.include?(element_id)
        result /= 2
      end
    end
    # 过程结束
    return result
  end
  #--------------------------------------------------------------------------
  # ● 获取属性有效度
  #--------------------------------------------------------------------------
  def state_ranks
    return $data_enemies[@enemy_id].state_ranks
  end
  #--------------------------------------------------------------------------
  # ● 属性防御判定
  #     state_id : 状态 ID
  #--------------------------------------------------------------------------
  def state_guard?(state_id)
    return false
  end
  #--------------------------------------------------------------------------
  # ● 获取普通攻击属性
  #--------------------------------------------------------------------------
  def element_set
    return []
  end
  #--------------------------------------------------------------------------
  # ● 获取普通攻击的状态变化 (+)
  #--------------------------------------------------------------------------
  def plus_state_set
    return []
  end
  #--------------------------------------------------------------------------
  # ● 获取普通攻击的状态变化 (-)
  #--------------------------------------------------------------------------
  def minus_state_set
    return []
  end
  #--------------------------------------------------------------------------
  # ● 获取行动
  #--------------------------------------------------------------------------
  def actions
    return $data_enemies[@enemy_id].actions
  end
  #--------------------------------------------------------------------------
  # ● 获取 EXP
  #--------------------------------------------------------------------------
  def exp
    return $data_enemies[@enemy_id].exp
  end
  #--------------------------------------------------------------------------
  # ● 获取金钱
  #--------------------------------------------------------------------------
  def gold
    return $data_enemies[@enemy_id].gold
  end
  #--------------------------------------------------------------------------
  # ● 获取物品 ID
  #--------------------------------------------------------------------------
  def item_id
    return $data_enemies[@enemy_id].item_id
  end
  #--------------------------------------------------------------------------
  # ● 获取武器 ID
  #--------------------------------------------------------------------------
  def weapon_id
    return $data_enemies[@enemy_id].weapon_id
  end
  #--------------------------------------------------------------------------
  # ● 获取放具 ID
  #--------------------------------------------------------------------------
  def armor_id
    return $data_enemies[@enemy_id].armor_id
  end
  #--------------------------------------------------------------------------
  # ● 获取宝物出现率
  #--------------------------------------------------------------------------
  def treasure_prob
    return $data_enemies[@enemy_id].treasure_prob
  end
  #--------------------------------------------------------------------------
  # ● 取得战斗画面 X 坐标
  #--------------------------------------------------------------------------
  def screen_x
    return $data_troops[@troop_id].members[@member_index].x*$width/640
  end
  #--------------------------------------------------------------------------
  # ● 取得战斗画面 Y 坐标
  #--------------------------------------------------------------------------
  def screen_y
    return $data_troops[@troop_id].members[@member_index].y*$height/480
  end
  #--------------------------------------------------------------------------
  # ● 取得战斗画面 Z 坐标
  #--------------------------------------------------------------------------
  def screen_z
    return screen_y
  end
  #--------------------------------------------------------------------------
  # ● 逃跑
  #--------------------------------------------------------------------------
  def escape
    # 设置击中标志
    @hidden = true
    # 清除当前行动
    self.current_action.clear
  end
  #--------------------------------------------------------------------------
  # ● 变身
  #     enemy_id : 变身为的敌人 ID
  #--------------------------------------------------------------------------
  def transform(enemy_id)
    # 更改敌人 ID
    @enemy_id = enemy_id
    # 更改战斗图形
    @battler_name = $data_enemies[@enemy_id].battler_name
    @battler_hue = $data_enemies[@enemy_id].battler_hue
    # 在生成行动
    make_action
  end
  #--------------------------------------------------------------------------
  # ● 生成行动
  #--------------------------------------------------------------------------
  def make_action
    # 清除当前行动
    self.current_action.clear
    # 无法行动的情况
    unless self.movable?
      # 过程结束
      return
    end
    # 抽取现在有效的行动
    available_actions = []
    rating_max = 0
    for action in self.actions
      # 确认回合条件
      n = $game_temp.battle_turn
      a = action.condition_turn_a
      b = action.condition_turn_b
      if (b == 0 and n != a) or
         (b > 0 and (n < 1 or n < a or n % b != a % b))
        next
      end
      # 确认 HP 条件
      if self.hp * 100.0 / self.maxhp > action.condition_hp
        next
      end
      # 确认等级条件
      if $game_party.max_level < action.condition_level
        next
      end
      # 确认开关条件
      switch_id = action.condition_switch_id
      if switch_id > 0 and $game_switches[switch_id] == false
        next
      end
      # 符合条件 : 添加本行动
      available_actions.push(action)
      if action.rating > rating_max
        rating_max = action.rating
      end
    end
    # 最大概率值作为 3 合计计算(0 除外)
    ratings_total = 0
    for action in available_actions
      if action.rating > rating_max - 3
        ratings_total += action.rating - (rating_max - 3)
      end
    end
    # 概率合计不为 0 的情况下
    if ratings_total > 0
      # 生成随机数
      value = rand(ratings_total)
      # 设置对应生成随机数的当前行动
      for action in available_actions
        if action.rating > rating_max - 3
          if value < action.rating - (rating_max - 3)
            self.current_action.kind = action.kind
            self.current_action.basic = action.basic
            self.current_action.skill_id = action.skill_id
            self.current_action.decide_random_target_for_enemy
            return
          else
            value -= action.rating - (rating_max - 3)
          end
        end
      end
    end
  end
end
#==============================================================================
# ■ Game_Map
#------------------------------------------------------------------------------
#  处理地图的类。包含卷动以及可以通行的判断功能。
# 本类的实例请参考 $game_map 。
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :tileset_name             # 元件 文件名
  attr_accessor :autotile_names           # 自动元件 文件名
  attr_accessor :panorama_name            # 全景 文件名
  attr_accessor :panorama_hue             # 全景 色相
  attr_accessor :fog_name                 # 雾 文件名
  attr_accessor :fog_hue                  # 雾 色相
  attr_accessor :fog_opacity              # 雾 不透明度
  attr_accessor :fog_blend_type           # 雾 混合方式
  attr_accessor :fog_zoom                 # 雾 放大率
  attr_accessor :fog_sx                   # 雾 SX
  attr_accessor :fog_sy                   # 雾 SY
  attr_accessor :battleback_name          # 战斗背景 文件名
  attr_accessor :display_x                # 显示 X 坐标 * 128
  attr_accessor :display_y                # 显示 Y 坐标 * 128
  attr_accessor :need_refresh             # 刷新要求标志
  attr_reader   :passages                 # 通行表
  attr_reader   :priorities               # 优先表
  attr_reader   :terrain_tags             # 地形标记表
  attr_reader   :events                   # 事件
  attr_reader   :fog_ox                   # 雾 原点 X 坐标
  attr_reader   :fog_oy                   # 雾 原点 Y 坐标
  attr_reader   :fog_tone                 # 雾 色调
  #--------------------------------------------------------------------------
  # ● 初始化条件
  #--------------------------------------------------------------------------
  def initialize
    @map_id = 0
    @display_x = 0
    @display_y = 0
  end
  #--------------------------------------------------------------------------
  # ● 设置
  #     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
    # 清除刷新要求标志
    @need_refresh = false
    # 设置地图事件数据
    @events = {}
    for i in @map.events.keys
      @events = Game_Event.new(@map_id, @map.events)
    end
    # 设置公共事件数据
    @common_events = {}
    for i in 1...$data_common_events.size
      @common_events = 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
  #--------------------------------------------------------------------------
  # ● 获取地图 ID
  #--------------------------------------------------------------------------
  def map_id
    return @map_id
  end
  #--------------------------------------------------------------------------
  # ● 获取宽度
  #--------------------------------------------------------------------------
  def width
    return @map.width
  end
  #--------------------------------------------------------------------------
  # ● 获取高度
  #--------------------------------------------------------------------------
  def height
    return @map.height
  end
  #--------------------------------------------------------------------------
  # ● 获取遇敌列表
  #--------------------------------------------------------------------------
  def encounter_list
    return @map.encounter_list
  end
  #--------------------------------------------------------------------------
  # ● 获取遇敌步数
  #--------------------------------------------------------------------------
  def encounter_step
    return @map.encounter_step
  end
  #--------------------------------------------------------------------------
  # ● 获取地图数据
  #--------------------------------------------------------------------------
  def data
    return @map.data
  end
  #--------------------------------------------------------------------------
  # ● BGM / BGS 自动切换
  #--------------------------------------------------------------------------
  def autoplay
    if @map.autoplay_bgm
      $game_system.bgm_play(@map.bgm)
    end
    if @map.autoplay_bgs
      $game_system.bgs_play(@map.bgs)
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    # 地图 ID 有效
    if @map_id > 0
      # 刷新全部的地图事件
      for event in @events.values
        event.refresh
      end
      # 刷新全部的公共事件
      for common_event in @common_events.values
        common_event.refresh
      end
    end
    # 清除刷新要求标志
    @need_refresh = false
  end
  #--------------------------------------------------------------------------
  # ● 滚动
  #     distance : 滚动距离
  #--------------------------------------------------------------------------
  def scroll_down(distance)
    @display_y = [@display_y + distance, (self.height - ($height / 32.0)) * 128].min
  end
  #--------------------------------------------------------------------------
  def scroll_left(distance)
    @display_x = [@display_x - distance, 0].max
  end
  #--------------------------------------------------------------------------
  def scroll_right(distance)
    @display_x = [@display_x + distance, (self.width - ($width / 32.0)) * 128].min
  end
  #--------------------------------------------------------------------------
  def scroll_up(distance)
    @display_y = [@display_y - distance, 0].max
  end
  #--------------------------------------------------------------------------
  # ● 有效坐标判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def valid?(x, y)
    return (x >= 0 and x < width and y >= 0 and y < height)
  end
  #--------------------------------------------------------------------------
  # ● 可以通行判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #     d          : 方向 (0,2,4,6,8,10)
  #                  ※ 0,10 = 全方向不能通行的情况的判定 (跳跃等)
  #     self_event : 自己 (判定事件可以通行的情况下)
  #--------------------------------------------------------------------------
  def passable?(x, y, d, self_event = nil)
    # 被给予的坐标地图外的情况下
    unless valid?(x, y)
      # 不能通行
      return false
    end
    # 方向 (0,2,4,6,8,10) 与障碍物接触 (0,1,2,4,8,0) 后变换
    bit = (1 << (d / 2 - 1)) & 0x0f
    # 循环全部的事件
    for event in events.values
      # 自己以外的元件与坐标相同的情况
      if event.tile_id >= 0 and event != self_event and
         event.x == x and event.y == y and not event.through
        # 如果障碍物的接触被设置的情况下
        if @passages[event.tile_id] & bit != 0
          # 不能通行
          return false
        # 如果全方向的障碍物的接触被设置的情况下
        elsif @passages[event.tile_id] & 0x0f == 0x0f
          # 不能通行
          return false
        # 这以外的优先度为 0 的情况下
        elsif @priorities[event.tile_id] == 0
          # 可以通行
          return true
        end
      end
    end
    # 从层按从上到下的顺序调查循环
    for i in [2, 1, 0]
      # 取得元件 ID
      tile_id = data[x, y, i]
      # 取得元件 ID 失败
      if tile_id == nil
        # 不能通行
        return false
      # 如果障碍物的接触被设置的情况下
      elsif @passages[tile_id] & bit != 0
        # 不能通行
        return false
      # 如果全方向的障碍物的接触被设置的情况下
      elsif @passages[tile_id] & 0x0f == 0x0f
        # 不能通行
        return false
      # 这以外的优先度为 0 的情况下
      elsif @priorities[tile_id] == 0
        # 可以通行
        return true
      end
    end
    # 可以通行
    return true
  end
  #--------------------------------------------------------------------------
  # ● 茂密判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def bush?(x, y)
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id == nil
          return false
        elsif @passages[tile_id] & 0x40 == 0x40
          return true
        end
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 反击判定
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def counter?(x, y)
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id == nil
          return false
        elsif @passages[tile_id] & 0x80 == 0x80
          return true
        end
      end
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 地获取地形标志
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def terrain_tag(x, y)
    if @map_id != 0
      for i in [2, 1, 0]
        tile_id = data[x, y, i]
        if tile_id == nil
          return 0
        elsif @terrain_tags[tile_id] > 0
          return @terrain_tags[tile_id]
        end
      end
    end
    return 0
  end
  #--------------------------------------------------------------------------
  # ● 获取指定位置的事件 ID
  #     x          : X 坐标
  #     y          : Y 坐标
  #--------------------------------------------------------------------------
  def check_event(x, y)
    for event in $game_map.events.values
      if event.x == x and event.y == y
        return event.id
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 滚动开始
  #     direction : 滚动方向
  #     distance  : 滚动距离
  #     speed     : 滚动速度
  #--------------------------------------------------------------------------
  def start_scroll(direction, distance, speed)
    @scroll_direction = direction
    @scroll_rest = distance * 128
    @scroll_speed = speed
  end
  #--------------------------------------------------------------------------
  # ● 滚动中判定
  #--------------------------------------------------------------------------
  def scrolling?
    return @scroll_rest > 0
  end
  #--------------------------------------------------------------------------
  # ● 开始变更雾的色调
  #     tone     : 色调
  #     duration : 时间
  #--------------------------------------------------------------------------
  def start_fog_tone_change(tone, duration)
    @fog_tone_target = tone.clone
    @fog_tone_duration = duration
    if @fog_tone_duration == 0
      @fog_tone = @fog_tone_target.clone
    end
  end
  #--------------------------------------------------------------------------
  # ● 开始变更雾的不透明度
  #     opacity  : 不透明度
  #     duration : 时间
  #--------------------------------------------------------------------------
  def start_fog_opacity_change(opacity, duration)
    @fog_opacity_target = opacity * 1.0
    @fog_opacity_duration = duration
    if @fog_opacity_duration == 0
      @fog_opacity = @fog_opacity_target
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 还原必要的地图
    if $game_map.need_refresh
      refresh
    end
    # 滚动中的情况下
    if @scroll_rest > 0
      # 滚动速度变化为地图坐标系的距离
      distance = 2 ** @scroll_speed
      # 执行滚动
      case @scroll_direction
      when 2  # 下
        scroll_down(distance)
      when 4  # 左
        scroll_left(distance)
      when 6  # 右
        scroll_right(distance)
      when 8  # 上
        scroll_up(distance)
      end
      # 滚动距离的减法运算
      @scroll_rest -= distance
    end
    # 更新地图事件
    for event in @events.values
      event.update
    end
    # 更新公共事件
    for common_event in @common_events.values
      common_event.update
    end
    # 处理雾的滚动
    @fog_ox -= @fog_sx / 8.0
    @fog_oy -= @fog_sy / 8.0
    # 处理雾的色调变更
    if @fog_tone_duration >= 1
      d = @fog_tone_duration
      target = @fog_tone_target
      @fog_tone.red = (@fog_tone.red * (d - 1) + target.red) / d
      @fog_tone.green = (@fog_tone.green * (d - 1) + target.green) / d
      @fog_tone.blue = (@fog_tone.blue * (d - 1) + target.blue) / d
      @fog_tone.gray = (@fog_tone.gray * (d - 1) + target.gray) / d
      @fog_tone_duration -= 1
    end
    # 处理雾的不透明度变更
    if @fog_opacity_duration >= 1
      d = @fog_opacity_duration
      @fog_opacity = (@fog_opacity * (d - 1) + @fog_opacity_target) / d
      @fog_opacity_duration -= 1
    end
  end
end
#==============================================================================
# ■ Sprite_Character
#------------------------------------------------------------------------------
#  角色显示用脚本。监视 Game_Character 类的实例、
# 自动变化脚本状态。
#==============================================================================

class Sprite_Character < RPG::Sprite
  #--------------------------------------------------------------------------
  # ● 定义实例变量
  #--------------------------------------------------------------------------
  attr_accessor :character                # 角色
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     viewport  : 查看端口
  #     character : 角色 (Game_Character)
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil)
    super(viewport)
    @vp = viewport
    @character = character
    update
  end
  #--------------------------------------------------------------------------
  # ● 更新画面
  #--------------------------------------------------------------------------
  def update
    super
    # 元件 ID、文件名、色相与现在的情况存在差异的情况下
    if @tile_id != @character.tile_id or
       @character_name != @character.character_name or
       @character_hue != @character.character_hue
      # 记忆元件 ID 与文件名、色相
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      # 元件 ID 为有效值的情况下
      if @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
      # 元件 ID 为无效值的情况下
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    # 设置可视状态
    self.visible = (not @character.transparent)
    # 图形是角色的情况下
    if @tile_id == 0
      # 设置传送目标的矩形
      sx = @character.pattern * @cw
      sy = (@character.direction - 2) / 2 * @ch
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    # 设置脚本的坐标
    self.x = @character.screen_x
    #if @character == $game_player
      if @vp == $viewport5 or @vp == $viewport6
        self.y = @character.screen_y-480
        self.z = @character.screen_z(@ch)-480
      else
        self.y = @character.screen_y
        self.z = @character.screen_z(@ch)
      end
    #else
      #self.y = @character.screen_y
      #self.z = @character.screen_z(@ch)
    #end
    # 设置不透明度、合成方式、茂密
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    # 动画
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
  end
end

  class Weather
    def initialize(viewport = nil)
      @type = 0
      @max = 0
      @ox = 0
      @oy = 0
      color1 = Color.new(255, 255, 255, 255)
      color2 = Color.new(255, 255, 255, 128)
      @rain_bitmap = Bitmap.new(7, 56)
      for i in 0..6
        @rain_bitmap.fill_rect(6-i, i*8, 1, 8, color1)
      end
      @storm_bitmap = Bitmap.new(34, 64)
      for i in 0..31
        @storm_bitmap.fill_rect(33-i, i*2, 1, 2, color2)
        @storm_bitmap.fill_rect(32-i, i*2, 1, 2, color1)
        @storm_bitmap.fill_rect(31-i, i*2, 1, 2, color2)
      end
      @snow_bitmap = Bitmap.new(6, 6)
      @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
      @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
      @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
      @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
      @sprites = []
      for i in 1..40
        sprite = Sprite.new(viewport)
        sprite.z = 1000
        sprite.visible = false
        sprite.opacity = 0
        @sprites.push(sprite)
      end
    end
    def dispose
      for sprite in @sprites
        sprite.dispose
      end
      @rain_bitmap.dispose
      @storm_bitmap.dispose
      @snow_bitmap.dispose
    end
    def type=(type)
      return if @type == type
      @type = type
      case @type
      when 1
        bitmap = @rain_bitmap
      when 2
        bitmap = @storm_bitmap
      when 3
        bitmap = @snow_bitmap
      else
        bitmap = nil
      end
      for i in 1..40
        sprite = @sprites
        if sprite != nil
          sprite.visible = (i <= @max)
          sprite.bitmap = bitmap
        end
      end
    end
    def ox=(ox)
      return if @ox == ox;
      @ox = ox
      for sprite in @sprites
        sprite.ox = @ox
      end
    end
    def oy=(oy)
      return if @oy == oy;
      @oy = oy
      for sprite in @sprites
        sprite.oy = @oy
      end
    end
    def max=(max)
      return if @max == max;
      @max = [[max, 0].max, 40].min
      for i in 1..40
        sprite = @sprites
        if sprite != nil
          sprite.visible = (i <= @max)
        end
      end
    end
    def update
      return if @type == 0
      for i in 1..@max
        sprite = @sprites
        if sprite == nil
          break
        end
        if @type == 1
          sprite.x -= 2
          sprite.y += 16
          sprite.opacity -= 8
        end
        if @type == 2
          sprite.x -= 8
          sprite.y += 16
          sprite.opacity -= 12
        end
        if @type == 3
          sprite.x -= 2
          sprite.y += 8
          sprite.opacity -= 8
        end
        x = sprite.x - @ox
        y = sprite.y - @oy
        if sprite.opacity < 64 or x < -50 or x > $width+150 or y < -300 or y > $height+100
          sprite.x = rand($width+150) - 50 + @ox
          sprite.y = rand($height+100) - 200 + @oy
          sprite.opacity = 255
        end
      end
    end
    attr_reader :type
    attr_reader :max
    attr_reader :ox
    attr_reader :oy
  end
回复 支持 反对

使用道具 举报

Lv1.梦旅人

尽头

梦石
0
星屑
119
在线时间
278 小时
注册时间
2010-6-20
帖子
1280
5
发表于 2010-6-20 21:50:40 | 只看该作者
:o = :   O
回复 支持 反对

使用道具 举报

Lv1.梦旅人

神之瞳

梦石
0
星屑
60
在线时间
5 小时
注册时间
2009-7-5
帖子
314
6
发表于 2010-6-20 21:57:12 | 只看该作者
在脚本技术没有达到炉火纯青之前最好不要修改分辨率

如果脚本已经达到此级别,请使用RGE
Frame.set_size(width, height)

九月三日

  有时我真不理解,怎么有另一个人能够爱她,可以爱她,殊不知我爱她爱得如此真切,如此忘情,如此情意缱倦,除了她我什么也不了解,什么也不知道,什么也没有呀!
——摘自《少年维特之烦恼》

谨以 纪念一段消逝了的感情
ILY ZXY

NOIp什么的最讨厌了!

啊……讨厌,为什么我的网盘全部坏掉了……
zoomshare恢复了,虚惊一场
可恶的skydrive,我XX你的OO,竟把我的帐号封了!
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2009-1-6
帖子
177
7
发表于 2010-6-20 22:28:01 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
90
在线时间
379 小时
注册时间
2006-10-16
帖子
4299

贵宾

8
发表于 2010-6-21 00:19:22 | 只看该作者
请用RGE(Ruby Game Engine)
回复 支持 反对

使用道具 举报

Lv1.梦旅人

℃ake

梦石
0
星屑
50
在线时间
8 小时
注册时间
2009-6-6
帖子
787
9
发表于 2010-6-21 07:17:11 | 只看该作者
推荐易语言D2D
我爱66RPG,但我讨厌66.
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2010-6-21
帖子
7
10
发表于 2010-6-21 08:29:53 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-5-22 17:22

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表