Todo lo que necesitas saber antes de empezar a modificar el juego. ¿Alguna vez quisiste hacer que esta pistola de basura fuera más útil? ¿Algo parece estar demasiado dominado para ti? ¿Quieres hacer una máquina de memes invulnerable? ¿O hacer un mod de reequilibrio serio global? Esta guía está ahí para ayudarte.
Descargo de responsabilidad: la guía aún no está completa y algunas secciones no están terminadas o descritas correctamente. El plazo de finalización es indefinido.
Estructura .seria
El juego guarda la mayoría de sus cosas en archivos .seria, ya sea un archivo guardado, de envío o de configuración. Es útil entenderlo antes de pasar a otras cosas.
.seria consta de nodos que están delimitados por paréntesis. Los paréntesis siempre están en una nueva línea y no hay otras cosas en la misma línea. Todos los nodos, excepto la raíz, también tienen un encabezado: algún par de atributo-valor, donde un valor suele ser algún int. El valor del encabezado no debe ser único. Ejemplo de un nodo no raíz (contenido reemplazado por "..."):
m_stats=2051 { ... }
El contenido del nodo puede ser una combinación de lo siguiente:
- Un par atributo-valor
m_child=15 { ... m_classname=Cuerpo ... }
- Un nodo anidado
m_niños=15 { ... m_malla=1073741827 { ... } }
- (Solo para nodos de malla) una secuencia de flotadores
{ m_classname=Mesh m_size=4 -3.53553 5.32097 -3.53553 -5.32097 3.53553 -5.32097 3.53553 5.32098 }
Hablaremos de mallas más tarde.
Los pares de atributo-valor pueden repetir:
m_child=15 { ... m_sectors=1 m_sectors=1 m_sectors=1 m_sectors=1 m_sectors=1 m_sectors=1 #360 entradas "m_sectors" en total... }
Así es como el juego maneja las matrices. Por ejemplo, las entradas de 360 "m_sectors" denotan un disparo o un arco de sensor en un archivo de barco, uno para cada grado.
Si va a analizar/editar .seria, NO HAGA SANGRE NUNCA. Eso romperá el archivo.
Eso es básicamente todo lo que necesita saber antes de analizar un archivo .seria; Los archivos de configuración de partes e incluso los guardados siguen esta estructura, por lo que potencialmente puede modificar los guardados con este conocimiento.
Bibliotecas/OL.seria
OL.seria contiene una primera fracción de los parámetros de los módulos. La mayoría de ellos (si no todos) no requieren mantener sus estados en un archivo guardado, es decir, puede modificarlos y ver los cambios en el juego inmediatamente después de iniciar + cargar un archivo guardado/enviado. También contiene los parámetros que probablemente modificará: tamaño del clip del arma, velocidad de recarga, costo, cantidad de combustible, empuje/consumo del motor y muchos más.
Este es un archivo .seria simple de dos niveles, donde cada parte obtuvo un
m_stats=2051 { ... }
entrada sin nodos anidados. Las entradas potencialmente más interesantes son:
- m_oid es uno de los nombres del módulo interno, bajo el cual se hace referencia en otros archivos. Es bueno aprenderlos para los módulos que vas a modificar.
- m_precio es un precio en oro. Mientras se escribe el costo de un barco en un archivo de barco, el juego lo vuelve a calcular automáticamente después del inicio (al menos para trabajos de barco; no confirmado para el modo campaña).
- m_coste_reparación es un tiempo total de reparación, unidades desconocidas
- m_icon_nombre es un nombre en miniatura. Las miniaturas se registran en archivos Media/Tex/Static*.res.
- m_mdl_crew_necesidad son los requisitos de la tripulación
- m_mdl_ammobox_necesidad son requisitos de munición. Divertidamente, puede establecerse en un valor flotante como 0.5 y funcionará.
- m_mdl_power_necesidad son los requisitos de potencia, kW
- m_arma_carga_cantidad es un clip de munición de arma
- m_weapon_load_time es un acortar Tiempo de recarga en unidades. Unidad = 4/7 (~0.571) segundos. Para aeronaves, este es un tiempo de mantenimiento en horas.
- m_tasa_de_armas es la velocidad de descarga de un clip, rondas por minuto
- m_arma_calibre es un índice de calibre de armas. La estadística principal del arma: se usa un tipo de caparazón.
- m_misiles_explosivos es una carga explosiva de misiles tácticos/arcade.
- m_misiles_ap define cómo pasa el daño a través de la armadura. Solo para misiles, lamentablemente.
- m_launched_health es un misil de salud después del lanzamiento.
- m_launched_range es una gama para aviones/misiles tácticos/arcade. Para activos estratégicos se mide en km.
- m_velocidad_lanzada es una velocidad de mapa global para misiles aéreos/tácticos/arcade (sí) en m/s.
- m_launched_speed2 es una velocidad arcade para aviones/tácticos/misiles arcade (¿parece ser km/h?)
- m_mdl_rotación es una velocidad de rotación de la torreta. No suena tan interesante, pero valores como 1.5 y menores realmente pueden afectar la comodidad de uso del arma. Las unidades parecen ser rad/s.
- recursos_m es un atributo apilable que define cuántos "recursos" se necesitan para construir una pieza (casco/cubierta/blindaje).
La lista está incompleta pero contiene las cosas más importantes.
Bibliotecas/parts.seria
Este archivo contiene otra fracción (más grande y más técnica) de las estadísticas del módulo. Estos se escriben en un archivo de envío/guardado; técnicamente, se clona una entrada parts.seria con algunos cambios menores/atributos adicionales. Eso significa que cualquier cosa que modifique en parts.seria no se transferirá a archivos de envío y guardados ya existentes. Solo las piezas recién recogidas de los talleres navales tendrán nuevas estadísticas.
Hay una manera de actualizar (parcialmente) los archivos de envío: consulte la sección correspondiente.
La estructura del archivo es más compleja:
{ ... #Aspectos técnicos del nodo raíz m_children=15 #Una entrada de ejemplo; hay muchas entradas como esta { atributo_uno=valor_uno atributo_dos=valor_dos ... m_mesh=1073741827 #Las entradas contienen un solo nodo de malla... { ... } atributo_tres=valor_tres ... m_sprites=536870915 #...y uno /múltiples nodos de sprite... { ... } m_sprites=536870915 { ... } m_sprites=536870915 { ... } m_slots=2147483651 #...y cero/uno/múltiples nodos de ranura { ... } m_slots= 2147483651 { ... } opt_attr_one=valor_cuatro opt_attr_dos=valor_cinco ... } ... #Otras entradas del módulo }
Puede tener no solo pares attr=value sino también un nivel adicional de nodos anidados. Los tipos de nodos secundarios son m_mesh (único), m_sprites (múltiple) y m_slots (opcional, múltiple).
Atributos potencialmente interesantes:
- medio es una identificación de nodo. No significa nada por sí mismo, pero es importante realizar un seguimiento si su juego sigue fallando.
- m_master_id es un ID de nodo padre. Si es incorrecto, su juego no se cargará o se congelará en Shipworks.
- m_oid es el mismo m_oid que en OL.seria.
- m_densidad afecta a la masa de un módulo. Más sobre eso a continuación.
- m_masa stat NO ES UNA MASA DE MÓDULO, pero es un número que se utiliza para los cálculos y la visualización de la masa de la GUI.
- m_burn_hp. Supongo que afecta la cantidad de tiempo que tienes para saquear la pieza en el minijuego del lugar del accidente.
- m_salud y m_salud_max son módulo HP. Tenga en cuenta que m_health es el estado actual del módulo, lo que solo tiene sentido en un archivo de envío -> puede ser un estado inicial del módulo.
- m_explosivo es un daño de auge una vez que se destruye este módulo.
- m_rescue_explosivo es si este módulo destruirá otro botín si no es saqueado en el minijuego del lugar del accidente.
- tipo_m_piso es una altura de módulo a lo largo del eje Z. Por ejemplo, los tanques grandes lo tienen configurado en 3.
- m_count es cuántos módulos hay en una tienda. No tiene sentido en parts.seria (será 999 en la mayoría de los casos), pero una vez que se clone una entrada en un archivo guardado, tendrá un valor correspondiente al stock de módulos en una ciudad en particular.
- código_m_espasmo es un atributo repetitivo al final de una entrada. No sé qué hace exactamente (creo que algo con arcos/obstrucciones), pero es bueno considerarlo si desea analizar un archivo correctamente.
mallas
Una estructura de malla es fija:
m_mesh=1073741827 { m_classname=Mesh #Atributo común para (casi) todos los nodos m_size=4 #Cuántos puntos hay en una malla 3.13553 #Cada par de números es un punto Coordenadas X e Y -3.13553 3.13553 3.13553 -3.13553 3.13553 -3.13553 -3.13553 }
Nota: los ejes X/Y están dirigidos a la derecha/abajo respectivamente. Si desea visualizar una malla en el juego, simplemente seleccione una parte y su contorno blanco será su malla.
El juego no tiene ninguna estadística de masa en particular, pero calcula la masa con la fórmula "Mesh Volume * m_density". El volumen de malla es un mínimo (ancho de malla, altura de malla) * área de malla, donde el área de malla se puede calcular con la fórmula de Gauss para polígono. Entonces, si cambiamos un lado de una malla cuadrada (manteniendo su cuadrado), la masa se volverá cúbica; si extendemos el lado más largo de una malla rectangular, la masa crecerá linealmente.
Sprites
La estructura de sprite es un nodo de un nivel con una cantidad variable de atributos (técnicamente, con el mismo pero algunos tienen valores implícitos establecidos).
m_sprites=536870915 { m_classname=Sprite m_code=536870915 #Debe ser igual que un valor de encabezado m_animation_name=ap_07 m_position.y=-7 m_stage=-2 m_mask=0 m_animation_mode=4 m_scale.x=1.4 m_scale.y=1.4 }
Los atributos de los sprites aún no están bien estudiados; Aquí hay algunos que ya conozco:
- m_nombre_animación es un nombre de sprite que está registrado en el archivo Media/Tex/Ships1.res. Aquí hay una entrada del archivo:
Animación ap_07 { textura = Ships1 rect = 3,3,140,140 hotspot = 70,70 zorder = 0.000000 resgroup = 0 frames = 40 }
Una animación puede ser una animación cuadro por cuadro o un solo sprite.
- m_posición.x y m_posición.y son desplazamientos de sprites relativos a los parte Punto cero.
- m_escala.x y m_escala.y son factores de escala de sprites. No se recomienda estirar/comprimir demasiado los sprites, ya que tendrán una resolución demasiado baja o demasiado nítida. Sin embargo, el tramado puede enmascarar problemas de sprites.
- mutilar es una rotación de sprite en rad.
- m_etapa parece ser una capa de sprite O una condición bajo la cual se dibuja un sprite (al pasar el mouse, al colocarlo, …)
Tragamonedas
Las ranuras son accesorios de un módulo. Pueden ser accesorios laterales o accesorios internos (como los que proporciona el casco).
m_slots=2147483651 { m_classname=Ranura m_code=2147483651 #Debe ser igual que un valor de encabezado m_master.id=7246492521041933693 #Debe ser igual que una identificación de parte m_type=5 m_position.x=1.78571 m_position.y=5.4888 }
- posición_m - usted sabe lo que es esto. Se puede configurar según el contorno de la malla. Tenga en cuenta que si coloca una ranura externa dentro de una malla, no funcionará.
- m_tipo es un tipo de ranura: externo, interno, interno grande, … . Hay varios, pero no los he estudiado todavía.
- is_slave. Parece estar configurado en falso para las ranuras internas.
enviar archivos
Los archivos de envío contienen:
- Entradas de módulo muy similares a las de parts.seria
- Entradas conjuntas que definen conexiones entre partes
- Entrada de criatura especial con estadísticas globales del barco.
Un ejemplo (archivo Arcángel):
{ m_classname=Node m_code=7 m_id=-492343618703753414 m_name=Archangel m_children=31 {...} m_children=15 {...} m_children=15 {...} ... m_children=15 {...} m_joints=8589934595 {...} m_joints=8589934595 {...} ... m_joints=8589934595 {...} }
- m_children=15 son nodos parciales
- m_joints=8589934595 son nodos conjuntos
La lista de piezas en el primer nivel anidado no está completa: se trata de pistolas, patas, motores cardánicos y nodos ficticios sin masa ni densidad. El resto de los módulos son hijos del nodo m_children=31:
{ m_classname=Frame m_code=31 m_id=1883400248470934012 m_state=2 m_master_id=-492343618703753414 m_owner_id=-9178736643823363944 m_children=15 {...} m_children=15 {...} ... m_children=15 {...} m_center.x=0.000152588 m_center.y=18.7003 m_mass=7826850.0 m_mesh=1073741827 { m_classname=Mesh m_size=0 } }
El primer nodo hijo m_children=15 allí es único, eso es un puente:
{ m_classname=Body m_code=15 m_id=481579170968876493 m_name=COMBRIDGE ... m_children=47 {...} ... m_mesh=1073741827 {...} ... m_oid=MDL_COMBRIDGE_01 ... m_sprites=536870915 {...} ... m_sprites=536870915 {...} m_slots=2147483651 {...} ... m_slots=2147483651 {...} }
Y finalmente, el nodo m_children=47, que transporta las estadísticas globales del barco:
{ m_classname=Creature m_code=47 ... m_mesh=1073741827 {...} m_layer=0 m_health=10 m_health_lock=true m_ship_name=Archangel m_playable=true m_alignment=1 m_card_caption={align=2}{font=courier_28}ÀÐÕÀÍÃÅË@{font=myriad_10}ÓÄÀÐ. ËÅÃÊÈÉ ÊÐÅÉÑÅÐ m_card_main={align=0}{font=flash_large}ÒßÃÀ/ÂÅÑ: 4@ÑÊÎÐÎÑÒÜ: 190 êì/÷@ÄÀËÜÍÎÑÒÜ: 820 êì@ m_card_arma={align=0}{font=flash_large}ÂÎÎÐÓÆÅÍÈÅ:@004X CANNON 2x57mm@002X CANNON 2x180mm@002X MISSILE m_card_modules=MDL_CANNON_57_2=4,MDL_ENGINE_04=8,MDL_ENGINE_05=2,MDL_CANNON_180_2=2,MDL_MISSILE_01=2, m_bio_caption={align=2}{color=2281701376}{font=courier_28}PROFILE@¹981 m_bio_snapshot=no_photo ... creatureId=2 m_damageCounter=8360 versionCompatibility=Ñîâìåñòèì ñ âåðñèåé 1.15 }
(Los abracadabras son problemas de decodificación cirílica; todo se ve bien en el juego)
Este nodo contiene muchas estadísticas globales de barcos, que definen qué tan lejos/rápido/largo puede volar/ver/ser visto. Es importante saber que no tiene sentido cambiarlos si desea alterar la velocidad del barco, el alcance o la potencia del sensor; estos se utilizan principalmente para cálculos de generación o visualizaciones de GUI. Lo que es realmente importante allí es la bandera m_flagship que puede establecer en "verdadero" si desea que el barco sea reconocido como buque insignia.
Si quieres jugar con las estadísticas de la nave, es mejor cambiar las estadísticas del módulo de la nave y luego obligar al juego a volver a calcular las estadísticas globales. Las entradas del módulo son muy similares a las de parts.seria, con algunas diferencias:
- Armas, sensores, inhibidores, misiles, … (todo lo que tenga un arco) obtiene un atributo repetido m_sectors, 360 entradas por parte. Es uno/cero para armas/misiles, valor de potencia ELINT para ELINT (cero, completo o la mitad si está obstruido) y rango de radar en km para radares (cero/completo/medio).
- Los atributos m_position.*, m_scale.* y m_angle ahora tienen sentido y definen dónde está el módulo en un barco. m_scale se usa para reflejar partes simétricas como piernas/motores.
- Tal vez algunas otras cosas misceláneas que me perdí, ya que evito tocar los atributos tecnológicos
Lea la sección de la guía correspondiente sobre la actualización del barco después de cambiar los valores del módulo.
Guardar archivos
Esta sección está en construcción, ya que estoy estudiando esto en este momento. Pero con una edición guardada, potencialmente puedes hacer:
- Genere grupos enemigos adicionales, altere una composición de los ya existentes
- Cambiar las existencias de la tienda
- Cambiar las cantidades de inteligencia en las ciudades
- Mucho mas
También puede cambiar su bonificación en efectivo allí (atributo del nodo raíz "m_scores", por ejemplo, m_scores=76886) y desbloquear barcos (incluidos los ocultos/sin usar/solo IA) cambiando la bandera correspondiente.
Archivos de localización
Hay dos razones principales para editar archivos de localización:
- Creación de entradas de descripción para piezas/barcos nuevos
- Alterar los resultados de los eventos
Entradas de barcos
Hay dos entradas que quizás desee editar si desea agregar una descripción del barco:
#SHIP_NAME_Nomad Nómada
Se necesita principalmente una entrada "SHIP_NAME_*" para la versión rusa donde permite agregar un nombre de barco cirílico. El "*" debe reemplazarse con un valor de atributo de nodo raíz "m_name" del barco (¿o un "m_ship_name" en las estadísticas globales del barco? En su mayoría son iguales).
#SHIP_DESC_NOMAD Cruceros estratégicos pesados romaníes, que han servido como núcleo de grupos de mando durante décadas. A pesar de su antigüedad, se han sometido a una gran cantidad de actualizaciones y han participado en pruebas de campo de los sistemas AEW de última generación, que se planeó instalar más tarde en los cruceros más nuevos de la clase Sebastopol en construcción.
"SHIP_DESC_*" es lo que está buscando si desea agregar una descripción visible al inicio de la campaña. Tenga en cuenta que un nombre de barco insertado en "*" está en mayúscula allí. También tenga en cuenta que una etiqueta y un texto están separados por tabulaciones y no tienen saltos de línea.
Entradas de piezas
#MDL_CANNON_220 M-22 #MDL_CANNON_220_SDESC CANNON #MDL_CANNON_220_DESC Un cañón de gran calibre de 180 mm con una velocidad de disparo aumentada.
Si desea agregar una entrada de módulo allí, necesitará una entrada para un nombre, tipo y descripción (MDL_*, MDL_*_SDESC, MDL_*_DESC donde * es un módulo m_oid).
Eventos
Los archivos de diálogo también contienen algunas recompensas/penalizaciones que obtienes de los eventos. Si bien algunos resultados están siendo codificados (como nuevos barcos, estancias forzadas, sin reparaciones/reabastecimiento de combustible en una ciudad, …), el efectivo/la reputación/la moral pueden verse alterados allí.
#INTERCOM_FASIL_1 ¿Sí, duque? #INTERCOM_FASIL_0 La guerra es una empresa costosa, ¿no es así, mi duque? #INTERCOM_FASIL_1 Muy bien. Juntaré el dinero. #INTERCOM_FASIL_SHORT Muy bien. Juntaré el dinero.
También puede modificar la "dirección" de un diálogo en términos de sprites/efectos de desvanecimiento.
Fabricación de piezas nuevas
Antes de continuar con la creación de piezas nuevas, indiquemos lo que no podremos hacer:
- No podemos agregar nuevas piezas a los trabajos navales sin reemplazar algo que ya existe.
- No podemos agregar nuevas piezas a las tiendas (* sin guardar la edición)
La canalización es la siguiente:
- Elija un módulo de vainilla que se acerque más a algo que va a hacer
- Duplique su entrada en OL.seria, altere su m_oid y stats
- Vaya a Libraries/constructor.seria (haga una copia de seguridad) y elimine el
m_niños=15 { ... m_oid=ELEMENTO_EMERGENCIA ... }
nodo para liberar algo de espacio.
- Vaya a parts.seria, elija una entrada de módulo estándar y péguela en constructor.seria en lugar de un nodo eliminado.
- Establezca m_oid, m_master_id (!!!importante!!!!, el valor es el valor "m_id" del nodo raíz constructor.seria)
- Modifique las cosas que desee: HP, densidad, masa, …
- No te olvides de la malla de módulos, los sprites, las ranuras.
- Comienza el juego y entra en Shipworks.
Ahora la última categoría de módulo será reemplazada por el módulo que acaba de crear. Tenga en cuenta que no necesita una entrada en parts.seria: una vez que instale una pieza en un barco, se escribirá en un archivo de barco y solo se referirá a OL.seria.
El juego tiene algunos sprites sin usar, pero no hay mucho. OTOH, aún puede crear nuevas imágenes si es creativo con los sprites que ya tiene. Por ejemplo, el cañón M-22 de 180 mm se creó a partir de un sprite Mk-1-180 con un nuevo cañón fabricado con Sprint+flare y un freno de boca fabricado con un bloque de casco.
No olvide crear las entradas correspondientes en los archivos de diálogo, de lo contrario, el nombre y la descripción estarán vacíos.
Reemplazos y actualización de barcos
Otro mod potencial que quizás quieras desarrollar son los reemplazos de naves de vainilla. Los barcos Vanilla se tratan por separado y se guardan en la carpeta Objetos/Diseños. No se pueden eliminar en el juego ni sobrescribir en los trabajos navales.
Reemplazos
Si va a reemplazar un barco de vainilla con el suyo, la tubería es la siguiente:
- Abra tanto los barcos estándar como los personalizados en el editor.
- Cambie el "m_name" del envío personalizado (atributo del nodo raíz) al valor del envío estándar
- Cambie el nombre en "m_card_caption" (sección de estadísticas globales) al nombre de vainilla
- Cambie la estadística "m_ship_name" (sección de estadísticas globales) al nombre de vainilla
- (Opcional) cambie la estadística "m_combatvalue", que afecta la cantidad de instancias del barco que se generarán en las pruebas de los talleres (y tal vez en las guarniciones).
- (Opcional, versiones anteriores) cambie la ruta "m_card_snapshot" (sección de estadísticas globales) a la ruta de la instantánea de vainilla (que también deberá reemplazar)
Tenga en cuenta que a partir de la versión 1.151, el juego no generará instantáneas y las derivará de las estadísticas del barco, por lo que el último paso será redundante y "m_card_snapshot" no estará presente.
Actualización de barcos
Es posible que desee actualizar todos los barcos (incluido Vanilla) después de modificar parts.seria o módulos de envío. Hay 79 barcos de vainilla, así que elige unas vacaciones y comienza desde Archa...
JK, jajaja, hay algunos mecanismos implementados que pretenden ayudarte con eso:
- El juego puede actualizar algunas estadísticas por sí mismo.
- Se pueden escribir scripts de bricolaje para actualizar los archivos del barco.
Si inicia la nueva versión del juego por primera vez, actualizará todo en la carpeta Ships y colocará las copias antiguas en Ships_backup. Lo que vuelve a calcular:
- Arcos de disparo de armas
- Arcos del sensor (puede fallar allí)
- Todas las estadísticas globales
- Densidad/masa (probablemente, no confirmado)
- Elevación (probablemente, no confirmada)
Para obligar al juego a hacer eso, abra Config.ini y cambie el valor “CORE_LAST_LOADED_VERSION=1.15” a uno más antiguo, como 1.14 o 1.1.
Sin embargo, no extraerá todos los datos de parts.seria por sí mismo. Si modificó parts.seria y desea que un barco obtenga nuevos valores, antes de realizar el paso anterior primero debe modificar las entradas de piezas en un archivo de envío. Yo mismo he escrito algunos scripts de Python para eso y los lanzaré pronto.
Entonces, la canalización de actualización del envío es la siguiente:
- Elija un archivo de barco
- Modifique usted mismo / actualice con las entradas de un módulo de secuencia de comandos allí
- Póngalo en la carpeta Ships (haga una copia de seguridad de la carpeta, por si acaso)
- Cambia la versión del juego en Config.ini a una más antigua
- Ejecutar el juego
Conclusión
HF es un juego fascinante y, como todo juego fascinante, la compatibilidad con mods contribuirá significativamente a su ciclo de vida. Asumiendo que es un proyecto favorito de dos personas, votaría por llenar el juego con contenido de los jugadores y centrarme en un amplio soporte de mods por parte de los desarrolladores, como hacen muchos otros grandes juegos (por ejemplo, Rimworld).
Eso es todo lo que estamos compartiendo hoy para este altaflota guía. Esta guía fue originalmente creada y escrita por Amanecer radiante. En caso de que no actualicemos esta guía, puede encontrar la última actualización siguiendo este liga.
¿Qué tipo de parámetros tiene?
¿Y qué pasa con qué programas no están grabando archivos?