Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.
Conectarse

Recuperar mi contraseña

Temas importantes
----------------------------------------
Páginas con recursos RPG Maker
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
----------------------------------------
Afiliados
Estadísticas
Tenemos 4139 miembros registrados.
El último usuario registrado es pepus2008.

Nuestros miembros han publicado un total de 84794 mensajes en 12069 argumentos.

[XP][Herramienta de enginer] Project Finder

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP][Herramienta de enginer] Project Finder

Mensaje por Wecoc el 2017-08-14, 17:14

Esto es una utilidad para gente algo descuidada o bien muy activa en el maker como yo. Será especialmente útil para enginers y scripters.
Ya sabéis lo mucho que me gustan los scripts raros de éste tipo xD Éste aún es bastante normalito.

No sé si os pasará que haciendo pruebas en el maker se os llenan las carpetas de "Project1", "Project2"... y llega un punto que no sabéis qué tenéis dónde y luego al buscar algo concreto os volvéis locos y perdéis un montón de tiempo buscándolo.

Pues si os ocurre eso os interesará éste script. Permite buscar entre esos proyectos lo que te interese recuperar, solo hay que darle cierta pista ya sea por nombre de script, texto dentro del script, nombre del proyecto o bien nombre de mapa. No hace falta darlo entero, solo una parte y ya devuelve todos los que coincidan con ella, por ejemplo buscáis “Mode7” y encontrará todos aquellos donde ponga algo de Mode7. Quizá ninguno de los 4 tipos de búsqueda os sirva en un determinado caso, si tenéis pensado otro tipo de búsqueda similar podéis contactar conmigo en éste topic para que lo incluya.
El script es corto, no requiere créditos y es compatible con prácticamente todo.

Código:
#==============================================================================
# ** [XP][Herramienta de enginer] Project Finder v1.0
#------------------------------------------------------------------------------
# Script que permite buscar proyectos que cumplan cierta condición entre tus
# archivos. No requiere créditos; usar y tirar. Compatible con todo.
#
# Para usarlo hay que definir tu llamada de script en initialize y luego
# ejecutar el proyecto en modo Debug.
#==============================================================================
# Llamadas de script:
#
# * Buscar los proyectos cuyo nombre contenga cierta string
#    find_project_name(string)
#
# * Buscar los proyectos con scripts que en su nombre aparezca cierta string
#    find_script_name(string)
#
# * Buscar los proyectos con scripts en cuyo contenido aparezca cierta string
#    find_script_text(string)
#
# * Buscar los proyectos con mapas que en su nombre aparezca cierta string
#    find_map_name(string)
#
# ¿Quieres más opciones de búsqueda? Contacta conmigo en éste tema:
# http://www.mundo-maker.com/t14217-xpherramienta-de-enginer-project-finder
#==============================================================================

module ProjectFinder
  module_function
 
  #--------------------------------------------------------------------------
  # Pon aquí la carpeta principal de los proyectos a analizar
  # Por ejemplo: "C:/Documents and Settings/Administrador/Mis documentos/RPGXP"
  # Si se deja vacío utilizará la carpeta Mis Documentos
 
  FOLDER = "C:/Documents and Settings/Administrador/Mis documentos/RPGXP"
 
  # Define aquí si el resultado es guardado con un TXT o bien solo se muestra
  # en una ventana del maker
 
  SAVE_TXT = true
 
  #--------------------------------------------------------------------------
 
  GetSpFolderA      = "SHGetSpecialFolderLocation"
  GetPathFromIDA    = "SHGetPathFromIDList"
  GetSpecialFolder = Win32API.new("shell32.dll", GetSpFolderA, "LLP", "I")
  GetPathFromID    = Win32API.new("shell32.dll", GetPathFromIDA ,"LP","I")
  Profile = Win32API.new('kernel32', 'GetPrivateProfileString','PPPPLP', 'L')
 
  #--------------------------------------------------------------------------
  def initialize
    create_state_sprite
    #------------------------------------------------------------------------
    # Pon aquí tu llamada de script (ver información principal del script)
    # Ejemplo: find_script_name("WecTools")
   
   
   
   
    #------------------------------------------------------------------------
    dispose_state_sprite
  end
  #--------------------------------------------------------------------------
  def create_state_sprite
    @sprite = Sprite.new
    @sprite.bitmap = Bitmap.new(640, 64)
    @sprite.bitmap.font.name = "Courier New"
    @sprite.bitmap.font.color = Color.new(0, 255, 0)
    @sprite.bitmap.font.size = 16
    @sprite.bitmap.font.bold = true
  end
  #--------------------------------------------------------------------------
  def dispose_state_sprite
    @sprite.bitmap.dispose
    @sprite.dispose
  end
  #--------------------------------------------------------------------------
  def draw_state(checked, found)
    @sprite.bitmap.clear
    @sprite.bitmap.draw_text(0, 0, 640, 16, " Projects checked: #{checked}")
    @sprite.bitmap.draw_text(0, 0, 640, 48, " Projects found:  #{found}")
    Graphics.update
  end
  #--------------------------------------------------------------------------
  def folder
    result = FOLDER
    if result == "" or result.nil?
      idl = [0].pack("V")
      ret = GetSpecialFolder.call(0, 0x0005, idl)
      return "." if ret != 0
      path = "\0" * 512
      ret = GetPathFromID.call(idl.unpack("V")[0], path)
      return "." if ret == 0
      result = path.gsub(/\0/, "")
      return result.gsub("\\", "/")
    end
    return result
  end
  #--------------------------------------------------------------------------
  def procdir(dirname, &block)
    data = ''
    Dir.foreach(dirname) do |dir|
      dirpath = dirname + '/' + dir
      if File.directory?(dirpath) then
        if dir != '.' && dir != '..' then
          yield dirpath
          procdir(dirpath, &block)
        end
      else
        data += dirpath
      end
    end
    return data
  end
  #--------------------------------------------------------------------------
  def find_script_name(name)
    result = []
    current_folder = folder.clone
    n = current_folder.split("/").size
    prc = 0
    prf = 0
    procdir(current_folder) do |dirpath|
      files = Dir.files(dirpath)
      data = nil
      if files.include?("Scripts.rxdata")
        file = files[files.index("Scripts.rxdata")]
        data = load_data(dirpath + "/" + file) rescue nil
        next if data.nil?
        prc += 1
        found = false
        for entry in data
          if entry[1].include?(name)
            found = true
            result_dir = dirpath.split("/")
            result_dir = result_dir[n...(result_dir.size - 1)].join("/")
            result.push("Folder: #{result_dir}\tScript name: #{entry[1]}")
          end
        end
        prf += 1 if found
        draw_state(prc, prf)
        Graphics.update
      end
    end
    result = result.join("\n")
    get_result(result)
  end
  #--------------------------------------------------------------------------
  def find_script_text(text)
    result = []
    current_folder = folder.clone
    n = current_folder.split("/").size
    prc = 0
    prf = 0
    procdir(current_folder) do |dirpath|
      files = Dir.files(dirpath)
      data = nil
      if files.include?("Scripts.rxdata")
        file = files[files.index("Scripts.rxdata")]
        data = load_data(dirpath + "/" + file) rescue nil
        next if data.nil?
        prc += 1
        found = false
        for entry in data
          if Zlib::Inflate.inflate(entry[2]).include?(text)
            found = true
            result_dir = dirpath.split("/")
            result_dir = result_dir[n...(result_dir.size - 1)].join("/")
            result.push("Folder: #{result_dir}\tScript name: #{entry[1]}")
          end
        end
        prf += 1 if found
        draw_state(prc, prf)
        Graphics.update
      end
    end
    result = result.join("\n")
    get_result(result)
  end
  #--------------------------------------------------------------------------
  def find_project_name(name)
    result = []
    current_folder = folder.clone
    n = current_folder.split("/").size
    prc = 0
    prf = 0
    procdir(current_folder) do |dirpath|
      files = Dir.files(dirpath)
      data = nil
      if files.include?("Game.ini")
        file = files[files.index("Game.ini")]
        title = "\0" * 256
        Profile.call("Game","Title","",title,256,dirpath + "/" + "Game.ini")
        title.delete!("\0")
        prc += 1
        if title.include?(name)
          result_dir = dirpath.split("/")
          result_dir = result_dir[n...result_dir.size].join("/")
          result.push("Folder: #{result_dir}\tProject: #{title}")
          prf += 1
        end
        draw_state(prc, prf)
        Graphics.update
      end
    end
    result = result.join("\n")
    get_result(result)
  end
  #--------------------------------------------------------------------------
  def find_map_name(name)
    result = []
    current_folder = folder.clone
    n = current_folder.split("/").size
    prc = 0
    prf = 0
    procdir(current_folder) do |dirpath|
      files = Dir.files(dirpath)
      data = nil
      if files.include?("MapInfos.rxdata")
        file = files[files.index("MapInfos.rxdata")]
        data = load_data(dirpath + "/" + file) rescue nil
        next if data.nil?
        prc += 1
        found = false
        for map in data.values
          if map.name.include?(name)
            found = true
            result_dir = dirpath.split("/")
            result_dir = result_dir[n...(result_dir.size - 1)].join("/")
            result.push("Folder: #{result_dir}\tMap name: #{map.name}")
          end
        end
        prf += 1 if found
        draw_state(prc, prf)
        Graphics.update
      end
    end
    result = result.join("\n")
    get_result(result)
  end
  #--------------------------------------------------------------------------
  def get_result(result)
    if SAVE_TXT
      open("pfinder.txt", "w") { |file| file.write(result) }
      Thread.new do
        r = "c:\\Archivos de programa\\Windows NT\\Accesorios\\wordpad.exe"
        system(r, "pfinder.txt")
      end
    else
      print result
    end
  end
end

class Dir
  #------------------------------------------------------------------------
  # * Obtener carpetas dentro de una carpeta
  #------------------------------------------------------------------------
  def self.folders(folder)
    all_files = Dir.open(folder).entries
    all_files.delete(".") ; all_files.delete("..")
    result_files = []
    for file in all_files
      if FileTest.exist?(folder + "/" + file)
        ftype = File.ftype(folder + "/" + file) rescue nil
        result_files.push(file) if ftype == "directory"
      end
    end
    return result_files
  end
  #------------------------------------------------------------------------
  # * Obtener archivos dentro de una carpeta
  #------------------------------------------------------------------------
  def self.files(folder, ext=nil)
    all_files = Dir.open(folder).entries
    result_files = []
    for file in all_files
      if FileTest.exist?(folder + "/" + file)
        ftype = File.ftype(folder + "/" + file) rescue nil
        result_files.push(file) if ftype == "file"
      end
    end
    return result_files if ext == nil
    return result_files.select {|d| d.ext?(ext)}
  end
end

ProjectFinder.initialize if $DEBUG

avatar
Wecoc
Administrador
Administrador



Créditos 9218

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Herramienta de enginer] Project Finder

Mensaje por Calayax el 2017-08-14, 17:49

Tú y tus herramientas de engines siempre facilitando el trabajo, ahora lo único que hace falta es un script de compatibilidad (? Para que se haga sencillo cambiar todas las ids de variables o que permita saber cuáles están ocupadas y así hacer más sencilla la unión de engines que en principio estén en proyectos separados (ya sabes cómo funciona esto?)

Felicidades por nueva herramienta, aún no estoy tan saturado para no encontrar mis engines pero de estarlo ya sé a quién recurrir :D
avatar
Calayax
Soñador
Soñador

0/3

Créditos 671

Gracias : 42

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Herramienta de enginer] Project Finder

Mensaje por Wecoc el 2017-08-14, 17:58

Lo de cambiar todas las ID de variables no lo haré porque implica reescritura de datos del proyecto, y es más peligroso (especialmente si hubiera que cambiarlas en llamadas de script también)... mis herramientas siempre obtienen datos, no los reescriben. Lo de saber cual variable está ocupada y cual no se puede hacer con AGO Finder, pero un consejo: Nombra siempre las variables que uses, no las dejes en blanco. Así no te liarás con esas cosas. Sé que pasar un engine a tu juego y tener que cambiar todas las ID es tedioso pero en ese caso es mucho mejor hacerlo a mano.
avatar
Wecoc
Administrador
Administrador



Créditos 9218

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Herramienta de enginer] Project Finder

Mensaje por orochii el 2017-08-16, 15:06

¿Puede buscar proyectos incluyendo en subcarpetas? Lo que daría por darle a buscar desde C: xDDD.

Está interesante.
avatar
orochii
Caballero Shiro
Caballero Shiro

0/3

Créditos 6389

Gracias : 332

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Herramienta de enginer] Project Finder

Mensaje por Wecoc el 2017-08-16, 19:07

Sep, y si no defines carpeta lo busca directamente desde Mis Documentos, aunque normalmente será más interesante restringirlo porque si tienes muchos proyectos puede llevarle unos minutos comprobarlos todos. De hecho si os interesa esa función de búsqueda recursiva del script para otros propósitos, es el método :procdir y lo adapté de un código libre sacado de internet (hecho en Ruby).

Me dí cuenta testeando que puede que ignore ciertas carpetas con carácteres especiales, el problema de siempre por parte del maker cuando hace ese tipo de cosas... En Screen EX medio arreglé eso pero intentar hacerlo también en éste los hubiera hecho incompatibles (y quizá con otros), así que en el caso que necesitárais hacer búsquedas en carpetas con carácteres no ASCII poned también el código Screen EX en el proyecto a parte de éste.

También soy consciente que el output (archivo de texto) del script no es tan "elegante" como en otros casos pero... es lo que hay Sweat

Nota: Inicialmente hice el script para mí mismo, supongo que eso lo explica xD
avatar
Wecoc
Administrador
Administrador



Créditos 9218

Gracias : 493

Volver arriba Ir abajo

RPG Maker XP Re: [XP][Herramienta de enginer] Project Finder

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.