¡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 3397 miembros registrados.
El último usuario registrado es LucasGF.

Nuestros miembros han publicado un total de 79808 mensajes en 11257 argumentos.
Navega con Google Chrome
[DESCARGA]

[XP] Comprobador de incompatibilidades

 :: RPG Maker :: Scripts

Ver el tema anterior Ver el tema siguiente Ir abajo

RPG Maker XP [XP] Comprobador de incompatibilidades

Mensaje por Wecoc el 2016-09-28, 21:36

Éste código es de usar y tirar (es decir, tras usarlo debéis borrarlo) y no requiere créditos.
Está hecho para RPG maker XP, pero posiblemente funcione en RPG maker VX/Ace.

Lo que hace es buscar incompatibilidades entre los scripts del proyecto. Solo tenéis que insertarlo (da igual donde mientras quede por encima de main) y ejecutar el proyecto, y os dirá los problemas de incompatibilidad que detecte entre los scripts.

El script en sí no es incompatible con nada ni tampoco hace ninguna modificación estructural, así que no tengáis miedo en usarlo.

Algunos de los casos no son verdaderamente problemas porque se trata del uso de alias o bien de reescrituras controladas de algunos métodos, pero óbviamente los especifica igualmente porque podrían ser conflitivos. Tendréis que saber interpretar un poco lo que ha detectado. En la información del script está detallado cada posible caso por si vais un poco perdidos con eso.

Ejemplo:



Ésto significa que en el script original Neo-Shop sale un método que ya se había definido en en script Game_Temp, concretamente el initialize. Pero si os fijáis usa un alias y el órden es correcto (el del alias está detrás del original) así que lo más probable es que no sea una verdadera incompatibilidad.

Código:
#==============================================================================
# ** Comprobador de incompatibilidades v1.0
#------------------------------------------------------------------------------
# * Éste código es de usar y tirar (es decir, tras usarlo debéis borrarlo)
#
#   Lo que hace es buscar incompatibilidades entre los scripts del proyecto.
#
#   Debéis insertarlo encima de main y ejecutar el proyecto.
#   Os saldrá una ventana para cada método repetido, indicando si usa alias.
#
# - Si un método sale repetido y no usa alias en ninguno de los dos, los
#   scripts implicados son incompatibles entre ellos y hay que juntar ámbos
#   métodos (teniendo en cuenta lo que comparten, hay que añadir aquello en
#   lo que difieren)
#
# - Si un método sale repetido y no queda ninguno sin alias por debajo de los
#   que sí tienen alias, no debería haber problemas con ese método.
#
# - Si un método sale repetido y alguno sin alias queda por debajo de otro con
#   alias, los scripts no se han inserido en el órden correcto. Si cambiando el
#   órden aparece otro error similar es que no son compatibles entre ellos.
#------------------------------------------------------------------------------
# Está hecho para RPG maker XP, pero posiblemente funcione en RPG maker VX/Ace
#------------------------------------------------------------------------------
# ==== Autor: Wecoc - No requiere créditos  ===================================
#==============================================================================

#==============================================================================
# ** Code_Check
#==============================================================================

