class_21_01-77b6c8c5

La App Makers

¡Hola a todo el mundo!
En este post les enseñaré a crear paquetes RPA, para reunir todos los Assets de un juego Ren’Py en un solo paquete físico (o en varios).
Esto puede usarse para evitar que los archivos de nuestro juego queden fácilmente al alcance de los jugadores, y evitar que ciertos archivos como el código fuente queden al descubierto.
Ah, y perdón por la ausencia, pero me he dedicado casi todo mi tiempo a mi proyecto en curso xD (y a mis estudios por supuesto).

Sin más dilación, ¡comencemos con el post!


STATUS CHECK : Todo el contenido de este post ha sido verificado, y es compatible con la última versión emitida de Ren’Py.


1. EMPAQUETANDO ASSETS : ¿QUÉ SON LOS ARCHIVOS RPA EN REN’PY?

[SCREENSHOT : Vista de paquetes RPA en un juego compilado.]

El motor Ren’Py posee un sistema criptográfico básico para el empaquetado de Assets, el cual puedes utilizar para empaquetar varios archivos para tener como resultado final, un único paquete con extensión RPA que contiene múltiples archivos en su interior.
En los archivos RPA puedes guardar cualquier tipo de archivo que componga tu juego, ya sea archivos de audio, vídeo, imágenes, modelos de Live2D y el código por supuesto.


1.1 ¿CÓMO LEE REN’PY A LOS ARCHIVOS RPA? :

En primer lugar, los archivos RPA se crean mientras se compila el juego.
Cuando inicias el juego ya compilado, Ren’Py localiza los paquetes RPA y busca los archivos empaquetados mediante el desplazamiento de bytes, el cual está dado por una clave de ofuscación, que siendo precisos, en Ren’Py es la 0x42424242.
Al encontrar el byte inicial de cada archivo empaquetado, el motor indexa los archivos empaquetados y los procesa de forma individual, otorgando una ruta referencial a cada archivo que fue empaquetado. No asigna rutas físicas, porque la ruta física viene siendo la ubicación del paquete RPA en el sistema de archivos del PC. Posterior a la indexación, el motor decide sobre el orden y cuáles archivos se van a cargar en la RAM antes de mostrar la interfaz del juego al jugador.

NOTA : Naturalmente los archivos RPA están hechos SOLO para cuando quieres compilar una versión para PC (Windows, Linux o MacOS). Para Android o iOS no está disponible, a menos que se hagan ciertas modificaciones que no trataré en este post.

Para aprender a empaquetar los Assets en Ren’Py, lee el siguiente ítem donde ya empezaremos a tratar con código.


2. ¡MANOS A LA OBRA! ¡VAMOS A EMPAQUETAR LOS ASSETS!

En este punto pediré que saquen lápiz y papel… digo digo, enciendan su tostadora y abran el editor de código con su proyecto, porque para crear los empaquetados, antes debemos dar instrucciones a Ren’Py desde nuestro código del juego.

Ren’Py tiene varias funciones de configuración para compilar una versión de nuestro juego, pero en este post haremos énfasis en dos de estas funciones que son los principales para realizar el empaquetado de nuestros Assets mientras ocurre la compilación. Sigue leyendo para ver cuáles son y como se usan.

2.1 LAS BASES PARA USAR build.archive() Y build.classify() :

Antes de irnos directamente al meollo del asunto, debo explicarles algo previo para así estar preparados.
Cuando vamos a crear un paquete RPA, debemos decirle a Ren’Py en qué compilaciones se debe, o no se debe incluir el paquete. Para esto se ocupan las siguientes palabras clave :

  • “all” [String] : Se usa para incluir un RPA en cualquier compilación.
  • “windows” [String] : Se usa para incluir un RPA solo en compilaciones para Windows.
  • “linux” [String] : Se usa para incluir un RPA solo en compilaciones para Linux.
  • “mac” [String] : Se usa para incluir un RPA solo en compilaciones para MacOS (Macintosh).
  • “android” [String] : Se usa para incluir un RPA solo en compilaciones para Android (No tiene mucho sentido agregar paquetes RPA, pues Ren’Py por naturaleza ignora el crear RPAs cuando se trata de Android).

