Advertisement
MundoBezier

TilesetEditor v2

Aug 19th, 2022
907
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 9.89 KB | None | 0 0
  1. #===============================================================================
  2. # Edits the terrain tags of tiles in tilesets.
  3. #===============================================================================
  4. # [ Actualizado por Bezier ]
  5. # Cambios:
  6. #   Autotag:    Pulsar A para cambiar el valor del tag que será aplicado con la
  7. #               tecla C sin tener que asignar el valor cada vez
  8. #   Selección:  Pulsar S para seleccionar un área y aplicar el autotag
  9. #===============================================================================
  10. begin
  11.  
  12. def pbTilesetWrapper
  13.   return PokemonDataWrapper.new(
  14.      "Data/Tilesets.rxdata",
  15.      "Data/TilesetsTemp.rxdata",
  16.      Proc.new{
  17.         Kernel.pbMessage(_INTL("El editor ha detectado que los datos del tileset fueron editados recientemente en RPG Maker XP."))
  18.         next !Kernel.pbConfirmMessage(_INTL("¿Quieres cargar estos cambios recientes?"))
  19.      }
  20.   )
  21. end
  22.  
  23.  
  24.  
  25. class PokemonTilesetScene
  26.  
  27.   # Obtiene las coordenadas y dimensión de la selección actual
  28.   def getSelectionValues
  29.     return [@x,@y,@x,@y,1,1] if @selection.size==0
  30.     x0=[@selection[0][0],@selection[1][0]].min
  31.     y0=[@selection[0][1],@selection[1][1]].min
  32.     x1=[@selection[0][0],@selection[1][0]].max
  33.     y1=[@selection[0][1],@selection[1][1]].max
  34.     w=x1-x0+28
  35.     h=y1-y0+28
  36.     return [x0,y0,x1,y1,w,h]
  37.   end
  38.  
  39.   def pbUpdateTileset
  40.     @sprites["overlay"].bitmap.clear
  41.     textpos=[]
  42.     @sprites["tileset"].src_rect=Rect.new(0,@topy,256,Graphics.height)
  43.     tilesize=@tileset.terrain_tags.xsize
  44.     for yy in 0...(Graphics.height)/32
  45.       ypos=(yy+(@topy/32))*8+384
  46.       next if ypos>=tilesize
  47.       for xx in 0...8
  48.         terr=ypos<384 ? @tileset.terrain_tags[xx*48] : @tileset.terrain_tags[ypos+xx]
  49.         if ypos<384
  50.           @tilehelper.bltTile(@sprites["overlay"].bitmap,xx*32,yy*32,xx*48)
  51.         end
  52.         textpos.push(["#{terr}",xx*32+16,yy*32,2,Color.new(80,80,80),Color.new(192,192,192)])
  53.       end
  54.     end
  55.     # Pinta la selección en vez de la celda actual [@x,@y]
  56.     if @selectionMode && @selection.size>0
  57.       x0,y0,x1,y1,w,h=getSelectionValues
  58.       @sprites["overlay"].bitmap.fill_rect(x0,y0-@topy,w,4,Color.new(255,0,0))
  59.       @sprites["overlay"].bitmap.fill_rect(x0,y0-@topy,4,h,Color.new(255,0,0))
  60.       @sprites["overlay"].bitmap.fill_rect(x0,y1-@topy+28,w,4,Color.new(255,0,0))
  61.       @sprites["overlay"].bitmap.fill_rect(x1+28,y0-@topy,4,h,Color.new(255,0,0))
  62.     else
  63.       @sprites["overlay"].bitmap.fill_rect(@x,@y-@topy,32,4,Color.new(255,0,0))
  64.       @sprites["overlay"].bitmap.fill_rect(@x,@y-@topy,4,32,Color.new(255,0,0))
  65.       @sprites["overlay"].bitmap.fill_rect(@x,@y-@topy+28,32,4,Color.new(255,0,0))
  66.       @sprites["overlay"].bitmap.fill_rect(@x+28,@y-@topy,4,32,Color.new(255,0,0))
  67.     end
  68.     pbDrawTextPositions(@sprites["overlay"].bitmap,textpos)
  69.   end
  70.  
  71.   def pbGetSelected(x,y)
  72.     if y<0
  73.       return 48*(x/32)
  74.     else
  75.       return (y/32)*8+384+(x/32)
  76.     end
  77.   end
  78.  
  79.   def pbSetSelected(i,value)
  80.     if i<384
  81.       for j in 0...48
  82.         @tileset.terrain_tags[i+j]=value
  83.       end
  84.     else
  85.       @tileset.terrain_tags[i]=value
  86.     end
  87.   end
  88.  
  89.   def pbChooseTileset
  90.     commands=[]
  91.     for i in 1...@tilesetwrapper.data.length
  92.       commands.push(sprintf("%03d %s",i,@tilesetwrapper.data[i].name))
  93.     end
  94.     ret=Kernel.pbShowCommands(nil,commands,-1)
  95.     if ret>=0
  96.       @tileset=@tilesetwrapper.data[ret+1]
  97.       @tilehelper.dispose
  98.       @tilehelper=TileDrawingHelper.fromTileset(@tileset)
  99.       @sprites["tileset"].setBitmap("Graphics/Tilesets/#{@tileset.tileset_name}")
  100.       @x=0
  101.       @y=-32
  102.       @topy=-32
  103.       pbUpdateTileset
  104.     end
  105.   end
  106.  
  107.   # Actualiza el sprite que muestra el menú
  108.   def updateMenu
  109.     txt=getTittleText
  110.     @sprites["title"].text=txt
  111.     @sprites["title"].resizeToFit(txt)
  112.     @sprites["title"].width=Graphics.width-256
  113.   end
  114.  
  115.   # Texto del menú dependiendo del estado actual del editor de Tileset
  116.   def getTittleText
  117.     txt = "Tileset Editor\nQ/W: Desplaza\n    Z: Menú\n    A: Autotag [ " + @autotag.to_s + " ]\n    S: Selección"
  118.     if @selectionMode
  119.       txt += " [ON]"
  120.       txt += "\n    C: [ " + @autotag.to_s + " ] -> selección"
  121.     end
  122.     return txt
  123.   end
  124.  
  125.   # Actualiza el rectángulo de selección con las coordenadas actuales
  126.   def setSelectionRect
  127.     if @selection.size==0
  128.       @selection[0]=[@x,@y]
  129.     end
  130.     @selection[1]=[@x,@y]
  131.   end
  132.  
  133.   # Se ha cambiado un poco el interfaz para mostrar el nuevo menú a la derecha,
  134.   # el tileset ajustado arriba a la izquierda y gestionar los nuevos inputs
  135.   def pbStartScene
  136.     @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  137.     @viewport.z=99999
  138.     @tilesetwrapper=pbTilesetWrapper
  139.     @tileset=@tilesetwrapper.data[1]
  140.     @tilehelper=TileDrawingHelper.fromTileset(@tileset)
  141.     @sprites={}
  142.     @autotag=0
  143.     @selectionMode=false
  144.     @selection=[]
  145.     @sprites["title"]=Window_UnformattedTextPokemon.new(getTittleText)
  146.     @sprites["title"].viewport=@viewport
  147.     @sprites["title"].x=260
  148.     @sprites["title"].y=0
  149.     @sprites["title"].width=Graphics.width-256
  150.     @sprites["tileset"]=IconSprite.new(0,0,@viewport)
  151.     @sprites["tileset"].setBitmap("Graphics/Tilesets/#{@tileset.tileset_name}")
  152.     @sprites["tileset"].src_rect=Rect.new(0,0,256,Graphics.height)
  153.     @sprites["overlay"]=BitmapSprite.new(256,Graphics.height,@viewport)
  154.     @sprites["overlay"].x=0
  155.     @sprites["overlay"].y=0
  156.     pbSetSystemFont(@sprites["overlay"].bitmap)
  157.     @sprites["title"].visible=true
  158.     @sprites["tileset"].visible=true
  159.     @sprites["overlay"].visible=true
  160.     @x=0
  161.     @y=-32
  162.     @topy=-32
  163.     pbUpdateTileset
  164.     pbFadeInAndShow(@sprites)
  165.     height=@sprites["tileset"].bitmap.height
  166.     ########
  167.     loop do
  168.       Graphics.update
  169.       Input.update
  170.       if Input.repeat?(Input::UP)
  171.         @y-=32
  172.         @y=-32 if @y<-32
  173.         @topy=@y if @y<@topy
  174.         setSelectionRect if @selectionMode
  175.         pbUpdateTileset
  176.       elsif Input.repeat?(Input::DOWN)
  177.         @y+=32
  178.         @y=@sprites["tileset"].bitmap.height-32 if @y>=@sprites["tileset"].bitmap.height-32
  179.         @topy=@y-(Graphics.height)+32 if @y-@topy>=Graphics.height
  180.         setSelectionRect if @selectionMode
  181.         pbUpdateTileset
  182.       elsif Input.repeat?(Input::LEFT)
  183.         @x-=32
  184.         @x=0 if @x<0
  185.         setSelectionRect if @selectionMode
  186.         pbUpdateTileset
  187.       elsif Input.repeat?(Input::RIGHT)
  188.         @x+=32
  189.         @x=256-32 if @x>=256-32
  190.         setSelectionRect if @selectionMode
  191.         pbUpdateTileset
  192.       elsif Input.repeat?(Input::L)
  193.         @y-=((Graphics.height)/32)*32
  194.         @topy-=((Graphics.height)/32)*32
  195.         @y=-32 if @y<-32
  196.         @topy=@y if @y<@topy
  197.         @topy=-32 if @topy<-32
  198.         setSelectionRect if @selectionMode
  199.         pbUpdateTileset
  200.       elsif Input.repeat?(Input::R)
  201.         @y+=((Graphics.height)/32)*32
  202.         @topy+=((Graphics.height)/32)*32
  203.         @y=@sprites["tileset"].bitmap.height-32 if @y>=@sprites["tileset"].bitmap.height-32
  204.         @topy=@y-(Graphics.height)+32 if @y-@topy>=Graphics.height
  205.         @topy=@sprites["tileset"].bitmap.height-(Graphics.height) if @topy>=@sprites["tileset"].bitmap.height-(Graphics.height)
  206.         setSelectionRect if @selectionMode
  207.         pbUpdateTileset
  208.  
  209.       elsif Input.trigger?(Input::X) # Autotag
  210.         params=ChooseNumberParams.new
  211.         params.setRange(0,99)
  212.         @autotag=Kernel.pbMessageChooseNumber(_INTL("Cambiar autotag."),params)
  213.         updateMenu
  214.  
  215.       elsif Input.trigger?(Input::Y) # Selección
  216.         if @selectionMode
  217.           @selectionMode=false
  218.           @selection=[]
  219.         else
  220.           @selectionMode=true
  221.           setSelectionRect
  222.         end
  223.         updateMenu
  224.         pbUpdateTileset
  225.  
  226.       elsif Input.trigger?(Input::A)
  227.         commands=[
  228.            _INTL("Ir abajo"),
  229.            _INTL("Ir arriba"),
  230.            _INTL("Cambiar tileset"),
  231.            _INTL("Salir")
  232.         ]
  233.         ret=Kernel.pbShowCommands(nil,commands,-1)
  234.         case ret
  235.         when 0
  236.           @y=@sprites["tileset"].bitmap.height-32
  237.           @topy=@y-(Graphics.height)+32 if @y-@topy>=Graphics.height
  238.           pbUpdateTileset
  239.         when 1
  240.           @y=-32
  241.           @topy=@y if @y<@topy
  242.           pbUpdateTileset
  243.         when 2
  244.           pbChooseTileset
  245.         end
  246.       elsif Input.trigger?(Input::B)
  247.         if Kernel.pbConfirmMessage(_INTL("¿Guardar los cambios?"))
  248.           @tilesetwrapper.save
  249.           $data_tilesets=@tilesetwrapper.data
  250.           if $game_map && $MapFactory
  251.             $MapFactory.setup($game_map.map_id)
  252.             $game_player.center($game_player.x,$game_player.y)
  253.             if $scene.is_a?(Scene_Map)
  254.               $scene.disposeSpritesets
  255.               $scene.createSpritesets
  256.             end
  257.           end
  258.           Kernel.pbMessage(_INTL("Para asegurar que los cambios se mantengan, cierre y vuelva a abrir RPG Maker XP."))
  259.         end
  260.         break if Kernel.pbConfirmMessage(_INTL("¿Salir del editor?"))
  261.       elsif Input.trigger?(Input::C)
  262.         if @selectionMode
  263.           x0,y0,x1,y1,w,h=getSelectionValues
  264.           for ix in x0..x1
  265.             for iy in y0..y1
  266.               selected=pbGetSelected(ix,iy)
  267.               pbSetSelected(selected,@autotag)    
  268.             end
  269.           end
  270.           @selectionMode=false
  271.           @selection=[]
  272.           updateMenu
  273.           pbUpdateTileset
  274.         else
  275.           selected=pbGetSelected(@x,@y)
  276.           pbSetSelected(selected,@autotag)
  277.           pbUpdateTileset
  278.         end
  279.       end
  280.     end
  281.     ########
  282.     pbFadeOutAndHide(@sprites)
  283.     pbDisposeSpriteHash(@sprites)
  284.     @viewport.dispose
  285.     @tilehelper.dispose
  286.   end
  287. end
  288.  
  289.  
  290.  
  291. def pbTilesetScreen
  292.   pbFadeOutIn(99999){
  293.      scene=PokemonTilesetScene.new
  294.      scene.pbStartScene
  295.   }
  296. end
  297.  
  298.  
  299.  
  300. rescue Exception
  301.   if $!.is_a?(SystemExit) || "#{$!.class}"=="Reset"
  302.     raise $!
  303.   end
  304. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement