Touhou: Fading Illusion

Touhou: Fading Illusion

Not enough ratings
Guía para la creación de mods
By GiMark
En esta guía, puede encontrar toda la información necesaria para crear un mod simple.
   
Award
Favorite
Favorited
Unfavorite
Prefacio
¡Saludos, entusiastas del modding! En esta guía, encontrarás la información básica necesaria para crear un mod. Antes de comenzar a hacer mods, te recomiendo que te familiarices con las reglas para crear contenido de fans.

ADVERTENCIA: Actualmente, la herramienta de carga de mods solo está disponible para usuarios de Windows.

NOTA: Las imágenes en la carpeta de "_game_resources" y algunas partes de esta guía pueden contener spoilers.
Restricciones de contenido
Requisitos del creador de la serie de juegos original
Como Touhou: Fading Illusion es una obra hecha por fans basada en el universe de Touhou Project, tus mods también deben cumplir con los requisitos establecidos por el creador original de la serie de juegos, ZUN. Específicamente, sus mods NUNCA deben incluir:
  • Cualquier cosa que pueda dañar la reputación de Touhou Project.

  • Cualquier cosa que infrinja otra propiedad intelectual.

  • Cualquier cosa que signifique confundir tu contenido de fans con uno de los títulos oficiales de Touhou Project.

  • Cualquier cosa que se extraiga de los juegos oficiales de Touhou Project.

  • Escenas finales de los juegos oficiales de Touhou Project.

  • Cualquier cosa que signifique publicitar creencias personales más allá de los límites de la ficción.

  • Otro contenido de fans de Touhou sin el permiso del creador.

  • Contenido sexual excesivo que se considera ilegal.

  • Cualquier cosa que promueva el odio contra individuos o grupos.

  • Cualquier fotografía del propio ZUN sin el permiso de ZUN.
Puede revisar la lista completa de requisitos en este sitio web[touhou-project.news].

Además, tus mods no deben contener ningún código malicioso. Si no deseas distribuir el código fuente, debes contactarnos y te permitiremos publicar tu mod después de revisar el código fuente de forma privada. Al comenzar a crear un mod, estas confirmando que has leído y aceptado esta advertencia. En caso de violaciones, nos reservamos el derecho de ocultar o bloquear tu mod.

Si tiene alguna pregunta, le sugerimos que se comunique con el servidor Discord de nuestro equipo[discord.gg].
Para comenzar
Bueno, si estás de acuerdo con todo lo mencionado anteriormente, pongámonos manos a la obra. Primero, necesitarás un editor de texto conveniente, ya que trabajarás MUCHO con texto y código. Los archivos ".rpy" con los que estarás tratando, se pueden abrir con el Bloc de notas integrado estándar, pero recomendamos algo más avanzado, como VS Code o Notepad ++. Ambos programas son gratuitos y están disponibles públicamente.

Después de eso, asegúrese de que Touhou: Fading Illusion está instalado en tu computadora y estes suscrito a la official mod, el cual te ayudará a comprender cómo funciona el código y te proporcionará herramientas para cargarlo.
Creando una Carpeta de Mods
Navega a la carpeta de Steam o Librería de Steam en la misma unidad donde está instalado Touhou: Fading Illusion y luego ubica la carpeta en la ruta "steamapps\workshop\content\2132480\3565758917". Esta carpeta debería aparecer tan pronto como descargues nuestro mod.
No te dejes intimidar por los números en los nombres de las carpetas - estos son los identificadores de Steam, y también obtendrás uno para tu mod cuando lo crees.

