Advertisement
MundoBezier

DebugEx

Aug 21st, 2022 (edited)
2,104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 18.01 KB | None | 0 0
  1. ################################################################################
  2. #                          DebugEx : Mejoras del DEBUG                         #
  3. #                                Autor : Bezier                                #
  4. #                                                                              #
  5. # Este script mejora algunas funciones del menú del DEBUG para agilizar su uso #
  6. ################################################################################
  7.  
  8. # Muestra los paneles necesarios para buscar en un listado de comandos
  9. # commands  = Lista de comandos que se muestran en el listado
  10. # lister    = Clase de tipo XXXLister que genera los comandos
  11. # viewport  = Viewport donde se muestra el listado
  12. # inputs    = Array con los inputs que se usan para la selección
  13. def showSearchWindow(commands,lister,viewport,inputs=nil)
  14.   # Sprite con el título
  15.   title=Window_UnformattedTextPokemon.new("Escribe el texto a buscar\n -> ENTER: Confirma\n -> ESC: Cancela")
  16.   title.x=0
  17.   title.y=Graphics.height-title.height-64
  18.   title.viewport=viewport
  19.   title.z=999
  20.   # Sprite para la entrada de texto por teclado
  21.   search_win=Window_TextEntry_Keyboard.new("",0,Graphics.height-64,250,64)
  22.   search_win.viewport=viewport
  23.   search_win.maxlength=50
  24.   search_win.z=999
  25.   # Bucle para la búsqueda de candidatos
  26.   candidates=[]
  27.   indexes=[]
  28.   selected=0
  29.   loop do
  30.     Graphics.update
  31.     Input.update
  32.     search_win.update
  33.     if Input.triggerex?(0x1B) # Escape
  34.       selected=-2
  35.       break
  36.     elsif Input.triggerex?(0x0D) # Enter
  37.       filter=search_win.text[0..-2].downcase
  38.       if filter!=""
  39.         for i in 0...commands.length
  40.           cmd=commands[i]
  41.           if cmd.is_a?(Array)
  42.             for item in cmd
  43.               if item.to_s.downcase.include?(filter)
  44.                 candidates << cmd
  45.                 indexes << i
  46.                 break
  47.               end
  48.             end
  49.           elsif cmd.to_s.downcase.include?(filter)
  50.             candidates << cmd
  51.             indexes << i
  52.           end
  53.         end
  54.       end
  55.       break
  56.     end
  57.   end
  58.   title.dispose
  59.   search_win.dispose
  60.   # Si hay candidatos, muestra un listado con los elementos filtrados
  61.   if candidates.length > 0
  62.     lister.refresh(indexes[0])
  63.     if candidates.length>0
  64.       list=pbListWindow([],256)
  65.       list.viewport=viewport
  66.       list.z=999
  67.       list.commands=candidates
  68.       list.index=0
  69.       loop do
  70.         Graphics.update
  71.         Input.update
  72.         list.update
  73.         if list.index!=selected
  74.           lister.refresh(indexes[list.index])
  75.           selected=list.index
  76.         end
  77.         if Input.trigger?(Input::C) ||
  78.            (list.doubleclick? rescue false) ||
  79.            (inputs && inputs.any? {|key| Input.trigger?(key) })
  80.           selected=indexes[selected]
  81.           break
  82.         elsif Input.trigger?(Input::B)
  83.           selected=-1
  84.           break
  85.         end
  86.       end
  87.       list.dispose
  88.     end
  89.   else
  90.     selected=-1
  91.   end
  92.   return selected
  93. end
  94.  
  95. ################################################################################
  96. # Lists (Debug)
  97. ################################################################################
  98.  
  99. # Redefine esta función para:
  100. # - Mostrar una lista con sprite en vez de la lista simple
  101. # - Usar las funciones de búsqueda
  102. def pbChooseSpeciesOrdered(default)
  103.   specie=pbListScreen(_INTL("AGREGAR POKÉMON"), PokemonLister.new(0))
  104.   specie=0 if specie<0
  105.   return specie
  106. end
  107.  
  108. ################################################################################
  109. # Core lister script (Editor)
  110. ################################################################################
  111.  
  112. # Amplia la función para incluir la opción de búsqueda
  113. def pbListScreen(title,lister)
  114.   viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  115.   viewport.z=99999
  116.   list=pbListWindow([],256)
  117.   list.viewport=viewport
  118.   list.z=2
  119.   # Añade el texto de búsqueda en el menú
  120.   title+="\n D: Buscar"
  121.   title=Window_UnformattedTextPokemon.new(title)
  122.   title.x=256
  123.   title.y=0
  124.   title.width=Graphics.width-256
  125.   title.viewport=viewport
  126.   title.z=2
  127.   lister.setViewport(viewport)
  128.   selected=-1
  129.   commands=lister.commands
  130.   selindex=lister.startIndex
  131.   if commands.length==0
  132.     value=lister.value(-1)
  133.     lister.dispose
  134.     return value
  135.   end
  136.   list.commands=commands
  137.   list.index=selindex
  138.   loop do
  139.     Graphics.update
  140.     Input.update
  141.     list.update
  142.     if list.index!=selected
  143.       lister.refresh(list.index)
  144.       selected=list.index
  145.     end
  146.     if Input.trigger?(Input::C) || (list.doubleclick? rescue false)
  147.       break
  148.     elsif Input.trigger?(Input::B)
  149.       selected=-1
  150.       break
  151.     elsif Input.trigger?(Input::Z) # D: Buscar
  152.       selected=showSearchWindow(commands,lister,viewport)
  153.       break if selected!=-1
  154.     end
  155.   end
  156.   value=lister.value(selected)
  157.   lister.dispose
  158.   title.dispose
  159.   list.dispose
  160.   Input.update
  161.   return value
  162. end
  163.  
  164. def pbListScreenBlock(title,lister)
  165.   viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  166.   viewport.z=99999
  167.   list=pbListWindow([],256)
  168.   list.viewport=viewport
  169.   list.z=2
  170.   # Añade el texto de búsqueda en el menú
  171.   title+="\n D: Buscar"
  172.   title=Window_UnformattedTextPokemon.new(title)
  173.   title.x=256
  174.   title.y=0
  175.   title.width=Graphics.width-256
  176.   title.viewport=viewport
  177.   title.z=2
  178.   lister.setViewport(viewport)
  179.   selected=-1
  180.   commands=lister.commands
  181.   selindex=lister.startIndex
  182.   if commands.length==0
  183.     value=lister.value(-1)
  184.     lister.dispose
  185.     return value
  186.   end
  187.   list.commands=commands
  188.   list.index=selindex
  189.   loop do
  190.     Graphics.update
  191.     Input.update
  192.     list.update
  193.     if list.index!=selected
  194.       lister.refresh(list.index)
  195.       selected=list.index
  196.     end
  197.     if Input.trigger?(Input::Z) # D: Buscar con inputs
  198.       selected=showSearchWindow(commands,lister,viewport,[Input::C,Input::A])
  199.     end
  200.     if Input.trigger?(Input::A)
  201.       yield(Input::A, lister.value(selected))
  202.       list.commands=lister.commands
  203.       if list.index==list.commands.length
  204.         list.index=list.commands.length
  205.       end
  206.       lister.refresh(list.index)
  207.     elsif Input.trigger?(Input::C) || (list.doubleclick? rescue false)
  208.       yield(Input::C, lister.value(selected))
  209.       list.commands=lister.commands
  210.       if list.index==list.commands.length
  211.         list.index=list.commands.length
  212.       end
  213.       lister.refresh(list.index)
  214.     elsif Input.trigger?(Input::B)
  215.       break
  216.     end
  217.   end
  218.   lister.dispose
  219.   title.dispose
  220.   list.dispose
  221.   Input.update
  222. end
  223.  
  224. ################################################################################
  225. # General listers (Editor)
  226. ################################################################################
  227.  
  228. # Lista los Pokémon ordenados alfabéticamente y los devuelve como comandos para selección
  229. class PokemonLister
  230.   def initialize(selection)
  231.     @sprite=PokemonSprite.new(@viewport)
  232.     @sprite.z=2
  233.     @selection=selection
  234.     @commands=[]
  235.     @species=[]
  236.     @index=0
  237.   end
  238.  
  239.   def setViewport(viewport)
  240.     @sprite.viewport=viewport
  241.   end
  242.  
  243.   def startIndex
  244.     return @index
  245.   end
  246.  
  247.   def value(index)
  248.     return (index<0) ? -1 : @species[index]
  249.   end
  250.  
  251.   def dispose
  252.     @sprite.bitmap.dispose if @sprite.bitmap
  253.     @sprite.dispose
  254.   end
  255.  
  256.   def commands   # Ordenados alfabéticamente
  257.     @commands.clear
  258.     cmds=[]
  259.     for i in 1..PBSpecies.maxValue
  260.       cname=getConstantName(PBSpecies,i) rescue nil
  261.       cmds.push([i,PBSpecies.getName(i)]) if cname
  262.     end
  263.     cmds.sort! {|a,b| a[1]<=>b[1]}
  264.     for c in cmds
  265.       @commands.push(_ISPRINTF("{1:03d}: {2:s}",c[0],c[1]))
  266.       @species.push(c[0])
  267.     end
  268.     @index=@selection
  269.     @index=@commands.length-1 if @index>=@commands.length
  270.     @index=0 if @index<0
  271.     return @commands
  272.   end
  273.  
  274.   def refresh(index)
  275.     @sprite.bitmap.dispose if @sprite.bitmap
  276.     return if index<0
  277.     @sprite.setSpeciesBitmap(@species[index])
  278.     if @sprite.bitmap
  279.       @sprite.x=(Graphics.width-((Graphics.width-256)/2))-(@sprite.bitmap.width/2)
  280.       @sprite.y=(Graphics.height-((Graphics.height-64)/2))-(@sprite.bitmap.height/2)
  281.     end
  282.   end
  283. end
  284.  
  285. #===============================================================================
  286. # Edits the terrain tags of tiles in tilesets.
  287. #===============================================================================
  288. # [ Actualizado por Bezier ]
  289. # Cambios:
  290. #   Autotag:    Pulsar A para cambiar el valor del tag que será aplicado con la
  291. #               tecla C sin tener que asignar el valor cada vez
  292. #   Selección:  Pulsar S para seleccionar un área y aplicar el autotag
  293. #===============================================================================
  294. begin
  295.  
  296. def pbTilesetWrapper
  297.   return PokemonDataWrapper.new(
  298.      "Data/Tilesets.rxdata",
  299.      "Data/TilesetsTemp.rxdata",
  300.      Proc.new{
  301.         Kernel.pbMessage(_INTL("El editor ha detectado que los datos del tileset fueron editados recientemente en RPG Maker XP."))
  302.         next !Kernel.pbConfirmMessage(_INTL("¿Quieres cargar estos cambios recientes?"))
  303.      }
  304.   )
  305. end
  306.  
  307.  
  308.  
  309. class PokemonTilesetScene
  310.  
  311.   # Obtiene las coordenadas y dimensión de la selección actual
  312.   def getSelectionValues
  313.     return [@x,@y,@x,@y,1,1] if @selection.size==0
  314.     x0=[@selection[0][0],@selection[1][0]].min
  315.     y0=[@selection[0][1],@selection[1][1]].min
  316.     x1=[@selection[0][0],@selection[1][0]].max
  317.     y1=[@selection[0][1],@selection[1][1]].max
  318.     w=x1-x0+28
  319.     h=y1-y0+28
  320.     return [x0,y0,x1,y1,w,h]
  321.   end
  322.  
  323.   def pbUpdateTileset
  324.     @sprites["overlay"].bitmap.clear
  325.     textpos=[]
  326.     @sprites["tileset"].src_rect=Rect.new(0,@topy,256,Graphics.height)
  327.     tilesize=@tileset.terrain_tags.xsize
  328.     for yy in 0...(Graphics.height)/32
  329.       ypos=(yy+(@topy/32))*8+384
  330.       next if ypos>=tilesize
  331.       for xx in 0...8
  332.         terr=ypos<384 ? @tileset.terrain_tags[xx*48] : @tileset.terrain_tags[ypos+xx]
  333.         if ypos<384
  334.           @tilehelper.bltTile(@sprites["overlay"].bitmap,xx*32,yy*32,xx*48)
  335.         end
  336.         textpos.push(["#{terr}",xx*32+16,yy*32,2,Color.new(80,80,80),Color.new(192,192,192)])
  337.       end
  338.     end
  339.     # Pinta la selección en vez de la celda actual [@x,@y]
  340.     if @selectionMode && @selection.size>0
  341.       x0,y0,x1,y1,w,h=getSelectionValues
  342.       @sprites["overlay"].bitmap.fill_rect(x0,y0-@topy,w,4,Color.new(255,0,0))
  343.       @sprites["overlay"].bitmap.fill_rect(x0,y0-@topy,4,h,Color.new(255,0,0))
  344.       @sprites["overlay"].bitmap.fill_rect(x0,y1-@topy+28,w,4,Color.new(255,0,0))
  345.       @sprites["overlay"].bitmap.fill_rect(x1+28,y0-@topy,4,h,Color.new(255,0,0))
  346.     else
  347.       @sprites["overlay"].bitmap.fill_rect(@x,@y-@topy,32,4,Color.new(255,0,0))
  348.       @sprites["overlay"].bitmap.fill_rect(@x,@y-@topy,4,32,Color.new(255,0,0))
  349.       @sprites["overlay"].bitmap.fill_rect(@x,@y-@topy+28,32,4,Color.new(255,0,0))
  350.       @sprites["overlay"].bitmap.fill_rect(@x+28,@y-@topy,4,32,Color.new(255,0,0))
  351.     end
  352.     pbDrawTextPositions(@sprites["overlay"].bitmap,textpos)
  353.   end
  354.  
  355.   def pbGetSelected(x,y)
  356.     if y<0
  357.       return 48*(x/32)
  358.     else
  359.       return (y/32)*8+384+(x/32)
  360.     end
  361.   end
  362.  
  363.   def pbSetSelected(i,value)
  364.     if i<384
  365.       for j in 0...48
  366.         @tileset.terrain_tags[i+j]=value
  367.       end
  368.     else
  369.       @tileset.terrain_tags[i]=value
  370.     end
  371.   end
  372.  
  373.   def pbChooseTileset
  374.     commands=[]
  375.     for i in 1...@tilesetwrapper.data.length
  376.       commands.push(sprintf("%03d %s",i,@tilesetwrapper.data[i].name))
  377.     end
  378.     ret=Kernel.pbShowCommands(nil,commands,-1)
  379.     if ret>=0
  380.       @tileset=@tilesetwrapper.data[ret+1]
  381.       @tilehelper.dispose
  382.       @tilehelper=TileDrawingHelper.fromTileset(@tileset)
  383.       @sprites["tileset"].setBitmap("Graphics/Tilesets/#{@tileset.tileset_name}")
  384.       @x=0
  385.       @y=-32
  386.       @topy=-32
  387.       pbUpdateTileset
  388.     end
  389.   end
  390.  
  391.   # Actualiza el sprite que muestra el menú
  392.   def updateMenu
  393.     txt=getTittleText
  394.     @sprites["title"].text=txt
  395.     @sprites["title"].resizeToFit(txt)
  396.     @sprites["title"].width=Graphics.width-256
  397.   end
  398.  
  399.   # Texto del menú dependiendo del estado actual del editor de Tileset
  400.   def getTittleText
  401.     txt = "Tileset Editor\nQ/W: Desplaza\n    Z: Menú\n    A: Autotag [ " + @autotag.to_s + " ]\n    S: Selección"
  402.     if @selectionMode
  403.       txt += " [ON]"
  404.       txt += "\n    C: [ " + @autotag.to_s + " ] -> selección"
  405.     end
  406.     return txt
  407.   end
  408.  
  409.   # Actualiza el rectángulo de selección con las coordenadas actuales
  410.   def setSelectionRect
  411.     if @selection.size==0
  412.       @selection[0]=[@x,@y]
  413.     end
  414.     @selection[1]=[@x,@y]
  415.   end
  416.  
  417.   # Se ha cambiado un poco el interfaz para mostrar el nuevo menú a la derecha,
  418.   # el tileset ajustado arriba a la izquierda y gestionar los nuevos inputs
  419.   def pbStartScene
  420.     @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  421.     @viewport.z=99999
  422.     @tilesetwrapper=pbTilesetWrapper
  423.     @tileset=@tilesetwrapper.data[1]
  424.     @tilehelper=TileDrawingHelper.fromTileset(@tileset)
  425.     @sprites={}
  426.     @autotag=0
  427.     @selectionMode=false
  428.     @selection=[]
  429.     @sprites["title"]=Window_UnformattedTextPokemon.new(getTittleText)
  430.     @sprites["title"].viewport=@viewport
  431.     @sprites["title"].x=260
  432.     @sprites["title"].y=0
  433.     @sprites["title"].width=Graphics.width-256
  434.     @sprites["tileset"]=IconSprite.new(0,0,@viewport)
  435.     @sprites["tileset"].setBitmap("Graphics/Tilesets/#{@tileset.tileset_name}")
  436.     @sprites["tileset"].src_rect=Rect.new(0,0,256,Graphics.height)
  437.     @sprites["overlay"]=BitmapSprite.new(256,Graphics.height,@viewport)
  438.     @sprites["overlay"].x=0
  439.     @sprites["overlay"].y=0
  440.     pbSetSystemFont(@sprites["overlay"].bitmap)
  441.     @sprites["title"].visible=true
  442.     @sprites["tileset"].visible=true
  443.     @sprites["overlay"].visible=true
  444.     @x=0
  445.     @y=-32
  446.     @topy=-32
  447.     pbUpdateTileset
  448.     pbFadeInAndShow(@sprites)
  449.     height=@sprites["tileset"].bitmap.height
  450.     ########
  451.     loop do
  452.       Graphics.update
  453.       Input.update
  454.       if Input.repeat?(Input::UP)
  455.         @y-=32
  456.         @y=-32 if @y<-32
  457.         @topy=@y if @y<@topy
  458.         setSelectionRect if @selectionMode
  459.         pbUpdateTileset
  460.       elsif Input.repeat?(Input::DOWN)
  461.         @y+=32
  462.         @y=@sprites["tileset"].bitmap.height-32 if @y>=@sprites["tileset"].bitmap.height-32
  463.         @topy=@y-(Graphics.height)+32 if @y-@topy>=Graphics.height
  464.         setSelectionRect if @selectionMode
  465.         pbUpdateTileset
  466.       elsif Input.repeat?(Input::LEFT)
  467.         @x-=32
  468.         @x=0 if @x<0
  469.         setSelectionRect if @selectionMode
  470.         pbUpdateTileset
  471.       elsif Input.repeat?(Input::RIGHT)
  472.         @x+=32
  473.         @x=256-32 if @x>=256-32
  474.         setSelectionRect if @selectionMode
  475.         pbUpdateTileset
  476.       elsif Input.repeat?(Input::L)
  477.         @y-=((Graphics.height)/32)*32
  478.         @topy-=((Graphics.height)/32)*32
  479.         @y=-32 if @y<-32
  480.         @topy=@y if @y<@topy
  481.         @topy=-32 if @topy<-32
  482.         setSelectionRect if @selectionMode
  483.         pbUpdateTileset
  484.       elsif Input.repeat?(Input::R)
  485.         @y+=((Graphics.height)/32)*32
  486.         @topy+=((Graphics.height)/32)*32
  487.         @y=@sprites["tileset"].bitmap.height-32 if @y>=@sprites["tileset"].bitmap.height-32
  488.         @topy=@y-(Graphics.height)+32 if @y-@topy>=Graphics.height
  489.         @topy=@sprites["tileset"].bitmap.height-(Graphics.height) if @topy>=@sprites["tileset"].bitmap.height-(Graphics.height)
  490.         setSelectionRect if @selectionMode
  491.         pbUpdateTileset
  492.  
  493.       elsif Input.trigger?(Input::X) # Autotag
  494.         params=ChooseNumberParams.new
  495.         params.setRange(0,99)
  496.         @autotag=Kernel.pbMessageChooseNumber(_INTL("Cambiar autotag."),params)
  497.         updateMenu
  498.  
  499.       elsif Input.trigger?(Input::Y) # Selección
  500.         if @selectionMode
  501.           @selectionMode=false
  502.           @selection=[]
  503.         else
  504.           @selectionMode=true
  505.           setSelectionRect
  506.         end
  507.         updateMenu
  508.         pbUpdateTileset
  509.  
  510.       elsif Input.trigger?(Input::A)
  511.         commands=[
  512.            _INTL("Ir abajo"),
  513.            _INTL("Ir arriba"),
  514.            _INTL("Cambiar tileset"),
  515.            _INTL("Salir")
  516.         ]
  517.         ret=Kernel.pbShowCommands(nil,commands,-1)
  518.         case ret
  519.         when 0
  520.           @y=@sprites["tileset"].bitmap.height-32
  521.           @topy=@y-(Graphics.height)+32 if @y-@topy>=Graphics.height
  522.           pbUpdateTileset
  523.         when 1
  524.           @y=-32
  525.           @topy=@y if @y<@topy
  526.           pbUpdateTileset
  527.         when 2
  528.           pbChooseTileset
  529.         end
  530.       elsif Input.trigger?(Input::B)
  531.         if Kernel.pbConfirmMessage(_INTL("¿Guardar los cambios?"))
  532.           @tilesetwrapper.save
  533.           $data_tilesets=@tilesetwrapper.data
  534.           if $game_map && $MapFactory
  535.             $MapFactory.setup($game_map.map_id)
  536.             $game_player.center($game_player.x,$game_player.y)
  537.             if $scene.is_a?(Scene_Map)
  538.               $scene.disposeSpritesets
  539.               $scene.createSpritesets
  540.             end
  541.           end
  542.           Kernel.pbMessage(_INTL("Para asegurar que los cambios se mantengan, cierre y vuelva a abrir RPG Maker XP."))
  543.         end
  544.         break if Kernel.pbConfirmMessage(_INTL("¿Salir del editor?"))
  545.       elsif Input.trigger?(Input::C)
  546.         if @selectionMode
  547.           x0,y0,x1,y1,w,h=getSelectionValues
  548.           for ix in x0..x1
  549.             for iy in y0..y1
  550.               selected=pbGetSelected(ix,iy)
  551.               pbSetSelected(selected,@autotag)    
  552.             end
  553.           end
  554.           @selectionMode=false
  555.           @selection=[]
  556.           updateMenu
  557.           pbUpdateTileset
  558.         else
  559.           selected=pbGetSelected(@x,@y)
  560.           pbSetSelected(selected,@autotag)
  561.           pbUpdateTileset
  562.         end
  563.       end
  564.     end
  565.     ########
  566.     pbFadeOutAndHide(@sprites)
  567.     pbDisposeSpriteHash(@sprites)
  568.     @viewport.dispose
  569.     @tilehelper.dispose
  570.   end
  571. end
  572.  
  573.  
  574.  
  575. def pbTilesetScreen
  576.   pbFadeOutIn(99999){
  577.      scene=PokemonTilesetScene.new
  578.      scene.pbStartScene
  579.   }
  580. end
  581.  
  582.  
  583.  
  584. rescue Exception
  585.   if $!.is_a?(SystemExit) || "#{$!.class}"=="Reset"
  586.     raise $!
  587.   end
  588. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement