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

Project1

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

[已经解决] 请问下CACAO的截图脚本为什么无法使用

[复制链接]

Lv2.观梦者

梦石
0
星屑
693
在线时间
102 小时
注册时间
2019-8-15
帖子
34
跳转到指定楼层
1
发表于 2019-8-17 19:06:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
已经同时使用了前置脚本的画像保存,但是在测试运行之后按了F6也没有反应,不知道为什么会这样
  1. #******************************************************************************
  2. #
  3. #    * マップショット
  4. #
  5. #  --------------------------------------------------------------------------
  6. #    バージョン : 1.2.1
  7. #    対      応 : RPGツクールVX Ace : RGSS3
  8. #    制  作  者 : CACAO
  9. #    配  布  元 : http://cacaosoft.webcrow.jp/
  10. #  --------------------------------------------------------------------------
  11. #   == 概    要 ==
  12. #
  13. #    : マップを1枚の画像にして保存します。
  14. #
  15. #  --------------------------------------------------------------------------
  16. #   == 注意事項 ==
  17. #
  18. #    ※ 画像の保存に『画像保存』スクリプトが必要になります。
  19. #    ※ ゲーム配布時には、削除してください。
  20. #    ※ 撮影時にプレイヤーは非表示になります。
  21. #
  22. #  --------------------------------------------------------------------------
  23. #   == 使用方法 ==
  24. #
  25. #    ★ マップ画像の保存
  26. #     マップ画面で F6 キーを押してください。
  27. #     右下まで移動すると停止しますが、画像を保存しています。
  28. #     画面が元に戻るまで、しばらくお持ちください。
  29. #     画像は、ゲームフォルダに保存されます。
  30. #
  31. #    ★ マップ画像の保存 (スクリプト)
  32. #     CAO::MapShot.start
  33. #
  34. #
  35. #******************************************************************************


  36. #==============================================================================
  37. # ◆ 設定項目
  38. #==============================================================================
  39. module CAO
  40. module MapShot
  41.   #--------------------------------------------------------------------------
  42.   # ◇ マップ画面での撮影ボタン
  43.   #--------------------------------------------------------------------------
  44.   KEY = :F6
  45.   #--------------------------------------------------------------------------
  46.   # ◇ 撮影時プレイヤーを非表示
  47.   #--------------------------------------------------------------------------
  48.   PLAYER_TRANSPARENT = true
  49.   #--------------------------------------------------------------------------
  50.   # ◇ 保存名
  51.   #--------------------------------------------------------------------------
  52.   SAVE_NAME = "MapShot/%2$s(%5$d)_%3$d%4$d.png"
  53.   #--------------------------------------------------------------------------
  54.   # ◇ 経過をコンソールに表示
  55.   #--------------------------------------------------------------------------
  56.   SHOW_MESSAGE = true
  57.   #--------------------------------------------------------------------------
  58.   # ◇ 完了を告げるメッセージボックスを表示
  59.   #--------------------------------------------------------------------------
  60.   SHOW_MSGBOX = true
  61. end # module MapShot
  62. end # module CAO


  63. #/////////////////////////////////////////////////////////////////////////////#
  64. #                                                                             #
  65. #                下記のスクリプトを変更する必要はありません。                 #
  66. #                                                                             #
  67. #/////////////////////////////////////////////////////////////////////////////#


  68. module CAO::MapShot
  69.   #--------------------------------------------------------------------------
  70.   # ●
  71.   #--------------------------------------------------------------------------
  72.   def self.start
  73.     return unless SceneManager.scene_is?(Scene_Map)
  74.     SceneManager.scene.map_shot
  75.   end
  76.   #--------------------------------------------------------------------------
  77.   # ●
  78.   #--------------------------------------------------------------------------
  79.   def self.mkdir(path)
  80.     return if FileTest.directory?(path)
  81.     parent = path.split(/[\\\/]/)[0..-2].join('/')
  82.     self.mkdir(parent) unless parent.empty? || FileTest.directory?(parent)
  83.     Dir.mkdir(path)
  84.   end
  85. end

  86. class Sprite_Character < Sprite_Base
  87.   #--------------------------------------------------------------------------
  88.   # ● フレーム更新
  89.   #--------------------------------------------------------------------------
  90.   def update_snap
  91.     self.x = @character.screen_x
  92.     self.y = @character.screen_y
  93.     self.z = @character.screen_z
  94.     self.visible = [email protected]
  95.     if @balloon_duration > 0
  96.       @balloon_sprite.x = x
  97.       @balloon_sprite.y = y - height
  98.       @balloon_sprite.z = z + 200
  99.     end
  100.   end
  101. end

  102. class Spriteset_Map
  103.   #--------------------------------------------------------------------------
  104.   # ●
  105.   #--------------------------------------------------------------------------
  106.   def update_snap
  107.     @tilemap.ox = $game_map.display_x * 32
  108.     @tilemap.oy = $game_map.display_y * 32
  109.     @parallax.ox = @tilemap.ox
  110.     @parallax.oy = @tilemap.oy
  111.     @character_sprites.each {|sprite| sprite.update_snap }
  112.     airship = $game_map.airship
  113.     @shadow_sprite.x = airship.screen_x
  114.     @shadow_sprite.y = airship.screen_y + airship.altitude
  115.     @shadow_sprite.opacity = airship.altitude * 8
  116.     Graphics.update
  117.   end
  118. end

  119. class Scene_Map < Scene_Base
  120.   #--------------------------------------------------------------------------
  121.   # ● フレーム更新
  122.   #--------------------------------------------------------------------------
  123. if CAO::MapShot::KEY
  124.   alias _cao_mapshot_update update
  125.   def update
  126.     _cao_mapshot_update
  127.     map_shot if Input.press?(CAO::MapShot::KEY)
  128.   end
  129. end # if CAO::MapShot::KEY
  130.   #--------------------------------------------------------------------------
  131.   # ●
  132.   #--------------------------------------------------------------------------
  133.   def map_shot
  134.     if CAO::MapShot::SHOW_MESSAGE
  135.       puts " == マップ画像の保存 =="
  136.     end
  137.     # プレイヤーを非表示
  138.     if CAO::MapShot::PLAYER_TRANSPARENT
  139.       last_player_transparent = $game_player.transparent
  140.       $game_player.transparent = true
  141.       $game_player.followers.update
  142.     end
  143.     # マップの撮影
  144.     format_arg = [$game_map.map_id, $data_mapinfos[$game_map.map_id].name]
  145.     bitmap = Bitmap.new([$game_map.width * 32, Graphics.width * 10].min,
  146.                         [$game_map.height * 32, Graphics.height * 13].min)
  147.     screen_width = $game_map.screen_tile_x
  148.     screen_height = $game_map.screen_tile_y
  149.     bitmap_tile_x = bitmap.width / 32
  150.     bitmap_tile_y = bitmap.height / 32
  151.     cnt = 1
  152.     ($game_map.height * 32 / bitmap.height.to_f).ceil.times do |by|
  153.       ($game_map.width * 32 / bitmap.width.to_f).ceil.times do |bx|
  154.         (bitmap_tile_y / screen_height.to_f).ceil.times do |y|
  155.           (bitmap_tile_x / screen_width.to_f).ceil.times do |x|
  156.             tile_x = screen_width * x + bitmap_tile_x * bx
  157.             tile_y = screen_height * y + bitmap_tile_y * by
  158.             $game_map.set_display_pos(tile_x, tile_y)
  159.             @spriteset.update_snap
  160.             dx = $game_map.display_x * 32 - bitmap.width * bx
  161.             dy = $game_map.display_y * 32 - bitmap.height * by
  162.             snap = Graphics.snap_to_bitmap
  163.             bitmap.blt(dx, dy, snap, snap.rect)
  164.           end
  165.         end
  166.         # マップ画像の保存
  167.         format_arg[2] = bx
  168.         format_arg[3] = by
  169.         format_arg[4] = cnt
  170.         filename = CAO::MapShot::SAVE_NAME % format_arg
  171.         CAO::MapShot.mkdir(File.dirname(filename))
  172.         if CAO::MapShot::SHOW_MESSAGE
  173.           puts "[#{"%02d"%cnt}] #{filename}"
  174.         end
  175.         bitmap.save_png(filename)
  176.         bitmap.clear
  177.         cnt += 1
  178.       end
  179.     end
  180.     if CAO::MapShot::SHOW_MESSAGE
  181.       puts " == 保存完了 =="
  182.     end
  183.     if CAO::MapShot::SHOW_MSGBOX
  184.       msgbox "Complete!"
  185.       Input.update
  186.     end
  187.     # プレイヤーの状態を戻す
  188.     if CAO::MapShot::PLAYER_TRANSPARENT
  189.       $game_player.transparent = last_player_transparent
  190.     end
  191.     $game_player.center($game_player.x, $game_player.y)
  192.     $game_player.update
  193.   end
  194. end
