Kid02

Exportador de klein oh si

Mar 12th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 18.46 KB | None | 0 0
  1. #===============================================================================
  2. # ■ Fast Map Exporter by KleinStudio V1.1
  3. # http://pokemonfangames.com
  4. #
  5. # ** Keys
  6. # Control + P * Save current map with events and player
  7. # Control + E * Save current map with events
  8. # Alt + M * Save current map (only the map)
  9. #
  10. # ** Saving not current maps
  11. # *** While pressing control, type with the numbers keys a map id.
  12. # Control + Map id * Save selected map with events
  13. # Alt + Map id * Save selected map (only the map)
  14. #===============================================================================
  15. SAVED_MAP_SCALE = 0.5
  16. SAVE_REFLECTED_SPRITES = true
  17.  
  18. # The next settings are for the supported custom scripts, you can find them in
  19. # http://pokemonfangames.com
  20. SAVE_FOOTPRINTS = true
  21. SAVE_SHADOWS = true
  22. SAVE_WATERBUBBLES = true
  23.  
  24.  
  25. #===============================================================================
  26. # Zeus81's Bitmap Exporter
  27. # This will allow to save the bitmap
  28. #===============================================================================
  29. class Bitmap
  30. RtlMoveMemory = Win32API.new('kernel32', 'RtlMoveMemory', 'ppi', 'i')
  31. def last_row_address
  32. return 0 if disposed?
  33. RtlMoveMemory.call(buf=[0].pack('L'), __id__*2+16, 4)
  34. RtlMoveMemory.call(buf, buf.unpack('L')[0]+8 , 4)
  35. RtlMoveMemory.call(buf, buf.unpack('L')[0]+16, 4)
  36. buf.unpack('L')[0]
  37. end
  38. def bytesize
  39. width * height * 4
  40. end
  41. def get_data
  42. data = [].pack('x') * bytesize
  43. RtlMoveMemory.call(data, last_row_address, data.bytesize)
  44. data
  45. end
  46. def set_data(data)
  47. RtlMoveMemory.call(last_row_address, data, data.bytesize)
  48. end
  49. def get_data_ptr
  50. data = String.new
  51. RtlMoveMemory.call(data.__id__*2, [0x2007].pack('L'), 4)
  52. RtlMoveMemory.call(data.__id__*2+8, [bytesize,last_row_address].pack('L2'), 8)
  53. def data.free() RtlMoveMemory.call(__id__*2, String.new, 16) end
  54. return data unless block_given?
  55. yield data ensure data.free
  56. end
  57. def _dump(level)
  58. get_data_ptr do |data|
  59. dump = Marshal.dump([width, height, Zlib::Deflate.deflate(data, 9)])
  60. dump
  61. end
  62. end
  63. def self._load(dump)
  64. width, height, data = *Marshal.load(dump)
  65. data.replace(Zlib::Inflate.inflate(data))
  66. bitmap = new(width, height)
  67. bitmap.set_data(data)
  68. bitmap
  69. end
  70. def export(filename)
  71. export_png("#{filename}.png")
  72. end
  73. def export_png(filename)
  74. data, i = get_data, 0
  75. (0).step(data.bytesize-4, 4) do |i|
  76. data[i,3] = data[i,3].reverse!
  77. end
  78. deflate = Zlib::Deflate.new(9)
  79. null_char, w4 = [].pack('x'), width*4
  80. (data.bytesize-w4).step(0, -w4) {|i| deflate << null_char << data[i,w4]}
  81. data.replace(deflate.finish)
  82. deflate.close
  83. File.open(filename, 'wb') do |file|
  84. def file.write_chunk(chunk)
  85. write([chunk.bytesize-4].pack('N'))
  86. write(chunk)
  87. write([Zlib.crc32(chunk)].pack('N'))
  88. end
  89. file.write("\211PNG\r\n\32\n")
  90. file.write_chunk(['IHDR',width,height,8,6,0,0,0].pack('a4N2C5'))
  91. file.write_chunk(data.insert(0, 'IDAT'))
  92. file.write_chunk('IEND')
  93. end
  94. end
  95. end
  96.  
  97. class String
  98. alias getbyte []
  99. alias setbyte []=
  100. alias bytesize size
  101. end
  102.  
  103. class Font
  104. def marshal_dump() end
  105. def marshal_load(dump) end
  106. end
  107.  
  108. module Graphics
  109. FindWindow = Win32API.new('user32', 'FindWindow' , 'pp' , 'i')
  110. GetDC = Win32API.new('user32', 'GetDC' , 'i' , 'i')
  111. ReleaseDC = Win32API.new('user32', 'ReleaseDC' , 'ii' , 'i')
  112. BitBlt = Win32API.new('gdi32' , 'BitBlt' , 'iiiiiiiii', 'i')
  113. CreateCompatibleBitmap = Win32API.new('gdi32' , 'CreateCompatibleBitmap', 'iii' , 'i')
  114. CreateCompatibleDC = Win32API.new('gdi32' , 'CreateCompatibleDC' , 'i' , 'i')
  115. DeleteDC = Win32API.new('gdi32' , 'DeleteDC' , 'i' , 'i')
  116. DeleteObject = Win32API.new('gdi32' , 'DeleteObject' , 'i' , 'i')
  117. GetDIBits = Win32API.new('gdi32' , 'GetDIBits' , 'iiiiipi' , 'i')
  118. SelectObject = Win32API.new('gdi32' , 'SelectObject' , 'ii' , 'i')
  119. def self.snap_to_bitmap
  120. bitmap = Bitmap.new(width, height)
  121. info = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
  122. hDC = GetDC.call(hwnd)
  123. bmp_hDC = CreateCompatibleDC.call(hDC)
  124. bmp_hBM = CreateCompatibleBitmap.call(hDC, width, height)
  125. bmp_obj = SelectObject.call(bmp_hDC, bmp_hBM)
  126. BitBlt.call(bmp_hDC, 0, 0, width, height, hDC, 0, 0, 0xCC0020)
  127. GetDIBits.call(bmp_hDC, bmp_hBM, 0, height, bitmap.last_row_address, info, 0)
  128. SelectObject.call(bmp_hDC, bmp_obj)
  129. DeleteObject.call(bmp_hBM)
  130. DeleteDC.call(bmp_hDC)
  131. ReleaseDC.call(hwnd, hDC)
  132. bitmap
  133. end
  134.  
  135. class << self
  136. def hwnd() @hwnd ||= FindWindow.call('RGSS Player', nil) end
  137. def width() 640 end unless method_defined?(:width)
  138. def height() 480 end unless method_defined?(:height)
  139. def export(filename=Time.now.strftime("snapshot %Y-%m-%d %Hh%Mm%Ss #{frame_count}"))
  140. bitmap = snap_to_bitmap
  141. bitmap.export(filename)
  142. bitmap.dispose
  143. end
  144. alias save export
  145. alias snapshot export
  146. end
  147. end
  148.  
  149. #===============================================================================
  150. # Game_Map Edit
  151. #===============================================================================
  152.  
  153. class Game_Map
  154. def getMapIdSave
  155. @mapToSave="" if !@mapToSave
  156.  
  157. if Input.pressex?(0x11)
  158. @pressedForMap1 = true
  159. if Input.triggerex?(0x30)
  160. @mapToSave+="0"
  161. elsif Input.triggerex?(0x31)
  162. @mapToSave+="1"
  163. elsif Input.triggerex?(0x32)
  164. @mapToSave+="2"
  165. elsif Input.triggerex?(0x33)
  166. @mapToSave+="3"
  167. elsif Input.triggerex?(0x34)
  168. @mapToSave+="4"
  169. elsif Input.triggerex?(0x35)
  170. @mapToSave+="5"
  171. elsif Input.triggerex?(0x36)
  172. @mapToSave+="6"
  173. elsif Input.triggerex?(0x37)
  174. @mapToSave+="7"
  175. elsif Input.triggerex?(0x38)
  176. @mapToSave+="8"
  177. elsif Input.triggerex?(0x39)
  178. @mapToSave+="9"
  179. end
  180. elsif Input.pressex?(0x12)
  181. @pressedForMap2 = true
  182. if Input.triggerex?(0x30)
  183. @mapToSave+="0"
  184. elsif Input.triggerex?(0x31)
  185. @mapToSave+="1"
  186. elsif Input.triggerex?(0x32)
  187. @mapToSave+="2"
  188. elsif Input.triggerex?(0x33)
  189. @mapToSave+="3"
  190. elsif Input.triggerex?(0x34)
  191. @mapToSave+="4"
  192. elsif Input.triggerex?(0x35)
  193. @mapToSave+="5"
  194. elsif Input.triggerex?(0x36)
  195. @mapToSave+="6"
  196. elsif Input.triggerex?(0x37)
  197. @mapToSave+="7"
  198. elsif Input.triggerex?(0x38)
  199. @mapToSave+="8"
  200. elsif Input.triggerex?(0x39)
  201. @mapToSave+="9"
  202. end
  203. end
  204.  
  205. end
  206.  
  207. alias klein_savemap_miniupdate update
  208. def update
  209. klein_savemap_miniupdate
  210. if $DEBUG
  211. # Control + P - Save current map with events and player
  212. if Input.pressex?(0x11) && Input.triggerex?(0x50)
  213. pbSaveMapGraphic($game_map,true,true)
  214. # Control + E - Save current map with events
  215. elsif Input.pressex?(0x11) && Input.triggerex?(0x45)
  216. pbSaveMapGraphic($game_map,true)
  217. # Alt + M - Save current map
  218. elsif Input.pressex?(0x12) && Input.triggerex?(0x4D)
  219. pbSaveMapGraphic($game_map)
  220. end
  221.  
  222. getMapIdSave
  223.  
  224. if !Input.pressex?(0x11) && @pressedForMap1
  225. if pbRgssExists?(sprintf("Data/Map%03d.rxdata",@mapToSave.to_i))
  226. map=$MapFactory.getMapNoAdd(@mapToSave.to_i)
  227. pbSaveMapGraphic(map,true)
  228. end
  229. @mapToSave=""
  230. @pressedForMap1=false
  231. elsif !Input.pressex?(0x12) && @pressedForMap2
  232. if pbRgssExists?(sprintf("Data/Map%03d.rxdata",@mapToSave.to_i))
  233. map=$MapFactory.getMapNoAdd(@mapToSave.to_i)
  234. pbSaveMapGraphic(map)
  235. end
  236. @mapToSave=""
  237. @pressedForMap2=false
  238. end
  239.  
  240. end
  241. end
  242. end
  243.  
  244. #===============================================================================
  245. # Support for Klein's Footprints script
  246. #===============================================================================
  247. if defined?(Footsprite)
  248. class Spriteset_Map
  249. attr_accessor :footsprites
  250. end
  251.  
  252. class Footsprite
  253. def pbGetSaveMapData
  254. return false if @disposed
  255. return [@sprite,@event.x,@event.y]
  256. end
  257. end
  258. end
  259. #===============================================================================
  260. # Support for Klein's Water Bubbles script
  261. #===============================================================================
  262. if defined?(WaterAnim)
  263. class Spriteset_Map
  264. attr_accessor :waterSprites
  265. end
  266.  
  267. class WaterAnim
  268. def pbGetSaveMapData
  269. return false if @disposed or !isInWaterTileId
  270. return [@actualBitmap,@event.x,@event.y]
  271. end
  272.  
  273. def pbGetEvent
  274. return @event
  275. end
  276. end
  277. end
  278. #===============================================================================
  279. # Support for Klein's Overworld Shadows Script
  280. #===============================================================================
  281. if defined?(ShadowSprite)
  282. class Spriteset_Map
  283. attr_accessor :shadowSprites
  284. end
  285.  
  286. class ShadowSprite
  287. def pbGetSaveMapData
  288. return false if @disposed or !@sprite.visible
  289. return [@sprite.bitmap,@event.x,@event.y,@sprite.opacity]
  290. end
  291.  
  292. def pbGetEvent
  293. return @event
  294. end
  295. end
  296. end
  297.  
  298. #===============================================================================
  299. # Support for Reflected Sprites
  300. #===============================================================================
  301. if defined?(ReflectedSprite)
  302. class Spriteset_Map
  303. attr_accessor :reflectedSprites
  304. end
  305.  
  306. class ReflectedSprite
  307. def pbGetSaveMapData
  308. return false if @disposed or @sprite.nil? or !@sprite.visible
  309. return [@sprite,@event.x,@event.y,@sprite.opacity,@rsprite,@event.tile_id>=384,@event]
  310. end
  311.  
  312. def pbGetEvent
  313. return @event
  314. end
  315. end
  316. end
  317.  
  318. #===============================================================================
  319. # Function to create the bitmap
  320. #===============================================================================
  321.  
  322. def pbSaveMapGraphic(realmap,saveEvents=false, savePlayer=false)
  323. map = load_data(sprintf("Data/Map%03d.rxdata", realmap.map_id))
  324. bitmap=BitmapWrapper.new(map.width*32,map.height*32)
  325. tilesets=load_data("Data/Tilesets.rxdata")
  326. tileset=tilesets[map.tileset_id]
  327. priorities=tileset.priorities
  328.  
  329. helper=TileDrawingHelper.fromTileset(tileset)
  330. for y in 0...map.height
  331. for x in 0...map.width
  332. for z in 0..2
  333. id=map.data[x,y,z]
  334. id=0 if !id
  335. helper.bltTile(bitmap,x*32,y*32,id) if priorities[id]==0
  336. end
  337. end
  338. end
  339.  
  340. if defined?(Footsprite) && SAVE_FOOTPRINTS
  341. if realmap==$game_map
  342. if $scene.spriteset && $scene.spriteset.footsprites
  343. for sprite in $scene.spriteset.footsprites
  344. data=sprite.pbGetSaveMapData
  345. if data
  346. sp=data[0]
  347. bitmap.blt((data[1]+1)*32.0-sp.src_rect.width/2-16,(data[2]+1)*32-sp.bitmap.height,sp.bitmap,
  348. Rect.new(sp.src_rect.x,0,sp.src_rect.width,sp.src_rect.height),sp.opacity)
  349. end
  350. end
  351. end
  352. end
  353. end
  354.  
  355. characters=[]
  356. for event in realmap.events.values
  357. characters.push(event)
  358. end
  359.  
  360. characters.push($game_player) if savePlayer && realmap==$game_map
  361. characters.sort!{|a,b| a.y<=>b.y}
  362.  
  363. if defined?(ReflectedSprite) && saveEvents && SAVE_REFLECTED_SPRITES
  364. if realmap==$game_map
  365. if $scene.spriteset && $scene.spriteset.reflectedSprites
  366. for sprite in $scene.spriteset.reflectedSprites
  367. data=sprite.pbGetSaveMapData
  368.  
  369. if data
  370. next if data[6]==$game_player && !savePlayer
  371. sp=data[0]
  372. plus=sp.y-data[4].y
  373.  
  374. width = data[5] ? 32 : sp.bitmap.width / 4
  375. height = data[5] ? 32 : sp.bitmap.height / 4
  376.  
  377. rbitmap=makeReflectedBitmap(sp,data[5])
  378.  
  379. bitmap.blt((data[1]+1)*32.0-width/2-16,(data[2]+1)*32-height+plus+height/2,rbitmap,
  380. Rect.new(0,0,width,height),sp.opacity)
  381. end
  382. end
  383. end
  384. end
  385. end
  386.  
  387. if saveEvents
  388. for i in 0..characters.length
  389. if characters[i]
  390.  
  391. if defined?(ShadowSprite) && SAVE_SHADOWS
  392. if $scene.spriteset && $scene.spriteset.shadowSprites
  393. for e in 0...$scene.spriteset.shadowSprites.length
  394. actual=$scene.spriteset.shadowSprites[e]
  395. data=actual.pbGetSaveMapData if actual.pbGetEvent==characters[i]
  396. end
  397. if data
  398. sp=data[0]
  399. bitmap.blt((data[1]+1)*32.0-sp.width/2-16,(data[2]+1)*32-sp.height+4-2,sp,
  400. Rect.new(0,0,sp.width,sp.height),data[3])
  401. end
  402. end
  403. end
  404.  
  405. dollEvent=characters[i]
  406. if dollEvent.tile_id>=384 # It's a tile, not a Character
  407. dollBitmap=pbGetTileBitmap(dollEvent.map.tileset_name,
  408. dollEvent.tile_id,dollEvent.character_hue)
  409. width = 32
  410. height = 32
  411. sx = 0
  412. sy = 0
  413. else # Character
  414. dollBitmap=AnimatedBitmap.new("Graphics/Characters/"+dollEvent.character_name,
  415. dollEvent.character_hue)
  416. width = dollBitmap.width / 4
  417. height = dollBitmap.height / 4
  418. sx = dollEvent.pattern * width
  419. sy = (dollEvent.direction - 2) / 2 * height
  420. end
  421.  
  422. charBitmap=dollEvent.tile_id>=384 ? dollBitmap : dollBitmap.bitmap
  423.  
  424. if dollEvent.tile_id<384 && deepBushForSave?(dollEvent.x,dollEvent.y,tileset.passages,tileset.terrain_tags,realmap.data)
  425. bushBitmap=BushMapBitmap.new(dollBitmap,dollEvent.tile_id>=384,32)
  426. bitmap.blt((dollEvent.x+1)*32-width/2-16,(dollEvent.y+1)*32-height,bushBitmap.bitmap,Rect.new(sx,sy,width,height))
  427. elsif dollEvent.tile_id<384 && bushForSave?(dollEvent.x,dollEvent.y,tileset.passages,tileset.terrain_tags,realmap.data)
  428. bushBitmap=BushMapBitmap.new(dollBitmap,dollEvent.tile_id>=384,12)
  429. bitmap.blt((dollEvent.x+1)*32-width/2-16,(dollEvent.y+1)*32-height,bushBitmap.bitmap,Rect.new(sx,sy,width,height))
  430. else
  431. bitmap.blt((dollEvent.x+1)*32-width/2-16,(dollEvent.y+1)*32-height,charBitmap,Rect.new(sx,sy,width,height))
  432. end
  433.  
  434. if defined?(WaterAnim) && SAVE_WATERBUBBLES
  435. if realmap==$game_map
  436. if $scene.spriteset && $scene.spriteset.waterSprites
  437. for e in 0...$scene.spriteset.waterSprites.length
  438. actual=$scene.spriteset.waterSprites[e]
  439. if actual.respond_to?("pbGetEvent")
  440. dataw=actual.pbGetSaveMapData if actual.pbGetEvent==characters[i]
  441. end
  442. end
  443. if dataw
  444. sp=dataw[0]
  445. bitmap.blt((dataw[1]+1)*32.0-sp.width/2-16,(dataw[2]+1)*32-sp.height+4,sp,
  446. Rect.new(0,0,sp.width,sp.height))
  447. end
  448. end
  449. end
  450. end
  451. end
  452. end
  453. end
  454.  
  455. for y in 0...map.height
  456. for x in 0...map.width
  457. for z in 0..2
  458. id=map.data[x,y,z]
  459. id=0 if !id
  460. helper.bltTile(bitmap,x*32,y*32,id) if priorities!=nil && priorities[id]!=nil && priorities[id]>0
  461. end
  462. end
  463. end
  464.  
  465. unless FileTest.directory?("SavedMaps")
  466. Dir.mkdir("SavedMaps")
  467. end
  468.  
  469. scaleBitmap=BitmapWrapper.new(bitmap.width*SAVED_MAP_SCALE,bitmap.height*SAVED_MAP_SCALE)
  470. scaleBitmap.stretch_blt(Rect.new(0,0,bitmap.rect.width*SAVED_MAP_SCALE,bitmap.rect.height*SAVED_MAP_SCALE),bitmap,bitmap.rect)
  471.  
  472. fileName=sprintf("#{pbGetMapNameFromId(realmap.map_id)}")
  473. fileName+=" with events" if saveEvents
  474. fileName+=" and player" if savePlayer
  475. scaleBitmap.export(sprintf("SavedMaps/#{fileName}"))
  476. return scaleBitmap
  477. end
  478.  
  479. def bushForSave?(x, y, passages, terrains, data)
  480. for i in [2, 1, 0]
  481. tile_id = data[x, y, i]
  482. if tile_id == nil
  483. return false
  484. elsif terrains[tile_id]==PBTerrain::Bridge && $PokemonMap &&
  485. $PokemonMap.bridge>0
  486. return false
  487. elsif passages[tile_id] & 0x40 == 0x40
  488. return true
  489. end
  490. end
  491. return false
  492. end
  493.  
  494. def deepBushForSave?(x, y, passages, terrains, data)
  495. for i in [2, 1, 0]
  496. tile_id = data[x, y, i]
  497. if tile_id == nil
  498. return false
  499. elsif terrains[tile_id]==PBTerrain::Bridge && $PokemonMap &&
  500. $PokemonMap.bridge>0
  501. return false
  502. elsif passages[tile_id] & 0x40 == 0x40 &&
  503. terrains[tile_id]==PBTerrain::TallGrass
  504. return true
  505. end
  506. end
  507. return false
  508. end
  509.  
  510. class BushMapBitmap
  511. def initialize(bitmap,isTile,depth)
  512. @bitmaps=[]
  513. @bitmap=bitmap
  514. @isTile=isTile
  515. @isBitmap=@bitmap.is_a?(Bitmap)
  516. @depth=depth
  517. end
  518.  
  519. def dispose
  520. for b in @bitmaps
  521. b.dispose if b
  522. end
  523. end
  524.  
  525. def bitmap
  526. thisBitmap=@isBitmap ? @bitmap : @bitmap.bitmap
  527. current=@isBitmap ? 0 : @bitmap.currentIndex
  528. if !@bitmaps[current]
  529. if @isTile
  530. @bitmaps[current]=Sprite_Character.pbBushDepthTile(thisBitmap,@depth)
  531. else
  532. @bitmaps[current]=Sprite_Character.pbBushDepthBitmap(thisBitmap,@depth)
  533. end
  534. end
  535. return @bitmaps[current]
  536. end
  537. end
  538.  
  539. class BitmapData
  540. def initialize(x,y,color)
  541. @x=x
  542. @y=y
  543. @color=color
  544. end
  545. def x; return @x; end
  546. def y; return @y; end
  547. def color; return @color; end
  548. end
  549.  
  550. def makeReflectedBitmap(sprite,isTile)
  551. width = isTile ? 32 : sprite.bitmap.width / 4
  552. height = isTile ? 32 : sprite.bitmap.height / 4
  553.  
  554. bitmap=sprite.bitmap
  555. newBitmap=Bitmap.new(width,height)
  556. colorBitmap=Bitmap.new(width,height)
  557. bitmapdata=[]
  558.  
  559. for x in 0...width
  560. for y in 0...height
  561. color=bitmap.get_pixel(sprite.src_rect.x+x,sprite.src_rect.y+y)
  562. bitmapdata.push(BitmapData.new(x,height-y,color))
  563. end
  564. end
  565.  
  566. for data in bitmapdata
  567. x=data.x
  568. y=data.y
  569. c=data.color
  570. newBitmap.set_pixel(x,y,c)
  571. colorBitmap.set_pixel(x,y,Color.new(248,248,248)) if c.alpha!=0
  572. end
  573. newBitmap.blt(0,0,colorBitmap,Rect.new(0,0,colorBitmap.width,colorBitmap.height),96)
  574. return newBitmap
  575. end
Add Comment
Please, Sign In to add comment