Dentro de la carpeta de nuestro mod, abre la carpeta "_upload_app" e inicie la aplicación. En la aplicación, ingrese el nombre de su mod en el menú de la izquierda y haga clic en el botón "Create Item" en la esquina inferior izquierda. Después de eso, aparecerá una carpeta para el contenido de su mod en la carpeta WorkshopContent, junto con un archivo llamado *el nombre de tu mod*.workshop.json – este es el archivo que necesitamos (recomendamos guardarlo en algún lugar después de completarlo).
Abra este archivo, copie el valor de la etiqueta "publishedfileid", y cree una carpeta con el mismo nombre en el directorio "steamapps\workshop\content\2132480". Dado que los usuarios descargarán tu mod en esta misma ruta, tiene sentido desarrollarlo directamente en esta ubicación. Crear los archivos mod_info.rpy y script.rpy en la carpeta de su mod, luego abra el archivo mod_info.rpy en la carpeta de nuestro mod usando un editor de texto.
Información del Mod
Dentro de mod_info.rpy, Puedes ver el siguiente código:
init 99 python:
    tfi_official_mod_path = os.path.join(os.path.dirname(os.path.dirname(renpy.config.basedir)), "workshop/content/2132480/3565758917").replace("\\","/")
    global_game_mods["tfi_official_mod"] = {
      "start_scene": "tfi_official_mod_scene1",
      "description": _("This is a tutorial mod that also serves as a template for creating other mods. Open the folder steam/steamapps/workshop/content/2132480/3565758917 to look at the code and images in more detail."),
      "name": _("Tutorial mod"),
      "image": os.path.join(tfi_official_mod_path, "images/preview.png").replace("\\","/"),
    }
Para tu mod, deberás copiar este código en tu propio archivo mod_info.rpy y hacer algunos cambios:
  • Reemplaza tfi_official_mod en el global_game_mods["tfi_official_mod"] con cualquier otro nombre único en caracteres latinos. Este es el identificador de tu mod dentro de los archivos del juego, y para evitar conflictos con otros mods, recomendamos usar el nombre de tu mod en caracteres latinos y luego usarlo para nombrar variables y escenas.

  • Cambia el valor de la variable start_scene – Este es el nombre de la primera escena a la que el jugador hará la transición después de iniciar su mod. Para simplificar, copia el nombre de tu mod mencionado anteriormente y agregale "_scene1" , ya que los nombres de escena también deben ser únicos.

  • La variable description y name son el texto que será visible para los usuarios en el menú de selección de mods del juego. Puedes completarlos como desees, pero ten en cuenta que el espacio es limitado.

  • La variable image es la imagen de vista previa de tu mod, que también se mostrará en el menú de selección de mods. Puedes dejar este campo vacío o eliminarlo por completo si no tiene una imagen, en ese caso, se mostrará un marcador de posición con un signo de interrogación.

Al final, deberías tener algo como esto:

Una vez que hayas terminado con mod_info.rpy, Copie la información de nuestro archivo script.rpy en el tuyo. Analicemos todo el código proporcionado.
Bloque "init:"
Esta sección contiene variables que querrás definir para tu mod. Por ejemplo, el comando "define tfi_official_mod_dev = Character(_('TFI Main Dev'))" crea un nuevo personaje denominado "TFI Main Dev". Puedes crear tantos personajes como quieras, pero asegúrate de que los nombres de las variables de tus personajes sean únicos y no entren en conflicto con nuestras variables o las de otros mods. Recomendamos usar un prefijo único para su mod en los nombres aquí también.

Si un personaje es situacional, puedes omitir la definición de una variable y usar el nombre del personaje directamente antes de su diálogo.
"TFI Main Dev" "Hello!"
"TFI Player" "Hey!"
La siguiente tabla enumera las variables utilizadas actualmente en nuestro juego, a las que puedes consultar según sea necesario. A medida que se introduzcan nuevos personajes en la historia, agregaremos nuevas variables.

Personajes oficiales de la serie de juegos

Name
Tag
Name
Tag
Name
Tag
Name
Tag
Name
Tag
Reimu
rei
Marisa
mar
Byakuren
byak
Rin
orin
Rinnosuke
korin
Yukari
yuk
Mokou
moko
Kanako
kan
Youmu
youmu
Sanae
san
Kasen
kas
Clownpiece
clown
Eirin
eirin
Reisen
reisen
Nazrin
naz
Satori
sat
Utsuho
okuu
Suwako
suwa
Komachi
koma
Eiki
eiki
Chen
chen
Ran
ran
Aya
aya
Yuugi
yuugi
Mima
mima
Mamizou
mami
Sumireko
sum
Meiling
mei
Kokoro
kokoro
Sakuya
sak
Koishi
koi
Remilia
remi
Mizuchi
mizu
Seija
seija
Flandre
flan
Hecatia
heca