复制代码


Lv3.寻梦者

梦石
0
星屑
2983
在线时间
299 小时
注册时间
2018-4-6
帖子
328
2
发表于 2019-8-17 21:45:27 | 只看该作者
本帖最后由 whitedewxiao 于 2019-8-17 21:49 编辑

删除评论

点评

不好意思,你的版本是更新的。我看漏了。 截图是在测试的时候按F6的。  发表于 2019-8-17 21:53
算了,你这个脚本好像不是原本的?  发表于 2019-8-17 21:46
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2983
在线时间
299 小时
注册时间
2018-4-6
帖子
328
3
发表于 2019-8-17 21:48:49 | 只看该作者
本帖最后由 whitedewxiao 于 2019-8-17 21:54 编辑

这里有一个亲测可用的旧版。
  1. #******************************************************************************
  2. #
  3. #    * PNG 保存
  4. #
  5. #  --------------------------------------------------------------------------
  6. #    バージョン :  1.0.0
  7. #    対      応 :  RPGツクールVX Ace : RGSS3
  8. #    制  作  者 :  CACAO
  9. #    配  布  元 :  [url]http://cacaosoft.web.fc2.com/[/url]
  10. #  --------------------------------------------------------------------------
  11. #   == 概    要 ==
  12. #
  13. #    : ピングファイルの出力機能を追加します。
  14. #
  15. #  --------------------------------------------------------------------------
  16. #   == 使用方法 ==
  17. #
  18. #    ★ Bitmap#save_png(filename, alpha = false)
  19. #     このビットマップをピングファイルで出力
  20. #     filename : 保存するファイル名
  21. #     alpha    : αチャンネルの有無
  22. #
  23. #
  24. #******************************************************************************


  25. #/////////////////////////////////////////////////////////////////////////////#
  26. #                                                                             #
  27. #                  このスクリプトに設定項目はありません。                     #
  28. #                                                                             #
  29. #/////////////////////////////////////////////////////////////////////////////#


  30. class Bitmap
  31.   #--------------------------------------------------------------------------
  32.   # ● ピング画像として保存
  33.   #     filename : ファイル名
  34.   #     alpha    : アルファチャンネルの有無
  35.   #--------------------------------------------------------------------------
  36.   def save_png(filename, alpha = false)
  37.     sgnt = "\x89PNG\r\n\x1a\n"
  38.     ihdr = _chunk('IHDR', [width,height,8,(alpha ? 6 : 2),0,0,0].pack('N2C5'))
  39.     data = []
  40.     height.times do |y|
  41.       data << 0
  42.       width.times do |x|
  43.         color = self.get_pixel(x, y)
  44.         data << color.red << color.green << color.blue
  45.         data << color.alpha if alpha
  46.       end
  47.     end
  48.     idat = _chunk('IDAT', Zlib::Deflate.deflate(data.pack('C*')))
  49.     iend = _chunk('IEND', "")
  50.     File.open(filename, 'wb') do |file|
  51.       file.write(sgnt)
  52.       file.write(ihdr)
  53.       file.write(idat)
  54.       file.write(iend)
  55.     end
  56.   end
  57. private
  58.   #--------------------------------------------------------------------------
  59.   # ● チャンクの作成
  60.   #     name : チャンク名
  61.   #     data : チャンクデータ
  62.   #--------------------------------------------------------------------------
  63.   def _chunk(name, data)
  64.     return [data.size, name, data, Zlib.crc32(name + data)].pack('NA4A*N')
  65.   end
  66. end


  67. #******************************************************************************
  68. #
  69. #    * マップ画像の保存
  70. #
  71. #  --------------------------------------------------------------------------
  72. #    バージョン :  1.0.0
  73. #    対      応 :  RPGツクールVX Ace : RGSS3
  74. #    制  作  者 :  CACAO
  75. #    配  布  元 :  [url]http://cacaosoft.web.fc2.com/[/url]
  76. #  --------------------------------------------------------------------------
  77. #   == 概    要 ==
  78. #
  79. #    : マップを1枚の画像にして保存します。
  80. #
  81. #  --------------------------------------------------------------------------
  82. #   == 注意事項 ==
  83. #
  84. #    ※ 画像保存に『PNG 保存』スクリプトが必要になります。
  85. #    ※ ゲーム配布時には、削除してください。
  86. #    ※ 撮影時にプレイヤーは非表示になります。
  87. #
  88. #  --------------------------------------------------------------------------
  89. #   == 使用方法 ==
  90. #
  91. #    ★ マップ画像を保存する
  92. #     マップ画面で F7 キーを押してください。
  93. #     右下まで移動すると停止しますが、画像を保存しています。
  94. #     画面が元に戻るまで、しばらくお持ちください。
  95. #     画像は、ゲームフォルダに保存されます。
  96. #
  97. #    ※ キーを変更するには、:F7 で検索してください。
  98. #       1箇所のみ引っかかるので、そこを変更してください。
  99. #
  100. #
  101. #******************************************************************************


  102. #/////////////////////////////////////////////////////////////////////////////#
  103. #                                                                             #
  104. #                下記のスクリプトを変更する必要はありません。                 #
  105. #                                                                             #
  106. #/////////////////////////////////////////////////////////////////////////////#


  107. class Sprite_Character < Sprite_Base
  108.   #--------------------------------------------------------------------------
  109.   # ● フレーム更新
  110.   #--------------------------------------------------------------------------
  111.   def update_snap
  112.     self.x = @character.screen_x
  113.     self.y = @character.screen_y
  114.     self.z = @character.screen_z
  115.     self.visible = [email protected]

  116.     if @balloon_duration > 0
  117.       @balloon_sprite.x = x
  118.       @balloon_sprite.y = y - height
  119.       @balloon_sprite.z = z + 200
  120.     end
  121.   end
  122. end

  123. class Spriteset_Map
  124.   #--------------------------------------------------------------------------
  125.   # ●
  126.   #--------------------------------------------------------------------------
  127.   def update_snap
  128.     @tilemap.ox = $game_map.display_x * 32
  129.     @tilemap.oy = $game_map.display_y * 32

  130.     @parallax.ox = $game_map.parallax_ox(@parallax.bitmap)
  131.     @parallax.oy = $game_map.parallax_oy(@parallax.bitmap)

  132.     @character_sprites.each {|sprite| sprite.update_snap }

  133.     airship = $game_map.airship
  134.     @shadow_sprite.x = airship.screen_x
  135.     @shadow_sprite.y = airship.screen_y + airship.altitude
  136.     @shadow_sprite.opacity = airship.altitude * 8

  137.     Graphics.update
  138.   end
  139. end

  140. class Scene_Map < Scene_Base
  141.   #--------------------------------------------------------------------------
  142.   # ● フレーム更新
  143.   #--------------------------------------------------------------------------
  144.   alias _cao_mapshot_update update
  145.   def update
  146.     _cao_mapshot_update
  147.     map_shop if Input.press?(:F7)
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ●
  151.   #--------------------------------------------------------------------------
  152.   def map_shop
  153.     # プレイヤーを非表示
  154.     last_player_transparent = $game_player.transparent
  155.     $game_player.transparent = true
  156.     # マップの撮影
  157.     bitmap = Bitmap.new($game_map.width * 32, $game_map.height * 32)
  158.     screen_width = $game_map.screen_tile_x
  159.     screen_height = $game_map.screen_tile_y
  160.     ($game_map.width / screen_width.to_f).ceil.times do |x|
  161.       ($game_map.height / screen_height.to_f).ceil.times do |y|
  162.         $game_map.set_display_pos(screen_width * x, screen_height * y)
  163.         @spriteset.update_snap
  164.         dx = $game_map.display_x * 32
  165.         dy = $game_map.display_y * 32
  166.         snap = Graphics.snap_to_bitmap
  167.         bitmap.blt(dx, dy, snap, snap.rect)
  168.       end
  169.     end
  170.     # マップ画像の保存
  171.     Graphics.update
  172.     filename = sprintf('ground%03d-1.png', $game_map.map_id,$game_map.display_name)
  173.     bitmap.save_png(filename)
  174.     puts "`#{filename}' 保存完了!"
  175.     # プレイヤーの状態を戻す
  176.     $game_player.transparent = last_player_transparent
  177.     $game_player.center($game_player.x, $game_player.y)
  178.     $game_player.update
  179.   end
  180. end

