These weeks in Veloren 248
6/13/2025 Post original
Vamos voltar para o vagão do blog, carregados de correções, kits e diversão sazonal. Espero que não tenha muita bagagem para pegar o trem da i18n.
- horblegorble, colaborador do TWiV
Trabalho do colaborador
Obrigado a todos que contribuíram com o veloren nas últimas semanas: @drunicornthe1, @Crabo, @unii, @juliancoffee, @isse, @horblegorble, @do-no-van, @walpo, @xMAC94X, @Knightress_Paladin, @coffee-compiler, @Caigh, @imbris, @floppy e @srpapinha.
Obrigado aos tradutores do Weblate que contribuíram nas últimas semanas:
| Linguagem | Tradutores |
|---|---|
| tcheco | Janez |
| Inglês | evgenkot | Arriona |
| Francês | Limina |
| Alemão | compilador de café |
| coreano | juliancoffee |
| russo | evgenkot | caesarrxx | LevmurDev | MBKenny | Arriona | Trauvel | Manifure | LuckyCoin | Carrotism | lucius_pilgrim | VVolsha |
| ucraniano | juliancoffee | Akumo33 | ministroganso | Sinari | Gelado | lomkada | Karaya | DDmytroO |
Trabalho mesclado
Mudanças tagarelas
Você é um tagarela que adora ter várias conversas ao mesmo tempo, mas o atrito da troca de marchas está te atrasando? @drunicornthe1 conhece essa sensação — e sabe o que fazer a respeito. Para o primeiro pedido de fusão, eles colocaram as mãos na sujeira da caixa de câmbio para ajustar a troca de modo de transmissão. Agora, a sensação é de dirigir um carro de corrida, com a barra de espaço como a alavanca de troca de marchas ágil.
Limpe a desordem e mantenha a mensagem
GitLab: !4849 ✨
@Crabo abriu a janela de bate-papo para que pudéssemos ir direto para o wiki do Veloren:
Adicionei o comando /wiki . A ideia surgiu de um problema no GitLab criado em setembro de 2020. Foi fácil de implementar porque ele usa REST para delegar a busca e o redirecionamento para o próprio wiki. Estou começando a ver mais pessoas usando-o para direcionar os novatos para as páginas wiki corretas. Eu digo às pessoas para digitarem "/wiki receitas" e "/wiki armas" o tempo todo.

Respostas na ponta dos dedos
Tenha em mente que o wiki é conduzido pela comunidade e nem sempre acompanha o fluxo de desenvolvimento.
Laboratório Git: !4823
Malabarismo com machado
Talvez seja necessário recalibrar seu estilo de jogo de faca no palito, com combo menor para diversas habilidades e mudanças na destruição feroz.

Fazendo outro ato de equilíbrio
Vamos detalhar os ajustes do @unii:
- reduções combinadas: antepara, capotamento, execução, redemoinho, correnteza
- Destruição feroz com uma mão: dano reduzido
- Destruição feroz de duas mãos: dano aumentado, alcance reduzido, custo de energia aumentado
As descrições de habilidades relacionadas a combos também foram atualizadas para que seus valores numéricos sejam separados dos arquivos i18n. Isso é uma bola a menos no ar para futuros malabaristas.
GitLab: !4850
Corrigindo fontes
Se parecia que o estilo voxel de Veloren estava indo longe demais em algumas línguas, @juliancoffee concordaria. A visão de todos esses blocos ativou seu instinto de mineração, e ele brandiu a picareta de codificação para revelar suas verdadeiras formas:
Ajustamos um pouco nossas fontes.
TL;DR: Idiomas latinos complexos, como norueguês ou tcheco, agora podem ser renderizados corretamente. O árabe também pode ser renderizado. Você não pode mais usar convert_utf8_to_ascii , pois o removemos.

Escultura de picareta de alta fidelidade
Para uma explicação mais aprofundada, cada idioma tinha 5 fontes anexadas:
-
Alkhemikal, fonte super chique. -
OpenSans, fonte super genérica. Cyri, que acredito que significa cirílico, é usada como fonte regular para a maioria dos textos que você vê na tela.-
Wizard, não utilizado. -
Metamorph, não utilizado.
Removemos as fontes Wizard e Metamorph , que não eram utilizadas, e substituímos OpenSans por GoNotoCurrent.ttf . O objetivo da OpenSans é ser uma fonte universal para informações formais onde queremos a cobertura mais completa, por exemplo, em bate-papos. No entanto, ela não abrangia muitos idiomas, então a substituímos por outra fonte que agora abrange quase tudo, exceto coreano. E, como essa é a fonte que deve ser a mesma para todos os idiomas, ela é adicionada por padrão, sem necessidade de especificá-la no manifesto do idioma.
Além disso, adicionamos EnterCommand do Font End Dev, que é um pouco diferente, mas suporta mais caracteres latinos, então considero isso uma vitória. Ah, e definimos a fonte GoNotoCurrent como fonte regular para árabe. O quão bom será o suporte para idiomas RTL ainda está para ser visto, eu sei que não é o ideal, mas pelo menos podemos renderizá-lo agora. Ah, e adicionei os caracteres ґ Ґ à nossa fonte Cyri , agora sou um artista 👀
GitLab: !4875
Não precisa gritar
@isse tem estado muito ocupado, corrigindo todos os tipos de peculiaridades na base de código.
Os NPCs da cidade podem economizar sua voz com distâncias de interação muito mais razoáveis.