Personajes secundarios u originales

Name
Tag
Name
Tag
Name
Tag
Name
Tag
Name
Tag
Girl
girl
Hitomu
hito
Bake-danuki
bake
Rabbit
usausa
Tengu
tengu
Kappa
kappa
Yamaraja
yamaraja
Itime-kozo
itime

La variable "tfi_official_mod_path" sirve como acceso directo a la ruta de la carpeta de tu mod desde la carpeta principal del juego. Si usas imágenes personalizadas, esta variable será útil. Todo lo que necesitas hacer es reemplazar "tfi_official_mod" en el nombre de la variable con el nombre de tu mod, como antes, y actualiza el nombre de la última carpeta en la ruta "workshop/content/2132480/3565758917". Puedes hacer referencia a todos los archivos desde la carpeta "3565758917/_game_resourses" sin usar esta variable, ya que forman parte del juego principal. Sin embargo, para tus archivos únicos, necesitarás incluirlo.
define mod_name_path = os.path.join(os.path.dirname(os.path.dirname(renpy.config.basedir)), "workshop/content/2132480/your_folder").replace("\\","/")
show image("[mod_name_path]/images/your_image1.png")
show image(Transform("images/backgrounds/hakurei_shrine_inter_d1.jpg", zoom=0.5))
Escenas y líneas
Luego viene el comienzo de una escena, definida por una etiqueta a la que se asigna un nombre único. Anteriormente, especificaste la escena inicial como "*your mod*_scene1", Así que ahora reemplaza el nombre de esta etiqueta con él.

Si todo está listo, lo único que queda es idear una trama y escribirla. El texto debe mostrarse en la pantalla en partes para que quepan dentro de la ventana de diálogo. Si el identificador de un personaje se coloca antes de una línea, su nombre se mostrará junto al texto. Si no hay ningún identificador, solo se mostrará el texto.

El juego también admite líneas simultáneas de dos o tres personajes. Todo lo que necesitas hacer es agregar (multiple = 2) or (multiple = 3) a la derecha de la línea:
rei "Buena suerte." (multiple = 2)
mar "Nos vemos." (multiple = 2)
Imágenes
Digamos que has escrito tu diálogo, pero ¿qué pasa con las imágenes? Son un poco más complejos. Recomendamos consultar el relevant section of the RenPy documentation[www.renpy.org] si no encuentras respuestas a tus preguntas en los ejemplos a continuación.

Fondos e imágenes estáticas
Puede mostrar una imagen en la pantalla usando el comando show image("path to image"). Dado que la resolución objetiva del juego es de 1920x1080, y muchas imágenes se crean en resoluciones más altas, deben reducirse usando el comando Transform() antes de ser exhibido. Para los fondos y algunos CG, usamos un factor de escala de 0.5 y para los sprites, 0.6, pero puede usar cualquier valor que prefiera. También se recomienda utilizar el comando scene al comienzo de una escena, que reemplaza todas las demás imágenes.
scene image(Transform("images/backgrounds/human_village1_m.jpg", zoom=0.5))
show image(Transform(tfi_official_mod_reimu_happy, zoom=0.6))

Sprites dinámicos
Además de esto, en Touhou: Fading Illusion, usamos algunos métodos RenPy no estándar para optimizar el juego o agregar nuevas posibilidades de dirección. Específicamente, agregamos una nueva capa en el sistema de visualización de imágenes donde se muestran los sprites de personajes en capas.

En nuestro mod, puedes ver el siguiente código:
$ chars = 2
$ elems = 13
$ scale = 0.6

$ pict_ = [
["none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png",],
["none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png","none.png",],
]

$ pict_1 = [
[
"none.png",
"none.png",
"none.png",
"sprites/Sakuya/sak_body1.png",
"sprites/Sakuya/sak_body1_brow1.png",
"sprites/Sakuya/sak_body1_eyes1_d.png",
"sprites/Sakuya/sak_body1_mouth2.png",
"sprites/Sakuya/sak_body1_leftarm2.png",
"sprites/Sakuya/sak_body1_rightarm6.png",
"none.png",
"none.png",
"none.png",
"none.png",
],
[
"none.png",
"none.png",
"none.png",
"sprites/Nazrin/naz_body1.png",
"sprites/Nazrin/naz_body1_brow1.png",
"sprites/Nazrin/naz_body1_eyes5_f.png",
"sprites/Nazrin/naz_body1_mouth18.png",
"sprites/Nazrin/naz_body1_arms1.png",
"none.png",
"none.png",
"none.png",
"none.png",
"none.png",
],
]

