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:

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:

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!

GitLab: !4851 + !4854

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 assume enum 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 obter enum 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:

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:

(Ah, e a propósito, adicionei uma seção sobre fontes em "Gerenciando o Weblate", que foi inspirada na postagem acima.)

!211

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

GitLab: !4873 + !4877

Todas as outras carruagens

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:

Para desenvolvedores e tradutores:

 name-body-quadruped_medium-lion = .fem = Lioness .masc = Lion
 name-custom-village-hunter = .fem = Huntress .masc = Hunter os 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
 name-custom-dungeon-cultist-turret = .neut = Possessed Turret E, francamente, era um MR name-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:

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:

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:

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:

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 :)