Tudo o que você precisa saber antes de começar a modificar o jogo. Sempre quis fazer esta arma de lixo mais útil? Algo parece ser muito forte para você? Quer fazer uma máquina de memes invulnerável? Ou fazendo um mod de rebalanceamento sério global? Este guia está aí para ajudá-lo.
Isenção de responsabilidade: o guia ainda não está completo e algumas seções não estão finalizadas/descritas adequadamente. O prazo de conclusão é indeterminado.
.seria Estrutura
O jogo mantém a maioria de suas coisas em arquivos .seria – seja um save, um arquivo de envio ou uma configuração. É útil entendê-lo antes de passar para outras coisas.
.seria consiste em nós delimitados por parênteses. Os parênteses estão sempre em uma nova linha e não há outras coisas na mesma linha. Todos os nós, exceto a raiz, também têm um cabeçalho – algum par atributo-valor, onde um valor é tipicamente algum int. O valor do cabeçalho não deve ser exclusivo. Exemplo de um nó não raiz (conteúdo substituído por “…”):
m_stats=2051 { ... }
O conteúdo do nó pode ser uma combinação do seguinte:
- Um par atributo-valor
m_children=15 { ... m_classname=Corpo ... }
- Um nó aninhado
m_children=15 { ... m_mesh=1073741827 { ... } }
- (Somente para nós de malha) uma sequência de flutuadores
{ m_classname=Mesh m_size=4 -3.53553 5.32097 -3.53553 -5.32097 3.53553 -5.32097 3.53553 5.32098 }
Falaremos sobre malhas mais tarde.
Os pares atributo-valor podem se repetir:
m_crianças=15 { ... m_setores=1 m_setores=1 m_setores=1 m_setores=1 m_setores=1 m_setores=1 #360 "m_setores" entradas no total ... }
É assim que o jogo lida com arrays. Por exemplo, 360 entradas “m_sectors” denotam um disparo ou um arco sensor em um arquivo de navio, um para cada grau.
Se você for analisar/editar .seria, NUNCA RECUAR. Isso quebrará o arquivo.
Isso é basicamente tudo o que você precisa saber antes de analisar um arquivo .seria; arquivos de configuração de peças e até mesmo saves seguem essa estrutura, então você pode potencialmente modificar os saves com esse conhecimento.
Bibliotecas/OL.seria
OL.seria contém uma primeira fração dos parâmetros dos módulos. A maioria deles (se não todos) não requer manter seus estados em um arquivo salvo, ou seja, você pode alterá-los e ver as mudanças no jogo imediatamente após a inicialização + carregar um arquivo salvar/enviar. Ele também contém os parâmetros que você provavelmente ajustará - tamanho do pente da arma, velocidade de recarga, custo, quantidade de combustível, empuxo/consumo do motor e muito mais.
Este é um arquivo .seria simples de dois níveis, onde cada parte tem um
m_stats=2051 { ... }
entrada sem nós aninhados. As entradas mais potencialmente interessantes são:
- m_oid é um dos nomes de módulos internos, sob os quais está sendo referido em outros arquivos. É bom aprendê-los para os módulos que você vai ajustar.
- m_preço é um preço em ouro. Enquanto o custo de um navio está sendo gravado em um arquivo de envio, o jogo o recalcula automaticamente após o início (pelo menos para navios; não confirmado para o modo de campanha).
- m_repair_cost é um tempo total de reparo, unidades desconhecidas
- m_icon_name é um nome de miniatura. As miniaturas são registradas em arquivos Media/Tex/Static*.res.
- m_mdl_crew_need são requisitos da tripulação
- m_mdl_ammobox_need são requisitos de munição. Curiosamente, pode ser definido como um valor flutuante como 0.5 e funcionará.
- m_mdl_power_need são requisitos de energia, kW
- m_weapon_load_amount é um clipe de munição de arma
- m_weapon_load_time é um clipe tempo de recarga em unidades. Unidade = 4/7 (~0.571) segundos. Para aeronaves, este é um tempo de manutenção em horas.
- taxa_de_arma_m é uma velocidade de descarga do clipe, rodadas por minuto
- m_weapon_caliber é um índice de calibre de arma. A principal estatística da arma – um tipo de projétil usado.
- m_míssil_explosivo é uma carga explosiva de míssil tático/arcade.
- m_missile_ap define como o dano passa pela armadura. Apenas para mísseis, infelizmente.
- m_launched_health é uma saúde de míssil após o lançamento.
- intervalo_m_launched é um alcance para mísseis de aeronaves/táticos/arcade. Para ativos estratégicos é medido em km.
- m_launched_speed é uma velocidade global do mapa para mísseis de aeronave/tático/arcade(sim) em m/s.
- m_launched_speed2 é uma velocidade de arcade para mísseis de aeronaves/táticos/arcade (parece ser km/h?)
- m_mdl_rotation é uma velocidade de rotação da torre. Parece não tão interessante, mas valores como 1.5 e inferiores podem realmente afetar o quão confortável é a arma de usar. As unidades parecem ser rad/s.
- m_recursos é um atributo empilhável que define quantos “recursos” são necessários para construir uma peça (casco/deck/armadura).
A lista está incompleta, mas contém as coisas mais importantes.
Bibliotecas/peças.seria
Este arquivo contém outra fração (maior e mais técnica) de estatísticas do módulo. Eles estão sendo escritos em um arquivo ship/save – tecnicamente, uma entrada parts.seria está sendo clonada com algumas pequenas alterações/atributos adicionais. Isso significa que qualquer coisa que você alterar no parts.seria não será transferido para arquivos de envio já existentes e salvos. Apenas peças recém-colhidas dos navios terão novas estatísticas.
Existe uma maneira de atualizar (parcialmente) os arquivos de envio – veja a seção correspondente.
A estrutura do arquivo é mais complexa:
{ ... #Root node tech stuff m_children=15 #Um exemplo de entrada; existem muitas entradas como esta { attribute_one=value_one attribute_two=value_two ... m_mesh=1073741827 #As entradas contêm um único nó de malha... { ... } attribute_three=value_three ... m_sprites=536870915 #...and one /vários nós de sprite... { ... } m_sprites=536870915 { ... } m_sprites=536870915 { ... } m_slots=2147483651 #...e zero/um/vários nós de slot { ... } m_slots= 2147483651 { ... } opt_attr_one=value_four opt_attr_two=value_five ... } ... #Outras entradas do módulo }
Ele pode ter não apenas pares attr=value, mas também um nível adicional de nós aninhados. Os tipos de nó filho são m_mesh (único), m_sprites (múltiplos) e m_slots (opcional, vários).
Atributos potencialmente interessantes:
- m_id é um ID de nó. Não significa nada por si só, mas é importante acompanhar se o seu jogo continua travando.
- m_master_id é um ID de nó pai. Se estiver errado, seu jogo não será carregado/congelará nos navios.
- m_oid é o mesmo m_oid que em OL.seria.
- m_densidade afeta a massa de um módulo. Mais sobre isso abaixo.
- massa_m stat NÃO É UMA MASSA DE MÓDULO, mas é um número usado para cálculos e exibição de massa da GUI.
- m_burn_hp. Suponho que isso afeta quanto tempo você tem para saquear a parte no mini-jogo do local do acidente.
- m_saúde e m_health_max são módulo HP. Observe que m_health é o estado atual do módulo que faz sentido apenas em um arquivo de envio -> pode ser um estado inicial do módulo.
- m_explosivo é um dano à lança quando este módulo é destruído.
- m_rescue_explosive é se este módulo destruirá outro saque se não for saqueado no mini-jogo do local do acidente.
- m_floor_type é uma altura do módulo ao longo do eixo Z. Por exemplo, tanques grandes o definem como 3.
- contagem_m é quantos módulos existem em uma loja. Não faz sentido em parts.seria (será 999 na maioria dos casos), mas uma vez que uma entrada é clonada em um arquivo salvo ela terá um valor correspondente ao estoque do módulo em uma determinada cidade.
- m_spasmcode é um atributo de repetição no final de uma entrada. Não sei exatamente o que ele faz (acho que algo com arcos/obstrução), mas é bom considerar se você deseja analisar um arquivo corretamente.
malhas
Uma estrutura de malha é fixa:
m_mesh=1073741827 { m_classname=Mesh #Atributo comum para (quase) todos os nós m_size=4 #Quantos pontos existem em uma malha 3.13553 #Cada par de números é um ponto X e coordenadas Y -3.13553 3.13553 3.13553 -3.13553 3.13553 -3.13553 -3.13553 }
Nota: os eixos X/Y são direcionados para a direita/para baixo respectivamente. Se você quiser visualizar uma malha no jogo, basta selecionar uma parte e seu contorno branco será sua malha.
O jogo não tem nenhuma estatística de massa específica, mas calcula a massa com a fórmula “Mesh Volume * m_density”. O volume da malha é um min(largura da malha, altura da malha) * área da malha, onde a área da malha pode ser calculada com a fórmula de Gauss para polígono. Então, se mudarmos um lado de uma malha quadrada (mantendo seu quadrado), a massa crescerá cúbica; se estendermos o lado mais longo de uma malha retangular, a massa crescerá linearmente.
Sprites
A estrutura sprite é um nó de um nível com uma quantidade variável de atributos (tecnicamente, com os mesmos, mas alguns têm valores implícitos definidos).
m_sprites=536870915 { m_classname=Sprite m_code=536870915 #Deve ser igual ao valor do cabeçalho 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 }
Os atributos do sprite ainda não estão bem estudados; aqui estão alguns que eu já conheço:
- m_animation_name é um nome de sprite que está registrado no arquivo Media/Tex/Ships1.res. Aqui está uma entrada do arquivo:
Animação ap_07 { textura = Ships1 rect = 3,3,140,140 hotspot = 70,70 zorder = 0.000000 resgroup = 0 frames = 40 }
Uma animação pode ser uma animação quadro a quadro ou um único sprite.
- m_posição.x e m_posição.y são deslocamentos de sprite em relação ao parte Zero pontos.
- m_escala.x e m_escala.y são fatores de escala de sprite. Não é recomendado esticar/apertar muito os sprites, pois eles terão resolução muito baixa/nitidez demais. O pontilhamento pode mascarar problemas de sprite.
- ângulo_m é uma rotação do sprite em rad.
- m_palco parece ser uma camada de sprite OU uma condição sob a qual um sprite está sendo desenhado (ao passar o mouse, ao ser colocado, …)
Caça-níqueis
Slots são anexos de um módulo. Eles podem ser anexos laterais ou internos (como os fornecidos pelo casco).
m_slots=2147483651 { m_classname=Slot m_code=2147483651 #Deve ser igual a um valor de cabeçalho m_master.id=7246492521041933693 #Deve ser igual a um ID de peça m_type=5 m_position.x=1.78571 m_position.y=5.4888 }
- m_posição - você sabe o que é isso. Pode ser configurado com base no contorno da malha. Observe que se você colocar um slot externo dentro de uma malha, ele não funcionará.
- tipo_m é um tipo de slot – externo, interno, interno grande, … . Existem vários, mas ainda não os estudei.
- is_slave. Parece ser definido como falso para slots internos.
Arquivos de envio
Os arquivos do navio contêm:
- Entradas de módulo muito semelhantes às de parts.seria
- Entradas conjuntas que definem as conexões entre as peças
- Entrada de criatura especial com estatísticas globais do navio
Um exemplo (arquivo Arcanjo):
{ 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 são nós de parte
- m_joints=8589934595 são nós de junção
A lista de peças no primeiro nível aninhado não está completa - são armas, pernas, motores suspensos e nós fictícios sem massa e densidade. O resto dos módulos são filhos do nó 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 } }
O primeiro nó filho m_children=15 é único – isso é uma ponte:
{ 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 {...} }
E finalmente – o nó m_children=47, que transporta as estatísticas globais do navio:
{ 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 }
(Os abracadabras são problemas de decodificação cirílico; tudo parece bem no jogo)
Este nó contém muitas estatísticas globais do navio, que definem quão longe/rápido/longo ele pode voar/ver/ser visto. É importante saber que não faz sentido alterá-los se você deseja alterar a velocidade, o alcance ou a força do sensor da nave; estes são usados principalmente para cálculos de spawn ou visualizações de GUI. O que é realmente importante é a bandeira m_flagship que você pode definir como “true” se você quiser que o navio seja reconhecido como um navio-almirante.
Se você quiser mexer nas estatísticas do navio, é melhor alterar as estatísticas do módulo do navio e forçar o jogo a recalcular as estatísticas globais. As entradas do módulo são muito semelhantes às do parts.seria, com algumas diferenças:
- Armas, sensores, jammers, mísseis, … (tudo com um arco) recebe um atributo de repetição m_sectors, 360 entradas por peça. É um/zero para armas/mísseis, valor de potência ELINT para ELINT (zero, cheio ou metade se obstruído) e alcance do radar em km para radares (zero/cheio/meio).
- Os atributos m_position.*, m_scale.* e m_angle agora fazem sentido e definem onde está o módulo em uma nave. m_scale está sendo usado para refletir partes simétricas como pernas/motores.
- Talvez algumas outras coisas que eu perdi, já que evito tocar nos atributos técnicos
Leia a seção do guia correspondente sobre a atualização do navio depois de alterar os valores do módulo.
Salvar arquivos
Esta seção está em construção, pois estou estudando isso no momento. Mas com uma edição salva você pode fazer:
- Gere grupos inimigos adicionais, altere a composição dos já existentes
- Alterar estoques da loja
- Alterar valores de inteligência nas cidades
- Muito mais
Você também pode alterar seu bônus em dinheiro lá (atributo de nó raiz “m_scores”, por exemplo, m_scores=76886) e desbloquear navios (incluindo ocultos/não usados/somente IA) lançando uma bandeira correspondente.
Arquivos de localização
Há dois motivos principais para editar arquivos de localização:
- Fazendo entradas de descrição para novas peças/navios
- Alterando os resultados dos eventos
Entradas de navio
Existem duas entradas que você pode editar se quiser adicionar uma descrição do navio:
#SHIP_NAME_Nomad Nômade
Uma entrada “SHIP_NAME_*” é necessária principalmente para a versão russa, onde permite adicionar um nome de navio cirílico. O “*” deve ser substituído por um valor de atributo do nó raiz “m_name” do navio (ou um “m_ship_name” nas estatísticas globais do navio? Eles são basicamente os mesmos).
#SHIP_DESC_NOMAD Cruzadores estratégicos pesados Romani, que servem como núcleo de grupos de comando há décadas. Apesar de sua idade, eles passaram por uma extensa quantidade de atualizações e participaram de testes de campo dos sistemas AEW de última geração, que foram planejados para serem instalados posteriormente nos mais novos cruzadores da classe Sevastopol em construção.
“SHIP_DESC_*” é o que você procura se quiser adicionar uma descrição visível no início da campanha. Observe que um nome de navio conectado em “*” é capitalizado lá. Observe também que uma tag e um texto estão sendo separados por tabulações e não possuem novas linhas.
Entradas de peças
#MDL_CANNON_220 M-22 #MDL_CANNON_220_SDESC CANNON #MDL_CANNON_220_DESC Um canhão de 180 mm de grande calibre com maior cadência de tiro.
Se você quiser adicionar uma entrada de módulo lá, precisará de uma entrada para um nome, tipo e descrição (MDL_*, MDL_*_SDESC, MDL_*_DESC onde * é um módulo m_oid).
Eventos
Os arquivos de diálogo também contêm algumas recompensas/penalidades que você recebe dos eventos. Enquanto alguns resultados estão sendo codificados (como novos navios, estadias forçadas, sem reparos/reabastecimento em uma cidade, …), dinheiro/rep/moral pode ser alterado lá.
#INTERCOM_FASIL_1 Sim, duque? #INTERCOM_FASIL_0 A guerra é um empreendimento caro, não é, meu duque? #INTERCOM_FASIL_1 Muito bem. Vou juntar o dinheiro. #INTERCOM_FASIL_SHORT Muito bem. Vou juntar o dinheiro.
Você também pode ajustar uma “direção” de diálogo em termos de sprites/efeitos de fade.
Fazendo novas peças
Antes de continuarmos fazendo novas peças, vamos denotar o que não poderemos fazer:
- Não podemos adicionar novas peças aos navios sem substituir algo que já existe
- Não podemos adicionar novas peças nas lojas (* sem salvar a edição)
O pipeline está a seguir:
- Escolha um módulo vanilla que seja mais próximo de algo que você vai fazer
- Duplique sua entrada em OL.seria, altere seu m_oid e estatísticas
- Vá para Libraries/constructor.seria (faça um backup) e remova o
m_children=15 { ... m_oid=ITEM_EMERGENCY ... }
nó para liberar algum espaço.
- Vá para parts.seria, escolha uma entrada de módulo vanilla e cole-a em constructor.seria em vez de em um nó excluído.
- Defina m_oid, m_master_id (!!!importante!!!!, o valor é o valor do nó raiz constructor.seria “m_id”)
- Altere as coisas que você quer – HP, densidade, massa, …
- Não se esqueça da malha do módulo, sprites, slots.
- Comece o jogo e entre em navios
Agora a última categoria de módulo será substituída pelo módulo que você acabou de criar. Observe que você não precisa de uma entrada em parts.seria – assim que você instalar uma peça em um ship, ela será escrita em um arquivo ship e fará referência apenas a OL.seria.
O jogo tem alguns sprites não utilizados, mas não há muito. OTOH, você ainda pode criar novos visuais se for criativo com os sprites que já possui. Por exemplo, o canhão M-22 180mm foi criado com base em um sprite Mk-1-180 com um novo cano feito de Sprint+flare e um freio de boca feito de um bloco de casco.
Não se esqueça de criar entradas correspondentes nos arquivos de diálogo, caso contrário o nome e a descrição ficarão vazios.
Substituição e atualização de navios
Outro mod em potencial que você pode querer desenvolver são as substituições de navios de baunilha. Os navios Vanilla são tratados de forma separada e são mantidos na pasta Objects/Designs. Eles não podem ser excluídos no jogo nem substituídos nas obras.
Replacements
Se você for substituir um navio vanilla pelo seu próprio, o pipeline é o seguinte:
- Abra os navios vanilla e personalizados no editor
- Altere o “m_name” do navio personalizado (attr do nó raiz) para o valor do navio vanilla
- Altere o nome em “m_card_caption” (seção de estatísticas globais) para o nome vanilla
- Altere a estatística “m_ship_name” (seção de estatísticas globais) para o nome vanilla
- (Opcional) altere a estatística “m_combatvalue”, que afeta quantas instâncias do navio aparecerão em testes de naves (e talvez em guarnições).
- (Opcional, versões antigas) altere o caminho “m_card_snapshot” (seção de estatísticas globais) para o caminho do instantâneo vanilla (que você também precisará substituir)
Observe que a partir da versão 1.151 o jogo não gerará instantâneos e os derivará das estatísticas do navio, portanto, a última etapa será redundante e o “m_card_snapshot” não estará presente.
Atualização do navio
Você pode querer atualizar todos os navios (incluindo o vanilla) depois de ajustar parts.seria ou enviar módulos. Existem 79 navios de baunilha, então escolha férias e comece de Archa…
JK, lol, existem alguns mecanismos implementados que visam ajudá-lo com isso:
- O jogo pode atualizar algumas estatísticas por si só
- Os scripts DIY podem ser escritos para atualizar os arquivos do navio
Se você iniciar a nova versão do jogo pela primeira vez, ela atualizará tudo na pasta Ships e colocará as cópias antigas em Ships_backup. O que ele recalcula:
- Arcos de disparo de armas
- Arcos do sensor (pode falhar lá)
- Todas as estatísticas globais
- Densidade/massa (provavelmente, não confirmada)
- Elevação (provavelmente, não confirmada)
Para forçar o jogo a fazer isso, abra o Config.ini e altere o valor “CORE_LAST_LOADED_VERSION=1.15” para algum mais antigo, como 1.14 ou 1.1.
No entanto, ele não extrairá todos os dados do parts.seria sozinho. Se você modificou o parts.seria e deseja que uma nave obtenha novos valores, antes de realizar o passo acima você precisa alterar as entradas de peças em um arquivo de envio primeiro. Eu escrevi alguns scripts Python para isso sozinho e os lançarei em breve.
Portanto, o pipeline de atualização do navio é o seguinte:
- Escolha um arquivo de envio
- Altere você mesmo/atualize com as entradas do módulo de script lá
- Coloque-o na pasta Ships (faça um backup da pasta, apenas no caso)
- Altere a versão do jogo no Config.ini para uma mais antiga
- Execute o jogo
Conclusão
HF é um jogo fascinante e, como qualquer jogo fascinante, um suporte a mods contribuirá significativamente para seu ciclo de vida. Supondo que seja um projeto de estimação para duas pessoas, eu votaria para preencher o jogo com conteúdo de jogadores e focar em um amplo suporte de mods por desenvolvedores, como muitos outros grandes jogos (por exemplo, Rimworld) fazem.
Isso é tudo o que estamos compartilhando hoje para isso Alta Frota guia. Este guia foi originalmente criado e escrito por Amanhecer radiante. Caso não consigamos atualizar este guia, você pode encontrar a atualização mais recente seguindo este link.
Você pode configurar o módulo para configurar o jogo?
e se você quiser, com que programa de programa não foi aberto?