$ xp = [111000, 111000, 111000]
$ yp = [-130, -130, -130]
$ copy()
show screen _Pers_ onlayer add_l
Aquí, puedes ver cómo se ensamblan los sprites de Sakuya y Nazrin en el código: usamos renderizado en capas para cambiar fácilmente las expresiones faciales o las posiciones de las manos sin limitar las variaciones. Antes de especificar elementos de sprite específicos, debes definir las variables chars (Número de personajes), elems (Número de elementos), y scale (Factor de escala de sprites), y también asignar matrices similares a los sprites a la variable pict_, pero con imágenes "none.png".

Las posiciones de los sprites se establecen mediante dos variables – xp y yp, que controlan el posicionamiento horizontal y vertical, respectivamente. Estas variables se pueden configurar individualmente para cada sprite, por ejemplo, xp[1] = …, o para todos los sprites a la vez usando una matriz, como se muestra en el ejemplo, xp = […, …, …].

Además, este método utiliza una capa separada para mostrar sprites: "show screen _Pers_ onlayer add_l". Esta capa está delante de la capa estándar para imágenes, por lo que los sprites siempre aparecerán delante de todas las demás imágenes. Si deseas mostrar una imagen frente a los sprites, deberá agregar "onlayer add_l".

Sin embargo, todo esto es opcional, y puedes preensamblar un solo sprite a partir de capas, asignarlo a la variable pict_1 de manera similar, y luego cambiar a cualquier otro sprite, o usar métodos estándar de RenPy.

El siguiente código muestra ejemplos de cómo cambiar elementos de sprite o mostrar un sprite Reimu "completo" de los archivos del mod.
$ pict_[0][4] = "sprites/Sakuya/sak_body1_brow3.png" # 4
$ pict_[0][5] = "sprites/Sakuya/sak_body1_eyes3_f.png" # 5
$ pict_[0][6] = "sprites/Sakuya/sak_body1_mouth6.png" # 6
$ pict_[0][7] = "sprites/Sakuya/sak_body1_leftarm3.png" # 7
$ pict_[0][8] = "sprites/Sakuya/sak_body1_rightarm1.png" # 8

$ pict_[1][4] = "sprites/Nazrin/naz_body1_brow3.png" # 4
$ pict_[1][5] = "sprites/Nazrin/naz_body1_eyes3_f.png" # 5
$ pict_[1][6] = "sprites/Nazrin/naz_body1_mouth10.png" # 6
$ pict_[1][7] = "sprites/Nazrin/naz_body1_leftarm1.png" # 7
$ pict_[1][8] = "sprites/Nazrin/naz_body1_rightarm4.png" # 8

hide image(Transform(tfi_official_mod_reimu_happy, zoom=0.6))

show image(Transform(tfi_official_mod_reimu_sad, zoom=0.6)):
    xalign 0.8
    yalign -0.1
with dissolve

