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

Project1

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

[已经过期] 【>A<】截圖存檔腳本衝突

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2111
在线时间
950 小时
注册时间
2015-7-16
帖子
767

开拓者

跳转到指定楼层
1
发表于 2016-8-17 17:15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 duzine 于 2016-8-17 20:49 编辑

其實大概去年就知道衝突了,只是今天才心血來潮把衝突的腳本給找到
我想了很久,我真的希望這兩個優秀的腳本能夠共存,請求高手相助!

截圖存檔腳本
RUBY 代码复制
  1. #==============================================================================
  2. # [PS0]截图存档
  3. #      Window_SaveFile_Plus
  4. #------------------------------------------------------------------------------
  5. #     一种带有截图的存档,同时可以自定义存档数量。
  6. #==============================================================================
  7. # [核心脚本]
  8. #    - 快速储存Bitmap的Marshal         By 柳之一
  9. #------------------------------------------------------------------------------
  10. # [更新记录]
  11. #    - 2012.01.28 By 各种压力的猫君
  12. #      * 去掉效率较差的双线性缩放算法;
  13. #      * 新增存档管理功能(F5键,复制/移动/删除存档)
  14. #    - 2011.12.27 By 各种压力的猫君
  15. #      * 补上截图阴影;
  16. #      * 新增“不缩放”截图(推荐使用,尤其是大分辨率);
  17. #      * 修正选择不存在的存档时存档列表窗口卡死以及奇怪的SE;
  18. #      * 新增“存档中”提示窗口、覆盖存档提示、删除存档功能(Z键,对应键盘D)
  19. #    - 2011.12.26 By 各种压力的猫君
  20. #      * 功能齐全的测试版
  21. #    - 2011.12.16 By 各种压力的猫君
  22. #      * 移植至RGSS3,遵循PS0协议;
  23. #      * 丰富自定义选项,整合双线性插值算法精简版
  24. #    - 2008.05.26 By 沉影不器
  25. #      * 蓝本(VX新截图存档)
  26. #------------------------------------------------------------------------------
  27. # [使用方法]
  28. #    - 将本脚本插入到MAIN以上
  29. #    - 删除原Scene_File、Window_SaveFile(或确保本脚本位于上述两个脚本以下)
  30. #==============================================================================
  31. $_PS0 = {} if $_PS0 == nil  
  32. $_PS0["Window_SaveFile_Plus"] = 20120128
  33. #==============================================================================
  34. # [PS0] 通用配置模块  
  35. #==============================================================================
  36. module PS0
  37.   module Window_SaveFile_Plus
  38.  
  39.     # 最大存档数(范围正整数)
  40.     MAX_SAVE = 99
  41.  
  42.     # 存档目录(默认值 "Saves/";根目录 "")
  43.     SAVE_DIR = "Save/"   
  44.  
  45.     # 无存档时显示的文字
  46.     NO_DATA  = "无存档"
  47.  
  48.     # 保存时显示的信息
  49.     SAVE_NOW = "存档中..."
  50.  
  51.     # 复制存档时的帮助文字
  52.     HELP_COPY = "要复制到哪个位置?"
  53.  
  54.     # 移动存档时的帮助文字
  55.     HELP_MOVE = "要移动到哪个位置?"
  56.  
  57.     # 是否显示存档中窗口(true:显示;false:不显示)
  58.     # - 分辨率较大时建议显示
  59.     SHOW_SAVE_NOW = false
  60.  
  61.     # 截图缩放使用的插值算法
  62.     # - "NN" 最邻近(速度最快,质量最差,RM默认算法)
  63.     # - "NZ" 不缩放(速度快,质量好,以主角为中心切边,非全屏)
  64.     Zoom_Type = "NN"
  65.  
  66.     # 双线性插值能获得更好的截图缩放质量,但所需时间较最邻近插值更长。
  67.     # 缩略图尺寸(范围整数,单位像素)
  68.     # - VA默认分辨率(544×416)推荐使用340×260
  69.     # - VA最大分辨率(640×480)推荐使用425×325
  70.     # - 本脚本兼容分辨率解放,窗口大小将自动计算。
  71.     #   请自行计算截图分辨率,注意要确保宽高比一致,
  72.     #   若使用“不缩放”模式则可以不保持一致。
  73.     Thumbnail_Width  = 425  # 宽度
  74.     Thumbnail_Height = 325  # 高度
  75.  
  76.     # 缩略图位置微调(范围整数,单位像素)
  77.     Thumbnail_ox = -2    # 横向
  78.     Thumbnail_oy = -2-32 # 纵向
  79.  
  80.     # 各窗口切换时的渐变帧数
  81.     TRANS_DURATION = 5
  82.  
  83.   end
  84. end
  85. #==============================================================================
  86. # [核心脚本] 快速储存Bitmap的Marshal By 柳之一
  87. #==============================================================================
  88. class Font
  89.   def marshal_dump
  90.   end
  91.   def marshal_load(obj)
  92.   end
  93. end
  94. class Bitmap
  95.   RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  96.   RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i')
  97.   def _dump(limit)
  98.     data = "rgba" * width * height
  99.     RtlMoveMemory_pi.call(data, address, data.length)
  100.     [width, height, Zlib::Deflate.deflate(data)].pack("LLa*")
  101.   end
  102.   def self._load(str)
  103.     w, h, zdata = str.unpack("LLa*")
  104.     b = self.new(w, h)
  105.     RtlMoveMemory_ip.call(b.address, Zlib::Inflate.inflate(zdata), w * h * 4)
  106.     return b
  107.   end
  108.   def address
  109.     buffer, ad = "rgba", object_id * 2 + 16
  110.     RtlMoveMemory_pi.call(buffer, ad, 4)
  111.     ad = buffer.unpack("L")[0] + 8
  112.     RtlMoveMemory_pi.call(buffer, ad, 4)
  113.     ad = buffer.unpack("L")[0] + 16
  114.     RtlMoveMemory_pi.call(buffer, ad, 4)
  115.     return buffer.unpack("L")[0]
  116.   end
  117. end
  118. #==============================================================================
  119. # ■ Game_Temp
  120. #==============================================================================
  121. class Game_Temp
  122.   attr_accessor :save_bitmap
  123.   attr_accessor :save_snapshoot
  124.   alias new_initialize initialize
  125.   def initialize
  126.     new_initialize
  127.     @save_bitmap = Bitmap.new(1, 1)
  128.     @save_snapshoot = Bitmap.new(1, 1)
  129.   end
  130. end
  131. #==============================================================================
  132. # ■ SceneManager
  133. #==============================================================================
  134. module SceneManager
  135.   def self.snapshot_for_save
  136.     $game_temp.save_bitmap = Graphics.snap_to_bitmap
  137.     unless FileTest.exist?(PS0::Window_SaveFile_Plus::SAVE_DIR)
  138.       Dir.mkdir(PS0::Window_SaveFile_Plus::SAVE_DIR)
  139.     end
  140.   end
  141. end
  142. #==============================================================================
  143. # ■ Scene_Map
  144. #==============================================================================
  145. class Scene_Map < Scene_Base
  146.   alias save_terminate terminate
  147.   def terminate
  148.     SceneManager.snapshot_for_save
  149.     save_terminate
  150.   end
  151. end
  152. #==============================================================================
  153. # ■ DataManager
  154. #==============================================================================
  155. module DataManager
  156.   def self.save_file_exists?
  157.     !Dir.glob(PS0::Window_SaveFile_Plus::SAVE_DIR + 'Save*.rvdata2').empty?
  158.   end
  159.   def self.make_filename(index)
  160.     sprintf(PS0::Window_SaveFile_Plus::SAVE_DIR + "Save%02d.rvdata2", index + 1)
  161.   end
  162.   #--------------------------------------------------------------------------
  163.   # ● セーブヘッダの作成
  164.   #--------------------------------------------------------------------------
  165.   def self.make_save_header
  166.     d_rect = Rect.new(0, 0, PS0::Window_SaveFile_Plus::Thumbnail_Width,
  167.                             PS0::Window_SaveFile_Plus::Thumbnail_Height)
  168.     case PS0::Window_SaveFile_Plus::Zoom_Type
  169.     when "NN"
  170.       s_rect = $game_temp.save_bitmap.rect
  171.       $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
  172.       $game_temp.save_snapshoot.stretch_blt(d_rect, $game_temp.save_bitmap, s_rect)
  173.     when "NZ"
  174.       x = [[$game_player.screen_x - d_rect.width/2, 0].max, Graphics.width].min
  175.       y = [[$game_player.screen_y - d_rect.height/2, 0].max, Graphics.height].min
  176.       s_rect = Rect.new(x, y, d_rect.width, d_rect.height)
  177.       $game_temp.save_snapshoot = Bitmap.new(d_rect.width, d_rect.height)
  178.       $game_temp.save_snapshoot.blt(0, 0, $game_temp.save_bitmap, s_rect)
  179.     end
  180.     header = {}
  181.     header[:characters] = $game_party.characters_for_savefile
  182.     header[:playtime_s] = $game_system.playtime_s
  183.     header[:snapshoot]  = $game_temp.save_snapshoot
  184.     header
  185.   end
  186.   #--------------------------------------------------------------------------
  187.   # ● セーブの実行
  188.   #--------------------------------------------------------------------------
  189.   def self.save_game(index)
  190.     saving_window = Window_Saving.new
  191.     Graphics.update
  192.     begin
  193.       save_game_without_rescue(index)
  194.     rescue
  195.        delete_save_file(index)
  196.        false
  197.     end
  198.     saving_window.dispose
  199.     return true
  200.   end
  201. end
  202. #==============================================================================
  203. # ■ Window_Yes_Or_No
  204. #------------------------------------------------------------------------------
  205. #  提供“是”、“否”两个选项的窗口(替换、删除存档用)
  206. #==============================================================================
  207. class Window_Yes_Or_No < Window_HorzCommand
  208.   #--------------------------------------------------------------------------
  209.   # ● オブジェクト初期化
  210.   #--------------------------------------------------------------------------
  211.   def initialize(yes, no)
  212.     [url=home.php?mod=space&uid=40913]@yes[/url] = yes
  213.     @no = no
  214.     super(130, 0)
  215.     self.visible = false
  216.     self.active = false
  217.     @index = 0
  218.   end
  219.   #--------------------------------------------------------------------------
  220.   # ● 桁数の取得
  221.   #--------------------------------------------------------------------------
  222.   def col_max
  223.     return 2
  224.   end
  225.   #--------------------------------------------------------------------------
  226.   # ● コマンドリストの作成
  227.   #--------------------------------------------------------------------------
  228.   def make_command_list
  229.     add_command(@yes,   :yes)
  230.     add_command(@no,    :cancel)
  231.   end
  232.   #--------------------------------------------------------------------------
  233.   # ● 決定ボタンが押されたときの処理
  234.   #--------------------------------------------------------------------------
  235.   def process_ok
  236.     Input.update
  237.     call_ok_handler
  238.   end
  239.   #--------------------------------------------------------------------------
  240.   # ● 按下取消键时的处理
  241.   #--------------------------------------------------------------------------
  242.   def process_cancel
  243.     Input.update
  244.     call_cancel_handler
  245.   end
  246.   #--------------------------------------------------------------------------
  247.   # ● 启用窗口
  248.   #--------------------------------------------------------------------------
  249.   def activate
  250.     temp = self.y + self.height - Graphics.height
  251.     if temp > 0
  252.       self.y -= (temp + 12)
  253.     end
  254.     self.active = true
  255.     self
  256.   end
  257. end
  258. #==============================================================================
  259. # ■ Window_Saving
  260. #------------------------------------------------------------------------------
  261. #  显示保存信息的窗口
  262. #==============================================================================
  263. class Window_Saving < Window_Base
  264.   #--------------------------------------------------------------------------
  265.   # ● オブジェクト初期化
  266.   #--------------------------------------------------------------------------
  267.   def initialize
  268.     w = PS0::Window_SaveFile_Plus::SAVE_NOW.length * 16 + 32
  269.     x = (Graphics.width - w)/2
  270.     y = (Graphics.height - fitting_height(1))/2
  271.     super(x, y, w, fitting_height(1))
  272.     self.visible = PS0::Window_SaveFile_Plus::SHOW_SAVE_NOW
  273.     draw_text_ex(4, 0, PS0::Window_SaveFile_Plus::SAVE_NOW)
  274.   end
  275. end
  276. #==============================================================================
  277. # ■ Window_SaveManagerCommand
  278. #------------------------------------------------------------------------------
  279. #  存档管理窗口
  280. #==============================================================================
  281. class Window_SaveManagerCommand < Window_Command
  282.   #--------------------------------------------------------------------------
  283.   # ● 初始化对象
  284.   #--------------------------------------------------------------------------
  285.   def initialize(*args)
  286.     @copy, @move, @delete, [url=home.php?mod=space&uid=9053]@cancel[/url] = args[0..3]
  287.     super(130, 0)
  288.     self.visible = false
  289.     self.active = false
  290.     @index = 0
  291.   end
  292.   #--------------------------------------------------------------------------
  293.   # ● 获取窗口的宽度
  294.   #--------------------------------------------------------------------------
  295.   def window_width
  296.     return 100
  297.   end
  298.   #--------------------------------------------------------------------------
  299.   # ● 获取项目数
  300.   #--------------------------------------------------------------------------
  301.   def item_max
  302.     return 4
  303.   end
  304.   #--------------------------------------------------------------------------
  305.   # ● 生成指令列表
  306.   #--------------------------------------------------------------------------
  307.   def make_command_list
  308.     add_command(@copy,   :copy  )
  309.     add_command(@move,   :move  )
  310.     add_command(@delete, :delete)
  311.     add_command(@cancel, :cancel)
  312.   end
  313.   #--------------------------------------------------------------------------
  314.   # ● 按下确定键时的处理
  315.   #--------------------------------------------------------------------------
  316.   def process_ok
  317.     Input.update
  318.     call_ok_handler
  319.   end
  320.   #--------------------------------------------------------------------------
  321.   # ● 启用窗口
  322.   #--------------------------------------------------------------------------
  323.   def activate
  324.     temp = self.y + self.height - Graphics.height
  325.     if temp > 0
  326.       self.y -= (temp + 12)
  327.     end
  328.     self.active = true
  329.     self
  330.   end
  331. end
  332. #==============================================================================
  333. # ■ Window_FileCommand
  334. #------------------------------------------------------------------------------
  335. #  截图存档左侧的选择窗口。
  336. #==============================================================================
  337. class Window_FileCommand < Window_Command
  338.   #--------------------------------------------------------------------------
  339.   # ● オブジェクト初期化
  340.   #--------------------------------------------------------------------------
  341.   def initialize
  342.     super(0, 0)
  343.   end
  344.   #--------------------------------------------------------------------------
  345.   # ● ウィンドウ幅の取得
  346.   #--------------------------------------------------------------------------
  347.   def window_height
  348.     return Graphics.height-fitting_height(1)
  349.   end
  350.   #--------------------------------------------------------------------------
  351.   # ● 表示行数の取得
  352.   #--------------------------------------------------------------------------
  353.   def visible_line_number
  354.     item_max
  355.   end
  356.   #--------------------------------------------------------------------------
  357.   # ● コマンドリストの作成
  358.   #--------------------------------------------------------------------------
  359.   def make_command_list
  360.     add_main_commands
  361.   end
  362.   #--------------------------------------------------------------------------
  363.   # ● 主要コマンドをリストに追加
  364.   #--------------------------------------------------------------------------
  365.   def add_main_commands
  366.     for i in 1..PS0::Window_SaveFile_Plus::MAX_SAVE
  367.       if i < 10
  368.         text = Vocab::File + " 0" + i.to_s
  369.       else
  370.         text = Vocab::File + " " + i.to_s
  371.       end
  372.       add_command(text, :file)
  373.     end
  374.   end
  375.   #--------------------------------------------------------------------------
  376.   # ● 決定ボタンが押されたときの処理
  377.   #--------------------------------------------------------------------------
  378.   def process_ok
  379.   end
  380. end
  381. #==============================================================================
  382. # ■ Window_SaveFile
  383. #------------------------------------------------------------------------------
  384. #  セーブ画面およびロード画面で表示する、セーブファイルのウィンドウです。
  385. #==============================================================================
  386. class Window_SaveFile < Window_Base
  387.   #--------------------------------------------------------------------------
  388.   # ● オブジェクト初期化
  389.   #     index : セーブファイルのインデックス
  390.   #--------------------------------------------------------------------------
  391.   def initialize(index)
  392.     super(160, 0, Graphics.width-160, Graphics.height-fitting_height(1))
  393.     @file_index = index
  394.     @selected = true
  395.     refresh
  396.   end
  397.   #--------------------------------------------------------------------------
  398.   # ● リフレッシュ
  399.   #--------------------------------------------------------------------------
  400.   def refresh
  401.     contents.clear
  402.     change_color(normal_color)
  403.     w = (self.width-PS0::Window_SaveFile_Plus::Thumbnail_Width-16)/2
  404.     h = (self.height-PS0::Window_SaveFile_Plus::Thumbnail_Height-16)/2
  405.     width  = w + PS0::Window_SaveFile_Plus::Thumbnail_ox
  406.     height = h + PS0::Window_SaveFile_Plus::Thumbnail_oy
  407.     draw_shadow(width+5, height+5)
  408.     draw_text((self.width-32-PS0::Window_SaveFile_Plus::NO_DATA.length*16)/2,
  409.               self.height/2-32, PS0::Window_SaveFile_Plus::NO_DATA.length*32,
  410.               line_height, PS0::Window_SaveFile_Plus::NO_DATA)
  411.     draw_party_characters(32, Graphics.height-fitting_height(1)-32)
  412.     draw_playtime(-10, contents.height - line_height-10, contents.width - 4, 2)
  413.     draw_snapshoot(width, height)
  414.   end
  415.   #--------------------------------------------------------------------------
  416.   # ● パーティキャラの描画
  417.   #--------------------------------------------------------------------------
  418.   def draw_party_characters(x, y)
  419.     header = DataManager.load_header(@file_index)
  420.     return unless header
  421.     header[:characters].each_with_index do |data, i|
  422.       draw_character(data[0], data[1], x + i * 48, y)
  423.     end
  424.   end
  425.   #--------------------------------------------------------------------------
  426.   # ● プレイ時間の描画
  427.   #--------------------------------------------------------------------------
  428.   def draw_playtime(x, y, width, align)
  429.     header = DataManager.load_header(@file_index)
  430.     return unless header
  431.     draw_text(x, y, width, line_height, header[:playtime_s], 2)
  432.   end
  433.   #--------------------------------------------------------------------------
  434.   # ● 绘制截图
  435.   #--------------------------------------------------------------------------
  436.   def draw_snapshoot(x, y)
  437.     header = DataManager.load_header(@file_index)
  438.     return unless header
  439.     bitmap = header[:snapshoot]
  440.     contents.blt(x, y, bitmap, bitmap.rect)
  441.     bitmap.dispose
  442.   end
  443.   #--------------------------------------------------------------------------
  444.   # ● 绘制阴影
  445.   #--------------------------------------------------------------------------
  446.   def draw_shadow(x, y)
  447.     header = DataManager.load_header(@file_index)
  448.     return unless header
  449.     contents.fill_rect(x, y, PS0::Window_SaveFile_Plus::Thumbnail_Width,
  450.                              PS0::Window_SaveFile_Plus::Thumbnail_Height, Color.new(0, 0, 0))
  451.     contents.blur
  452.   end
  453. end
  454. #==============================================================================
  455. # ■ Scene_File
  456. #------------------------------------------------------------------------------
  457. #  セーブ画面とロード画面の共通処理を行うクラスです。
  458. #==============================================================================
  459. class Scene_File < Scene_MenuBase
  460.   #--------------------------------------------------------------------------
  461.   # ● 開始処理
  462.   #--------------------------------------------------------------------------
  463.   def start
  464.     super
  465.     create_help_window
  466.     create_savefile_viewport
  467.     create_command_window
  468.     create_savefile_window
  469.     create_manager_window
  470.     create_replace_window
  471.     create_delete_window
  472.   end
  473.   #--------------------------------------------------------------------------
  474.   # ● 終了処理
  475.   #--------------------------------------------------------------------------
  476.   def terminate
  477.     super
  478.     @savefile_viewport.dispose
  479.     @savefile_window.dispose
  480.     @command_window.dispose
  481.     @window_manager.dispose
  482.     @window_replace.dispose
  483.     @window_delete.dispose
  484.   end
  485.   #--------------------------------------------------------------------------
  486.   # ● フレーム更新
  487.   #--------------------------------------------------------------------------
  488.   def update
  489.     super
  490.     update_savefile_selection
  491.   end
  492.   #--------------------------------------------------------------------------
  493.   # ● 创建替换窗口
  494.   #--------------------------------------------------------------------------
  495.   def create_replace_window
  496.     @window_replace = Window_Yes_Or_No.new("替换", "取消")
  497.     @window_replace.set_handler(:yes,    method(:do_replace))
  498.     @window_replace.set_handler(:cancel, method(:do_cancel))
  499.   end
  500.   #--------------------------------------------------------------------------
  501.   # ● 创建删除窗口
  502.   #--------------------------------------------------------------------------
  503.   def create_delete_window
  504.     @window_delete  = Window_Yes_Or_No.new("删除", "取消")
  505.     @window_delete.set_handler(:yes,    method(:do_delete))
  506.     @window_delete.set_handler(:cancel, method(:do_return_manager))
  507.     @window_delete.x += 40
  508.   end
  509.   #--------------------------------------------------------------------------
  510.   # ● 创建管理窗口
  511.   #--------------------------------------------------------------------------
  512.   def create_manager_window
  513.     @window_manager = Window_SaveManagerCommand.new("复制", "移动", "删除", "取消")
  514.     @window_manager.set_handler(:copy  , method(:on_copy?))
  515.     @window_manager.set_handler(:move  , method(:on_move?))
  516.     @window_manager.set_handler(:delete, method(:on_delete?))
  517.     @window_manager.set_handler(:cancel, method(:do_cancel))
  518.   end
  519.   #--------------------------------------------------------------------------
  520.   # ● ヘルプウィンドウの作成
  521.   #--------------------------------------------------------------------------
  522.   def create_help_window
  523.     @help_window = Window_Help.new(1)
  524.     @help_window.set_text(help_window_text)
  525.   end
  526.   #--------------------------------------------------------------------------
  527.   # ● ヘルプウィンドウのテキストを取得
  528.   #--------------------------------------------------------------------------
  529.   def help_window_text
  530.     return ""
  531.   end
  532.   #--------------------------------------------------------------------------
  533.   # ● セーブファイルビューポートの作成
  534.   #--------------------------------------------------------------------------
  535.   def create_savefile_viewport
  536.     @savefile_viewport = Viewport.new
  537.     @savefile_viewport.rect.y = @help_window.height
  538.     @savefile_viewport.rect.height -= @help_window.height
  539.   end
  540.   #--------------------------------------------------------------------------
  541.   # ● セーブファイルウィンドウの作成
  542.   #--------------------------------------------------------------------------
  543.   def create_savefile_window
  544.     @savefile_window = Window_SaveFile.new(@index)
  545.     @savefile_window.viewport = @savefile_viewport
  546.   end
  547.   #--------------------------------------------------------------------------
  548.   # ● 生成存档列表窗口
  549.   #--------------------------------------------------------------------------
  550.   def create_command_window
  551.     @command_window = Window_FileCommand.new
  552.     @command_window.index = first_savefile_index
  553.     @index = @command_window.index
  554.     @command_window.viewport = @savefile_viewport
  555.     @command_window.set_handler(:file,      method(:on_savefile_ok))
  556.   end
  557.   #--------------------------------------------------------------------------
  558.   # ● セーブファイル選択の更新
  559.   #--------------------------------------------------------------------------
  560.   def update_savefile_selection
  561.     if @source_index != nil
  562.       if Input.trigger?(:C)
  563.         if @index == @source_index
  564.           Sound.play_buzzer
  565.         elsif FileTest.exist?(DataManager.make_filename(@index))
  566.           Graphics.freeze
  567.           @command_window.deactivate
  568.           @window_replace.y = 72 + @index * 24
  569.           @window_replace.activate
  570.           @window_replace.visible = true
  571.           @window_replace.refresh
  572.           Sound.play_ok
  573.           Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  574.         else
  575.           return on_copy_ok
  576.         end
  577.       elsif Input.trigger?(:B)
  578.         return do_return_manager
  579.       end
  580.     else
  581.       if Input.trigger?(:C)
  582.         if self.is_a?(Scene_Save) and FileTest.exist?(DataManager.make_filename(@index))
  583.           Graphics.freeze
  584.           @command_window.deactivate
  585.           @window_replace.y = 72 + @index * 24
  586.           @window_replace.activate
  587.           @window_replace.visible = true
  588.           @window_replace.refresh
  589.           Sound.play_ok
  590.           Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  591.         else
  592.           return on_savefile_ok
  593.         end
  594.       elsif Input.trigger?(:B)
  595.         return on_savefile_cancel
  596.       elsif Input.trigger?(:F5)
  597.         unless @window_manager.active == true or
  598.                @window_delete.active == true or
  599.                @window_replace.active == true
  600.           return on_manager?
  601.         end
  602.       end
  603.     end
  604.     @need_refresh = true if @index != @command_window.index
  605.     if @need_refresh
  606.       Graphics.freeze
  607.       @index = @command_window.index
  608.       @savefile_window.dispose
  609.       create_savefile_window
  610.       @need_refresh = false
  611.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  612.     end
  613.   end
  614.   #--------------------------------------------------------------------------
  615.   # ● セーブファイル[決定]
  616.   #--------------------------------------------------------------------------
  617.   def on_savefile_ok
  618.   end
  619.   #--------------------------------------------------------------------------
  620.   # ● セーブファイル[キャンセル]
  621.   #--------------------------------------------------------------------------
  622.   def on_savefile_cancel
  623.     Sound.play_cancel
  624.     return_scene
  625.   end
  626.   #--------------------------------------------------------------------------
  627.   # ● セーブファイル[決定]
  628.   #--------------------------------------------------------------------------
  629.   def on_copy_ok
  630.     Graphics.freeze
  631.     source_name = DataManager.make_filename(@source_index)
  632.     new_name    = DataManager.make_filename(@index)
  633.     case @source_type
  634.     when "copy"
  635.       # 复制存档文件(API)
  636.       Win32API.new('kernel32',"CopyFileA",'ppl','').call(source_name,new_name,0)
  637.     when "move"
  638.       # 重命名存档
  639.       File.rename(source_name, new_name)
  640.     end
  641.     # 返回
  642.     @help_window.set_text(help_window_text)
  643.     @source_index = nil
  644.     do_return_savelist
  645.   end
  646.   #--------------------------------------------------------------------------
  647.   # ● セーブファイル[复制]
  648.   #--------------------------------------------------------------------------
  649.   def on_copy?
  650.     Graphics.freeze
  651.     @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_COPY)
  652.     @source_index = @index
  653.     @source_type = "copy"
  654.     do_return_savelist
  655.   end
  656.   #--------------------------------------------------------------------------
  657.   # ● セーブファイル[移动]
  658.   #--------------------------------------------------------------------------
  659.   def on_move?
  660.     Graphics.freeze
  661.     @help_window.set_text(PS0::Window_SaveFile_Plus::HELP_MOVE)
  662.     @source_index = @index
  663.     @source_type = "move"
  664.     do_return_savelist
  665.   end
  666.   #--------------------------------------------------------------------------
  667.   # ● セーブファイル[管理]
  668.   #--------------------------------------------------------------------------
  669.   def on_manager?
  670.     if FileTest.exist?(DataManager.make_filename(@index))
  671.       Graphics.freeze
  672.       @command_window.deactivate
  673.       @window_manager.y = 72 + @index * 24
  674.       @window_manager.activate
  675.       @window_manager.visible = true
  676.       @window_manager.refresh
  677.       Sound.play_ok
  678.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  679.     else
  680.       Sound.play_buzzer
  681.     end
  682.   end
  683.   #--------------------------------------------------------------------------
  684.   # ● セーブファイル[删除]
  685.   #--------------------------------------------------------------------------
  686.   def on_delete?
  687.     Graphics.freeze
  688.     @window_manager.deactivate
  689.     @command_window.deactivate
  690.     @window_delete.y = 72 + 72 + @index * 24
  691.     @window_delete.activate
  692.     @window_delete.visible = true
  693.     @window_delete.refresh
  694.     Sound.play_ok
  695.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  696.   end
  697.   #--------------------------------------------------------------------------
  698.   # ● 删除
  699.   #--------------------------------------------------------------------------
  700.   def do_delete
  701.     Graphics.freeze
  702.     File.delete(DataManager.make_filename(@index))
  703.     @window_delete.index  = 0
  704.     @window_manager.index = 0
  705.     @window_delete.visible  = false
  706.     @window_manager.visible = false
  707.     @window_delete.deactivate
  708.     @window_manager.deactivate
  709.     @command_window.activate
  710.     @need_refresh = true
  711.     Sound.play_save
  712.     if DataManager.save_file_exists?
  713.       Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  714.     else
  715.       return_scene
  716.     end
  717.   end
  718.   #--------------------------------------------------------------------------
  719.   # ● 替换
  720.   #--------------------------------------------------------------------------
  721.   def do_replace
  722.     Graphics.freeze
  723.     if @source_index != nil
  724.       return on_copy_ok
  725.     else
  726.       return on_savefile_ok
  727.     end
  728.     @window_replace.visible = false
  729.     @window_replace.deactivate
  730.     @need_refresh = true
  731.   end
  732.   #--------------------------------------------------------------------------
  733.   # ● 取消
  734.   #--------------------------------------------------------------------------
  735.   def do_cancel
  736.     Graphics.freeze
  737.     Sound.play_cancel
  738.     @window_delete.index  = 0
  739.     @window_replace.index = 0
  740.     @window_manager.index = 0
  741.     @window_delete.visible  = false
  742.     @window_replace.visible = false
  743.     @window_manager.visible = false
  744.     @window_delete.deactivate
  745.     @window_replace.deactivate
  746.     @window_manager.deactivate
  747.     @command_window.activate
  748.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  749.   end
  750.   #--------------------------------------------------------------------------
  751.   # ● 返回管理菜单
  752.   #--------------------------------------------------------------------------
  753.   def do_return_manager
  754.     Graphics.freeze
  755.     @help_window.set_text(help_window_text)
  756.     @command_window.index = @source_index unless @source_index == nil
  757.     @source_index = nil
  758.     @source_type = nil
  759.     @command_window.deactivate
  760.     @window_delete.index  = 0
  761.     @window_replace.index = 0
  762.     @window_delete.visible  = false
  763.     @window_replace.visible = false
  764.     @window_delete.deactivate
  765.     @window_replace.deactivate
  766.     @window_manager.y = 72 + @index * 24
  767.     @window_manager.activate
  768.     @window_manager.visible = true
  769.     @window_manager.refresh
  770.     Sound.play_cancel
  771.     Graphics.transition(PS0::Window_SaveFile_Plus::TRANS_DURATION)
  772.   end
  773.   #--------------------------------------------------------------------------
  774.   # ● 返回文件列表(复制、移动 用)
  775.   #--------------------------------------------------------------------------
  776.   def do_return_savelist
  777.     @window_manager.visible = false
  778.     @window_manager.deactivate
  779.     @command_window.activate
  780.     @need_refresh = true
  781.     Sound.play_ok
  782.   end
  783. end
  784. #==============================================================================
  785. # [PS0] End of Script
  786. #==============================================================================