Luego, para evitar crear una declaración para cada archivo, podemos recurrir a los RegEx (Expresiones regulares) para señalar a más archivos en una sola línea de código, por ejemplo mira el uso de los “asteriscos” :

  • * : Coincide con cualquier nombre de archivo, pero ignora al separador de carpetas.
  • ** : Coincide con cualquier archivo, incluido los separadores de carpetas

NOTA : Con “separador de carpetas” nos estamos refiriendo al Slash (/) que se escriben en las rutas de archivos.

Un ejemplo para poner en contexto lo anterior, es el siguiente :

  • “game/*.ogg” : Considera a cualquier archivo OGG que esté dentro de la carpeta “game”, pero no considera a archivos OGG que estén en alguna subcarpeta, es decir, si tenemos archivos OGG en la ruta “game” y también en la ruta “game/audio”, se ignorará esta última ruta y solo se empaquetarán los archivos de la carpeta “game”.
  • “game/**.ogg” : Considera a cualquier archivo con extensión OGG que esté dentro de la carpeta “game” y también los que estén en alguna subcarpeta, es decir, si hay archivos OGG tanto en la carpeta “game”, en “game/audio” y en “game/sfx”, se empaquetarán todas las rutas mencionadas, sin excepciones.

Y ahora viene lo divertido. En esta parte explicaré la utilidad de las funciones build.archive() y build.classify(). Sigue leyendo por favor :

  • build.archive(name, file_list = u’all’) [Función] : Esta función se encarga de declarar un paquete RPA físico donde se van a colocar los Assets del juego. Recibe dos argumentos posicionales, ambos de tipo string, donde name corresponde al nombre que quieres poner al paquete físico, y file_list corresponde a la compilación en que permitirás la creación de este paquete RPA (Explicado más arriba). Por defecto, su argumento es ‘all’ (todas las compilaciones).
  • build.classify(pattern, file_list) [Función] : Esta función se dedica a clasificar e ignorar al mismo tiempo los archivos. Toma dos argumentos posicionales donde pattern corresponde a la ruta que quieres clasificar que empieza desde la carpeta base de tu juego (generalmente un grupo de archivos o un archivo en específico), y file_list corresponde al nombre del paquete RPA en donde quieres incluir la ruta que señalaste. Si quieres eximir de la compilación a un determinado archivo, pattern será la ruta del archivo y file_list debes colocarlo como None.

2.2 EXPRESANDO LO ANTERIOR EN LINEAS DE CÓDIGO :

En este sub-ítem te enseñaré a empaquetar los recursos de tu juego en archivos RPA usando las funciones build.archive() y build.classify().
Primero decidí poner las bases para usar las dos funciones porque si, era un poco extenso. Ahora para demostrar el funcionamiento de todo esto, les pondré situaciones y esas situaciones las convertiremos en líneas de código, el cual se irá construyendo poco a poco. Mira como se pone en práctica :

NOTA : Todo fragmento de código que veas a partir de ahora, debes colocarlo al final del script “options.rpy”, pero dentro del bloque init python.


  • Situación 1 : Declarar un archivo RPA llamado “images” que sea incluido solo en compilaciones destinadas a Windows.

[Screenshot Situación 1]

Al realizar una compilación, esto creará un paquete físico llamado “images.rpa”.


  • Situación 2 : Incluir todos los archivos PNG del juego en el archivo “images”.

[Screenshot Situación 2]

Esto hará que Ren’Py coloque cualquier imagen PNG que encuentre dentro de todas las carpetas de tu juego, en el paquete “images”.


  • Situación 3 : Incluir solo los archivos PNG de una subcarpeta en específico.

[Screenshot Situación 3]

Aquí apuntamos directamente hacia una subcarpeta, así que en el paquete “images” solo se incluirán los PNGs de la subcarpeta “backgrounds”.


  • Situación 4 : Impedir que los archivos RPY, sin importar si están en la carpeta “game” o en alguna subcarpeta, se incluyan en la compilación.

[Screenshot Situación 4]

Al agregar None como segundo argumento, le dirá a Ren’Py que estos archivos no se incluirán en la compilación que se entregará al jugador.

NOTA : Nunca, por nada en el mundo permitas que se compilen los archivos RPY de tu juego, pues esos archivos son el código fuente de tu juego sin compilar (legible para humanos). Si los incluyes en la compilación, le darás más libertad al jugador para modificar tu juego.

Por último en este ítem, dejaré aquí un código más completo que considera múltiples archivos de un juego, excluyendo a otros de la compilación. Podrías usarlo como ejemplo :

[SCREENSHOT : Procedimiento completo recomendado para empaquetar los Assets del juego.]

Y ahora, en el siguiente item nos vamos a hacer pruebas para ver de que esto funciona de verdad. ¡Vamos allá!


3. PRUEBA DE COMPILACIÓN REAL

Este será el ítem donde les mostraré que todo lo que expliqué anteriormente, es efectivamente cierto. En este caso haremos el test con un proyecto llamado “CharlieFuu69 Creations”.
Antes de mostrar el paso a paso para compilar una distribución, les mostraré cómo se ve el interior de la carpeta “game” del proyecto, en estos momentos :

[SCREENSHOT : Vista de la carpeta “game” antes de compilar.]

Y este es el trozo de código que apliqué en options.rpy para empaquetar cosas en este proyecto :

[SCREENSHOT : Código para la compilación de prueba.]

Ahora viene el paso a paso para compilar, seguido de los resultados obtenidos al compilar.


  • Paso 1 : Acciones previas en el proyecto.

[Screenshot Paso 1]

Recuerda que antes de compilar tu juego, debes hacer dos cosas: borrar los datos persistentes, y comprobar si el juego se ejecuta correctamente. De forma adicional puedes usar el Lint para comprobar errores que se te han pasado por alto.
Luego de terminar el procedimiento anterior, en tu Launcher de Ren’Py haz click en “Construir Distribuciones”.


  • Paso 2 : Configuración de compilación.

[Screenshot Paso 2]

En este menú verás las configuraciones para poder acomodar la compilación a tu gusto. En este caso, haremos una compilación que esté unicamente destinada al sistema operativo Windows.
Con todo ya configurado a tus necesidades, haz click en “Construir”. Ahora solo deja que Ren’Py haga tranquilamente su trabajo.


  • Paso 3 : Resultados de la compilación.

[Screenshot Paso 3]

Cuando la compilación finaliza, se abre una ventana del explorador de archivos con un paquete ZIP en su interior. Ese paquete ZIP contiene tu juego preparado para que un usuario final pueda jugarlo. Aquí hice la extracción de la carpeta que contiene el ZIP para mostrarles cómo se ve por dentro.

La carpeta base contiene los siguientes archivos :

[SCREENSHOT : Vista de carpeta base del juego ya construido.]

Ahí encuentras el ejecutable de tu juego (ahora Ren’Py incluye un ejecutable tanto para 32 como 64-bit). En el interior está la carpeta “game” donde se guardan los Assets de tu juego, y pues ahora quiero que veas qué pasó en el interior de esa carpeta :

[SCREENSHOT : Carpeta “game” con los archivos RPA creados.]

Si, se ve más vacía que antes de compilar, y eso se debe a que la mayoría de los recursos del juego fueron colocados en los paquetes “gamedata.rpa”“imagedata.rpa”. Puedes comprobar eso a primera vista con solo ver el tamaño de esos dos paquetes.
Ahora bien, parece que la carpeta “gui” no se empaquetó completamente. Eso pasó por lo siguiente :

Dentro de la carpeta “gui” tenía un par de fuentes tipográficas TTF, que por cierto, nunca las señalé en el código de compilación, así que como no fueron señalados, estos no se empaquetaron pero tampoco fueron excluidos de la compilación.


Con todo esto dicho, damos por finalizado el Post #21 de este hilo donde nuestro objetivo era empaquetar los recursos del juego. Lo he dicho una cantidad inmesurable de veces que si te quedaron dudas, ponte en contacto conmigo en los comentarios o en mi Telegram para así explicarte de una forma más calmada :3

#OffTopic : Perdonenme por el background de mi editor de código, pero no pienso cambiarlo por nada en el mundo. Viva Aqours y Love Live! maldita sea >w<

Mandamiento CharlieFuuniano #1 : NO JODERÁS a tu prójimo por su editor de código, (excepto si usa un White Theme xD).


Mira el código de los posts anteriores en mi repositorio de GitHub!

Eres nuevo? Descarga el motor Ren’Py para que comiences a hacer tu propia Visual Novel!

  • Visita la web oficial de Ren’Py Presionando Aquí!
  • Link para copiar : https://renpy.org/

No has entendido algo sobre este post u otros de este mismo hilo? No dudes en comunicarte conmigo! Contactame mediante los comentarios o en mi Telegram personal!


Hmmm… me pregunto qué haré para el próximo post…

Ahora lo tengo todo más claro. Para el siguiente post haremos un pequeño Web Scrapper en Python para poder extraer la URL final de descarga de un archivo alojado en Mediafire. Esto le vendrá como anillo al dedo para quienes quieren hacer el Sistema de Descargas WGET del Post #18, pero que no pueden (o no quieren) costear un hosting, pues la idea es alojar los archivos en Mediafire, y que el juego sea capaz de obtenerlos.

Muchachos, nos veremos en la próxima entrega de este hilo, así que vayan a picar código maldita sea xD.


Navega entre los posts de este hilo!

<< Ir al Post #20 | ¡El Post #22 estará disponible próximamente!

<< Eres nuevo? Click aquí para ir al Post #1 >>


CharlieFuu69 Creations! – ElectroBasicsYT

  • Tutorial
  • Programación | Programas, aplicaciones
7 Comentarios
  1. Avatar

    Muy buen tutorial, justamente estaba buscando un tutorial sobre esto, me cayó como anillo al dedo, muchas gracias sensei!

    1+
    • ElectroBasicsYT Autor
      ElectroBasicsYT 2 meses

      Me demoré en subirlo, pero ahí tienes. Siempre se recomienda que uses el Launcher de Ren’Py para labores de Modding en juegos Ren’Py. Hacerlo con los archivos sueltos como lo hace casi toda la comunidad de DDLC, es más tedioso.

      Saludos papu >w<

      0
  2. Juani10
    Juani10 2 meses

    Muy completo el tutorial Charly lo que me sorprendió fue lo de los dos asteriscos (**) ya que solo conocía el uso de un solo asterisco para referirse a un conjunto especifico de archivos.

    1+
    • ElectroBasicsYT Autor
      ElectroBasicsYT 2 meses

      Mucho cuidado, porque esto resulta en el entorno de Ren’Py, mas no podría resultar en Python (por ejemplo con el módulo “os”), o un editor de texto, o en el terminal de un dispositivo.
      Puede que esto solo funcione para el diseño interno que tiene Ren’Py.

      Gracias por tu comment =D

      0
  3. Juanjo
    Juanjo 2 meses

    Haci que preferis el IDE oscuro. Blanco te cortas las manos. La tonalidad de gris es una alternativa. Pero los colores oscuros ayudan a descanzar la vista. Por el brillo y demás caracteristicas. Abrazo

    1+

Contesta

CONTACTANOS

Esta es su red social de tecnología para compartir tus ideas y proyectos .Puedes enviarnos un correo si tienes dudas.Nos vemos

Enviando

Inicia Sesión con tu Usuario y Contraseña

o    

¿Olvidó sus datos?

Create Account