Cambios de color
También tiene la opción de cambiar el esquema de color de una imagen usando la función blur() con tres parámetros – hue, brightness, y saturation. Por ejemplo, blur(image, 320, 120, 100) cambiará el tinte a 320, el brillo a 120, y saturación a 100 para la imagen.
$ pict_[0][3] = blur("sprites/Sakuya/sak_body1.png", -10, -0.22, 0.9) # 3
$ pict_[0][4] = blur("sprites/Sakuya/sak_body1_brow3.png", -10, -0.22, 0.9) # 4
$ pict_[0][5] = blur("sprites/Sakuya/sak_body1_eyes3_f.png", -10, -0.22, 0.9) # 5
$ pict_[0][6] = blur("sprites/Sakuya/sak_body1_mouth6.png", -10, -0.22, 0.9) # 6
$ pict_[0][7] = blur("sprites/Sakuya/sak_body1_leftarm3.png", -10, -0.22, 0.9) # 7
$ pict_[0][8] = blur("sprites/Sakuya/sak_body1_rightarm1.png", -10, -0.22, 0.9) # 8
Efectos
RenPy admite una variedad de efectos visuales para imágenes que aparecen o desaparecen. Es posible que hayas notado que muchos comandos en los ejemplos proporcionados terminan con "with dissolve". Esto se usa para hacer que las imágenes aparezcan o desaparezcan con una transición de 1-segundo en lugar de instantáneamente. También hay otra versión incorporada, dissolve_f, que dura 0.25 segundos y se usa al cambiar los elementos de los sprites para evitar prolongar demasiado el tiempo de juego. Puedes crear tu propia versión de transición utilizando una variable similar:
define dissolve_five = Dissolve(5) # a 5-second transition
En su mayor parte, usamos solo estos, pero puede usar otros efectos que se aplican de manera similar. Puedes leer más sobre los efectos en RenPy documentation[www.renpy.org].
Música y Sonidos
Puedes reproducir o detener música usando el comando renpy.music.play y el comando renpy.music.stop. Después de especificar la ruta del archivo, puedes indicar el canal en el que se reproducirá la pista, así como el efecto para iniciar o desvanecer la pista.
$ renpy.music.play("sounds/ambience/crowd_medium1.ogg", channel="music_2", synchro_start=True, fadein=2.0)
$ renpy.music.stop(channel="music_2", fadeout=1.5)
Hay tres canales para la música – music, music_1, and music_2, al igual que un canal para la reproducción de sonido por una sola vez – sound.
Opciones
Hemos modificado el menú de elección estándar para mostrar no solo las opciones posibles, sino también la pregunta planteada al jugador. Para mostrar la pregunta, debe actualizar la variable menu_question:
$ menu_question = _("¿Necesitas una ronda extra?")

$ quick_menu = False
window hide dissolve

menu:
    with dissolve
    "Sí, Por favor!":
      $ quick_menu = True
      window show dissolve
      jump tfi_official_mod_scene1
    "Nah, lo tengo.":
      $ quick_menu = True
      window show dissolve
Uso de variables
Puede usar variables, por ejemplo, para realizar un seguimiento de las elecciones del jugador. Las variables pueden ser textuales (= "one"), numéricos (= 1), o lógicos (= True), y puede manipularlos usando diferentes condiciones, como if o for. Puede leer más sobre las variables en relevant section of the RenPy documentation[www.renpy.org].
$ menu_question = _("Uno o dos?")

menu:
    with dissolve
    "Uno!":
      $ mod_name_player_choice = 1
      jump mod_name_scene_player_pick_one
    "Dos!":
      $ mod_name_player_choice = 2
      jump mod_name_scene_player_pick_two
if your_mod_condition == 2:
    jump destitute1_scene2_5
else:
    jump destitute1_scene1_5
Traducción
NOTE: Algunos miembros de nuestro equipo han expresado estar dispuestos a traducir mods que les gustan además del juego principal, por lo que si estás interesado, puedes comunicarte con ellos en nuestro servidor de Discord[discord.gg].

Si planeas crear un mod en varios idiomas, deberás generar archivos de traducción. Para generarlos, debes descargarlos en RenPy 8.3.7[www.renpy.org], Especifique la ruta del juego en la configuración y genere una traducción al idioma deseado.
Puede traducir no solo líneas de diálogo, sino también variables y nombres de personajes: para hacer esto, incluya el texto entre comillas _(...) al declarar la variable:
define tfi_official_mod_dev = Character(_('TFI Main Dev'))
Sin embargo, te advertimos que algunas variables pueden causar errores, por lo que se recomienda generar solo los archivos de traducción para las líneas de diálogo, que requieren un identificador de traducción, mientras que el texto traducible en sí sirve como identificador para las variables.
# línea traducible
translate english prologue_scene_0_89ef4bf6:
    "La humanidad siempre ha tenido miedo a lo desconocido."

# variable traducible
Traducir hilos en español:
    old "Продолжение следует..."
    new "Continuará..."