module Code_Check
  module_function
  #--------------------------------------------------------------------------
  # * Initialize
  #--------------------------------------------------------------------------
  def initialize
    @scripts = []
    for i in 0...$RGSS_SCRIPTS.size
      s = __script($RGSS_SCRIPTS[i][1])
      @scripts.push Script.new(s, $RGSS_SCRIPTS[i][1]) if s.size != 0
    end
  end
  #--------------------------------------------------------------------------
  # * Get incompatibility problems
  #--------------------------------------------------------------------------
  def get_problems
    data = []
    for script in @scripts
      for section in script.sections
        for method in section.methods
          data.push([script.name, section.name, method.name, method.alias?])
        end
      end
    end
    problem_data = []
    for i in 0...data.size
      count = __count(data, i)
      if count > 1
        problem_data.push(data[i])
      end
    end
    return problem_data
  end
  #--------------------------------------------------------------------------
  # * Print incompatibility problems
  #--------------------------------------------------------------------------
  def print_problems
    problems = get_problems
    loop do
      result = problems.select do |s|
        (s[1] == problems[0][1] && s[2] == problems[0][2])
      end
      problems = problems.reject do |s|
        (s[1] == problems[0][1] && s[2] == problems[0][2])
      end
      break if problems.size == 0 or result.size == 0
      t = "A repeated method has been detected.\n\n"
      for i in 0...result.size
        script  = result[i][0]
        section = result[i][1]
        method  = result[i][2]
        alias_mode = (result[i][3] == true) ? ' (alias)' : ''
        t += "Script:\t#{script}\tMethod:\t#{section}:#{method}#{alias_mode}\n"
      end
      print t
    end
  end
  #--------------------------------------------------------------------------
  # * (Private) Get script code by name
  #--------------------------------------------------------------------------
  def __script(name)
    result = $RGSS_SCRIPTS.select{|s| s[1] == name}
    return '' if result.size == 0
    return '' if result[0][3].include?(self.name)
    return Zlib::Inflate.inflate(result[0][2])
  end
  #--------------------------------------------------------------------------
  # * (Private) Count section methods
  #--------------------------------------------------------------------------
  def __count(data, index)
    n = 0
    for i in 0...data.size
      if data[i][1] == data[index][1] && data[i][2] == data[index][2]
        n += 1
      end
    end
    return n
  end
  #============================================================================
  # ** Script
  #============================================================================
  class Script
    attr_reader :name
    attr_reader :sections
    #--------------------------------------------------------------------------
    # * Initialize
    #--------------------------------------------------------------------------
    def initialize(code, name)
      @name = name
      @code = __clean_code(code)
      @sections = __get_sections
    end
    #--------------------------------------------------------------------------
    # * (Private) Erase all code comments
    #--------------------------------------------------------------------------
    def __clean_code(code)
      result = code.split("\r\n")
      delete_all = false
      for line in result.clone
        l = line.strip
        delete_all = true if l[0] != nil && l[0].chr == '=' && l[1..5] == 'begin'
        if l[0] == nil or l[0].chr == '#' or delete_all == true
          result.delete(line)
        end
        delete_all = false if l[0] != nil && l[0].chr == '=' && l[1..3] == 'end'
      end
      result = result.join("\r\n")
      return result.gsub(";", "\r\n")
    end
    #--------------------------------------------------------------------------
    # * (Private) Get code sections
    #--------------------------------------------------------------------------
    def __get_sections
      c = @code.split("\r\n")
      n = -1
      r = {}
      for line in c
        l = line.strip
        if l[0..5] == "class " or l[0..6] == "module "
          n += 1
        end
        r[n] = [] if r[n] == nil
        r[n].push(l)
      end
      result = []
      for s in r.keys.sort
        result.push Section.new(r[s], self)
      end
      return result
    end
    #--------------------------------------------------------------------------
    # * Code string (print mode)
    #--------------------------------------------------------------------------
    def to_s
      @code
    end
    #--------------------------------------------------------------------------
    # * Code string (inspect mode)
    #--------------------------------------------------------------------------
    def inspect
      @code.inspect
    end
  end
  #============================================================================
  # ** Section
  #============================================================================
  class Section
    attr_reader :name
    attr_reader :methods
    attr_reader :script
    #--------------------------------------------------------------------------
    # * Initialize
    #--------------------------------------------------------------------------
    def initialize(code, script)
      line = code[0].split(" ")
      line.delete("")
      @name = line[1]
      @code = code.join("\r\n")
      @methods = __get_methods
      @script = script
    end
    #--------------------------------------------------------------------------
    # * (Private) Get all section methods
    #--------------------------------------------------------------------------
    def __get_methods
      line = @code.split("\r\n")
      line.collect{|s| s.strip!}
      line = line.select{|s| s[0..3] == "def "}
      result = []
      for c in line
        l = c.split(" ")[1]
        l.sub!("self", name)
        l = l[0...l.index("(")] if l.include?("(")
        a = @code.split("\r\n")
        a = a.select{|s| s.include?("alias")}
        a = a.select{|s| s.include?(l)}
        alias_mode = (a.size > 0)
        result.push Method.new(l, self, alias_mode)
      end
      return result
    end
    #--------------------------------------------------------------------------
    # * Code string (print mode)
    #--------------------------------------------------------------------------
    def to_s
      @code
    end
    #--------------------------------------------------------------------------
    # * Code string (inspect mode)
    #--------------------------------------------------------------------------
    def inspect
      @code.inspect
    end
  end
  #============================================================================
  # ** Method
  #============================================================================
  class Method
    attr_reader :name
    attr_reader :section
    #--------------------------------------------------------------------------
    # * Initialize
    #--------------------------------------------------------------------------
    def initialize(name, section, a=false)
      @name = name
      @a = a
      @section = section
    end
    #--------------------------------------------------------------------------
    # * Check if the method has been aliased
    #--------------------------------------------------------------------------
    def alias?
      return @a
    end
    #--------------------------------------------------------------------------
    # * Method name string (print mode)
    #--------------------------------------------------------------------------
    def to_s
      @name
    end
    #--------------------------------------------------------------------------
    # * Method name string (inspect mode)
    #--------------------------------------------------------------------------
    def inspect
      @name.inspect
    end
  end