Boombox -> caixa de voz
Os dirigíveis retornam às suas posições normais de atracação, aliviando a pressão sobre os joelhos dos jogadores.

Não mais processo de embarque com mola
A exploração de cavernas volta a ser uma aventura subterrânea, à medida que seus marcadores aparecem escondidos no mapa.

Vamos chamar isso de prática inicial para mapas detectáveis
Mas espere, tem mais!
- itens arremessáveis recebem um som de captura
- NPCs de cidades desertas podem direcioná-lo para oficinas de artesanato
- entradas de cavernas alagadas têm menos probabilidade de serem marcadas no mapa
- o uso de posições de personagens interpoladas torna mais fácil realizar interações em alta velocidade, por exemplo, com sprites em dirigíveis
Equipando-se
Se você tem alergia a narrações que quebram a enésima parede, volte agora. É o @horblegorble com as informações sobre os carregamentos:
O empório /kit expandiu seu catálogo de suprimentos para aventuras com uma variedade de novidades, trajes e bombas. Alguns são novos na loja, enquanto outros são pacotes personalizados de produtos já existentes. Como sempre, basta exibir seu crachá de administrador na porta para desbloquear a experiência de compras ilimitada! Novos clientes podem querer pegar uma sacola "Buraco Negro do Administrador" antes de se perderem pelos corredores. Uma sacola de cortesia está incluída no pacote /kit debug .