Después de generar, mueva la carpeta tl a la carpeta de tu mod y rellena los campos de traducción en todos los archivos nuevos.
También recomendamos crear un menú similar al comienzo de tu mod para que los usuarios sepan qué idiomas están disponibles y que están absolutamente disponibles.
menu:
    with dissolve
    "{font=fonts/Merriweather-Regular.ttf}Я хочу играть на Русском{/font}":
      $ renpy.change_language("russian")
    "{font=fonts/Merriweather-Regular.ttf}Quiero jugar en español{/font}":
      $ renpy.change_language("Español ")
    "{font=fonts/SourceHanSansCN-Regular.otf}{size=26}以简体中文开始{/size}{/font}":
      $ renpy.change_language("schinese")
    "{font=fonts/NotoSansJP-Regular.ttf}{size=26}日本語でプレイする{/size}{/font}":
      $ renpy.change_language("japanese")
Al momento de escribir esta guía, el juego actualmente admite 9 idiomas: Ruso (russian), Inglés (english), Francés (french), Español (spanish), Portugués brasileño (portuguese), Chino tradicional (tchinese), Chino simplificado (schinese), Coreano (korean), y Japonés (japanese). Si usas un idioma que no usa los alfabetos de ninguno de estos idiomas, deberás incluir nuevas fuentes en tu mod.
Características Adicionales
Trabajar con la Cámara
Dado que los personajes se muestran en una pantalla separada, deberás mover esta pantalla simultáneamente con la capa de cámara estándar si deseas acercar o alejar la imagen.
cámara:
    perspective True
    gl_depth True
    zpos -1100 xpos -375 ypos -380
    easein 3.0 zpos 0 xpos 0 ypos 0
show layer add_l:
    perspective True
    gl_depth True
    zpos -1100 xpos -375 ypos -380
    easein 3.0 zpos 0 xpos 0 ypos 0

Pantalla de Hora y Fecha
El juego incluye una función incorporada para mostrar una pantalla con la ubicación, la fecha y la hora, en caso de que su historia también implique dividir los eventos en días y horas.
$ date_place = _("Muenzuka")
$ date_date = _("18 de Abril del 2018")
$ date_time = _("Por la noche, unas horas más tarde")
show screen date with dissolve

Pantalla de carga
Si el "reensamblaje" o los cambios de color de los sprites son significativos, pueden causar un ligero retraso en el juego, ya que RenPy necesita tiempo para procesar y colocar todas las imágenes individualmente en la pantalla. Para que esos momentos sean menos notorios, creamos una pantalla de transición con el texto "Girls are praying…". Para activarlo, debes usar el comando show screen loading seguido por hide screen loading. Para transiciones suaves, ocultamos y luego mostramos las ventanas de diálogo con los siguientes comandos.
$ quick_menu = False
window hide dissolve

$ quick_menu = True
window show dissolve
Probando el Mod
Antes de publicar tu mod, debes asegurarte de que funciona correctamente. El modo de desarrollador puede ayudar con esto. Para activarlo, agrega el siguiente código en tu bloqueinit :
define config.developer = True
define config.default_developer = True
Ahora, si presionas la combinación de teclas Shift + R, El juego se volverá a cargar en el mismo punto cada vez que se realicen cambios en los archivos. Esto significa que puedes editar rápidamente tu código y ver inmediatamente los resultados. Sin embargo, elimínalo antes de cargar el mod.
Subiendo el Mod
Una vez que haya completado todos los pasos, deberás:
1. Colocar los archivos mod en la carpeta mod dentro de la aplicación de carga. No olvides la imagen de vista previa, que debe ser cuadrada y de al menos 500x500 píxeles de resolución.
2. Ingresar toda la información necesaria. Recomendamos mover toda la carpeta _upload_app a algún lugar fuera de la carpeta 2132480 para evitar conflictos con los archivos de otros mods en el futuro.
3. Agregar un comentario y hacer clic en el botón Submit. Toda la información ingresada se guardará en tu archivo .workshop.json.

Si tienes alguna otra pregunta, te sugerimos que la escribas en los comentarios de esta guía para que podamos actualizar la información. Esperamos que todo salga bien, ¡y buena suerte en la creación de literatura de calidad!