兇手腳本 : mode 7

RUBY 代码复制
  1. #====================================================================
  2. # Mode 7 Ace
  3. # v.1.9
  4. # Auteur : MGC
  5. #
  6. # Il s'agit d'un script de mode 7 basique pour RMVX Ace.
  7. #
  8. # - Permet une inclinaison de la carte de 0° à 89°
  9. # - Toute la carte est inclinée, sans relief. Seuls les évènements
  10. #   paraissent dressés verticalement.
  11. # - L'effet de colorisation à l'horizon est personnalisable.
  12. # - Les tiles animés sont supportés, ainsi que le bouclage de la carte.
  13. # - possibilité de zoomer (de 1:8 à 8:1) quand le mode 7 est activé.
  14. #
  15. # IMPORTANT : SI VOUS RENCONTREZ DU LAG, VEUILLEZ VOUS ASSURER D'AVOIR
  16. # DECOCHER "REDUCE SCREEN FLICKERING" (F1).
  17. #
  18. # Nécessite :
  19. # - le fichier MGC_Mode7_Ace_1_9.dll à la racine du projet
  20. # - les 3 fichiers graphiques suivants, déposés dans Pictures/ :
  21. #         - autotiles_data.png
  22. #         - autotiles_data_small.png
  23. #         - autotiles_data_xsmall.png
  24. #
  25. # Configuration :
  26. # - MODE7_MAPS_ID : Contient la liste des id des cartes pour lesquelles
  27. #         le mode 7 est appliqué dès l'entrée sur ces cartes
  28. # - MODE7_DEFAULT_ZOOM : valeur de zoom par défaut qui s'applique dès le
  29. #         passage en mode 7. Compris entre 0.125 et 8.0.
  30. # - MODE7_DEFAULT_ANGLE : valeur d'angle d'inclinaison par défaut qui
  31. #         s'applique dès le passage en mode 7. Compris entre 0 et 89.
  32. # - MODE7_VIEW_LIMIT : nombre de tiles supplémentaires à afficher (en plus
  33. #         des 13 pour la vue normale de la carte en 544 * 416) avant l'horizon.
  34. # - MODE7_FADING_DISTANCE : nombre de tiles avant l'horizon subissant un
  35. #         dégradé de ton et/ou d'opacité.
  36. # - MODE7_FADING_TONE : composantes de couleur R, G, B vers lesquelles tend
  37. #         le dégradé de ton à l'horizon. Chaque composantes peut varier
  38. #         entre -255 et 255.
  39. # - MODE7_FADING_OPACITY : opacité vers laquelle tend le dégradé d'opacité ton
  40. #         à l'horizon. Compris entre 255 (pas de dégradé d'opacité) et 0.
  41. # - MODE7_SCAN_STEP : méthode de rafraîchissement de l'écran :
  42. #         - 1 : l'écran est entièrement redessiné en 1 frame. Déconseillé
  43. #               car extrêmement gourmand en ressources.
  44. #         - 2 : l'écran est redessiné en 2 frames (une ligne de l'écran sur
  45. #               deux est dessinée pour chaque frame).
  46. #         - 3 : l'écran est redessiné en 3 frames (une ligne de l'écran sur
  47. #               trois est dessinée pour chaque frame). Conseillé s'il y a
  48. #               trop de lag.
  49. # - MODE7_TERRAIN_TAGS : liste de valeurs de terrain tags pour lesquelles les
  50. #         tiles doivent être dessinés verticalement en mode 7. Si le paramètre
  51. #         MODE7_VERTICAL_TILES_TYPE n'a pas sa valeur égale à 0, utiliser
  52. #         plusieurs valeurs permet de séparer des regroupements de tiles
  53. #         contigus.
  54. # - MODE7_VERTICAL_TILES_TYPE :
  55. #         - 0 : aucun regroupement des tiles verticaux même si des tiles voisins
  56. #               ont le même terrain tag. Pour un tile avec un terrain tag
  57. #               configuré pour être dessiné verticalement, un sprite de
  58. #               dimensions 32*32 est créé. A priori aucun intérêt sans la
  59. #               rotation, car aura le même effet que la valeur 2 mais avec
  60. #               plus de sprites à l'écran, donc plus de ralentissements.
  61. #         - 1 : regroupement des tiles verticaux contigus sur la même colonne
  62. #               ayant le même terrain tag. Un sprite est créé par regroupement,
  63. #               le tile le plus bas du regroupement servant de base au sprite.
  64. #               A priori aucun intérêt sans la rotation, car aura le même effet
  65. #               que la valeur 3 mais avec plus de sprites à afficher.
  66. #         - 2 : regroupement des tiles verticaux contigus sur la même ligne
  67. #               ayant le même terrain tag. Un sprite est créé par regroupement,
  68. #               l'origine horizontale étant fixée au milieu du regroupement.
  69. #         - 3 : regroupement des tiles verticaux contigus ayant le même
  70. #               terrain tag, quelle que soit la ligne ou la colonne. Un sprite
  71. #               est créé par regroupement, le tile le plus bas du regroupement
  72. #               servant de base au sprite et l'origine horizontale étant fixée
  73. #               au milieu du regroupement. Valeur par défaut.
  74. # - MODE7_ALWAYS_DRAW_TILES_ON_MAP :
  75. #         - 0 : les tiles verticaux ne sont pas dessinés couchés sur la carte.
  76. #               Valeur par défaut.
  77. #         - 1 : les tiles verticaux sont également dessinés couchés sur la carte.
  78. # - MODE7_PARALLAXED_MAPS_ID : Contient la liste des id des cartes en mode 7
  79. #         pour lesquelles le panorama est utilisé en tant que couche inférieure.
  80. #         Vous pouvez utiliser un second panorama pour le fond, il faut ajouter
  81. #         dans les notes de la carte le texte suivant : [m7a_pano:nom_du_fichier]
  82. #
  83. # Utilisation :
  84. # Commandes utilisables comme commandes d'évènement avec Script... :
  85. # - MGC.start_mode7 : lance le mode 7 pour la carte
  86. # - MGC.to_mode7_angle(nouvel angle, durée de transition)
  87. # - MGC.to_mode7_zoom(nouvelle valeur de zoom, durée de transition)
  88. # - MGC.end_mode7 : quitte le mode 7
  89. # - MGC.set_mode7_scan(nouvelle valeur) : modifie le paramètre MODE7_SCAN_STEP
  90. #
  91. # Vous pouvez ajouter des commandes dans le nom des cartes pour forcer le
  92. # paramétrage du mode 7 de la carte. Les paramètres dans le nom de la
  93. # carte sont prioritaires par rapport à ceux dans la partie CONFIGURATION
  94. # - [M7] : active le mode 7 pour la carte
  95. # - [Ax], où x est un entier entre 0 et 89 : angle de la carte
  96. # - [Zx], où x est un décimal entre 0.125 et 8.0 : zoom de la carte
  97. # - [FDx], où x est un entier positif : nombre de tiles avant l'horizon
  98. #         subissant un dégradé de ton et/ou d'opacité
  99. # - [FTx,y,z], où x, y et z sont des entiers entre -255 et 255 :
  100. #         composantes de couleur R, G, B vers lesquelles tend le dégradé
  101. #         de ton à l'horizon
  102. # - [FOx], où x est un entier entre 0 et 255 : opacité vers laquelle
  103. #         tend le dégradé d'opacité ton à l'horizon
  104. # - [P] : le panorama est utilisé en tant que couche inférieure de la carte
  105. # Exemple :
  106. # My Worldmap [M7][A55][Z0.5][FD20][FT128,64,-32][FO128]
  107. #====================================================================
  108. module MGC
  109.   #--------------------------------------------------------------------------
  110.   # * CONFIGURATION
  111.   #--------------------------------------------------------------------------
  112.   MODE7_MAPS_ID = []
  113.   MODE7_DEFAULT_ZOOM = 1.0
  114.   MODE7_DEFAULT_ANGLE = 0
  115.   MODE7_VIEW_LIMIT = 26
  116.   MODE7_FADING_DISTANCE = 13
  117.   MODE7_FADING_TONE = Tone.new(64, 64, 128)
  118.   MODE7_FADING_OPACITY = 0
  119.   MODE7_SCAN_STEP = 2
  120.   MODE7_TERRAIN_TAGS = [1, 2] # [1.7]
  121.   MODE7_VERTICAL_TILES_TYPE = 3 # [1.7]
  122.   MODE7_ALWAYS_DRAW_TILES_ON_MAP = 0 # [1.7]
  123.   MODE7_PARALLAXED_MAPS_ID = [] # [1.9]
  124.   #--------------------------------------------------------------------------
  125.   # * Initialisation
  126.   #--------------------------------------------------------------------------
  127.   @mode7_zoom = 1.0
  128.   @mode7_active = false
  129.   #--------------------------------------------------------------------------
  130.   # * Lancement du mode 7
  131.   #--------------------------------------------------------------------------
  132.   def self.start_mode7
  133.     @end_mode7 = false
  134.     @spriteset.start_mode7
  135.   end
  136.   #--------------------------------------------------------------------------
  137.   # * Fin du mode 7
  138.   #--------------------------------------------------------------------------
  139.   def self.end_mode7
  140.     @end_mode7 = true
  141.     self.to_mode7_zoom(1.0, 1)
  142.   end
  143.   #--------------------------------------------------------------------------
  144.   # * Setter pour l'attribut spriteset
  145.   #--------------------------------------------------------------------------
  146.   def self.spriteset=(spriteset)
  147.     @spriteset = spriteset
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # * Initialisation des données du mode 7
  151.   #--------------------------------------------------------------------------
  152.   def self.initialize_mode7(reset = false) # [1.9]
  153.     if reset
  154.       self.mode7_angle = $game_map.get_default_mode7_angle
  155.       @mode7_zoom = $game_map.get_default_mode7_zoom
  156.     else
  157.       self.mode7_angle = $game_system.mode7_angle ? $game_system.mode7_angle :
  158.       $game_map.get_default_mode7_angle
  159.       @mode7_zoom = $game_system.mode7_zoom ? $game_system.mode7_zoom :
  160.       $game_map.get_default_mode7_zoom
  161.     end
  162.     @mode7_angle_duration = 0
  163.     @mode7_zoom_incr = Math.log(@mode7_zoom) / Math.log(2)
  164.     @mode7_zoom_duration = 0
  165.     pivot = (Graphics.height >> 1) + 12
  166.     @mode7_data = [pivot, pivot.to_f / Graphics.height, 1.0, 1.0, 0,
  167.     Graphics.height, 0, 0, 0, 0]
  168.   end
  169.   #--------------------------------------------------------------------------
  170.   # * Change Map
  171.   #--------------------------------------------------------------------------
  172.   def self.start_change_map
  173.     self.mode7_angle = $game_map.get_default_mode7_angle
  174.     @mode7_angle_duration = 0
  175.     @mode7_zoom = $game_map.get_default_mode7_zoom
  176.     @mode7_zoom_incr = Math.log(@mode7_zoom) / Math.log(2)
  177.     @mode7_zoom_duration = 0
  178.     @change_map = true
  179.   end
  180.   #--------------------------------------------------------------------------
  181.   # * Is Changing Map ?
  182.   #--------------------------------------------------------------------------
  183.   def self.is_changing_map?
  184.     return @change_map
  185.   end
  186.   #--------------------------------------------------------------------------
  187.   # * End Change Map
  188.   #--------------------------------------------------------------------------
  189.   def self.end_change_map
  190.     @change_map = false
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # * Getter pour l'attribut mode7_data
  194.   #--------------------------------------------------------------------------
  195.   def self.mode7_data
  196.     return @mode7_data
  197.   end
  198.   #--------------------------------------------------------------------------
  199.   # * Getter pour l'attribut mode7_zoom
  200.   #--------------------------------------------------------------------------
  201.   def self.mode7_zoom
  202.     return @mode7_zoom
  203.   end
  204.   #--------------------------------------------------------------------------
  205.   # * Getter pour l'attribut mode7_angle
  206.   #--------------------------------------------------------------------------
  207.   def self.mode7_angle
  208.     return @mode7_angle
  209.   end
  210.   #--------------------------------------------------------------------------
  211.   # * Getter pour l'attribut mode7_active
  212.   #--------------------------------------------------------------------------
  213.   def self.mode7_active
  214.     return @mode7_active
  215.   end
  216.   #--------------------------------------------------------------------------
  217.   # * Setter pour l'attribut mode7_active
  218.   #--------------------------------------------------------------------------
  219.   def self.mode7_active=(flag)
  220.     $game_system.mode7_active = flag
  221.     @mode7_active = flag
  222.   end
  223.   #--------------------------------------------------------------------------
  224.   # * Setter pour l'attribut mode7_zoom
  225.   #--------------------------------------------------------------------------
  226.   def self.mode7_zoom=(zoom_value)
  227.     unless mode7_zoom == zoom_value
  228.       if zoom_value < 0.125 || zoom_value > 8.0 then return end
  229.       @mode7_zoom = zoom_value
  230.       $game_system.mode7_zoom = @mode7_zoom
  231.       $game_player.center($game_player.x, $game_player.y)
  232.     end
  233.   end
  234.   #--------------------------------------------------------------------------
  235.   # * Incrémentation de la valeur du zoom du mode 7
  236.   #--------------------------------------------------------------------------
  237.   def self.incr_mode7_zoom(val = 0.02)
  238.     @mode7_zoom_incr += val
  239.     new_zoom = 2 ** @mode7_zoom_incr
  240.     self.mode7_zoom = new_zoom
  241.   end
  242.   #--------------------------------------------------------------------------
  243.   # * Pour aller progressivement vers une nouvelle valeur de zoom du mode 7
  244.   #--------------------------------------------------------------------------
  245.   def self.to_mode7_zoom(new_zoom, duration)
  246.     unless mode7_zoom == new_zoom
  247.       if new_zoom < 0.125 || new_zoom > 8.0 then return end
  248.       @mode7_zoom_duration = duration
  249.       target_zoom_incr = Math.log(new_zoom) / Math.log(2)
  250.       @mode7_zoom_step = (target_zoom_incr - @mode7_zoom_incr) / duration
  251.       @target_mode7_zoom = new_zoom
  252.     end
  253.   end
  254.   #--------------------------------------------------------------------------
  255.   # * Setter pour l'attribut mode7_angle
  256.   #--------------------------------------------------------------------------
  257.   def self.mode7_angle=(new_angle)
  258.     unless new_angle == @mode7_angle
  259.       @mode7_angle = [[new_angle, 0].max, 89].min
  260.       @mode7_angle_real = @mode7_angle
  261.       $game_system.mode7_angle = @mode7_angle
  262.     end
  263.   end
  264.   #--------------------------------------------------------------------------
  265.   # * Autre setter pour l'attribut mode7_angle, ne réinitialisant pas @mode7_angle_real
  266.   #--------------------------------------------------------------------------
  267.   def self.set_mode7_angle(new_angle)
  268.     unless new_angle == @mode7_angle
  269.       @mode7_angle = [[new_angle, 0].max, 89].min
  270.       $game_system.mode7_angle = @mode7_angle
  271.     end
  272.   end
  273.   #--------------------------------------------------------------------------
  274.   # * Incrémentation de la valeur de l'angle du mode 7
  275.   #--------------------------------------------------------------------------
  276.   def self.incr_mode7_angle
  277.     @mode7_angle_real += @mode7_angle_step
  278.     self.set_mode7_angle(@mode7_angle_real.to_i)
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # * Pour aller progressivement vers une nouvelle valeur de l'angle du mode 7
  282.   #--------------------------------------------------------------------------
  283.   def self.to_mode7_angle(new_angle, duration)
  284.     unless @mode7_angle == new_angle
  285.       new_angle = [[new_angle, 0].max, 89].min
  286.       @mode7_angle_duration = duration
  287.       @mode7_angle_step = (new_angle - @mode7_angle).to_f / duration
  288.       @target_mode7_angle = new_angle
  289.     end
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # * Mise à jour du mode 7
  293.   #--------------------------------------------------------------------------
  294.   def self.update_mode7
  295.     if @mode7_active
  296.       if @mode7_zoom_duration > 0
  297.         @mode7_zoom_duration -= 1
  298.         if @mode7_zoom_duration == 0
  299.           self.mode7_zoom = @target_mode7_zoom
  300.         else
  301.           self.incr_mode7_zoom(@mode7_zoom_step)
  302.         end
  303.       elsif @mode7_angle_duration > 0
  304.         @mode7_angle_duration -= 1
  305.         if @mode7_angle_duration == 0
  306.           self.mode7_angle = @target_mode7_angle
  307.         else
  308.           self.incr_mode7_angle
  309.         end
  310.       elsif @end_mode7
  311.         @spriteset.end_mode7
  312.         @end_mode7 = false
  313.       end
  314.     end
  315.   end
  316.   #--------------------------------------------------------------------------
  317.   # * Vérifie si un effet est en cours
  318.   #--------------------------------------------------------------------------
  319.   def self.effect?
  320.     return @mode7_active && (@mode7_zoom_duration > 0 ||
  321.     @mode7_angle_duration > 0 || @end_mode7)
  322.   end
  323.   #--------------------------------------------------------------------------
  324.   # * Modifie la valeur de la méthode de rafraîchissement de l'écran
  325.   #--------------------------------------------------------------------------
  326.   def self.set_mode7_scan(new_value)
  327.     new_value = [[new_value, 1].max, 3].min
  328.     unless MODE7_SCAN_STEP == new_value
  329.       self.const_set(:MODE7_SCAN_STEP, new_value)
  330.     end
  331.   end
  332.   #==============================================================================
  333.   # ** MGC::Mode7_Map
  334.   #==============================================================================
  335.   class Mode7_Map
  336.     #--------------------------------------------------------------------------
  337.     # * Attributs
  338.     #--------------------------------------------------------------------------
  339.     attr_reader :viewport, :visible, :ox, :oy, :opacity, :blend_type, :color,
  340.     :tone, :wave_amp, :wave_length, :wave_speed, :wave_phase, :zoom, :map_data,
  341.     :flags
  342.     attr_accessor :bitmaps, :flash_data
  343.     attr_reader :alpha, :parameters
  344.     attr_reader :param_tiles # [1.7]
  345.     attr_reader :map_id # [1.9]
  346.     #--------------------------------------------------------------------------
  347.     # * Constantes
  348.     #--------------------------------------------------------------------------
  349.     RENDER = Win32API.new("MGC_Mode7_Ace_Rot_1_9", "renderMode7", "l", "l")
  350.     #--------------------------------------------------------------------------
  351.     # * Initialisation
  352.     #--------------------------------------------------------------------------
  353.     def initialize(viewport)
  354.       @viewport = viewport
  355.       self.bitmaps = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  356.       @map_data = 0
  357.       @flags = 0
  358.       self.flash_data = nil
  359.       @cx = Graphics.width >> 1
  360.       @cy = Graphics.height >> 1
  361.       @sprite_render = Sprite.new(viewport)
  362.       @render = Bitmap.new(Graphics.width, Graphics.height)
  363.       @sprite_render.bitmap = @render
  364.       @sprite_render.x = 0
  365.       @sprite_render.y = 0
  366.       @sprite_render.z = 0
  367.       @zoom = 1.0
  368.       @view_limit = MODE7_VIEW_LIMIT << 5
  369.       m7_data = Table.new(6, Graphics.height) # [1.7]
  370.       @parameters = [@render, 0, map_data, bitmaps,
  371.       Cache.picture('autotiles_data'), Cache.picture('autotiles_data_small'),
  372.       Cache.picture('autotiles_data_xsmall'), 0, 0, 0, 0, 0, 0, 0, 4096,
  373.       100, $game_map.loop_horizontal?, $game_map.loop_vertical?, MODE7_SCAN_STEP,
  374.       0, m7_data, 2048, 0, MGC.mode7_data[5], MGC.mode7_data[0], 0, 0, 0, 0, 0,
  375.       0, 0, 0, 0, 0, 0]
  376.       @parameters << $game_map.tileset.flags # 36 [1.7]
  377.       @parameters << MGC::MODE7_ALWAYS_DRAW_TILES_ON_MAP # 37 [1.7]
  378.       @parameters << MGC::MODE7_TERRAIN_TAGS # 38 [1.7]
  379.       @parameters << 0 # 39 [1.9]
  380.       refresh_fading
  381.       MGC.mode7_data[9] = m7_data
  382.       self.alpha = 0
  383.       self.visible = true
  384.       self.zoom = 1.0
  385.       self.ox = 0
  386.       self.oy = 0
  387.       self.opacity = 255
  388.       self.blend_type = 0
  389.       self.color = Color.new
  390.       self.tone = Tone.new
  391.       self.wave_amp = 0
  392.       self.wave_length = 180
  393.       self.wave_speed = 360
  394.       self.wave_phase = 0.0
  395.       @initialization = true
  396.       @param_tiles = [Bitmap.new(32, 32), bitmaps,
  397.       Cache.picture('autotiles_data'),
  398.       Cache.picture('autotiles_data_small'),
  399.       Cache.picture('autotiles_data_xsmall'), 0, [0, 0, 0]] # [1.7]
  400.       @map_id = $game_map.map_id # [1.9]
  401.     end
  402.     #--------------------------------------------------------------------------
  403.     # * Refresh Fading
  404.     #--------------------------------------------------------------------------
  405.     def refresh_fading
  406.       fading_dist = $game_map.get_default_fading_distance << 5
  407.       fading_begin = Graphics.height + @view_limit - fading_dist
  408.       @parameters[30] = fading_begin
  409.       @parameters[31] = fading_dist
  410.       @parameters[32] = $game_map.get_default_fading_tone.red.to_i
  411.       @parameters[33] = $game_map.get_default_fading_tone.green.to_i
  412.       @parameters[34] = $game_map.get_default_fading_tone.blue.to_i
  413.       @parameters[35] = $game_map.get_default_fading_opacity
  414.     end
  415.     #--------------------------------------------------------------------------
  416.     # * Refresh all the parameters dependent on the angle of slant
  417.     #--------------------------------------------------------------------------
  418.     def refresh_alpha
  419.       # angle of slant
  420.       alpha_rad = (Math::PI * alpha) / 180
  421.       cos_alpha_real = Math.cos(alpha_rad)
  422.       sin_alpha_real = Math.sin(alpha_rad)
  423.       cos_alpha = (2048 * cos_alpha_real).to_i
  424.       sin_alpha = (2048 * sin_alpha_real).to_i
  425.       distance_h = MGC.mode7_data[5]
  426.       pivot = MGC.mode7_data[0]
  427.       # h0,  z0 : intermediate values used to calculate the slope
  428.       h0 = (-distance_h * pivot * cos_alpha) / ((distance_h << 11) +
  429.       pivot * sin_alpha) + pivot
  430.       z0 = (distance_h << 11).to_f / ((distance_h << 11) + pivot * sin_alpha)
  431.       # slope
  432.       slope_value = (1.0 - z0) / (pivot - h0)
  433.       slope_value_map = (131072 * slope_value).to_i
  434.       corrective_value = 1.0 - pivot * slope_value
  435.       corrective_value_map = (131072 * corrective_value).to_i
  436.       last_line = ((-pivot - @view_limit) * zoom).to_i
  437.       height_limit = (distance_h * last_line * cos_alpha) /
  438.       ((distance_h << 11) - last_line * sin_alpha) + pivot
  439.       height_limit = [height_limit.to_i, 0].max
  440.       parameters[21] = cos_alpha
  441.       parameters[22] = sin_alpha
  442.       parameters[25] = slope_value_map
  443.       parameters[26] = corrective_value_map
  444.       parameters[27] = height_limit
  445.       parameters[29] = MODE7_SCAN_STEP
  446.       @need_refresh = true
  447.       MGC.mode7_data[3] = cos_alpha_real
  448.       MGC.mode7_data[4] = sin_alpha_real
  449.       MGC.mode7_data[6] = slope_value
  450.       MGC.mode7_data[7] = corrective_value
  451.       MGC.mode7_data[8] = height_limit     
  452.     end
  453.     #--------------------------------------------------------------------------
  454.     # * Setter pour l'attribut map_data
  455.     #--------------------------------------------------------------------------
  456.     def map_data=(new_map_data)
  457.       @map_data = new_map_data
  458.       parameters[2] = @map_data
  459.     end
  460.     #--------------------------------------------------------------------------
  461.     # * Charge le panorama en mode 7 [1.9]
  462.     #--------------------------------------------------------------------------
  463.     def parallax=(new_parallax)
  464.       if new_parallax
  465.         parameters[39] = new_parallax
  466.       else
  467.         parameters[39] = 0
  468.       end
  469.     end
  470.     #--------------------------------------------------------------------------
  471.     # * Setter pour l'attribut flags
  472.     #--------------------------------------------------------------------------
  473.     def flags=(new_flags)
  474.       @flags = new_flags
  475.       parameters[7] = @flags
  476.     end
  477.     #--------------------------------------------------------------------------
  478.     # * Setter pour l'attribut zoom
  479.     #--------------------------------------------------------------------------
  480.     def zoom=(new_zoom)
  481.       unless zoom == new_zoom
  482.         @zoom = new_zoom
  483.         parameters[14] = (4096.0 / new_zoom).to_i
  484.         MGC.mode7_data[2] = new_zoom
  485.         vox = @ox
  486.         @ox = nil
  487.         self.ox = vox
  488.         voy = @oy
  489.         @oy = nil
  490.         self.oy = voy
  491.         @need_refresh = true
  492.         parameters[29] = MODE7_SCAN_STEP
  493.         @need_refresh = true
  494.         last_line = ((-parameters[24] - @view_limit) * zoom).to_i
  495.         height_limit = (parameters[23] * last_line * parameters[21]) /
  496.         ((parameters[23] << 11) - last_line * parameters[22]) + parameters[24]
  497.         parameters[27] = [height_limit.to_i, 0].max
  498.         MGC.mode7_data[8] = parameters[27]
  499.       end
  500.     end
  501.     #--------------------------------------------------------------------------
  502.     # * Setter pour l'attribut alpha
  503.     #--------------------------------------------------------------------------
  504.     def alpha=(new_alpha)
  505.       unless new_alpha == alpha
  506.         @alpha = new_alpha
  507.         refresh_alpha
  508.       end
  509.     end
  510.     #--------------------------------------------------------------------------
  511.     # * Setter pour l'attribut shadow_opacity
  512.     #--------------------------------------------------------------------------
  513.     def shadow_opacity=(value)
  514.       @parameters[15] = [[value, 0].max, 255].min
  515.     end
  516.     #--------------------------------------------------------------------------
  517.     # * Setter pour l'attribut visible
  518.     #--------------------------------------------------------------------------
  519.     def visible=(flag)
  520.       @visible = flag
  521.       @sprite_render.visible = flag
  522.     end
  523.     #--------------------------------------------------------------------------
  524.     # * Setter pour l'attribut ox
  525.     #--------------------------------------------------------------------------
  526.     def ox=(new_ox)
  527.       new_ox = new_ox.to_i
  528.       unless new_ox == @ox
  529.         @ox = new_ox
  530.         @need_refresh = true
  531.         parameters[8] = @ox
  532.         parameters[29] = MODE7_SCAN_STEP
  533.       end
  534.     end
  535.     #--------------------------------------------------------------------------
  536.     # * Setter pour l'attribut oy
  537.     #--------------------------------------------------------------------------
  538.     def oy=(new_oy)
  539.       new_oy = new_oy.to_i
  540.       unless new_oy == @oy
  541.         @oy = new_oy
  542.         @need_refresh = true
  543.         parameters[9] = @oy
  544.         parameters[29] = MODE7_SCAN_STEP
  545.       end
  546.     end
  547.     #--------------------------------------------------------------------------
  548.     # * Setter pour l'attribut opacity
  549.     #--------------------------------------------------------------------------
  550.     def opacity=(new_opacity)
  551.       @opacity = new_opacity
  552.       @sprite_render.opacity = new_opacity
  553.     end
  554.     #--------------------------------------------------------------------------
  555.     # * Setter pour l'attribut blend_type
  556.     #--------------------------------------------------------------------------
  557.     def blend_type=(new_blend_type)
  558.       @blend_type = new_blend_type
  559.       @sprite_render.blend_type = new_blend_type
  560.     end
  561.     #--------------------------------------------------------------------------
  562.     # * Setter pour l'attribut color
  563.     #--------------------------------------------------------------------------
  564.     def color=(new_color)
  565.       @color = new_color
  566.       @sprite_render.color = new_color
  567.     end
  568.     #--------------------------------------------------------------------------
  569.     # * Setter pour l'attribut tone
  570.     #--------------------------------------------------------------------------
  571.     def tone=(new_tone)
  572.       @tone = new_tone
  573.       @sprite_render.tone = new_tone
  574.     end
  575.     #--------------------------------------------------------------------------
  576.     # * Setter pour l'attribut wave_amp
  577.     #--------------------------------------------------------------------------
  578.     def wave_amp=(new_wave_amp)
  579.       @wave_amp = new_wave_amp
  580.       @sprite_render.wave_amp = new_wave_amp
  581.     end
  582.     #--------------------------------------------------------------------------
  583.     # * Setter pour l'attribut wave_length
  584.     #--------------------------------------------------------------------------
  585.     def wave_length=(new_wave_length)
  586.       @wave_length = new_wave_length
  587.       @sprite_render.wave_length = new_wave_length
  588.     end
  589.     #--------------------------------------------------------------------------
  590.     # * Setter pour l'attribut wave_speed
  591.     #--------------------------------------------------------------------------
  592.     def wave_speed=(new_wave_speed)
  593.       @wave_speed = new_wave_speed
  594.       @sprite_render.wave_speed = new_wave_speed
  595.     end
  596.     #--------------------------------------------------------------------------
  597.     # * Setter pour l'attribut wave_phase
  598.     #--------------------------------------------------------------------------
  599.     def wave_phase=(new_wave_phase)
  600.       @wave_phase = new_wave_phase
  601.       @sprite_render.wave_phase = new_wave_phase
  602.     end
  603.     #--------------------------------------------------------------------------
  604.     # * Libération de l'instance
  605.     #--------------------------------------------------------------------------
  606.     def dispose
  607.       @render.dispose
  608.       @sprite_render.dispose
  609.       clear_vertical_tiles # [1.7]
  610.       @param_tiles[0].dispose
  611.     end
  612.     #--------------------------------------------------------------------------
  613.     # * Suppression des tiles verticaux [1.7]
  614.     #--------------------------------------------------------------------------
  615.     def clear_vertical_tiles
  616.       if @vertical_tiles
  617.         @vertical_tiles.each {|sprite| sprite.dispose}
  618.         @vertical_tiles.clear
  619.       end
  620.     end
  621.     #--------------------------------------------------------------------------
  622.     # * Retourne true si l'instance a été libérée
  623.     #--------------------------------------------------------------------------
  624.     def disposed?
  625.       return @render.disposed?
  626.     end
  627.     #--------------------------------------------------------------------------
  628.     # * Mise à jour, appelée normalement à chaque frame
  629.     #--------------------------------------------------------------------------
  630.     def update
  631.       if @visible
  632.         if MGC.is_changing_map?
  633.           refresh_fading
  634.           MGC.end_change_map
  635.         end
  636.         if parameters[18] != MODE7_SCAN_STEP
  637.           parameters[18] = MODE7_SCAN_STEP
  638.           parameters[19] = 0
  639.           parameters[29] = 0
  640.           @need_refresh = true
  641.         end
  642.         self.alpha = MGC.mode7_angle
  643.         self.zoom = MGC.mode7_zoom
  644.         if Graphics.frame_count & 31 == 0
  645.           parameters[10] += 1
  646.           parameters[10] %= 3
  647.           parameters[29] = MODE7_SCAN_STEP
  648.           unless @need_refresh
  649.             @need_refresh_anim = true
  650.           end
  651.         end
  652.         if parameters[29] > 0 && !@need_refresh && !@need_refresh_anim
  653.           @need_refresh = true
  654.         end
  655.         begin
  656.           if @need_refresh
  657.             parameters[19] += 1
  658.             if parameters[19] == parameters[18]
  659.               parameters[19] = 0
  660.             end
  661.             parameters[11] = 0
  662.             RENDER.call(parameters.__id__)
  663.             parameters[29] -= 1
  664.             if parameters[29] == 0
  665.               @need_refresh = false
  666.             end
  667.           elsif @need_refresh_anim
  668.             parameters[19] += 1
  669.             if parameters[19] == parameters[18]
  670.               parameters[19] = 0
  671.             end
  672.             parameters[11] = 1
  673.             RENDER.call(parameters.__id__)
  674.             parameters[29] -= 1
  675.             if parameters[29] == 0
  676.               @need_refresh_anim = false
  677.             end
  678.           end
  679.           if @initialization && parameters[29] == 0
  680.             @initialization = false
  681.           end
  682.         end while @initialization
  683.         @sprite_render.update
  684.         @vertical_tiles.each {|sprite| sprite.update} # [1.7]
  685.       end
  686.     end
  687.     #--------------------------------------------------------------------------
  688.     # * Flash des couches de la tilemap
  689.     #--------------------------------------------------------------------------
  690.     def flash(color, duration)
  691.       @sprite_render.flash(color, duration)
  692.     end
  693.     #--------------------------------------------------------------------------
  694.     # * Create vertical tiles [1.7]
  695.     #--------------------------------------------------------------------------
  696.     def create_vertical_tiles
  697.       unless @vertical_tiles
  698.         @vertical_tiles = []
  699.       end
  700.       clear_vertical_tiles
  701.       @vt_checked_tiles = Table.new($game_map.width, $game_map.height,
  702.       MGC::MODE7_TERRAIN_TAGS.size)
  703.       (0...$game_map.height).each {|iy|
  704.         (0...$game_map.width).each {|ix|
  705.           (0...3).each {|il|
  706.             terrain_tag = $game_map.terrain_tag_for_layer(ix, iy, il)
  707.             if terrain_tag > 0 && MGC::MODE7_TERRAIN_TAGS.include?(terrain_tag)
  708.               tag_index = MGC::MODE7_TERRAIN_TAGS.index(terrain_tag)
  709.               unless @vt_checked_tiles[ix, iy, tag_index] == 1
  710.                 @vt_found_tiles = []
  711.                 @vt_x_min = ix
  712.                 @vt_x_max = ix
  713.                 @vt_y_min = iy
  714.                 @vt_y_max = iy
  715.                 find_linked_tiles(ix, iy, terrain_tag, tag_index)
  716.                 v_tile = MGC::Vertical_Tile.new(self, @viewport)
  717.                 v_tile.x = 1 + @vt_x_max + @vt_x_min << 5 >> 1
  718.                 v_tile.y = 1 + @vt_y_max << 5
  719.                 v_tile.refresh_tile_data(@vt_found_tiles,
  720.                 @vt_x_min, @vt_x_max, @vt_y_min, @vt_y_max)
  721.                 @vertical_tiles << v_tile
  722.                 break
  723.               end
  724.             end
  725.           }
  726.         }
  727.       }
  728.       @vt_checked_tiles = nil
  729.     end
  730.     #--------------------------------------------------------------------------
  731.     # * Find linked tiles [1.7]
  732.     # param x : Integer
  733.     # param y : Integer
  734.     # param terrain_tag : Integer
  735.     # param tag_index : Integer
  736.     #--------------------------------------------------------------------------
  737.     def find_linked_tiles(x, y, terrain_tag, tag_index)
  738.       unless @vt_checked_tiles[x, y, tag_index] == 1
  739.         @vt_checked_tiles[x, y, tag_index] = 1
  740.         found = false
  741.         (0...3).each {|il|
  742.           if $game_map.terrain_tag_for_layer(x, y, il) == terrain_tag
  743.             unless found
  744.               found_tile = [x, y, [false, false, false]]
  745.               @vt_found_tiles << found_tile
  746.               found = true
  747.             end
  748.             found_tile[2][il] = true
  749.           end
  750.         }
  751.         if found
  752.           if x > @vt_x_max
  753.             @vt_x_max = x
  754.           end
  755.           if x < @vt_x_min
  756.             @vt_x_min = x
  757.           end
  758.           if y > @vt_y_max
  759.             @vt_y_max = y
  760.           end
  761.           if y < @vt_y_min
  762.             @vt_y_min = y
  763.           end
  764.           if MGC::MODE7_VERTICAL_TILES_TYPE & 1 == 1
  765.             if y < $game_map.height - 1
  766.               find_linked_tiles(x, y + 1, terrain_tag, tag_index)
  767.             end
  768.           end
  769.           if MGC::MODE7_VERTICAL_TILES_TYPE & 2 == 2
  770.             if x < $game_map.width - 1
  771.               find_linked_tiles(x + 1, y, terrain_tag, tag_index)
  772.             end
  773.           end
  774.           if MGC::MODE7_VERTICAL_TILES_TYPE == 3
  775.             if x > 0
  776.               find_linked_tiles(x - 1, y, terrain_tag, tag_index)
  777.             end
  778.             if y > 0
  779.               find_linked_tiles(x, y - 1, terrain_tag, tag_index)
  780.             end
  781.           end
  782.         end
  783.       end
  784.     end
  785.   end
  786. end
  787.  
  788. #==============================================================================
  789. # ** Game_System
  790. #==============================================================================
  791. class Game_System
  792.   #--------------------------------------------------------------------------
  793.   # * Attributs
  794.   #--------------------------------------------------------------------------
  795.   attr_accessor :mode7_zoom, :mode7_angle, :mode7_active
  796. end
  797.  
  798. #==============================================================================
  799. # ** Game_Map
  800. #==============================================================================
  801. class Game_Map
  802.   attr_accessor :start_mode7, :end_mode7
  803.   #--------------------------------------------------------------------------
  804.   # * Aliased methods
  805.   #--------------------------------------------------------------------------
  806.   unless @already_aliased_mgc_m7a
  807.     alias setup_mgc_m7a setup
  808.     alias set_display_pos_mgc_m7a set_display_pos
  809.     alias scroll_down_mgc_m7a scroll_down
  810.     alias scroll_left_mgc_m7a scroll_left
  811.     alias scroll_right_mgc_m7a scroll_right
  812.     alias scroll_up_mgc_m7a scroll_up
  813.     @already_aliased_mgc_m7a = true
  814.   end
  815.   #--------------------------------------------------------------------------
  816.   # * Setup
  817.   #--------------------------------------------------------------------------
  818.   def setup(map_id)
  819.     setup_mgc_m7a(map_id)
  820.     @map = load_data(sprintf("Data/Map%03d.rvdata2", map_id)) # [1.9]
  821.     if is_mode7?
  822.       if MGC.mode7_active
  823.         MGC.start_change_map
  824.       end
  825.       self.start_mode7 = true
  826.     else
  827.       self.end_mode7 = true
  828.     end
  829.   end
  830.   #--------------------------------------------------------------------------
  831.   # * Check if the map is configured for mode 7
  832.   #--------------------------------------------------------------------------
  833.   def is_mode7?
  834.     return MGC::MODE7_MAPS_ID.include?(@map_id) ||
  835.     $data_mapinfos[@map_id].full_name[/\[M7\]/]
  836.   end
  837.   #--------------------------------------------------------------------------
  838.   # * Get default mode7 angle
  839.   #--------------------------------------------------------------------------
  840.   def get_default_mode7_angle
  841.     if $data_mapinfos[@map_id].full_name[/\[A(\d+)\]/]
  842.       return [[$1.to_i, 0].max, 89].min
  843.     else
  844.       return MGC::MODE7_DEFAULT_ANGLE
  845.     end
  846.   end
  847.   #--------------------------------------------------------------------------
  848.   # * Get default mode7 zoom
  849.   #--------------------------------------------------------------------------
  850.   def get_default_mode7_zoom
  851.     if $data_mapinfos[@map_id].full_name[/\[Z(\d+(?:\.\d+)*)\]/]
  852.       return [[$1.to_f, 0.125].max, 8.0].min
  853.     else
  854.       return MGC::MODE7_DEFAULT_ZOOM
  855.     end
  856.   end
  857.   #--------------------------------------------------------------------------
  858.   # * Get default fading distance
  859.   #--------------------------------------------------------------------------
  860.   def get_default_fading_distance
  861.     if $data_mapinfos[@map_id].full_name[/\[FD(\d{1,3})\]/]
  862.       return [$1.to_i, 0].max
  863.     else
  864.       return MGC::MODE7_FADING_DISTANCE
  865.     end
  866.   end
  867.   #--------------------------------------------------------------------------
  868.   # * Get default fading opacity
  869.   #--------------------------------------------------------------------------
  870.   def get_default_fading_opacity
  871.     if $data_mapinfos[@map_id].full_name[/\[FO(\d{1,3})\]/]
  872.       return [[$1.to_i, 0].max, 255].min
  873.     else
  874.       return MGC::MODE7_FADING_OPACITY
  875.     end
  876.   end
  877.   #--------------------------------------------------------------------------
  878.   # * Get default fading tone
  879.   #--------------------------------------------------------------------------
  880.   def get_default_fading_tone
  881.     if $data_mapinfos[@map_id].full_name[/\[FT(\-?\d{1,3}),(\-?\d{1,3}),(\-?\d{1,3})\]/]
  882.       red = [[$1.to_i, -255].max, 255].min
  883.       green = [[$2.to_i, -255].max, 255].min
  884.       blue = [[$3.to_i, -255].max, 255].min
  885.       return Tone.new(red, green, blue)
  886.     else
  887.       return MGC::MODE7_FADING_TONE
  888.     end
  889.   end
  890.   #--------------------------------------------------------------------------
  891.   # * Check if the map is parallaxed [1.9]
  892.   #--------------------------------------------------------------------------
  893.   def is_parallaxed?
  894.     return MGC::MODE7_PARALLAXED_MAPS_ID.include?(@map_id) ||
  895.     $data_mapinfos[@map_id].full_name[/\[P\]/]
  896.   end
  897.   #--------------------------------------------------------------------------
  898.   # * Check if the parallaxed map has a panorama in mode 7 [1.9]
  899.   #--------------------------------------------------------------------------
  900.   def has_additionnal_panorama?
  901.     return @map.note[/\[m7a_pano:\w+\]/]
  902.   end
  903.   #--------------------------------------------------------------------------
  904.   # * Return the panorama in mode 7 if the map is parallaxed [1.9]
  905.   #--------------------------------------------------------------------------
  906.   def set_additional_panorama
  907.     if @map.note[/\[m7a_pano:(\w+)\]/]
  908.       @parallax_name = $1
  909.     end
  910.   end
  911.   #--------------------------------------------------------------------------
  912.   # * Set Display Position
  913.   #--------------------------------------------------------------------------
  914.   def set_display_pos(x, y)
  915.     if MGC.mode7_active
  916.       if loop_horizontal?
  917.         @display_x = (x + width) % width
  918.       else
  919.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  920.           @display_x = (width - screen_tile_x) / 2
  921.         else
  922.           x_min = screen_tile_x * (1.0 / MGC.mode7_zoom - 1.0) / 2
  923.           x_max = width + screen_tile_x * ((1.0 - 1.0 / MGC.mode7_zoom) / 2 - 1)
  924.           x = [x_min, [x, x_max].min].max
  925.           @display_x = x
  926.         end
  927.       end
  928.       if loop_vertical?
  929.         @display_y = (y + height) % height
  930.       else
  931.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  932.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  933.         else
  934.           y_min = screen_tile_y * (1.0 / MGC.mode7_zoom - 1.0) * MGC.mode7_data[1]
  935.           y_max = height + screen_tile_y *
  936.           ((1.0 - 1.0 / MGC.mode7_zoom) * (1 - MGC.mode7_data[1]) - 1)
  937.           y = [y_min, [y, y_max].min].max
  938.           @display_y = y
  939.         end
  940.       end
  941.       @parallax_x = x
  942.       @parallax_y = y
  943.     else
  944.       set_display_pos_mgc_m7a(x, y)
  945.     end
  946.   end
  947.   #--------------------------------------------------------------------------
  948.   # * Scroll Down
  949.   #--------------------------------------------------------------------------
  950.   def scroll_down(distance)
  951.     if MGC.mode7_active
  952.       if loop_vertical?
  953.         @display_y += distance
  954.         @display_y %= @map.height
  955.         @parallax_y += distance if @parallax_loop_y
  956.       else
  957.         last_y = @display_y
  958.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  959.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  960.         else
  961.           max = height + screen_tile_y *
  962.           ((1.0 - 1.0 / MGC.mode7_zoom) * (1 - MGC.mode7_data[1]) - 1)
  963.           @display_y = [@display_y + distance, max].min
  964.         end
  965.         @parallax_y += @display_y - last_y
  966.       end
  967.     else
  968.       scroll_down_mgc_m7a(distance)
  969.     end
  970.   end
  971.   #--------------------------------------------------------------------------
  972.   # * Scroll Left
  973.   #--------------------------------------------------------------------------
  974.   def scroll_left(distance)
  975.     if MGC.mode7_active
  976.       if loop_horizontal?
  977.         @display_x += @map.width - distance
  978.         @display_x %= @map.width
  979.         @parallax_x -= distance if @parallax_loop_x
  980.       else
  981.         last_x = @display_x
  982.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  983.           @display_x = (width - screen_tile_x) / 2
  984.         else
  985.           min = screen_tile_x * (1.0 / MGC.mode7_zoom - 1.0) / 2
  986.           @display_x = [@display_x - distance, min].max
  987.         end
  988.         @parallax_x += @display_x - last_x
  989.       end
  990.     else
  991.       scroll_left_mgc_m7a(distance)
  992.     end
  993.   end
  994.   #--------------------------------------------------------------------------
  995.   # * Scroll Right
  996.   #--------------------------------------------------------------------------
  997.   def scroll_right(distance)
  998.     if MGC.mode7_active
  999.       if loop_horizontal?
  1000.         @display_x += distance
  1001.         @display_x %= @map.width
  1002.         @parallax_x += distance if @parallax_loop_x
  1003.       else
  1004.         last_x = @display_x
  1005.         if MGC.mode7_zoom < 1.0 && width * MGC.mode7_zoom < screen_tile_x
  1006.           @display_x = (width - screen_tile_x) / 2
  1007.         else
  1008.           max = width + screen_tile_x * ((1.0 - 1.0 / MGC.mode7_zoom) / 2 - 1)
  1009.           @display_x = [@display_x + distance, max].min
  1010.         end
  1011.         @parallax_x += @display_x - last_x
  1012.       end
  1013.     else
  1014.       scroll_right_mgc_m7a(distance)
  1015.     end
  1016.   end
  1017.   #--------------------------------------------------------------------------
  1018.   # * Scroll Up
  1019.   #--------------------------------------------------------------------------
  1020.   def scroll_up(distance)
  1021.     if MGC.mode7_active
  1022.       if loop_vertical?
  1023.         @display_y += @map.height - distance
  1024.         @display_y %= @map.height
  1025.         @parallax_y -= distance if @parallax_loop_y
  1026.       else
  1027.         last_y = @display_y
  1028.         if MGC.mode7_zoom < 1.0 && height * MGC.mode7_zoom < screen_tile_y
  1029.           @display_y = (height - screen_tile_y) * MGC.mode7_data[1]
  1030.         else
  1031.           min = screen_tile_y * (1.0 / MGC.mode7_zoom - 1.0) * MGC.mode7_data[1]
  1032.           @display_y = [@display_y - distance, min].max
  1033.         end
  1034.         @parallax_y += @display_y - last_y
  1035.       end
  1036.     else
  1037.       scroll_up_mgc_m7a(distance)
  1038.     end
  1039.   end
  1040.   #--------------------------------------------------------------------------
  1041.   # * Get Terrain Tag for a layer [1.7]
  1042.   #--------------------------------------------------------------------------
  1043.   def terrain_tag_for_layer(x, y, layer)
  1044.     return 0 unless valid?(x, y)
  1045.     return tileset.flags[tile_id(x, y, layer)] >> 12
  1046.   end
  1047. end
  1048.  
  1049. #==============================================================================
  1050. # ** Game_CharacterBase
  1051. #==============================================================================
  1052. class Game_CharacterBase
  1053.   #--------------------------------------------------------------------------
  1054.   # * Public Instance Variables
  1055.   #--------------------------------------------------------------------------
  1056.   attr_accessor :sprite
  1057. end
  1058.  
  1059. #==============================================================================
  1060. # ** Serialisation
  1061. #==============================================================================
  1062. [:Sprite, :Viewport, :Bitmap, :Font].each {|classname|
  1063.   eval(
  1064.   "class #{classname}
  1065.     def marshal_dump
  1066.       return []
  1067.     end
  1068.     def marshal_load(array)
  1069.     end
  1070.   end")
  1071. }
  1072.  
  1073. #==============================================================================
  1074. # ** Sprite
  1075. #==============================================================================
  1076. class Sprite
  1077.   #--------------------------------------------------------------------------
  1078.   # * Aliased methods
  1079.   #--------------------------------------------------------------------------
  1080.   unless @already_aliased_mgc_m7a
  1081.     alias initialize_mgc_m7a initialize
  1082.     alias zoom_x_mgc_m7a= zoom_x=
  1083.     alias zoom_y_mgc_m7a= zoom_y=
  1084.     alias zoom_x_mgc_m7a zoom_x
  1085.     alias zoom_y_mgc_m7a zoom_y
  1086.     @already_aliased_mgc_m7a = true
  1087.   end
  1088.   #--------------------------------------------------------------------------
  1089.   # * Initialisation
  1090.   #--------------------------------------------------------------------------
  1091.   def initialize(*args)
  1092.     initialize_mgc_m7a(*args)
  1093.     @phase_mode7 = false
  1094.     self.zoom_x = 1.0
  1095.     self.zoom_y = 1.0
  1096.   end
  1097.   #--------------------------------------------------------------------------
  1098.   # * Setter pour l'attribut zoom_x
  1099.   #--------------------------------------------------------------------------
  1100.   def zoom_x=(new_zoom_x)
  1101.     unless @phase_mode7
  1102.       @base_zoom_x = new_zoom_x
  1103.     end
  1104.     self.zoom_x_mgc_m7a = new_zoom_x
  1105.   end
  1106.   #--------------------------------------------------------------------------
  1107.   # * Setter pour l'attribut zoom_y
  1108.   #--------------------------------------------------------------------------
  1109.   def zoom_y=(new_zoom_y)
  1110.     unless @phase_mode7
  1111.       @base_zoom_y = new_zoom_y
  1112.     end
  1113.     self.zoom_y_mgc_m7a = new_zoom_y
  1114.   end
  1115.   #--------------------------------------------------------------------------
  1116.   # * Getter pour l'attribut zoom_x
  1117.   #--------------------------------------------------------------------------
  1118.   def zoom_x
  1119.     return @base_zoom_x
  1120.   end
  1121.   #--------------------------------------------------------------------------
  1122.   # * Getter pour l'attribut zoom_y
  1123.   #--------------------------------------------------------------------------
  1124.   def zoom_y
  1125.     return @base_zoom_y
  1126.   end
  1127.   #--------------------------------------------------------------------------
  1128.   # * Valeur réelle du zoom_x en prenant en compte le zoom de la carte
  1129.   #--------------------------------------------------------------------------
  1130.   def zoom_x_real
  1131.     return zoom_x_mgc_m7a
  1132.   end
  1133.   #--------------------------------------------------------------------------
  1134.   # * Valeur réelle du zoom_y en prenant en compte le zoom de la carte
  1135.   #--------------------------------------------------------------------------
  1136.   def zoom_y_real
  1137.     return zoom_y_mgc_m7a
  1138.   end
  1139. end
  1140.  
  1141. #==============================================================================
  1142. # ** Sprite_Base
  1143. #==============================================================================
  1144. class Sprite_Base
  1145.   #--------------------------------------------------------------------------
  1146.   # * Aliased methods
  1147.   #--------------------------------------------------------------------------
  1148.   unless @already_aliased_mgc_m7a
  1149.     alias animation_set_sprites_mgc_m7a_aprite_base animation_set_sprites
  1150.     @already_aliased_mgc_m7a = true
  1151.   end
  1152.   #--------------------------------------------------------------------------
  1153.   # * Set Animation Sprite
  1154.   #     frame : Frame data (RPG::Animation::Frame)
  1155.   #--------------------------------------------------------------------------
  1156.   def animation_set_sprites(frame)
  1157.     if MGC.mode7_active
  1158.       cell_data = frame.cell_data
  1159.       @ani_sprites.each_with_index do |sprite, i|
  1160.         next unless sprite
  1161.         pattern = cell_data[i, 0]
  1162.         if !pattern || pattern < 0
  1163.           sprite.visible = false
  1164.           next
  1165.         end
  1166.         sprite.bitmap = pattern < 100 ? @ani_bitmap1 : @ani_bitmap2
  1167.         sprite.visible = true
  1168.         sprite.src_rect.set(pattern % 5 * 192,
  1169.           pattern % 100 / 5 * 192, 192, 192)
  1170.         if @ani_mirror
  1171.           sprite.x = @ani_ox - cell_data[i, 1] * zoom_y_real
  1172.           sprite.y = @ani_oy + cell_data[i, 2] * zoom_y_real
  1173.           sprite.angle = (360 - cell_data[i, 4])
  1174.           sprite.mirror = (cell_data[i, 5] == 0)
  1175.         else
  1176.           sprite.x = @ani_ox + cell_data[i, 1] * zoom_y_real
  1177.           sprite.y = @ani_oy + cell_data[i, 2] * zoom_y_real
  1178.           sprite.angle = cell_data[i, 4]
  1179.           sprite.mirror = (cell_data[i, 5] == 1)
  1180.         end
  1181.         sprite.z = self.z + 300 + i
  1182.         sprite.ox = 96
  1183.         sprite.oy = 96
  1184.         sprite.zoom_x = cell_data[i, 3] * zoom_y_real / 100.0
  1185.         sprite.zoom_y = cell_data[i, 3] * zoom_y_real / 100.0
  1186.         sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
  1187.         sprite.blend_type = cell_data[i, 7]
  1188.       end
  1189.     else
  1190.       animation_set_sprites_mgc_m7a_aprite_base(frame)
  1191.     end
  1192.   end
  1193. end
  1194.  
  1195. #==============================================================================
  1196. # ** Sprite_Character
  1197. #==============================================================================
  1198. class Sprite_Character < Sprite_Base
  1199.   #--------------------------------------------------------------------------
  1200.   # * Aliased methods
  1201.   #--------------------------------------------------------------------------
  1202.   unless @already_aliased_mgc_m7a
  1203.     alias initialize_mgc_m7a_aprite_character initialize
  1204.     alias update_position_mgc_m7a_aprite_character update_position
  1205.     alias update_other_mgc_m7a_aprite_character update_other
  1206.     alias update_balloon_mgc_m7a_aprite_character update_balloon
  1207.     @already_aliased_mgc_m7a = true
  1208.   end
  1209.   #--------------------------------------------------------------------------
  1210.   # * Object Initialization
  1211.   #     character : Game_Character
  1212.   #--------------------------------------------------------------------------
  1213.   def initialize(viewport, character = nil)
  1214.     initialize_mgc_m7a_aprite_character(viewport, character)
  1215.     character.sprite = self
  1216.   end
  1217.   #--------------------------------------------------------------------------
  1218.   # * Update Position
  1219.   #--------------------------------------------------------------------------
  1220.   def update_position
  1221.     if MGC.mode7_active
  1222.       old_x = x
  1223.       old_y = y
  1224.       update_mode7
  1225.       @in_mode_7 = true # [1.5]
  1226.       move_animation(x - old_x, y - old_y)
  1227.     else
  1228.       if @in_mode_7 # [1.5]
  1229.         self.zoom_x = zoom_x
  1230.         self.zoom_y = zoom_y
  1231.         @in_mode_7 = false
  1232.       end
  1233.       update_position_mgc_m7a_aprite_character
  1234.     end
  1235.   end
  1236.   #--------------------------------------------------------------------------
  1237.   # * Update Other
  1238.   #--------------------------------------------------------------------------
  1239.   def update_other
  1240.     update_other_mgc_m7a_aprite_character
  1241.     if MGC.mode7_active && visible
  1242.       if !@force_mode7_invisible &&
  1243.         y >= MGC.mode7_data[8] &&
  1244.         (y - height * zoom_y_real) < Graphics.height
  1245.       then
  1246.         self.visible = true
  1247.         if y < Graphics.height
  1248.           dat = MGC.mode7_data[9]
  1249.           self.opacity += dat[5, y]
  1250.           self.tone.set(dat[2, y], dat[3, y], dat[4, y])
  1251.         end
  1252.       else
  1253.         self.visible = false
  1254.       end
  1255.     end
  1256.   end
  1257.   #--------------------------------------------------------------------------
  1258.   # * Update Position In Mode7
  1259.   #--------------------------------------------------------------------------
  1260.   def update_mode7
  1261.     if @character.tile_id == 0 && character.character_name == "" # [1.8]
  1262.       @force_mode7_invisible = true
  1263.       return
  1264.     end
  1265.     y_screen = character.screen_y +
  1266.     (character.is_a?(Game_Vehicle) ? character.altitude : 0)
  1267.     y_init = MGC.mode7_data[2] * (y_screen - MGC.mode7_data[0])
  1268.     if y_init < - (MGC::MODE7_VIEW_LIMIT << 5) - MGC.mode7_data[0] ||
  1269.       y_init > Graphics.height
  1270.     then
  1271.       @force_mode7_invisible = true
  1272.       return
  1273.     else
  1274.       @force_mode7_invisible = false
  1275.     end
  1276.     x_init = MGC.mode7_data[2] * (character.screen_x - (Graphics.width >> 1))
  1277.     self.y = (MGC.mode7_data[0] + (MGC.mode7_data[5] * y_init *
  1278.     MGC.mode7_data[3]) / (MGC.mode7_data[5] - y_init * MGC.mode7_data[4])).to_i
  1279.     zx = MGC.mode7_data[6] * y + MGC.mode7_data[7]
  1280.     self.x = ((Graphics.width >> 1) + zx * x_init).to_i
  1281.     @phase_mode7 = true
  1282.     self.zoom_x = MGC.mode7_data[2] * zx
  1283.     self.zoom_y = zoom_x_real
  1284.     @phase_mode7 = false
  1285.     self.z = @character.screen_z + (y << 8) # [1.7]
  1286.     if character.is_a?(Game_Vehicle)
  1287.       self.y -= character.altitude * zoom_y_real
  1288.     end
  1289.   end
  1290.   #--------------------------------------------------------------------------
  1291.   # * Update Balloon Icon
  1292.   #--------------------------------------------------------------------------
  1293.   def update_balloon
  1294.     update_balloon_mgc_m7a_aprite_character
  1295.     if MGC.mode7_active && @balloon_duration > 0
  1296.       @balloon_sprite.y = y - height * zoom_y_real
  1297.       @balloon_sprite.zoom_x = zoom_x_real
  1298.       @balloon_sprite.zoom_y = zoom_y_real
  1299.     end
  1300.   end
  1301. end
  1302.  
  1303. #==============================================================================
  1304. # ** Spriteset_Map
  1305. #==============================================================================
  1306. class Spriteset_Map
  1307.   #--------------------------------------------------------------------------
  1308.   # * Aliased methods
  1309.   #--------------------------------------------------------------------------
  1310.   unless @already_aliased_mgc_m7a
  1311.     alias initialize_mgc_m7a initialize
  1312.     alias create_tilemap_mgc_m7a create_tilemap
  1313.     alias update_mgc_m7a update
  1314.     alias update_shadow_mgc_m7a update_shadow
  1315.     alias update_parallax_mgc_m7a update_parallax
  1316.     @already_aliased_mgc_m7a = true
  1317.   end
  1318.   #--------------------------------------------------------------------------
  1319.   # * Object Initialization
  1320.   #--------------------------------------------------------------------------
  1321.   def initialize
  1322.     MGC.spriteset = self
  1323.     initialize_mgc_m7a
  1324.   end
  1325.   #--------------------------------------------------------------------------
  1326.   # * Lance le mode 7
  1327.   #--------------------------------------------------------------------------
  1328.   def start_mode7
  1329.     unless @tilemap_mode7 && @tilemap_mode7.map_id == $game_map.map_id # [1.9]
  1330.       if @tilemap_mode7
  1331.         @tilemap_mode7.dispose unless @tilemap_mode7.disposed?
  1332.         MGC.initialize_mode7(true)
  1333.       else
  1334.         MGC.initialize_mode7
  1335.         @tilemap_classic = @tilemap
  1336.       end
  1337.       @tilemap_mode7 = MGC::Mode7_Map.new(@viewport1)
  1338.       @tilemap_mode7.map_data = $game_map.data
  1339.       if $game_map.is_parallaxed? && $game_map.parallax_name &&
  1340.         $game_map.parallax_name != '' # [1.9]
  1341.       then
  1342.         @tilemap_mode7.parallax = Cache.parallax($game_map.parallax_name)
  1343.         $game_map.set_additional_panorama
  1344.       end
  1345.       @tilemap = @tilemap_mode7
  1346.       load_tileset
  1347.     end
  1348.     @tilemap_mode7.create_vertical_tiles # [1.7]
  1349.     @tilemap_mode7.visible = true
  1350.     @tilemap_classic.visible = false
  1351.     @tilemap = @tilemap_mode7
  1352.     MGC.mode7_active = true
  1353.   end
  1354.   #--------------------------------------------------------------------------
  1355.   # * Met fin au mode 7
  1356.   #--------------------------------------------------------------------------
  1357.   def end_mode7
  1358.     if @tilemap_mode7
  1359.       @tilemap_mode7.visible = false
  1360.       @tilemap_classic.visible = true
  1361.       @tilemap = @tilemap_classic
  1362.       @tilemap_mode7.clear_vertical_tiles # [1.7]
  1363.       @parallax.visible = true # [1.9]
  1364.     end
  1365.     MGC.mode7_active = false
  1366.   end
  1367.   #--------------------------------------------------------------------------
  1368.   # * Create Tilemap
  1369.   #--------------------------------------------------------------------------
  1370.   def create_tilemap
  1371.     create_tilemap_mgc_m7a
  1372.     unless $game_system.mode7_active
  1373.       MGC.mode7_active = false
  1374.     end
  1375.     if $game_map.is_mode7? || $game_system.mode7_active
  1376.       start_mode7
  1377.     end
  1378.   end
  1379.   #--------------------------------------------------------------------------
  1380.   # * Update
  1381.   #--------------------------------------------------------------------------
  1382.   def update
  1383.     MGC.update_mode7
  1384.     if $game_map.start_mode7
  1385.       start_mode7
  1386.       $game_map.start_mode7 = false
  1387.     elsif $game_map.end_mode7
  1388.       end_mode7
  1389.       $game_map.end_mode7 = false
  1390.     end
  1391.     update_mgc_m7a
  1392.   end
  1393.   #--------------------------------------------------------------------------
  1394.   # * Update Parallax [1.9]
  1395.   #--------------------------------------------------------------------------
  1396.   def update_parallax
  1397.     update_parallax_mgc_m7a
  1398.     if MGC.mode7_active && $game_map.is_parallaxed?
  1399.       if $game_map.has_additionnal_panorama?
  1400.         $game_map.set_additional_panorama
  1401.       else
  1402.         @parallax.visible = false
  1403.       end
  1404.     end
  1405.   end
  1406.   #--------------------------------------------------------------------------
  1407.   # * Update Airship Shadow Sprite
  1408.   #--------------------------------------------------------------------------
  1409.   def update_shadow
  1410.     if MGC.mode7_active
  1411.       airship_sprite = $game_map.airship.sprite
  1412.       @shadow_sprite.x = airship_sprite.x
  1413.       @shadow_sprite.y = airship_sprite.y + $game_map.airship.altitude *
  1414.       airship_sprite.zoom_y_real
  1415.       @shadow_sprite.opacity = $game_map.airship.altitude * 8 *
  1416.       airship_sprite.opacity
  1417.       @shadow_sprite.zoom_x = airship_sprite.zoom_x_real
  1418.       @shadow_sprite.zoom_y = airship_sprite.zoom_y_real
  1419.       @shadow_sprite.update
  1420.     else
  1421.       update_shadow_mgc_m7a
  1422.     end
  1423.   end
  1424. end
  1425.  
  1426. #==============================================================================
  1427. # ** Scene_Map
  1428. #==============================================================================
  1429. class Scene_Map < Scene_Base
  1430.   #--------------------------------------------------------------------------
  1431.   # * Aliased methods
  1432.   #--------------------------------------------------------------------------
  1433.   unless @already_aliased_mgc_m7a
  1434.     alias update_call_menu_mgc_m7a update_call_menu
  1435.     @already_aliased_mgc_m7a = true
  1436.   end
  1437.   #--------------------------------------------------------------------------
  1438.   # * Determine if Menu is Called due to Cancel Button
  1439.   #--------------------------------------------------------------------------
  1440.   def update_call_menu
  1441.     unless MGC.effect?
  1442.       update_call_menu_mgc_m7a
  1443.     end
  1444.   end
  1445. end
  1446.  
  1447. #============================================================================
  1448. # ** RPG::MapInfo
  1449. #============================================================================
  1450. class RPG::MapInfo
  1451.   # defines the map name as the name without anything within brackets,
  1452.   # including brackets
  1453.   def name
  1454.     return @name.gsub(/\[.*\]/) {''}
  1455.   end
  1456.   #--------------------------------------------------------------------------
  1457.   # the original name with the codes
  1458.   def full_name
  1459.     return @name
  1460.   end
  1461. end
  1462.  
  1463. module MGC
  1464.   #--------------------------------------------------------------------------
  1465.   # * Constantes [1.7]
  1466.   #--------------------------------------------------------------------------
  1467.   RENDER_TILE = Win32API.new("MGC_Mode7_Ace_1_9", "renderTile", "l", "l")
  1468.   #==============================================================================
  1469.   # ** MGC::Vertical_Tile [1.7]
  1470.   #==============================================================================
  1471.   class Vertical_Tile
  1472.     #--------------------------------------------------------------------------
  1473.     # * Attributs
  1474.     #--------------------------------------------------------------------------
  1475.     attr_accessor :x, :y, :screen_x, :screen_y, :zoom
  1476.     attr_accessor :tile_width, :tile_height, :width, :height
  1477.     #--------------------------------------------------------------------------
  1478.     # * Initialisation
  1479.     # param parent : MGC::Mode7_Map
  1480.     # param viewport : Viewport
  1481.     #--------------------------------------------------------------------------
  1482.     def initialize(parent, viewport)
  1483.       @parent = parent
  1484.       @viewport = viewport
  1485.       @visible = false
  1486.       @sprite = nil
  1487.     end
  1488.     #--------------------------------------------------------------------------
  1489.     # * Refresh tile data
  1490.     # param tiles : Array<Array[Integer, Integer, Array[3]<Boolean>]>
  1491.     # param x_min : Integer
  1492.     # param x_max : Integer
  1493.     # param y_min : Integer
  1494.     # param y_max : Integer
  1495.     #--------------------------------------------------------------------------
  1496.     def refresh_tile_data(tiles, x_min, x_max, y_min, y_max)
  1497.       self.tile_width = 1 + x_max - x_min
  1498.       self.width = tile_width << 5
  1499.       self.tile_height = 1 + y_max - y_min
  1500.       self.height = tile_height << 5
  1501.       @tiles_data = Array.new(tile_width * tile_height)
  1502.       tiles.each {|tile|
  1503.         x_tile = tile[0] - x_min
  1504.         y_tile = tile[1] - y_min
  1505.         @tiles_data[x_tile + y_tile * tile_width] = tile
  1506.       }
  1507.     end
  1508.     #--------------------------------------------------------------------------
  1509.     # * Dispose
  1510.     #--------------------------------------------------------------------------
  1511.     def dispose
  1512.       if @sprite
  1513.         @sprite.bitmap.dispose
  1514.         @sprite.dispose
  1515.         @sprite = nil
  1516.       end
  1517.     end
  1518.     #--------------------------------------------------------------------------
  1519.     # * Update
  1520.     #--------------------------------------------------------------------------
  1521.     def update
  1522.       update_mode7
  1523.       update_visibility
  1524.     end
  1525.     #--------------------------------------------------------------------------
  1526.     # * Update Position In Mode7
  1527.     #--------------------------------------------------------------------------
  1528.     def update_mode7
  1529.       x_scr = 32 * $game_map.adjust_x(x.to_f / 32)
  1530.       y_scr = 32 * $game_map.adjust_y(y.to_f / 32)
  1531.       y_init = MGC.mode7_data[2] * (y_scr - MGC.mode7_data[0])
  1532.       if y_init < - (MGC::MODE7_VIEW_LIMIT << 5) - MGC.mode7_data[0] ||
  1533.         y_init > Graphics.height
  1534.       then
  1535.         @force_invisible = true
  1536.         return
  1537.       else
  1538.         @force_invisible = false
  1539.       end
  1540.       x_init = MGC.mode7_data[2] * (x_scr - (Graphics.width >> 1))
  1541.       self.screen_y = (MGC.mode7_data[0] + (MGC.mode7_data[5] * y_init *
  1542.       MGC.mode7_data[3]) / (MGC.mode7_data[5] - y_init * MGC.mode7_data[4])).to_i
  1543.       zx = MGC.mode7_data[6] * screen_y + MGC.mode7_data[7]
  1544.       self.screen_x = ((Graphics.width >> 1) + zx * x_init).to_i
  1545.       self.zoom = MGC.mode7_data[2] * zx
  1546.     end
  1547.     #--------------------------------------------------------------------------
  1548.     # * Update Visibility
  1549.     #--------------------------------------------------------------------------
  1550.     def update_visibility
  1551.       if @visible
  1552.         if !@force_invisible &&
  1553.           screen_y >= MGC.mode7_data[8] &&
  1554.           (screen_y - height * zoom) < Graphics.height &&
  1555.           (screen_x + width * zoom / 2)  >= 0 &&
  1556.           (screen_x - width * zoom / 2) < Graphics.width
  1557.         then
  1558.           if screen_y < Graphics.height
  1559.             dat = MGC.mode7_data[9]
  1560.             @sprite.opacity = 255 + dat[5, screen_y]
  1561.             @sprite.tone.set(dat[2, screen_y], dat[3, screen_y], dat[4, screen_y])
  1562.           end
  1563.           @sprite.x = screen_x
  1564.           @sprite.y = screen_y
  1565.           @sprite.z = screen_y << 8
  1566.           @sprite.zoom_x = zoom
  1567.           @sprite.zoom_y = zoom
  1568.         else
  1569.           @visible = false
  1570.           @sprite.bitmap.dispose
  1571.           @sprite.dispose
  1572.           @sprite = nil
  1573.         end
  1574.       else
  1575.         if !@force_invisible &&
  1576.           screen_y >= MGC.mode7_data[8] &&
  1577.           (screen_y - height * zoom) < Graphics.height &&
  1578.           (screen_x + width * zoom / 2)  >= 0 &&
  1579.           (screen_x - width * zoom / 2) < Graphics.width
  1580.         then
  1581.           @visible = true
  1582.           @sprite = Sprite.new(@viewport)
  1583.           @sprite.ox = tile_width * 32 / 2
  1584.           @sprite.oy = tile_height * 32
  1585.           @sprite.x = screen_x
  1586.           @sprite.y = screen_y
  1587.           @sprite.z = screen_y << 8
  1588.           @sprite.zoom_x = zoom
  1589.           @sprite.zoom_y = zoom
  1590.           @sprite.bitmap = Bitmap.new(32 * tile_width, 32 * tile_height)
  1591.           (0...tile_height).each {|iy|
  1592.             (0...tile_width).each {|ix|
  1593.               tile_data = @tiles_data[ix + iy * tile_width]
  1594.               if tile_data
  1595.                 (0...3).each {|il|
  1596.                   if tile_data[2][il]
  1597.                     @parent.param_tiles[6][il] =
  1598.                     $game_map.tile_id(tile_data[0], tile_data[1], il)
  1599.                   else
  1600.                     @parent.param_tiles[6][il] = 0
  1601.                   end
  1602.                 }
  1603.                 @parent.param_tiles[0].clear
  1604.                 MGC::RENDER_TILE.call(@parent.param_tiles.__id__)
  1605.                 @sprite.bitmap.blt(ix << 5, iy << 5, @parent.param_tiles[0],
  1606.                 @parent.param_tiles[0].rect)
  1607.               end
  1608.             }
  1609.           }
  1610.           if screen_y < Graphics.height
  1611.             dat = MGC.mode7_data[9]
  1612.             @sprite.opacity = 255 + dat[5, screen_y]
  1613.             @sprite.tone.set(dat[2, screen_y], dat[3, screen_y], dat[4, screen_y])
  1614.           end
  1615.         end
  1616.       end
  1617.     end
  1618.   end
  1619. end



mode 7 必要檔案
Project1.rar (51.26 KB, 下载次数: 28)
[神性领域扩张:扩张神性领域]
说了等于没说.
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-16 23:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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