Saque em abundância
Para aqueles curiosos sobre detalhes mais adiante na cadeia de suprimentos, aqui está uma olhada nos ajustes na especificação e geração de armas modulares para configurações de kit e carregamento.
KitSpec::ModularWeapon foi dividido por sufixo nas variantes Set e Random , que geram (respectivamente) um conjunto completo de armas compatíveis ou uma única arma escolhida aleatoriamente. O tratamento da destreza manual foi ajustado para aplicar corretamente o argumento " hands opcional em todas as combinações de componentes primários e secundários. Com essas duas mudanças, /kit pirate pôde ser configurado para fornecer duas espadas de uma mão selecionadas aleatoriamente. A compatibilidade de mão também foi aplicada a ItemSpec::ModularWeapon para carregamentos, o que fez com que os Grim Salvagers se mantivessem fiéis à sua especialização de martelos de duas mãos. Chega de contrabandear uma arma de uma mão que fosse próxima o suficiente e encerrar o jogo.
Parabéns ao @juliancoffee pelos conselhos sobre o processo de codificação, assim como ao @Tarhun e ao @Sam pelos comentários da avaliação.
Em uma nota de manutenção (e onde esta solicitação de mesclagem começou), os novos conjuntos de armaduras metálicas multimodelo agora têm nomes e ordenação consistentes em seus arquivos .vox . Isso organizou os manifestos .ron e, espera-se, mitigue a recorrência de algumas confusões de índice que surgiram de modificações de copiar e colar.
GitLab: !4798
Melhores vigas
@do-no-van sempre ouviu que era vantajoso ter um conjunto de habilidades completo, mas descobriu que os ataques de raio estavam indo longe demais com essa recomendação. Mais especificamente, a situação ficou um pouco estranha quando o raio foi adicionado ao alcance nominal. Depois de um pequeno ajuste, as coisas se encaixaram muito melhor.
Cuidado com o vão
GitLab: !4869
Um iter para governar todos eles
Tudo começou com a criação das Grandes Estruturas de Dados. Campos foram dados às Estruturas; imortais, os mais simples e pontudos de todos os seres. Variantes dos Lordes Enum, grandes casadores e sindicalizadores dos salões de dois pontos. E características... Características foram concedidas à Raça dos Tipos, que acima de tudo deseja rigor.
Pois dentro dessas estruturas estavam vinculados os endereços de memória e a montagem para governar cada abstração. Mas todos eles foram enganados, pois outra abstração foi criada. Na terra da Ucrânia, nas chamas de Neovim, o Senhor das Trevas @juliancoffee forjou, em segredo, macros declarativas para enumerar todas as outras. E nessas macros ele despejou toda a sua cafeína, seu rust-fu e sua vontade de iterar todas as variantes:
Ok, isso é algo super técnico, mas, ei, é um blog de desenvolvimento. Deixe-me apresentar algumas macros nas quais tenho trabalhado, com a ajuda do @imbris.
Bem, você [talvez] saiba que pode definir enum em Rust:
enum Dir { Up, Down, }Digamos que você tenha alguma função que assumeenum Dir { Up, Down, }
Dir como saída, então seria legal testá-lo automaticamente em todos Dirs e verificar se não gera erros ou algo do tipo. Só que você não pode obter todos Dirs , pois o Rust não oferece essa funcionalidade...
Exceto que você pode escrever essa funcionalidade sozinho com um pouco de magia negra, reescrevendo o código Rust em tempo de compilação. Um desses reescritores mágicos é o strum crate, que estamos usando, que gerará um método iter() que fará exatamente isso. Infelizmente, strum não consegue lidar com nada mais complexo.
Digamos que você queira aninhar estas enumerações:
enum Boost { Health, Gravity(Dir), }Você esperaria obterenum Boost { Health, Gravity(Dir), }
Boost::Health , Boost::Gravity(Dir::Up) , Boost::Gravity(Dir::Down) , mas strum não irá gerá-los, porque... não irá.
Então, criei uma macro que os geraria. E isso não é tudo. E se você não tiver apenas enum ? E se você tiver alguma struct sobre a qual queira iterar?
enum Species { Butterfly, Bird } enum BodyType { Male, Female } struct Body { species: Species, body_type: BodyType, }
Bem, essa é outra macro que adicionei, que gera todas as combinações possíveis desses Bodies , que conteriam versões masculinas e femininas para Butterflies e Birds . E se já temos isso, por que não aplicamos exatamente a uma enumeração em nossa base de código: Body , que define todas as "entidades" possíveis que podemos ter. Por entidade, quero dizer algo abstrato, mas inclui tudo, de humanoides a coelhos, até mesmo itens, objetos e dirigíveis. Mas não fogueiras, que também são entidades, mas bem, especiais.
Então, este MR adiciona a função Body::iter , que fornece uma lista de todas as entidades possíveis. Como um bônus, ele também gera algumas constantes, como o número de tipos que uma enumeração possui ou, se você pedir gentilmente, também fornece todas as variantes possíveis. Infelizmente, esta última função não funciona com enumerações aninhadas.
enum_iter! { ~const_array(ALL) #[derive(Eq, PartialEq, Debug)] enum Shade { Good, Meh, Bad, } } // it is, in fact, three kinds, as you can see assert_eq!(Shade::NUM_KINDS, 3); // and these shades are really what you'd expect const ALL_SHADES: [Shade; Shade::NUM_KINDS] = Shade::ALL; assert_eq!(ALL_SHADES, [Shade::Good, Shade::Meh, Shade::Bad]);Tudo isso é feito usando as chamadas macros declarativas ou macros por exemplo, que são poderosas o suficiente para realizar o que acabei de mostrar, mas ainda não são tão convenientes de escrever (ou usar) em comparação com tipos mais poderosos de macros: as macros procedurais. Essas macros não apenas reescrevem seu código, como também permitem que você escreva o código para criar um novo código.enum_iter! { ~const_array(ALL) #[derive(Eq, PartialEq, Debug)] enum Shade { Good, Meh, Bad, } } // it is, in fact, three kinds, as you can see assert_eq!(Shade::NUM_KINDS, 3); // and these shades are really what you'd expect const ALL_SHADES: [Shade; Shade::NUM_KINDS] = Shade::ALL; assert_eq!(ALL_SHADES, [Shade::Good, Shade::Meh, Shade::Bad]);
No futuro, planejamos criar versões alternativas usando macros procedurais, e eu pessoalmente gostaria de lançá-las para o ecossistema Rust em geral.
GitLab: !4843
Fazendo fotos de identificação
Quer você queira criar cartazes de procurados, um futuro bestiário ou estabelecer um banco de dados para uma distopia de vigilância, a expansão do img_export para NPCs feita pelo @isse resolve o seu problema.

Escolha seu lutador
Aqui está um exemplo simples que lhe dará tudo de uma vez:
E outra com alguns detalhes interessantes: cargo run --bin img_export -- --all-npcs
Isso lhe dará uma imagem para todos os caminhos de NPC que contêm 'viajante', com um cargo run --bin img_export -- --all-npcs --filter traveler --seed 0 20 Valor seed para controlar características aleatórias. Observe que o argumento scale posicional final é aplicado a uma imagem de 10x10, portanto, o padrão de 20 resulta em uma saída de 200x200. O comando pode ser executado a partir do diretório veloren superior de um repositório Git , com a saída salva em uma pasta img-export .
Se você estiver procurando por resultados perfeitos em pixels, esteja ciente de que ainda há algumas pequenas falhas na renderização em resoluções mais baixas.
GitLab: !4871
Não fique confuso

Conheça seu repositório
Espelho, espelho meu, na nuvem; por que minhas alterações não são permitidas?
Famoso é o teu git commit;
mas espere, esse gatinho não é ele.
As orelhas não conseguem esconder o tentáculo.
Infelizmente, vulpes vulpes é onde você se encaixa.
Uma chicotada para ti, que não dá atenção à nota de @walpo:
Devido ao feedback dos usuários, @walpo e @xMAC94x atualizaram os repositórios espelho no GitHub para evitar confusão com os repositórios reais. As mudanças são:
- Novas solicitações de pull são fechadas automaticamente.
- Alguns recursos desses repositórios foram desabilitados para fazê-los parecer "menos reais".
Lembrem-se, pessoal, o desenvolvimento ocorre no GitLab, e não no GitHub!
GitLab: !4853 + !4857 + !4859 + !4868 + !4870
UI pegajosa
Com uma leve reformulação do @Crabo, as barras de rolagem de artesanato estão se sentindo muito mais confiantes para se destacarem diante do mouse. Isso também inspirou a seção de rodapé a abandonar a fase descalça e adotar uma "barra de botas" para uma delimitação mais organizada.

Um pouco de clareamento nas bordas
GitLab: !4801
Todos a bordo do trem i18n
Esquivando-se do fator ônibus

Baseado em uma história real
Olhos de faróis cortam a noite. Um rugido baixo ressoa pelas mandíbulas do radiador. Todos avançando em sua direção com 7 toneladas de fúria. A estrela do show está pronta, mas @juliancoffee quer sair deste suspense de fúria ao volante:
Então, havia um problema de fator de barramento com nosso sistema i18n, pois, francamente, eu provavelmente era a única pessoa que entendia completamente como ele funcionava e como interagir com ele, então, decidi consertar esse problema.
Este guia abrange:
- todas as caixas i18n (ou bem, aquelas que importam, estou fingindo que i18n-helpers não existe, porque)
- melhores práticas e como tornar as UIs localizáveis adequadamente
- alguns exemplos simples
(Ah, e a propósito, adicionei uma seção sobre fontes em "Gerenciando o Weblate", que foi inspirada na postagem acima.)
Como devo te chamar?
Eles já foram conhecidos por muitos nomes, flutuando no anonimato enquanto chefe após chefe os convocava. Depois de todos esses anos de serviço ingrato e anônimo, @juliancoffee finalmente lhes dá algo com que possam se identificar.

Uma história de convocações
GitLab: !4883
De volta à garrafa
Alguns itens de polimento estavam transbordando de poder, ansiosos para despejar informações no seu inventário. @Knightress_Paladin os manteve na linha, removendo uma concatenação duplicada e separando as informações de duração. Pelo menos esse trabalho foi mais fácil do que colocar pasta de dente de volta no tubo.

Não chore pela poção derramada
Todas as outras carruagens
- localizou algumas mensagens comerciais - @coffee-compiler !4862
- mudou "gigas frost" para "frost gigas" em inglês i18n - @Crabo - !4865
- arquivos HUD
.ftlconsolidados que ainda não são componentes no weblate - @coffee-compiler - !4820 - nomes de jogadores localizados na interface de troca - @Caigh - !4880 ✨
- comando
/playerslocalizado - @Caigh - !4882 - traduções mescladas do Weblate - @juliancoffee - !4884
-
CommandResultlocalizado em voxygen - @Caigh + @juliancoffee !4893
Novos nomes, velhas histórias
Peguem seus marshmallows e acomodem-se perto da fogueira. @juliancoffee tem uma história para contar:
Ok, nem sei por onde começar.
Agora podemos traduzir nomes de NPCs! 🥳

O atalho para obter um 'novo' cargo
Resumo
Para desenvolvedores:
- em
assets/common/npc_names.rono campogenericfoi alterado para representar uma chave i18n - em
assets/common/entity, o nome agora usaTranslatecom uma chave i18n
Para desenvolvedores e tradutores:
- animais agora são traduzidos assim:
name-body-quadruped_medium-lion = .fem = Lioness .masc = Lion- nomes de profissões e outros são traduzidos de forma idêntica:
name-custom-village-hunter = .fem = Huntress .masc = Hunteros objetos não têm nenhuma informação de gênero, então eles solicitam apenas um atributo:name-custom-village-hunter = .fem = Huntress .masc = Hunter
-
neut
name-custom-dungeon-cultist-turret = .neut = Possessed TurretE, francamente, era um MRname-custom-dungeon-cultist-turret = .neut = Possessed Turret
[Solicitação de Mesclagem] com uma diferença relativamente pequena, apenas 1.977 linhas adicionadas e 665 removidas. O sistema de internalização viu diferenças maiores.
Mas é o que me traz muita alegria, porque de certa forma é a última internacionalização do MR.
Uma última internacionalização, SR. Percorremos um longo caminho.
Um começo
Quando entrei no projeto, por volta de abril de 2021, uma boa quantidade de trabalho foi investida na tradução do Veloren, e a maior parte da interface do usuário pôde ser traduzida por meio do nosso sistema interno de arquivos .ron (arquivos de configuração semelhantes a json para Rust). Até oferecemos suporte a fallbacks caso o seu idioma atual não tivesse todas as suas strings traduzidas (agradecimentos a @Christof ). Funcionou bem, mas obviamente tinha suas limitações; afinal, é apenas um armazenamento de chave-valor. Você pede um "sim" traduzido e recebe um "Sim" em troca. Ou "Oui", ou "Ja", ou "Так", ou "はい". Você entendeu. Fica complicado quando você quer passar alguns valores ou até mesmo agir de forma ligeiramente diferente dependendo desses valores; por exemplo, você não quer acabar em uma situação em que um item custa "uma moeda".
Então, no início de agosto de 2022, corrigimos o problema. Adotamos um novo formato: Fluent , criado pela Mozilla. Era bastante semelhante em seu fluxo ao nosso sistema existente, mas, ao mesmo tempo, era superexpressivo, provavelmente o formato mais expressivo naquela época e até hoje. Você pode ler mais sobre isso em um post de blog sobre o assunto ou no documento RFC , que descreve rapidamente como tudo funciona. (Acho que o RFC é o mais legal, mas você pode decidir por si mesmo 😉 )
O Fluent é um formato interessante e já é motivo suficiente para adotá-lo, mas havia mais do que isso. Primeiro, havia um problema com a experiência de tradução em si. Na época, se você quisesse adicionar localização ao seu idioma, tinha que passar pelo mesmo procedimento que todos os desenvolvedores usam: criar uma conta no Gitlab, aprender a trabalhar com o Git, criar uma solicitação de mesclagem, possivelmente gerenciar sua ramificação caso precisasse de atualização... não era fácil.
Então, para resolver esse problema, escolhemos o Weblate . É um serviço web que oferece uma interface mais humana e um sistema de gerenciamento aprimorado. A migração levou algum tempo, e devo agradecer @walpo e @fnetx por nos ajudarem; não foi fácil. Assim como ao projeto Codeberg pela hospedagem. No momento, estamos usando-o para todas as traduções.
A história de dois mundos
Estávamos trabalhando na criação e no aprimoramento da estrutura interna para localização, mas devo mencionar uma limitação significativa dessa estrutura. Você só pode traduzir uma mensagem para um idioma se souber para qual idioma traduzir. E embora fosse possível extrair essas informações do cliente que você está usando (e hoje fazemos isso para exibir as regras do servidor), não seria tão conveniente quanto seria necessário criar praticamente dois sistemas de localização. Em vez disso, tivemos a ideia de avaliação atrasada de mensagens. Eu poderia reivindicar a ideia aqui, mas o crédito vai para @zesterer quando ele implementou o tipo Content enquanto trabalhava em mensagens de NPCs. O processo é simples: em vez de fornecer ao cliente a string final, fornecemos a ele uma chave para uma string e o contexto necessário para avaliar essa chave.
Isso significa que agora você pode traduzir não apenas a interface do usuário. Agora você pode traduzir tudo.
Começamos com as traduções das mensagens dos PNJs, continuamos com os comandos do servidor, itens e, finalmente, as profissões dos PNJs e os nomes dos animais. E, neste ponto, traduzimos praticamente tudo o que havia. Claro, há coisas que esquecemos aqui e ali, mas é uma questão de alguém que está passando por problemas de iniciante e implementando as partes que ficaram de fora. Você, caro leitor, também pode fazer isso .
Entre em contato comigo no Discord ou no Zulip , provavelmente poderei te ajudar. E se você for tradutor e perceber que algo está faltando no jogo e não houver problemas para isso, sinta-se à vontade para criar um (não se esqueça de adicionar a tag wg:translation ).
O futuro
Então, qual seria o próximo capítulo da internacionalização do Veloren? Com nossa cobertura quase completa, precisamos preencher pequenas lacunas, provavelmente também implementar i18n para plugins e focar em melhorias de qualidade de vida. Quem sabe até contribuir para o Weblate?
Mas se eu tivesse que desenhar um grande tema, diria uma palavra: Gênero.
É um tópico complexo, mas isso o torna ainda mais empolgante. E acho que vou compartilhar algumas reflexões com vocês. Para começar, já temos uma base (um pouco instável) para construir. Confira assets/voxygen/i18n/it/hud/chat.ftl :
hud-chat-connection_lost = { $user_gender -> [she] Connessione persa. Verrai scollegata tra { $time } secondi. *[he] Connessione persa. Verrai scollegato tra { $time } secondi. }
Eu não leio italiano, mas aposto que você teria ainda mais dificuldade com o exemplo ucraniano, então tenha paciência. Você pode ver o poder do Fluent aqui: cada mensagem não pode simplesmente emendar argumentos passados a ela, mas também pode agir sobre eles. O que é especialmente útil para números, já que o Fluent suporta todo o padrão Unicode para eles, mas também pode ser usado para outras coisas.
Quase todas as strings no chat têm um ou mais argumentos que especificam o atributo de gênero de um ator no contexto. Neste caso, verificamos se o gênero do usuário é masculino - usamos uma forma; se o gênero do usuário é feminino - usamos outra. ( scollegata vs scollegato ). (Se não soubermos, usamos o masculino por padrão neste caso, é para isso que serve * )
E se você for ao início desse arquivo, os nomes de NPCs seguem um padrão semelhante, exceto que aqui empregamos uma tática diferente. O motivo é que em ambos os casos "combinamos" por gênero, mas não é o mesmo tipo de gênero. Há mais de um gênero; na verdade, há mais de dois. Como você pode imaginar, hud-chat-connection_lost em inglês não tem correspondências. Isso porque o inglês carece quase completamente do conceito de gêneros gramaticais . Ele tem o conceito de sexo e o conceito de gênero. Afinal, temos todos os pronomes.
No entanto, a palavra "left" (esquerda) é a mesma, seja "she" (ela) que saiu, seja "he" (ele), seja "they" (ele) ou mesmo "it" (ele). Não existe "scollegata" (escolha) e "scollegato" (scollegato). E o mais importante: embora a maioria das línguas tenha um conceito semelhante de sexo e gênero, por não ser propriamente uma questão linguística, o conceito de gênero gramatical pode ser completamente diferente, então não poderíamos simplesmente expor um atributo para lidar com tudo.
A propósito, se você ainda está se perguntando o que quero dizer com gênero gramatical, deixe-me explicar rapidamente. Em algumas línguas, cada palavra tem um gênero. Na maioria das línguas europeias, isso influencia o artigo e a terminação da palavra. Assim, "gato" em alemão seria "die Katze", o que declara que gatos são inerentemente femininos. Em espanhol, "o gato vermelho" seria "el gato rojo", enquanto "a flor vermelha" seria "la flor roja". E assim por diante. Leia a página da Wikipédia sobre isso se quiser saber mais.
Com tudo isso, defino três conceitos que precisamos considerar: sexo, gênero social e gênero gramatical.
Eles estão interligados, e estamos mais interessados em gênero social (para nomes e coisas do tipo) e gramatical (para todo o resto). Infelizmente, neste momento, temos apenas um: sexo, que em nossa base de código chamamos de BodyType , uma enumeração binária para Masculino e Feminino. Precisamos estender esse sistema, criar o conceito de gênero social para jogadores e PNJs e, então, descobrir uma maneira de inferir ou definir o gênero gramatical. O desafio reside no fato de que as regras gramaticais de gênero são totalmente diferentes para cada idioma, então será divertido .
Vou terminar por aqui. Sinta-se à vontade para acessar nossas edições do Zulip ou do Gitlab se tiver alguma ideia.
GitLab: !4829
Zulip: [análise] Nome i18n !4829
Mais mudanças:
- link de patrocínio atualizado no github - @walpo - !4852
- modelo de Nível de Detalhe (LoD) reorientado para as Catacumbas de Haniwa - @horblegorble - !4844
- solidificou o piso da masmorra de Myrmidon - @floppy - !4855
- classificações de qualidade de itens atualizadas para receitas, bombas e poções médias - @horblegorble - !4867
- o reorient express continuou com modificadores para ataques à distância - @srpapinha - !4861
- reverteu alguns commits duplicados para um histórico mais limpo - @juliancoffee - !4876
- entrada de manifesto de armadura fixa para mãos de guarda anãs - @horblegorble - !4878
- verificações
git lfslimitadas para corrigir o uso de ponteiros - @imbris - !4879 - substituiu matrizes de strings por enumerações para seções de diário e árvores de habilidades - @coffee-compiler - !4888
- totens rotacionados invocados pelo Chefe Gnarling para enfrentar seu alvo - @horblegorble - !4887
Trabalho não mesclado em andamento
(Re)julgamento pelo fogo

A máquina a vapor hipercrítica — por @Necti
A codificação de @do-no-van e o balanceamento de @Necti foram postos à prova na segunda rodada de testes do Spicy Gigas. O grandalhão enfrentou jogadores e PNJs; felizmente, toda a comoção não queimou o servidor de @isse.

Pilares piréticos — @horblegorble
Viajantes se unem em Gigas — @horblegorble
Discussões
Começaram as guerras de armazenamento
@Knightress_Paladin escreveu o mais novo capítulo da antologia Veloren RFC, com uma ode às bolsas, aos bancos e às caixas. Considerando os diferentes caminhos a percorrer, eles traçaram e articularam um curso a seguir, juntamente com os perigos do terreno. Tudo para chegar a um único destino: um lugar para todas as coisas, sejam elas necessárias ou inovadoras.
Vamos dar uma olhada por dentro:
- Por jogador, armazenamento persistente baseado na cidade em estruturas de 'banco'
- Pode transferir entre personagens por meio de estoques
- Alternar a interface do mapa para mostrar os estoques ativos
- Motivações
- Pode dedicar seu inventário a um passeio específico, liberando espaço para pegar coisas novas e brilhantes
- Destrona o tamanho da bolsa de inventário de ser a estatística principal
- Os desenvolvedores têm alguma liberdade para adicionar itens sem sobrecarregar os jogadores
- O embaralhamento do site transfere automaticamente os estoques para a cidade mais próxima
- Feito no momento do login do jogador, para evitar a deriva em vários embaralhamentos
- Possível sistema de entrega para aliviar o trabalho de realocação de itens após a reorganização do local
- Diferenciando entre assentamentos subterrâneos e acima do solo no futuro
- Perguntas abertas
- Como decidir quais cidades têm armazenamento? Por exemplo, requer uma doca para dirigíveis
- Como os NPCs interagem com o sistema de armazenamento?
- Deve haver roubo de armazenamento e entregadores?
- Possibilidades futuras
- Melhorias no armazenamento em cada cidade (capacidade, segurança?)
- Pode variar de taxas únicas até a incorporação em um sistema de busca
- Influências de facção/sentimento
- Fora do escopo no momento, mas provavelmente influenciará as coisas no futuro
- Alinhamentos entre cidades podem aumentar custos de entrega
- Vários assentamentos podem ter seus próprios sistemas de preços e taxas
- O alinhamento não amigável pode significar custos iniciais/baseados em tempo para armazenamento
- O assentamento hostil não deve receber itens após uma reorganização do site
- Melhorias no armazenamento em cada cidade (capacidade, segurança?)
Embora a implementação de um recurso de armazenamento persistente forneça a área de preparação para inventários baseados em peso (ou outros enfraquecimentos de inventário), não é desejável que isso aconteça antes que as questões de armazenamento sejam devidamente resolvidas. Não queremos acabar com o pior dos dois mundos.
Contando bichinhos
O céu aberto rompe a sombra da copa das árvores quando você entra na clareira. Diante de você, uma visão que deixa perplexa a mente ecológica: meia dúzia de lobos, amontoados em um rebanho de ovelhas. Nenhum dos dois se importa com o outro. Como sempre foi, mas talvez não em um futuro ainda incerto.
Em vez de a vida selvagem ser considerada uma ilha isolada, que outras geografias seriam possíveis? Um grande arquipélago RTSIM seria a aposta certa, mas poderia comprometer bastante o orçamento de rastreamento. Portanto, em vez de um jogo de "este porquinho" em escala mundial, uma visão mais ampliada poderia evitar a redução do cofrinho da CPU.
O Projeto Pangea está liderando uma expedição a esse espaço de design de jogos, com uma recente sessão de brainstorming sobre como conectar populações rastreadas regionalmente. Entre a multidão de cáqui, estavam presentes @Neura, @zesterer, @isse, @juliancoffee, @Gemu e @Knightress_Paladin. Aqui estão as ideias deles até agora:
- A vida selvagem se reproduz com base em contagens populacionais rastreadas por região/bloco
- Se o terreno permitir, essas populações se difundem e se espalham entre regiões adjacentes
- As interações entre entidades levam a uma morte, morte ou retirada que é contabilizada contra a população
- Modelagem dinâmica de predador/presa ( simples ou complexa ) em paralelo às interações do jogo
- Com uma quantidade suficiente de ajustes nos números (parece delicioso!), isso deve levar a sistemas estáveis
- Existem algumas maneiras diferentes de dividir as categorias de vida selvagem para rastreamento
- Espécie, tipo de corpo, papel no ecossistema (presa, predador (de topo))
- Efeitos de fixação e mecanismos de repovoamento podem ser necessários para evitar extinções globais
- por exemplo, uma extinção local pode desencadear a replantação da população em outro lugar
- Já que cenários pós-apocalípticos estão na moda, sempre podemos deixar os jogadores vagarem livremente e aniquilarem tudo - adoramos ver que nossas ações têm consequências, certo?
- Um ponto de acompanhamento : os NPCs podem manter sentimentos em relação a espécies específicas de vida selvagem (em vez de indivíduos), comunicando isso a outros NPCs e alimentando um sistema de geração de missões.
Uma lista de verificação de busca
Você aí, viajante! Traga-me 10 braceletes Gnarling aleatoriamente e eu lhe concederei imersão total no jogo. Parece realista, não é? @isse discorda e acha que a receita para as missões vai ser mais do que uma refeição de micro-ondas:
Só para citar algumas propriedades que quero destacar:
- Ele precisa ser implementado no rtsim , nossa simulação de mundo, e ter efeitos nele.
- As missões devem ser baseadas nas necessidades reais do NPC/facção. Se um ciclope atacou recentemente, eles poderiam gerar uma missão para matá-lo. (No entanto, faltam muitas simulações para atender às necessidades de missões mais interessantes).
- Queremos um rastreador global para missões, mas cada missão deve ter um ator/facção que a deu e também retornar para completá-la. E um ator/facção que recebeu a missão.
- Como as missões são baseadas em necessidades, isso significa que também são, de certa forma, baseadas em tempo, já que as necessidades podem ser atendidas. Outra pessoa pode matar o ciclope, ou o responsável pela missão demorou muito para que o NPC decidisse fazê-lo sozinho, etc. E o sistema de missões deve ser capaz de lidar com isso, de alguma forma.
- Não é necessário para a primeira iteração, mas as missões devem ser capazes de lidar com casos em que o NPC original que deu a missão morreu. E migrar a missão para potencialmente outro NPC que o NPC conhecia.
- Também não é necessário para as primeiras iterações, mas como a grande maioria da população do mundo veloren são NPCs, eles também devem ser capazes de realizar missões.
Vitrine da comunidade
Arte conceitual
Relatos em primeira mão de várias explorações no espaço voxel. Uma mistura de elementos pensados para uso em jogos e ideias mais experimentais.

Vamos, vamos, rangers mais magros! — por @GoodMan29

Capacetes para altas altitudes — por @Supa

Sonhos impossíveis — por @Supa + uma recoloração por @Dan113
Este é o caminho
Dirigíveis são ótimos para viajar rápido, mas um bom mapa é essencial para viajar com inteligência. Para nos ajudar a planejar nossos deslocamentos, @Limina trocou de tradutora para criadora de ferramentas, adotando uma abordagem de desenvolvimento orientada por blog para a tarefa:
Depois de ver o mapa completo das rotas de dirigíveis feito por @Froggy no devblog 245 , decidi responder ao comentário abaixo: "Agora só precisamos de um aplicativo de planejamento de viagens".
Peça e receberá! O Planejador de Viagens Veloren para o servidor oficial do Veloren está disponível em itch.io , totalmente online - sem necessidade de download! O código está no GitHub , sob a licença GPLv3. Atualizarei quaisquer caminhos incorretos que encontrar - sintam-se à vontade para me avisar se houver algum que eu tenha esquecido! Para quem quiser mais detalhes, continue lendo - caso contrário, você pode simplesmente pular para a próxima seção. Não vou julgar (muito).
A ferramenta foi criada com o Godot 4.1.1, pois é meu mecanismo preferido para trabalhar (e também é de código aberto!). Ela usa o método A* pathfinding para descobrir o caminho mais curto entre as cidades — os caminhos são codificados, já que conhecemos todos eles. No entanto, eles são fáceis de trocar: cada "cidade" é um nó que contém uma lista de todas as outras cidades às quais está conectada. Isso foi especialmente útil quando notei que alguns dos caminhos haviam mudado desde que o mapa do @Froggy foi criado!
Atualmente, ele recria caminhos sempre que solicitamos um — admito que eu poderia pular essa etapa e gerá-lo apenas uma vez, mas não importa muito, visto que a quantidade de caminhos é bem pequena. Isso também permitiria ignorar cidades dinamicamente ou até mesmo adicioná-las/excluí-las em tempo de execução, se quisermos — embora isso ainda não seja uma realidade. :P Assim que soubermos as cidades de início e fim, podemos simplesmente usar os caminhos criados com o algoritmo A* e pronto, temos um caminho!
Eu realmente não tenho uma lista de tarefas, então qualquer sugestão é bem-vinda - ou até mesmo solicitações de pull, se desejar.
Weave tem um novo desafiante
A pairar sobre a competição está uma nova inscrição de @Moaaswell para o desafio de tapetes apresentado anteriormente . Levando-nos além do simples quadrado, será que isso vai expandir os limites do concurso?

Pense fora da caixa. Seja uma caixa ainda maior!
Nova meta explosiva
Prepare-se para se surpreender com o recurso do @Necti sobre o meta de bombas arremessáveis, que está detonando todos os outros estilos de jogo. Aprenda a proteger seu equipamento contra ondas de choque, explore a guerra de trincheiras "faça você mesmo" e fique por aqui para dicas encantadoras sobre como causar ainda mais dano.
Não é difícil imaginar um papel de apoio ao bombardeio aéreo
Os produtores de coco de Veloren estão cobiçando o aumento da demanda. Mas o tempo dirá se o apetite dos jogadores vai durar e se esses potenciais aproveitadores sobreviverão às consequências.
Fogos de artifício de Phoenix
Depois de converter seus estoques em fábricas dedicadas a bombas, os jogadores do Sporia enfrentaram uma escassez de velorita e cocos, o que ameaçava inviabilizar sua exibição de fogos de artifício regularmente programada. Para suprir a escassez local de pirotecnia, alguns indivíduos engenhosos decidiram importar um novo espetáculo de luzes.
@horblegorble nos traz um relato fotográfico do evento familiar hostil que se seguiu. Identidades e palavrões foram omitidos para proteger os (não tão) inocentes.
Enrole-a Iluminando a rua principal Receitas para o desastre Entusiasmo diminuído Aí vem a chuva Um novo sol nasce Ficando ofuscado Hora da flecha Vista aérea Um rescaldo crocante








Eventos
Era a temporada de brincadeiras de primavera em Veloren, quando trapaceiros conhecidos e ovos de tesouro apareciam. Mas este ano também trouxe uma bola de curling inesperada para a mistura.
Primeiro de abril
Deixaremos @Necti fazer a grande revelação, com esta informação privilegiada sobre a mais nova celebridade de Veloren.
Não dê atenção a pistas falsas — por @Necti
O mestre chegou
O Mestre Porco é um porco de dar água na boca — pelo menos, é o que o bando de ratos deles dirá se você perguntar sobre a formação dessa torre inclinada de problemas. Acabe com o menor deles (sem perdê-lo de vista) para ter a chance de ganhar umRabo de Rato para você.

Mestre, rato, pequeno, minúsculo, mini, pequeno — @horblegorble | @Alley_Oop | @Crabo
Essa pilha de surpresas foi contrabandeada em um pacote de "pequenas mudanças" por @isse, junto com colaboradores desconhecidos.
Por mais emocionante que tenha sido, a nova onda não roubou a cena. O pessoal se divertiu bastante com as brincadeiras inusitadas de 1º de abril .
Pule, pule e role para chegar ao show na hora — por @Supa Uma tradição anual — por @souffle Eles se metem em todos os tipos de situações complicadas — por (➜) @souffle | @horblegorble x3 Trilhas em chamas — @horblegorble @Necti se mistura para liderar a banda — @horblegorble Uma poção curiosa vira o jogo contra @horblegorble Ratos de telhado — @horblegorble






Páscoa
Embora um pouco ofuscados pela nova emoção das festividades, os jogadores ainda estavam ansiosos para participar do evento de Páscoa . Afinal, você não pode ficar dando ovos surpresa o resto do ano sem antes estocar.
Ouvido, ouvido! — por @souffle | @horblegorble @souffle acordou e descobriu que a fada do dente estava ajudando com as entregas de Páscoa deste ano

Na natureza
Lá e de volta outra vez
Deixe-se levar pela narração de @Gbone, enquanto eles nos contam uma história de maravilhas e infortúnios. Será que esse bando de aventureiros conquistará tudo ou o mundo os conquistará? Veja-os enfrentar lobos, cavernas, masmorras e até mesmo dirigíveis e NPCs da cidade — além de níveis involuntários de fogo amigo. Tudo em uma boa diversão enquanto eles encontram o caminho de volta para casa.
Fama, fortuna, glória e salada de tomate! — @Gbone
Capturas de tela
Só temos uma ponte, então é melhor que seja resistente — por @isse Mundos pequenos criam grandes festas — por @Alley_Oop Demonstrando o valor de todos esses alongamentos de pescoço — por @unii Aromas convidativos — por @isse Pegando uma carona — por (➜) @Val | @Limina | @horblegorble Voando em direção a novos amanheceres — @horblegorble Vulcão Aurora — @Alley_Oop Vale da luz — @horblegorble Procurando por raiz de mel — @horblegorble








Boing boing boing... — @Trentus Vibração — @Limina
Eu encontrei Atlântida? — @isse Inveja de Sahagin — por @Alley_Oop Lombadas enevoadas — por @Sam113 Vivendo uma vida bem sombreada — por @term_junkie Ansiando por um novo dia — @horblegorble Noites longas na praia — por @Sam113 Reflexões pontuais — por @Sam113 Distrito de arranha-céus — por @Alley_Oop 







Ouvi dizer que você gosta de rabiscos bobos

Cara de surpresa da torre-chu
'bigflyingrock' — por @Supa, nomeado por @Sam113 Túmulo do herói voador — @horblegorble, encontrado por @Alley_Oop Definitivamente algum tipo de entrada de caverna — @DaforLynx Cogumelos extra picantes — por @Alley_Oop Linhas liminares — por @And_i Espeleologia brilhante (diga isso cinco vezes rápido) — por @And_i Penhascos de Chillwater — por @Limina






Este blog de desenvolvedor é baseado em informações coletadas em #blog-content , onde os colaboradores do jogo são sempre convidados a comunicar suas atualizações ou simplesmente postar um link para um canal diferente.

O Legoom perdido contempla um caminho mais sombrio. Esperemos que eles encontrem o caminho de volta para nós :)