复制代码

点评

你那个的版本好像更新,但是好长啊,我也不知道问题出在哪里,你不如换成我用的这个。 这个是没有前置脚本需求的。按F7就好。  发表于 2019-8-17 21:51

评分

参与人数 1星屑 +50 收起 理由
VIPArcher + 50 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
1
星屑
14790
在线时间
2106 小时
注册时间
2017-9-28
帖子
662
4
发表于 2019-8-17 22:32:49 | 只看该作者
换个脚本?


  1. =begin
  2. #===============================================================================
  3. Title: 地图截图
  4. Author: Hime
  5. Date: Sep 25, 2015
  6. --------------------------------------------------------------------------------
  7. ** Change log
  8. Sep 25, 2015
  9.    - fixed placement issue with large sprites
  10. Dec 7, 2014
  11.    - added option to draw certain events
  12. Apr 15, 2013
  13.    - updated script to use GDI+ interface
  14.    - added support for region map overlay and passage map overlay
  15. Apr 6, 2013
  16.    - fixed bug where drawing events crashed the game
  17. Apr 2, 2013
  18.    - map data is now setup by an instance of Game_Map, to account for custom
  19.      map scripts adding to the map
  20. Jul 27
  21.    - Export dirNames are now optional
  22. May 28
  23.    - updated overlay mapping compatibility to draw the overlays
  24.      based on the player's current position
  25.    - fixed issue where import hash was commented out
  26.    - Added support for Yami's overlay mapping
  27. May 24, 2012
  28.    - fixed large characters
  29.    - some optimizations for calculating bounds and dimensions
  30. May 5, 2012
  31.    - fixed waterfall autotile
  32.    - added screenshot feature
  33. May 4, 2012
  34.    - fixed tiles with alpha channel
  35.    - fixed shadows
  36.    - fixed wall autotiles
  37. May 1, 2012
  38.    - fixed wall autotile, although there is still an issue with some tiles
  39. Apr 29, 2012
  40.    - fixed shadow map drawing
  41.    - added region highlighting
  42.    - added damage tile highlighting
  43. Apr 28, 2012
  44.    - Initial Release
  45. ------------------------------------------------------------------------------
  46. ** 介绍

  47. 允许你为游戏中的任何一张地图截取全图像,一张全地图的图像称为"mapshot" (而不是
  48. screenshot).

  49. 本脚本还可以设定地图截图中显示的元素,例如是否显示事件、载具、区域ID或特定的
  50. 图块.

  51. ------------------------------------------------------------------------------
  52. ** 使用方法

  53. 默认地图截图键是 F7. 可以在下面的设定部分里修改.

  54. 为地图截图的方法,首先需要启动游戏,然后按下F7.
  55. 一个文本会显示并告诉你截图成功.图像会保存在游戏目录下的"Mapshots"或"Screenshots"
  56. 文件夹内(默认)。

  57. 此外,你也可以使用脚本来给地图截图.

  58.     Map_Saver.new(地图_id).export
  59.    
  60. 除了输出截图图像,你还可以在游戏里使用已经保存了的地图截图.

  61.    ms = Map_Saver.new(地图_id)
  62.    bmp = ms.map_image
  63.    
  64. 以上方法可以引用一个包含地图截图的位图对象.
  65. --------------------------------------------------------------------------------
  66.   ** Credits

  67.   Cremno
  68.     -GDI+ interface code
  69.   Cidiomar
  70.     -for drawing autotiles and shadows,
  71.     -providing efficient bmp and png exporters
  72.   Moon
  73.     -auto-tile related info
  74.   Mephistox
  75.     -testing and suggestions
  76. ================================================================================
  77. =end
  78. $imported = {} if $imported.nil?
  79. $imported["TH_MapSaver"] = true
  80. #===============================================================================
  81. # ** 设定
  82. #===============================================================================
  83. module TH
  84.   module Map_Saver
  85.    

  86.     Mapshot_Button = Input::F7  # 地图截图键
  87.     Mapshot_Scale = 1           # 缩放比率
  88.    
  89.     Screenshot_Button = Input::F8  # 画面截图键
  90.     Screenshot_Scale = 1           # 缩放比率
  91.    
  92.     Mapshot_Directory = "Mapshots"        # 地图截图文件夹的名称
  93.     Screenshot_Directory = "Screenshots"  # 画面截图文件夹的名称
  94.    
  95.     # 导出的图片格式. 最好只用 png.
  96.     # 可选: [bmp, png]
  97.     Export_Format = "png"
  98.    
  99.     Draw_Events = true   # 是否在截图里显示事件
  100.     Draw_Player = false    # 是否在截图里显示玩家
  101.     Draw_Followers = false # 是否在截图里显示队友
  102.     Draw_Vehicles = false  # 是否在截图里显示载具
  103.    
  104.     #是否显示影子? 影子的颜色?
  105.     Draw_Shadow = false
  106.     Shadow_Color = Color.new(0, 0, 0, 128)
  107.    
  108.     # 是否显示区域? 需要脚本 "Region Overlay Map"
  109.     Draw_Regions = false
  110.    
  111.     # 是否显示地图图块的通行度? 需要脚本 "Passage Overlay Map"
  112.     Draw_Passages = false
  113.    
  114.     #带地形伤害的图块是否高亮显示? 用什么颜色?
  115.     Highlight_Damage = false
  116.     Damage_Color = Color.new(128, 0, 0, 128)
  117.   end
  118. end

  119. #==============================================================================
  120. # ** Module: Map_Tiles
  121. # Contains data and methods useful for working with maps and tiles
  122. #==============================================================================

  123. module Map_Tiles
  124.   AUTOTILE_PARTS = [[18,17,14,13], [ 2,14,17,18], [13, 3,17,18], [ 2, 3,17,18],
  125.                     [13,14,17, 7], [ 2,14,17, 7], [13, 3,17, 7], [ 2, 3,17, 7],
  126.                     [13,14, 6,18], [ 2,14, 6,18], [13, 3, 6,18], [ 2, 3, 6,18],
  127.                     [13,14, 6, 7], [ 2,14, 6, 7], [13, 3, 6, 7], [ 2, 3, 6, 7],
  128.                     [16,17,12,13], [16, 3,12,13], [16,17,12, 7], [12, 3,16, 7],
  129.                     [10, 9,14,13], [10, 9,14, 7], [10, 9, 6,13], [10, 9, 6, 7],
  130.                     [18,19,14,15], [18,19, 6,15], [ 2,19,14,15], [ 2,19, 6,15],
  131.                     [18,17,22,21], [ 2,17,22,21], [18, 3,22,21], [ 2, 3,21,22],
  132.                     [16,19,12,15], [10, 9,22,21], [ 8, 9,12,13], [ 8, 9,12, 7],
  133.                     [10,11,14,15], [10,11, 6,15], [18,19,22,23], [ 2,19,22,23],
  134.                     [16,17,20,21], [16, 3,20,21], [ 8,11,12,15], [ 8, 9,20,21],
  135.                     [16,19,20,23], [10,11,22,23], [ 8,11,20,23], [ 0, 1, 4, 5]]
  136.   WATERFALL_PIECES = [[ 2, 1, 6, 5], [ 0, 1, 4, 5], [ 2, 3, 6, 7], [0, 3, 4, 7]]
  137.   WALL_PIECES =  [[10, 9, 6, 5], [ 8, 9, 4, 5], [ 2, 1, 6, 5], [ 0, 1, 4, 5],
  138.                   [10,11, 6, 7], [ 8,11, 4, 7], [ 2, 3, 6, 7], [ 0, 3, 4, 7],
  139.                   [10, 9,14,13], [ 8, 9,12,13], [ 2, 1,14,13], [ 0, 1,12,13],
  140.                   [10,11,14,15], [8, 11,12,15], [ 2, 3,14,15], [ 0, 3,12,15]]

  141.   A1_TILES = [[0, 0], [0, 96], [192, 0], [192, 96],
  142.                [256, 0], [448, 0], [256, 96], [448, 96],
  143.                [0, 192], [192, 192], [0, 288], [192, 288],
  144.                [256, 192], [448, 192], [256, 288], [448, 288]]
  145.    
  146.   
  147.   #--------------------------------------------------------------------------
  148.   # * Checks if a tile is a wall
  149.   #--------------------------------------------------------------------------
  150.   def is_wall?(data)
  151.     return true if data.between?(2288, 2335)
  152.     return true if data.between?(2384, 2431)
  153.     return true if data.between?(2480, 2527)
  154.     return true if data.between?(2576, 2623)
  155.     return true if data.between?(2672, 2719)
  156.     return true if data.between?(2768, 2815)
  157.     return true if data.between?(4736, 5119)
  158.     return true if data.between?(5504, 5887)
  159.     return true if data.between?(6272, 6655)
  160.     return true if data.between?(7040, 7423)
  161.     return true if data > 7807
  162.     false
  163.   end
  164.   #--------------------------------------------------------------------------
  165.   # * Checks if a tile is roof
  166.   #--------------------------------------------------------------------------
  167.   def is_roof?(data)
  168.     return true if data.between?(4352, 4735)
  169.     return true if data.between?(5120, 5503)
  170.     return true if data.between?(5888, 6271)
  171.     return true if data.between?(6656, 7039)
  172.     return true if data.between?(7424, 7807)
  173.     false
  174.   end  
  175.   #--------------------------------------------------------------------------
  176.   # * Checks if a tile is soil
  177.   #--------------------------------------------------------------------------
  178.   def is_soil?(data)
  179.     return true if data.between?(2816, 4351) && !is_table?(data)
  180.     return true if data > 1663 && !is_stair?(data)
  181.     false
  182.   end   
  183.   #--------------------------------------------------------------------------
  184.   # * Checks if a tile is a stair
  185.   #--------------------------------------------------------------------------
  186.   def is_stair?(data)
  187.      return true if data.between?(1541, 1542)
  188.      return true if data.between?(1549, 1550)
  189.      return true if data.between?(1600, 1615)
  190.      false
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # * Checks if a tile is a table
  194.   #--------------------------------------------------------------------------
  195.   def is_table?(data)
  196.     return true if data.between?(3152, 3199)
  197.     return true if data.between?(3536, 3583)
  198.     return true if data.between?(3920, 3967)
  199.     return true if data.between?(4304, 4351)
  200.     false
  201.   end

  202.   #--------------------------------------------------------------------------
  203.   # * The tileset to be used
  204.   #--------------------------------------------------------------------------
  205.   def tileset
  206.     $data_tilesets[@tileset_id]
  207.   end
  208.   
  209.   #--------------------------------------------------------------------------
  210.   # * Region ID
  211.   #--------------------------------------------------------------------------
  212.   def region_id(x, y)
  213.     valid?(x, y) ? @map.data[x, y, 3] >> 8 : 0
  214.   end
  215.   
  216.   #--------------------------------------------------------------------------
  217.   # * Gets all of the tiles for each layer at position x,y
  218.   #--------------------------------------------------------------------------
  219.   def layered_tiles(x, y)
  220.     [2, 1, 0].collect {|z| @map.data[x, y, z] }
  221.   end
  222.   
  223.   def layered_tiles_flag?(x, y, bit)
  224.     layered_tiles(x, y).any? {|tile_id| tileset.flags[tile_id] & bit != 0 }
  225.   end
  226.    
  227.   def valid?(x, y)
  228.     x >= 0 && x < width && y >= 0 && y < height
  229.   end
  230.   
  231.   def damage_floor?(x, y)
  232.     valid?(x, y) && layered_tiles_flag?(x, y, 0x100)
  233.   end
  234.   
  235.   #--------------------------------------------------------------------------
  236.   # * Specifies which type of autotile is used
  237.   #--------------------------------------------------------------------------
  238.   def auto_tile(id)
  239.     id / 48
  240.   end
  241.   
  242.   #--------------------------------------------------------------------------
  243.   # * Specifies the specific arrangement of autotiles used
  244.   #--------------------------------------------------------------------------
  245.   def auto_index(id)
  246.     id % 48
  247.   end
  248.   
  249.   #--------------------------------------------------------------------------
  250.   # * Put the auto-tile pieces together
  251.   #--------------------------------------------------------------------------
  252.   def make_autotile(rects, sx, sy)
  253.     @tile.clear
  254.     for i in 0...4
  255.       @auto_rect.x = (rects[i] % 4) * 16 + sx
  256.       @auto_rect.y = (rects[i] / 4) * 16 + sy
  257.       @tile.blt((i % 2) * 16,(i / 2) * 16, @tilemap, @auto_rect)
  258.     end
  259.   end
  260.      
  261.   #--------------------------------------------------------------------------
  262.   # * Get auto-tile A1 tiles
  263.   #--------------------------------------------------------------------------
  264.   def autotile_A1(tile_id)
  265.     @tilemap = @bitmaps[0]
  266.     autotile = tile_id / 48
  267.     auto_id = tile_id % 48
  268.     sx, sy = A1_TILES[autotile]
  269.     if is_wall?(tile_id + 2048)
  270.       rects = WATERFALL_PIECES[auto_id]
  271.     else  
  272.       rects = AUTOTILE_PARTS[auto_id]
  273.     end
  274.     make_autotile(rects, sx, sy)
  275.   end
  276.   
  277.   #--------------------------------------------------------------------------
  278.   # * Get auto-tile A2 tiles.
  279.   # 64x96 tiles, 8 per row, 4 rows
  280.   #--------------------------------------------------------------------------
  281.   def autotile_A2(tile_id)
  282.     autotile = tile_id / 48
  283.     auto_id = tile_id % 48
  284.     @tilemap = @bitmaps[1]
  285.     sx = (autotile % 8) * 64
  286.     sy = (autotile / 8 % 4) * 96
  287.     rects = AUTOTILE_PARTS[auto_id]
  288.     make_autotile(rects, sx, sy)
  289.   end
  290.   
  291.   #--------------------------------------------------------------------------
  292.   # * Get auto-tile A3 tiles.
  293.   # 64x64 tiles, 8 per row, 4 rows
  294.   #--------------------------------------------------------------------------
  295.   def autotile_A3(tid)
  296.     @tilemap = @bitmaps[2]
  297.     sx = (auto_tile(tid) % 8) * 64
  298.     sy = (auto_tile(tid) / 8 % 4) * 64
  299.     rects = WALL_PIECES[auto_index(tid)]
  300.     make_autotile(rects, sx, sy)
  301.   end
  302.   
  303.   #--------------------------------------------------------------------------
  304.   # * Get auto-tile A4 tiles (walls)
  305.   #--------------------------------------------------------------------------
  306.   def autotile_A4(tile_id)
  307.     @tilemap = @bitmaps[3]
  308.     autotile = tile_id / 48
  309.     auto_id = tile_id % 48
  310.     sx = (autotile % 8) * 64
  311.     sy = (autotile / 16 * 160) + (autotile / 8 % 2) * 96
  312.     if is_wall?(tile_id + 5888)
  313.       rects = WALL_PIECES[auto_id]
  314.     else
  315.       rects = AUTOTILE_PARTS[auto_id]
  316.     end
  317.     make_autotile(rects, sx, sy)
  318.   end
  319.   
  320.   #--------------------------------------------------------------------------
  321.   # * Get auto-tile A5 tiles (normal)
  322.   #--------------------------------------------------------------------------
  323.   def autotile_A5(tile_id)
  324.     @tilemap = @bitmaps[4]
  325.     sx = (tile_id) % 8 * tilesize
  326.     sy = (tile_id) / 8 * tilesize
  327.     @src_rect.set(sx, sy, tilesize, tilesize)
  328.     @tile.clear
  329.     @tile.blt(0, 0, @tilemap, @src_rect)
  330.   end
  331.   
  332.   #--------------------------------------------------------------------------
  333.   # * Get normal tiles B, C, D, E
  334.   #--------------------------------------------------------------------------
  335.   def normal_tile(tile_id)
  336.     @tilemap = @bitmaps[5 + tile_id / 256]
  337.     sx = (tile_id / 128 % 2 * 8 + tile_id % 8) * tilesize;
  338.     sy = (tile_id % 256 / 8 % 16) * tilesize;
  339.     @src_rect.set(sx, sy, tilesize, tilesize)
  340.     @tile.clear
  341.     @tile.blt(0, 0, @tilemap, @src_rect)
  342.   end
  343.    
  344.   #--------------------------------------------------------------------------
  345.   # * Get bitmap for the specified tile id
  346.   #--------------------------------------------------------------------------
  347.   def get_bitmap(id)
  348.     if id < 1024
  349.       normal_tile(id)
  350.     elsif id < 1664
  351.       autotile_A5(id - 1536)
  352.     elsif id < 2816
  353.       autotile_A1(id - 2048)
  354.     elsif id < 4352
  355.       autotile_A2(id - 2816)
  356.     elsif id < 5888
  357.       autotile_A3(id - 4352)
  358.     else
  359.       autotile_A4(id - 5888)
  360.     end
  361.   end
  362. end

  363. #==============================================================================
  364. # **
  365. #==============================================================================

  366. class Game_Player < Game_Character
  367.   
  368.   alias :th_mapsaver_update :update
  369.   def update
  370.     th_mapsaver_update
  371.     if Input.trigger?(TH::Map_Saver::Mapshot_Button)
  372.       s = Map_Saver.new($game_map.map_id)
  373.       s.set_scale(TH::Map_Saver::Mapshot_Scale)
  374.       s.mapshot
  375.     end
  376.     if Input.trigger?(TH::Map_Saver::Screenshot_Button)
  377.       s = Map_Saver.new($game_map.map_id)
  378.       s.set_scale(TH::Map_Saver::Screenshot_Scale)
  379.       s.screenshot
  380.     end
  381.   end
  382. end

  383. class Game_Vehicle < Game_Character
  384.   attr_reader :map_id
  385. end

  386. class Game_Map
  387.   attr_reader :map
  388. end

  389. #==============================================================================
  390. # **
  391. #==============================================================================

  392. class Map_Saver
  393.   include TH::Map_Saver
  394.   include Map_Tiles
  395.   #--------------------------------------------------------------------------
  396.   # * Constants
  397.   #--------------------------------------------------------------------------

  398.   SHADOW_COLOR = TH::Map_Saver::Shadow_Color
  399.   DAMAGE_COLOR = TH::Map_Saver::Damage_Color

  400.   #--------------------------------------------------------------------------
  401.   # * Public instance variables
  402.   #--------------------------------------------------------------------------
  403.   attr_reader :map_image
  404.   
  405.   def initialize(map_id=$game_map.map_id, x=$game_player.x, y=$game_player.y)
  406.     @scale = 1
  407.     @local_x = x
  408.     @local_y = y
  409.     @screen_local = false
  410.     @shadow_bitmap = Bitmap.new(128, 128)
  411.     @draw_layer0 = true
  412.     @draw_layer1 = true
  413.     @draw_layer2 = true
  414.     @draw_events = Draw_Events
  415.     @draw_vehicles = Draw_Vehicles
  416.     @draw_player = Draw_Player
  417.     @draw_followers = Draw_Followers
  418.     @draw_shadow = Draw_Shadow
  419.     @draw_damage = Highlight_Damage
  420.     @draw_regions = Draw_Regions
  421.     @draw_passages = Draw_Passages
  422.     @tile = Bitmap.new(32, 32) #stores the current tile to be drawn
  423.     @tilemap = nil
  424.     @src_rect = Rect.new
  425.     @auto_rect = Rect.new(0, 0, tilesize / 2, tilesize/ 2) #constant
  426.     @tile_rect = Rect.new(0, 0, tilesize, tilesize)        #constant
  427.   end
  428.   
  429.   def load_tilesets
  430.     bitmaps = []
  431.     tileset.tileset_names.each_with_index do |name, i|
  432.       bitmaps[i] = Cache.tileset(name)
  433.     end
  434.     return bitmaps
  435.   end
  436.   
  437.   #--------------------------------------------------------------------------
  438.   # * Refresh, possibly with a new map
  439.   #--------------------------------------------------------------------------
  440.   def redraw(map_id=$game_map.map_id, x=$game_player.x, y=$game_player.y)
  441.     @map_image.dispose if @map_image
  442.     @map_id = map_id
  443.     @local_x = x
  444.     @local_y = y
  445.     @game_map = Game_Map.new
  446.     @game_map.setup(map_id)
  447.     @map = @game_map.map
  448.     @map_info = $data_mapinfos[map_id]
  449.     @screen = $game_map.screen
  450.     @tileset_id = @game_map.tileset.id
  451.     @bitmaps = load_tilesets
  452.    
  453.     get_bounds
  454.     @map_image = Bitmap.new(@width * tilesize, @height * tilesize)
  455.     draw_map
  456.     scale_map if @scale != 1
  457.   end
  458.   
  459.   #--------------------------------------------------------------------------
  460.   # * Pre-process. These will never change when drawing the map.
  461.   #--------------------------------------------------------------------------
  462.   def get_bounds
  463.     @start_x = start_x
  464.     @start_y = start_y
  465.     @end_x = end_x
  466.     @end_y = end_y
  467.     @width = width
  468.     @height = height
  469.     @tilesize = tilesize
  470.   end
  471.   
  472.   def screen_tile_x
  473.     Graphics.width / 32
  474.   end
  475.   
  476.   def screen_tile_y
  477.     Graphics.height / 32
  478.   end
  479.   
  480.   #--------------------------------------------------------------------------
  481.   # * Sets the scale for the map
  482.   #--------------------------------------------------------------------------
  483.   def set_scale(scale)
  484.     @scale = scale
  485.   end
  486.   
  487.   #--------------------------------------------------------------------------
  488.   # * Size of a tile
  489.   #--------------------------------------------------------------------------
  490.   def tilesize
  491.     32
  492.   end
  493.   
  494.   #--------------------------------------------------------------------------
  495.   # * Width and height of the map, both locally and globally
  496.   #--------------------------------------------------------------------------
  497.   def width
  498.     end_x - @start_x
  499.   end
  500.   
  501.   def height
  502.     end_y - @start_y
  503.   end
  504.   
  505.   #--------------------------------------------------------------------------
  506.   # * Starting and end positions, relative to the screen or map
  507.   #--------------------------------------------------------------------------
  508.   def start_x
  509.     @screen_local ? [[$game_player.x - screen_tile_x / 2, @map.width - screen_tile_x].min, 0].max : 0
  510.   end

  511.   def start_y
  512.     @screen_local ? [[$game_player.y - screen_tile_y / 2, @map.height - screen_tile_y].min, 0].max : 0
  513.   end
  514.   
  515.   def end_x
  516.     @screen_local ? [[screen_tile_x, @local_x + screen_tile_x / 2 + 1].max, @map.width].min : @map.width
  517.   end
  518.   
  519.   def end_y
  520.     @screen_local ? [[screen_tile_y, @local_y + screen_tile_y / 2 + 1].max, @map.height].min : @map.height
  521.   end

  522.   #--------------------------------------------------------------------------
  523.   # * Draw tile onto image. x and y values are absolute coords. They should
  524.   # be re-mapped based on the start_x and start_y values
  525.   #--------------------------------------------------------------------------
  526.   def draw_tile(x, y, tile, rect)
  527.     ox = (x - @start_x) * tilesize
  528.     oy = (y - @start_y) * tilesize
  529.     @map_image.blt(ox, oy, tile, rect)
  530.   end
  531.   
  532.   def draw_character(x, y, width, height, bmp, rect)
  533.     ox = (x - @start_x) * tilesize
  534.     oy = (y - @start_y) * tilesize
  535.    
  536.     ox = ox - width / 4 if width > 32
  537.     oy = oy - height / 2 if height > 32
  538.     @map_image.blt(ox, oy, bmp, rect)
  539.   end
  540.   
  541.   #--------------------------------------------------------------------------
  542.   # * Get bitmap for the specified character
  543.   #--------------------------------------------------------------------------
  544.   def get_character_bitmap(name)
  545.     charmap = Cache.character(name)
  546.     sign = name[/^[\!\$]./]
  547.     if sign && sign.include?(')
  548.       cw = charmap.width / 3
  549.       ch = charmap.height / 4
  550.     else
  551.       cw = charmap.width / 12
  552.       ch = charmap.height / 8
  553.     end
  554.     return charmap, cw, ch
  555.   end
  556.   
  557.   #--------------------------------------------------------------------------
  558.   # * Draw the character onto the tile
  559.   #--------------------------------------------------------------------------
  560.   def set_character_bitmap(character, x, y)
  561.     charmap, cw, ch = get_character_bitmap(character.character_name)
  562.     index = character.character_index
  563.     pattern = character.pattern < 3 ? character.pattern : 1
  564.     sx = (index % 4 * 3 + pattern) * cw
  565.     sy = (index / 4 * 4 + (character.direction - 2) / 2) * ch
  566.     @src_rect.set(sx, sy, cw, ch)
  567.     draw_character(x, y, cw, ch, charmap, @src_rect)
  568.   end
  569.   
  570.   #--------------------------------------------------------------------------
  571.   # * create the shadow map
  572.   #--------------------------------------------------------------------------
  573.   def make_shadow_map
  574.     for s in 0 ... 16
  575.       x = s % 4
  576.       y = s / 4
  577.       if s & 0b1000 == 0b1000
  578.         @shadow_bitmap.fill_rect(x*tilesize+16, y*@tilesize+16, 16, 16, SHADOW_COLOR)
  579.       end
  580.       if s & 0b0100 == 0b0100
  581.         @shadow_bitmap.fill_rect(x*tilesize, y*@tilesize+16, 16, 16, SHADOW_COLOR)
  582.       end
  583.       if s & 0b0010 == 0b0010
  584.         @shadow_bitmap.fill_rect(x*tilesize+16, y*@tilesize, 16, 16, SHADOW_COLOR)
  585.       end
  586.       if s & 0b0001 == 0b0001
  587.         @shadow_bitmap.fill_rect(x*tilesize, y*@tilesize, 16, 16, SHADOW_COLOR)
  588.       end
  589.     end
  590.   end
  591.   
  592.   def draw_parallax
  593.     image = Cache.parallax(@map.parallax_name)
  594.     @src_rect.set(0, 0, image.width, image.height)
  595.     @map_image.blt(0, 0, image, @src_rect)
  596.   end
  597.   
  598.   #--------------------------------------------------------------------------
  599.   # * Draw the shadow map
  600.   #--------------------------------------------------------------------------
  601.   def draw_shadow_map
  602.     for x in @start_x ... @end_x
  603.       for y in @start_y ... @end_y
  604.       _x, _y = x*@tilesize, y*@tilesize
  605.         s = @map.data[x, y, 3]  & 0b1111
  606.         if s != 0
  607.           x_ = (s % 4) * @tilesize
  608.           y_ = (s / 4) * @tilesize
  609.           @src_rect.set(x_, y_, @tilesize, @tilesize)
  610.           draw_tile(x, y, @shadow_bitmap, @src_rect)
  611.         end
  612.       end
  613.     end
  614.   end
  615.   
  616.   #--------------------------------------------------------------------------
  617.   # * Draw the specified layer
  618.   #--------------------------------------------------------------------------
  619.   def draw_layer(layer)
  620.     for x in @start_x ... @end_x
  621.       for y in @start_y ... @end_y
  622.         _x, _y = x*@tilesize, y*@tilesize
  623.         tile_id = @map.data[x, y, layer]
  624.         next if tile_id == 0
  625.         get_bitmap(tile_id)
  626.         draw_tile(x, y, @tile, @tile_rect)
  627.       end
  628.     end
  629.   end
  630.   
  631.   #-----------------------------------------------------------------------------
  632.   # Draw game regions
  633.   #-----------------------------------------------------------------------------
  634.   def draw_regions
  635.     if $imported["TH_RegionOverlay"]
  636.       image = SceneManager.scene.instance_variable_get(:@spriteset).instance_variable_get(:@region_map).bitmap
  637.       @src_rect.set(@start_x * tilesize, @start_y * tilesize, image.width, image.height)
  638.       @map_image.blt(0, 0, image, @src_rect, 255)
  639.     end
  640.   end
  641.   
  642.   def draw_passages
  643.     if $imported["TH_OverlayPassageMap"]
  644.       image = SceneManager.scene.instance_variable_get(:@spriteset).instance_variable_get(:@passage_map).bitmap
  645.       @src_rect.set(@start_x * tilesize, @start_y * tilesize, image.width, image.height)
  646.       @map_image.blt(0, 0, image, @src_rect, 255)
  647.     end
  648.   end

  649.   #--------------------------------------------------------------------------
  650.   # * Draw the game player
  651.   #--------------------------------------------------------------------------
  652.   def draw_player
  653.     set_character_bitmap($game_player, $game_player.x, $game_player.y) if @map_id == $game_map.map_id
  654.   end
  655.   
  656.   def draw_followers
  657.   end
  658.   
  659.   #--------------------------------------------------------------------------
  660.   # * Draw map events
  661.   #--------------------------------------------------------------------------
  662.   def draw_events
  663.     @map.events.values.each do |event|
  664.       canDraw = event.pages[0].list.any? do |cmd|
  665.         cmd.code == 108 && cmd.parameters[0] =~ /<screenshot:\s*tile\s*>/i
  666.       end
  667.       next unless @draw_events || canDraw
  668.       id = event.pages[0].graphic.tile_id
  669.       char_name = event.pages[0].graphic.character_name
  670.       if id > 0
  671.         normal_tile(id)
  672.         draw_tile(event.x, event.y, @tilemap, @src_rect)
  673.       elsif char_name != ""
  674.         set_character_bitmap(event.pages[0].graphic, event.x, event.y)
  675.       end
  676.     end
  677.   end
  678.   
  679.   #--------------------------------------------------------------------------
  680.   # * Draw map vehicles
  681.   #--------------------------------------------------------------------------
  682.   def draw_vehicles
  683.     $game_map.vehicles.each do |vehicle|
  684.       set_character_bitmap(vehicle, vehicle.x, vehicle.y) if @map_id == vehicle.map_id
  685.     end
  686.   end
  687.   
  688.   #--------------------------------------------------------------------------
  689.   # * Draw map sprites
  690.   #--------------------------------------------------------------------------
  691.   def draw_sprites
  692.     draw_events
  693.     draw_vehicles if @draw_vehicles
  694.     draw_player if @draw_player
  695.     draw_followers if @draw_followers
  696.   end
  697.   
  698.   #--------------------------------------------------------------------------
  699.   # * Highlight damage tiles
  700.   #--------------------------------------------------------------------------
  701.   def draw_damage
  702.     @tile.clear
  703.     @tile.fill_rect(0, 0, @tilesize, @tilesize, DAMAGE_COLOR)
  704.     @src_rect.set(0, 0, @tilesize, @tilesize)
  705.     for x in @start_x ... @end_x
  706.       for y in @start_y ... @end_y
  707.         _x, _y = x*@tilesize, y*@tilesize
  708.         if damage_floor?(x, y)
  709.           draw_tile(x, y, @tile, @src_rect)
  710.         end
  711.       end
  712.     end
  713.   end
  714.   
  715.   def draw_screen_effects
  716.   end
  717.   #--------------------------------------------------------------------------
  718.   # * Draw the map
  719.   #--------------------------------------------------------------------------
  720.   def draw_map
  721.     make_shadow_map if @draw_shadow
  722.     draw_parallax
  723.     draw_layer(0)
  724.     draw_layer(1)
  725.     draw_shadow_map
  726.     draw_layer(2)
  727.     draw_damage if @draw_damage
  728.     draw_regions if @draw_regions
  729.     draw_passages if @draw_passages
  730.     draw_sprites
  731.     draw_screen_effects
  732.   end
  733.   
  734.   #--------------------------------------------------------------------------
  735.   # * Scale the map
  736.   #--------------------------------------------------------------------------
  737.   def scale_map
  738.     nw = @width * @scale
  739.     nh = @height * @scale
  740.     @src_rect.set(0, 0, @width, @height)
  741.     scaled_map = Bitmap.new(nw, nh)
  742.     scaled_rect = Rect.new(0, 0, nw, nh)
  743.     scaled_map.stretch_blt(scaled_rect, @map_image, @src_rect)
  744.     @map_image = scaled_map
  745.   end
  746.   
  747.   #--------------------------------------------------------------------------
  748.   # * Take a mapshot of the map
  749.   #--------------------------------------------------------------------------
  750.   def mapshot
  751.     @screen_local = false
  752.     redraw
  753.     export(TH::Map_Saver::Mapshot_Directory)
  754.     $game_message.add("截图成功")
  755.   end
  756.    
  757.   #--------------------------------------------------------------------------
  758.   # * Take a screenshot of the map
  759.   #--------------------------------------------------------------------------
  760.   def screenshot
  761.     @screen_local = true
  762.     redraw
  763.     export(TH::Map_Saver::Screenshot_Directory)
  764.     $game_message.add("截图成功")
  765.   end
  766.   
  767.   #--------------------------------------------------------------------------
  768.   # * Get the format to export to
  769.   #--------------------------------------------------------------------------
  770.   def get_format
  771.     TH::Map_Saver::Export_Format
  772.   end
  773.   
  774.   #--------------------------------------------------------------------------
  775.   # * Export the map to a file
  776.   #--------------------------------------------------------------------------
  777.   def export(dirName="")
  778.     format = get_format
  779.     #name = @map.display_name != "" ? @map.display_name : @map_info.name
  780.     name = sprintf("Map%03d" %[@map_id])
  781.     Dir.mkdir(dirName) unless File.directory?(dirName)
  782.     name =
  783.     filename = "%s\\%s.%s" %[dirName, name, format]
  784.     t1 = Time.now
  785.     @map_image.save(filename)
  786.     t2 = Time.now
  787.     $game_message.add("截图已导出,用时: %f 秒" %[t2 - t1])
  788.   end
  789. end

  790. class Bitmap

  791.   def save(filename, options = {})
  792.     options.merge!(format: File.extname(filename)[1..-1].to_sym)
  793.     retval = false
  794.     #bitmap = Gdiplus::Bitmap.new(:hbitmap, hbitmap)
  795.     #bitmap = Gdiplus::Bitmap.new(:gdidib, *gdidib)
  796.     # this seems to be the fastest one (RGSS 3.0.1, Windows 8 64-bit)
  797.     bitmap = Gdiplus::Bitmap.new(:scan0, width, height, scan0)
  798.     if bitmap
  799.       retval = bitmap.save(:file, filename, options[:format])
  800.       bitmap.dispose
  801.     end
  802.     retval
  803.   end

  804. private

  805.   def _data_struct(offset = 0)
  806.     @_data_struct ||= (DL::CPtr.new((object_id << 1) + 16).ptr + 8).ptr
  807.     (@_data_struct + offset).ptr.to_i
  808.   end

  809.   def gdidib
  810.      [_data_struct(8), _data_struct(16)]
  811.   end

  812.   def hbitmap
  813.     _data_struct(44)
  814.   end

  815.   def scan0
  816.     _data_struct(12)
  817.   end

  818. end

  819. # ★ GDI+ interface
  820. # ★★★★★★★★★★★★
  821. #
  822. # Author : Cremno
  823. #

  824. module Gdiplus
  825.   DLL = 'gdiplus.dll'

  826.   def self.get_function name, import, export = 'L'
  827.     Win32API.new DLL, name, import, export
  828.   end

  829.   FUNCTIONS = {
  830.     GdiplusStartup: get_function('GdiplusStartup', 'PPP'),
  831.     GdiplusShutdown: get_function('GdiplusShutdown', 'P', 'V'),
  832.     GdipDisposeImage: get_function('GdipDisposeImage', 'P'),
  833.     GdipSaveImageToFile: get_function('GdipSaveImageToFile', 'PPPP'),
  834.     GdipCreateBitmapFromGdiDib: get_function('GdipCreateBitmapFromGdiDib', 'LLP'),
  835.     GdipCreateBitmapFromHBITMAP: get_function('GdipCreateBitmapFromHBITMAP', 'LLP'),
  836.     GdipCreateBitmapFromScan0: get_function('GdipCreateBitmapFromScan0', 'LLLLPP')
  837.   }

  838.   @@token = [0].pack('I')
  839.   def self.token
  840.     @@token
  841.   end

  842.   @@clsids = {}
  843.   def self.clsids
  844.     @@clsids
  845.   end

  846.   def self.gen_clsids
  847.     return unless @@clsids.empty?
  848.     func = Win32API.new('rpcrt4.dll', 'UuidFromString', 'PP', 'L')
  849.     {
  850.       bmp:  '557cf400-1a04-11d3-9a73-0000f81ef32e',
  851.       jpeg: '557cf401-1a04-11d3-9a73-0000f81ef32e',
  852.       gif:  '557cf402-1a04-11d3-9a73-0000f81ef32e',
  853.       tiff: '557cf405-1a04-11d3-9a73-0000f81ef32e',
  854.       png:  '557cf406-1a04-11d3-9a73-0000f81ef32e'
  855.     }.each_pair do |k, v|
  856.       clsid = [0].pack('I')
  857.       func.call(v, clsid)
  858.       @@clsids[k] = clsid
  859.     end
  860.     @@clsids[:jpg] = @@clsids[:jpeg]
  861.     @@clsids[:tif] = @@clsids[:tiff]
  862.   end

  863.   # TODO: prepend prefix (Gdip or Gdiplus) automatically
  864.   def self.call(*args)
  865.     name = args.shift
  866.     func = FUNCTIONS[name]
  867.     v = func.call(*args)
  868.     if v && v != 0
  869.       msgbox "GDI+ error: #{v}\n\nFunction: #{name}\nArguments: #{args.inspect}"
  870.       false
  871.     else
  872.       true
  873.     end
  874.   end

  875.   def self.startup
  876.     call :GdiplusStartup, @@token, [1, 0, 0, 0].pack('L4'), 0
  877.   end

  878.   def self.shutdown
  879.     call :GdiplusShutdown, @@token
  880.   end

  881.   class Image

  882.     attr_reader :instance
  883.     def initialize
  884.       @instance = 0
  885.       true
  886.     end

  887.     def save(destination, *args)
  888.       case destination
  889.       when :file
  890.         filename = args.shift << "\0"
  891.         filename.encode!('UTF-16LE')
  892.         argv = [:GdipSaveImageToFile, filename, Gdiplus.clsids[args.shift], 0]
  893.       else
  894.         raise ArgumentError, "unknown GDI+ image destination: #{source}"
  895.       end
  896.       argv.insert(1, @instance)
  897.       Gdiplus.call *argv
  898.     end

  899.     def dispose
  900.       Gdiplus.call :GdipDisposeImage, @instance
  901.     end
  902.   end

  903.   class Bitmap < Image

  904.     def initialize source, *args
  905.       case source
  906.       when :gdidib
  907.         argv = [:GdipCreateBitmapFromGdiDib, args.shift, args.shift]
  908.       when :hbitmap
  909.         argv = [:GdipCreateBitmapFromHBITMAP, args.shift, 0]
  910.       when :scan0
  911.         w = args.shift
  912.         h = args.shift
  913.         argv = [:GdipCreateBitmapFromScan0, w, h, w * -4, 0x26200a, args.shift]
  914.       else
  915.         raise ArgumentError, "unknown GDI+ bitmap source: #{source}"
  916.       end
  917.       argv.push([0].pack('I'))
  918.       retval = Gdiplus.call *argv
  919.       @instance = retval ? argv.last.unpack('I').first : 0
  920.       retval
  921.     end
  922.   end
  923. end

  924. if Gdiplus.startup
  925.   Gdiplus.gen_clsids
  926.   class << SceneManager
  927.     alias_method :run_wo_gdip_shutdown, :run
  928.     def run
  929.       run_wo_gdip_shutdown
  930.       Gdiplus.shutdown
  931.     end
  932.   end
  933. end

  934. #==============================================================================
  935. # * Compatibility add-ons
  936. #==============================================================================
  937. #Yami overlays
  938. if $imported["YSE-OverlayMapping"]
  939.   class Map_Saver
  940.     def draw_overlay_map_ground
  941.       filename = YSA::OVERLAY::GROUND
  942.       filename += $game_map.map_id.to_s
  943.       filename += "-" + $game_variables[YSA::OVERLAY::GROUND_VARIABLE].to_s
  944.       p filename
  945.       image = Cache.overlay(filename)
  946.       @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)
  947.       @map_image.blt(0, 0, image, @src_rect)
  948.     end
  949.    
  950.     def draw_overlay_map_parallax
  951.       filename = YSA::OVERLAY::PARALLAX
  952.       filename += $game_map.map_id.to_s
  953.       filename += "-" + $game_variables[YSA::OVERLAY::PARALLAX_VARIABLE].to_s
  954.       image = Cache.overlay(filename)
  955.       @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)
  956.       @map_image.blt(0, 0, image, @src_rect)
  957.     end
  958.    
  959.     def draw_overlay_map_light
  960.       filename = YSA::OVERLAY::LIGHT
  961.       filename += $game_map.map_id.to_s
  962.       filename += "-" + $game_variables[YSA::OVERLAY::LIGHT_VARIABLE].to_s
  963.       image = Cache.overlay(filename)
  964.       @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)
  965.       @map_image.blt(0, 0, image, @src_rect, 10)
  966.     end
  967.    
  968.     def draw_overlay_map_shadow
  969.       filename = YSA::OVERLAY::SHADOW
  970.       filename += $game_map.map_id.to_s
  971.       filename += "-" + $game_variables[YSA::OVERLAY::SHADOW_VARIABLE].to_s
  972.       image = Cache.overlay(filename)
  973.       @src_rect.set(@start_x*tilesize, @start_y*tilesize, image.width, image.height)
  974.       @map_image.blt(0, 0, image, @src_rect, 10)
  975.     end
  976.   
  977.     alias :th_map_overlay_draw_map :draw_map
  978.     def draw_map
  979.       th_map_overlay_draw_map
  980.       draw_overlay_map_ground if $game_switches[YSA::OVERLAY::GROUND_SWITCH]
  981.       draw_overlay_map_parallax if $game_switches[YSA::OVERLAY::PARALLAX_SWITCH]
  982.       draw_overlay_map_shadow if $game_switches[YSA::OVERLAY::SHADOW_SWITCH]
  983.       draw_overlay_map_light if $game_switches[YSA::OVERLAY::LIGHT_SWITCH]
  984.     end
  985.   end
  986. end

  987. if $imported["TH_AreaOverlay"]
  988.   class Map_Saver
  989.     def draw_overlay_area_map
  990.       image = SceneManager.scene.instance_variable_get(:@spriteset).instance_variable_get(:@area_map).bitmap
  991.       @src_rect.set(@start_x * tilesize, @start_y * tilesize, image.width, image.height)
  992.       @map_image.blt(0, 0, image, @src_rect, 255)
  993.     end
  994.    
  995.     alias :th_area_overlay_draw_map :draw_map
  996.     def draw_map
  997.       th_area_overlay_draw_map
  998.       draw_overlay_area_map
  999.     end
  1000.   end
  1001. end
复制代码

点评

谢谢大佬!  发表于 2019-8-17 23:10

评分

参与人数 1星屑 +50 收起 理由
VIPArcher + 50 塞糖

查看全部评分

VA外站脚本汉化群:226308173   |    部分远古文件备份:https://wwzv.lanzoue.com/b02rac5pc  密码:acgm
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
693
在线时间
102 小时
注册时间
2019-8-15
帖子
34
5
 楼主| 发表于 2019-8-17 22:45:59 | 只看该作者
whitedewxiao 发表于 2019-8-17 21:48
这里有一个亲测可用的旧版。

感谢!用这个脚本解决了!

点评

是cacao。总是打错人家名字——怪不好意思的......  发表于 2019-8-19 22:00
大佬不敢当。我也是搜论坛里搜来的,caocao才是真大佬。  发表于 2019-8-19 21:59
谢谢大佬提供的脚本呀  发表于 2019-8-18 21:10
解决了就好。  发表于 2019-8-18 18:13
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-16 19:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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