end

#================ Script Execution ============================================

begin
  Code_Check.initialize
  Code_Check.print_problems
end

Wecoc
Administrador
Administrador



Créditos 8272

Gracias : 372

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Comprobador de incompatibilidades

Mensaje por rigel2 el 2016-09-29, 05:07

thx por el script wecocc lo probe y me dio un millar de posibles incompatibilidades con tanto script que uso jjaja pero como mensionas la mayoria contenian alias al final igualmente es una erramienta muy util para el check de scripts este y el de resouse check son indispensables ala hora de lanzar la version final de el game

rigel2
Principiante
Principiante

0/3

Créditos 850

Gracias : 22

http://rigelforge.blog.fc2.com

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Comprobador de incompatibilidades

Mensaje por Wecoc el 2016-09-29, 11:44

Más que para lanzar la versión final del juego, la idea del script es usarlo para comprobar que al insertar un script, especialmente uno importante (por ejemplo un sistema de batalla) lo hayamos puesto en el órden correcto y no nos hayamos cargado ningún edit de los otros scripts añadidos anteriormente, los cuales dejarían de tener efecto si hay otra reescritura del mismo método o incluso saldrían errores en líneas inesperadas (eso es muy típico).

Cuando usas scripts con sistemas muy complejos que modifican muchos métodos (como el SDK) comprobar compatibilidades a mano puede llegar a ser muy tedioso, y éste script lo hace más llevadero. También si ponéis un script y os da un error inesperado que no parece que ocurra a otra gente, lo más probable es que sea una incompatibilidad de éstas y se puede usar el script para ver qué está pasando. Para solucionar esos fallos lo más importante es detectar los scripts implicados.

Quiero aclarar que el script busca reescrituras de métodos, que es el tipo de incompatibilidad más frecuente (más del 90%), pero hay otras causas posibles de incompatibilidad más raras; reescritura de constantes, modificaciones de los scripts base del programa (Tilemap, String...), uso de un mismo nombre de alias para un método, reescritura de attr_reader/attr_accessor por un método y uso de métodos destructivos como undef.

En otras palabras, el script es útil pero no hace milagros, en casos complejos deberéis buscar ayuda de un scripter.

Wecoc
Administrador
Administrador



Créditos 8272

Gracias : 372

Volver arriba Ir abajo

RPG Maker XP Re: [XP] Comprobador de incompatibilidades

Mensaje por Contenido patrocinado Hoy a las 12:42


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 :: RPG Maker :: Scripts

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