These weeks in Veloren 248
6/13/2025 Post original
Volvamos al blog, cargados de soluciones, kits y diversión de temporada. Ojalá no llevemos demasiado equipaje para subirnos al tren de la i18n.
- horblegorble, colaborador de TWiV
Trabajo colaborador
Gracias a todos los que contribuyeron a veloren estas últimas semanas: @drunicornthe1, @Crabo, @unii, @juliancoffee, @isse, @horblegorble, @do-no-van, @walpo, @xMAC94X, @Knightress_Paladin, @coffee-compiler, @Caigh, @imbris, @floppy y @srpapinha.
Gracias a los traductores de weblate que contribuyeron estas últimas semanas:
| Idioma | Traductores |
|---|---|
| checo | Janez |
| Inglés | evgenkot | Arriona |
| Francés | Limina |
| Alemán | compilador de café |
| coreano | café juliano |
| ruso | evgenkot | caesarrxx | LevmurDev | MBKenny | Arriona | Trauvel | Manifure | LuckyCoin | Carrotism | lucius_pilgrim | VVolsha |
| ucranio | café juliano | Akumo33 | ministro ganso | Sinari | helado | lomkada | Karaya | DDmytroO |
Trabajo fusionado
Cambios conversacionales
¿Eres de los que hablan mucho y te encanta tener un montón de conversaciones a la vez, pero la fricción al cambiar de marcha te frena? @drunicornthe1 conoce esa sensación y sabe qué hacer al respecto. Para su primera solicitud de fusión, metieron las manos en la caja de cambios para ajustar el cambio de modo. Ahora se siente como conducir un coche de carreras, con la barra espaciadora como palanca de cambios rápida.
Limpia el desorden y mantente enfocado en el mensaje
GitLab: !4849 ✨
@Crabo ha abierto la ventana de chat para que podamos acceder directamente a la wiki de Veloren:
Añadí el comando /wiki . La idea surgió de un problema de GitLab creado en septiembre de 2020. Fue fácil de implementar porque usa REST para delegar la búsqueda y la redirección a la propia wiki. Cada vez veo más gente usándolo para guiar a los recién llegados a las páginas wiki correctas. Les recomiendo que escriban "/wiki recetas" y "/wiki armas" constantemente.

Respuestas a tu alcance
Tenga en cuenta que la wiki está impulsada por la comunidad y no siempre se mantiene al día con el tráfico de desarrollo.
GitLab: !4823
Malabarismo con hacha
Tal vez sea necesario recalibrar tu estilo de juego de cuchillo sobre palo, con combos más bajos para varias habilidades y cambios en una devastación feroz.

Realizando otro acto de equilibrio
Vamos a explicar en detalle los cambios de @unii:
- Reducciones combinadas: mamparo, volcar, ejecutar, vorágine, resaca
- Arrasar ferozmente con una mano: daño reducido
- Arrasar ferozmente con dos manos: mayor daño, alcance reducido, mayor costo de energía
Las descripciones de las habilidades relacionadas con los combos también se han actualizado para que sus valores numéricos se separen de los archivos i18n. Esto supone un problema menos para los futuros malabaristas.
GitLab: !4850
Arreglando fuentes
Si sentía que el estilo vóxel de Veloren se estaba exagerando con algunos lenguajes, @juliancoffee estaría de acuerdo. Ver todos estos bloques despertó su instinto minero y blandió el pico de programación para revelar sus verdaderas formas:
Hemos ajustado un poco nuestras fuentes.
En resumen: Los idiomas latinos complejos, como el noruego o el checo, ahora se pueden representar correctamente. También se puede representar el árabe. Ya no se puede usar convert_utf8_to_ascii porque lo hemos eliminado.

Escultura de pico de alta fidelidad
Para una explicación más detallada, cada idioma tenía 5 fuentes adjuntas:
-
Alkhemikal, fuente súper elegante. -
OpenSans, fuente súper genérica. Cyri, que creo que significa cirílico, se utiliza como fuente regular para la mayoría de los textos que ves en la pantalla.-
Wizard, sin usar. -
Metamorph, sin usar.
Hemos eliminado las fuentes Wizard y Metamorph que no se usaban y hemos reemplazado OpenSans por GoNotoCurrent.ttf . El objetivo de OpenSans es ser una fuente universal para información formal donde buscamos la cobertura más completa, por ejemplo, en el chat. Sin embargo, no cubría muchos idiomas, así que la hemos reemplazado por otra fuente que ahora cubre casi todo, excepto el coreano. Y, como esta es la fuente que debería ser la misma para todos los idiomas, se agrega por defecto; no es necesario especificarla en el manifiesto del idioma.
Además, hemos añadido EnterCommand de Font End Dev, que es un poco diferente, pero admite más caracteres latinos, así que lo considero un éxito. Ah, y hemos configurado la fuente GoNotoCurrent como fuente normal para árabe. Está por verse qué tan buena es la compatibilidad con idiomas RTL; sé que no es ideal, pero al menos ahora podemos renderizarla. Ah, y he añadido los caracteres ґ Ґ a nuestra fuente Cyri . ¡Ahora soy un artista ! 👀
GitLab: !4875
No hay necesidad de gritar
@isse ha estado muy ocupada solucionando todo tipo de peculiaridades en el código base.
Los NPC de la ciudad pueden guardar su voz con distancias de interacción mucho más razonables.

Boombox -> caja de voz
Los dirigibles vuelven a sus posiciones de atraque normales, aliviando la presión de las rodillas de los jugadores.

No más procesos de embarque con resortes
La espeleología vuelve a ser una aventura subterránea a medida que sus marcadores salen de sus escondites en el mapa.

Llamémoslo práctica temprana para mapas descubribles.
Pero espera, ¡hay más!
- Los objetos arrojadizos reciben un sonido de recogida.
- Los PNJ de la ciudad del desierto pueden dirigirte a talleres de artesanía.
- Es menos probable que las entradas de cuevas inundadas estén marcadas en el mapa
- El uso de posiciones de caracteres interpoladas facilita la realización de interacciones a alta velocidad, por ejemplo, con sprites en dirigibles.
Equipándose
Si te dan alergia las narraciones que rompen la pared N, regresa ahora. Soy @horblegorble con la información sobre los equipamientos:
El emporio /kit ha ampliado su catálogo de suministros para aventuras con una variedad de nuevos artículos, atuendos y bombas. Algunos son nuevos en la tienda, mientras que otros son paquetes personalizados de productos existentes. Como siempre, ¡simplemente muestra tu credencial de administrador en la puerta para disfrutar de una experiencia de compra ilimitada! Los nuevos clientes pueden optar por una bolsa "Agujero Negro del Administrador" antes de perderse en los pasillos. Se incluye una de cortesía en el paquete /kit debug .

Botín en abundancia
Para aquellos curiosos acerca de los detalles más arriba en la cadena de suministro, aquí hay un vistazo a los ajustes a la especificación y generación de armas modulares para configuraciones de kit y carga.
KitSpec::ModularWeapon se dividió por sufijo en variantes de Set y Random , que generan (respectivamente) un conjunto completo de armas compatibles o una sola elegida al azar. Se ajustó la gestión de la lateralidad para aplicar correctamente el argumento hands opcionales en todas las combinaciones de componentes principales y secundarios. Con estos dos cambios, /kit pirate podía configurarse para proporcionar dos espadas de una mano seleccionadas al azar. La compatibilidad de manos también se aplicó a ItemSpec::ModularWeapon para las configuraciones, lo que hizo que los Grim Salvagers se mantuvieran fieles a su especialización de martillos de dos manos. Se acabó el contrabando de una mano lo suficientemente cerca y darlo por terminado.
Gracias a @juliancoffee por sus consejos sobre el proceso de codificación, así como también a @Tarhun y @Sam por sus comentarios sobre la revisión.
A modo de mantenimiento (y donde se originó esta solicitud de fusión), los nuevos sets de armaduras metálicas multimodelo ahora tienen nombres y orden consistentes en sus archivos .vox . Esto ha ordenado los manifiestos .ron y, con suerte, mitiga la recurrencia de algunas confusiones de índice derivadas de modificaciones de copiar y pegar.
GitLab: !4798
Mejores vigas
@do-no-van siempre había oído que era ventajoso tener un conjunto de habilidades completo, pero descubrió que los ataques de rayo llevaban este consejo demasiado lejos. En concreto, se volvió un poco raro cuando se añadió su radio a su alcance nominal. Tras un pequeño ajuste, todo quedó mucho más ordenado.
Cuidado con el hueco
GitLab: !4869
Un iter para gobernarlos a todos
Comenzó con la forja de las Grandes Estructuras de Datos. Se otorgaron campos a las Estructuras; seres inmortales, los más simples y puntiagudos de todos. Variantes a los Señores de las Enumeraciones, grandes emparejadores y unionizadores de las salas de doble colon. Y rasgos... Rasgos fueron otorgados a la Raza de los Tipos, quienes, por encima de todo, anhelan la rigurosidad.
Porque dentro de estas estructuras se encontraban las direcciones de memoria y el ensamblaje para gobernar cada abstracción. Pero todas fueron engañadas, pues se creó otra abstracción. En la tierra de Ucrania, en los fuegos de Neovim, el Señor Oscuro @juliancoffee forjó, en secreto, macros declarativas para enumerar todas las demás. Y en estas macros vertió toda su cafeína, su óxido y su voluntad de iterar todas las variantes:
Bueno, esto es algo muy técnico, pero bueno, es un blog de desarrollo. Les presento algunas macros en las que he estado trabajando con la ayuda de @imbris.
Bueno, quizás sepas que puedes definir enum en Rust:
enum Dir { Up, Down, }Digamos que tienes alguna función que tomaenum Dir { Up, Down, }
Dir como salida, así que sería genial probarlo automáticamente en todos Dirs y comprobar que no genere errores ni nada parecido. Sin embargo, no se pueden obtener todos Dirs , ya que Rust no ofrece esa funcionalidad.
Sin embargo, puedes escribir dicha funcionalidad tú mismo con un poco de magia negra, reescribiendo el código de Rust en tiempo de compilación. Una de estas reescripciones mágicas es la caja strum , que estamos usando, que generará un método iter() que hará precisamente eso. Desafortunadamente, strum no puede manejar nada más complejo.
Digamos que desea anidar estas enumeraciones:
enum Boost { Health, Gravity(Dir), }Esperarías obtenerenum Boost { Health, Gravity(Dir), }
Boost::Health , Boost::Gravity(Dir::Up) , Boost::Gravity(Dir::Down) , pero strum no los generará, porque... no lo hará.
Así que creé una macro que los generaría. Y eso no es todo. ¿Qué pasa si no tienes solo enum ? ¿Y si tienes una struct sobre la que quieres iterar?
enum Species { Butterfly, Bird } enum BodyType { Male, Female } struct Body { species: Species, body_type: BodyType, }
Bueno, esa es otra macro que he añadido y que genera todas las combinaciones posibles de estos Bodies , que contendrían versiones masculinas y femeninas de Butterflies y Birds . Y si ya tenemos eso, ¿por qué no lo aplicamos a una enumeración similar en nuestro código base: Body , que define todas las "entidades" posibles que podemos tener? Por entidad, me refiero a algo abstracto, pero que incluye todo, desde humanoides hasta conejos, e incluso objetos y dirigibles. Sin embargo, no fogatas, que también son entidades, pero, bueno, especiales.
Este MR añade la función Body::iter , que proporciona una lista de todas las entidades posibles. Como ventaja adicional, también genera algunas constantes, como el número de tipos de una enumeración o, si se le pide amablemente, proporciona todas las variantes que admite. Desafortunadamente, esto último no funciona con enumeraciones anidadas.
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]);Todo esto se realiza mediante las llamadas macros declarativas o macros por ejemplo, que son lo suficientemente potentes como para lograr lo que acabo de mostrar, pero aún no son tan fáciles de escribir (o usar) como las macros procedimentales, que son más potentes. Estas no solo reescriben el código, sino que permiten escribir el código para escribir código nuevo.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]);
En el futuro, planeamos crear versiones alternativas de estos usando macros de procedimiento y, personalmente, me gustaría lanzarlas al ecosistema general de Rust.
GitLab: !4843
Tomando fotografías policiales
Ya sea que desee crear carteles de búsqueda, un futuro bestiario o establecer la base de datos para una distopía de vigilancia, la expansión de img_export de @isse a NPC lo tiene cubierto.

Elige a tu luchador
He aquí un ejemplo sencillo que te lo mostrará todo de una vez:
Y otro más con algunas de las campanas y silbatos: cargo run --bin img_export -- --all-npcs
Esto le proporcionará una imagen para todas las rutas de NPC que contienen "viajero", con un cargo run --bin img_export -- --all-npcs --filter traveler --seed 0 20 Valor seed para controlar las características aleatorias. Tenga en cuenta que el argumento scale posicional final se aplica a una imagen de 10x10, por lo que el valor predeterminado de 20 da una salida de 200x200. El comando se puede ejecutar desde el directorio veloren principal de un repositorio Git , y la salida se guarda en la carpeta img-export .
Si buscas resultados con píxeles perfectos, ten en cuenta que todavía hay algunos fallos menores en la representación en resoluciones más bajas.
GitLab: !4871
No te confundas

Conozca su repositorio
Espejo, espejo, en la nube; ¿por qué no se permiten mis cambios?
Famoso es tu gran compromiso;
Pero espera, este gatito no es eso.
Las orejas no pueden ocultar el tentáculo.
Por desgracia, vulpes vulpes es donde encajas.
Un azote para ti, que no haces caso a la nota de @walpo:
Gracias a los comentarios de los usuarios, @walpo y @xMAC94x han actualizado los repositorios espejo en GitHub para evitar confusiones con los repositorios reales. Los cambios son:
- Las nuevas solicitudes de extracción se cierran automáticamente.
- Se han desactivado algunas funciones de esos repositorios para que parezcan "menos reales".
¡Recuerden amigos, el desarrollo se lleva a cabo en GitLab y no en GitHub!
GitLab: !4853 + !4857 + !4859 + !4868 + !4870
Interfaz de usuario pegajosa
Con una ligera renovación de @Crabo, las barras de desplazamiento de crafting se sienten mucho más seguras y resaltan ante el público. Esto también inspiró a la sección de pie de página a abandonar su fase descalza y a incorporar una barra de botas para una delineación más definida.

Un poco de brillo en los bordes.
GitLab: !4801
Todos a bordo del tren i18n
Esquivando el factor autobús

Basado en una historia real
Los faros atraviesan la noche. Un rugido sordo retumba entre las fauces del radiador. Todos se precipitan hacia ti con siete toneladas de furia. La estrella del espectáculo está lista, pero @juliancoffee quiere salir de este thriller de furia al volante.
Entonces, había un problema de factor bus con nuestro sistema i18n, en el sentido de que, francamente, probablemente yo era la única persona que entendía completamente cómo funciona y cómo interactuar con él, así que bueno, decidí solucionar este problema.
Esta guía cubre:
- todas las cajas i18n (o bueno, las que importan, estoy pretendiendo que i18n-helpers no existe, porque)
- Mejores prácticas y cómo hacer que las interfaces de usuario sean localizables correctamente
- algunos ejemplos sencillos
(Ah, y por cierto, he añadido una sección sobre fuentes a "Administración de Weblate", que está inspirada en la publicación anterior).
¿Cómo te llamaré?
Han tenido muchos nombres, flotando en el anonimato mientras un jefe tras otro los llamaba a la acción. Después de todos estos años de servicio ingrato y anónimo, @juliancoffee por fin les da algo con lo que pueden identificarse.

Una historia de citaciones
GitLab: !4883
De vuelta a la botella
Algunos objetos potenciadores rebosaban de poder, ansiosos por llenar tu inventario. @Knightress_Paladin los mantuvo a raya eliminando una concatenación duplicada y separando la información de duración. Al menos, esto era más fácil que volver a meter la pasta de dientes en su tubo.

No llores por la poción derramada
Todos los demás vagones
- Se localizaron algunos mensajes comerciales: @coffee-compiler !4862
- Cambié "gigas frost" a "frost gigas" en inglés i18n - @Crabo - !4865
- Archivos HUD
.ftlconsolidados que aún no son componentes en weblate - @coffee-compiler - !4820 - Nombres de jugadores localizados en la interfaz de intercambio - @Caigh - !4880 ✨
- Comando localizado
/players- @Caigh - !4882 - traducciones weblate fusionadas - @juliancoffee - !4884
-
CommandResultlocalizado en voxygen - @Caigh + @juliancoffee !4893
Nuevos nombres, viejas historias
Toma tus malvaviscos y acomódate junto a la fogata. @juliancoffee tiene una historia que contar:
Ok, ni siquiera sé por dónde empezar con esto.
¡Ahora podemos traducir los nombres de los NPC! 🥳

El atajo para conseguir un «nuevo» puesto de trabajo
Resumen
Para desarrolladores:
- En
assets/common/npc_names.ronse cambió el campogenericpara representar una clave i18n - En las configuraciones
assets/common/entity, el nombre ahora usaTranslatecon una clave i18n
Para desarrolladores y traductores:
- Los animales ahora se traducen así:
name-body-quadruped_medium-lion = .fem = Lioness .masc = Lion- Los nombres de profesiones y demás se traducen de forma idéntica:
name-custom-village-hunter = .fem = Huntress .masc = HunterLos objetos no tienen ninguna información de género, por lo que solo solicitan un atributo:name-custom-village-hunter = .fem = Huntress .masc = Hunter
-
neut
name-custom-dungeon-cultist-turret = .neut = Possessed TurretY francamente, fue un señor.name-custom-dungeon-cultist-turret = .neut = Possessed Turret
[Solicitud de fusión] con una diferencia bastante pequeña: solo se agregaron 1977 líneas y se eliminaron 665. El sistema de internalización tuvo diferencias más grandes.
Pero es la que me da más alegría porque de alguna manera es la última internacionalización del SR.
Una última internacionalización, señor. Hemos recorrido un largo camino.
Un comienzo
Cuando me uní al proyecto alrededor de abril de 2021, se dedicó bastante trabajo a la traducción de Veloren, y la mayor parte de la interfaz de usuario se podía traducir mediante nuestro sistema interno de archivos .ron (archivos de configuración tipo json para Rust). Incluso admitíamos alternativas si tu idioma actual no tenía todas las cadenas traducidas (gracias a @Christof ). Funcionaba bien, pero obviamente tenía sus limitaciones; al fin y al cabo, es solo un almacén de valores clave. Solicitas un "sí" traducido y recibes un "sí" a cambio. O "Oui", o "Ja", o "Так", o "はい". Ya me entiendes. Se complica cuando quieres pasar valores o, incluso, actuar de forma ligeramente diferente según estos valores; por ejemplo, no quieres que un objeto cueste "una moneda".
Así que, a principios de agosto de 2022, lo solucionamos. Adoptamos un nuevo formato: Fluent , creado por Mozilla. Su flujo era bastante similar al de nuestro sistema actual, pero a la vez, era súper expresivo, probablemente el formato más expresivo en aquel momento e incluso hoy. Puedes leer más sobre ello en una entrada de blog dedicada a todo esto o en el documento RFC , que describe brevemente su funcionamiento. (Creo que el RFC es el más interesante, pero puedes decidirlo tú mismo 😉 ).
Fluent es un formato genial, y es razón suficiente para adoptarlo, pero había más. Primero, había un problema con la propia experiencia de traducción. En aquel entonces, si querías añadir localización a tu idioma, tenías que seguir el mismo procedimiento que todos los desarrolladores: crear una cuenta de Gitlab, aprender a trabajar con Git, crear una solicitud de fusión y, potencialmente, gestionar tu rama en caso de que necesitara actualizaciones... no era fácil.
Así que sí, para solucionar ese problema, elegimos Weblate . Es un servicio web que ofrece una interfaz más intuitiva y un sistema de gestión mejorado. Nos llevó un tiempo migrar, y debo agradecer @walpo y @fnetx por impulsarlo; no fue fácil. También al proyecto Codeberg por el alojamiento. Actualmente, lo usamos para todas las traducciones.
La historia de dos mundos
Estábamos trabajando en la creación y mejora del marco interno para la localización, pero debo mencionar una limitación importante. Solo se puede traducir un mensaje a un idioma si se sabe a qué idioma traducir. Si bien sería posible procesar esta información desde el cliente que se usa (y hoy lo hacemos para mostrar las reglas del servidor), no sería tan práctico, ya que se necesitarían prácticamente dos sistemas de localización. En su lugar, se nos ocurrió la idea de la evaluación diferida de mensajes. Podría atribuirme la idea, pero el mérito es de @zesterer por implementar el tipo Content mientras trabajaba en los mensajes NPC. El proceso es simple: en lugar de proporcionar al cliente la cadena final, le damos una clave para una cadena y el contexto necesario para evaluar esta clave.
Esto significa que ahora no solo se puede traducir la interfaz de usuario, sino todo.
Empezamos con las traducciones de los mensajes de los PNJ, continuamos con los comandos del servidor, los objetos y, finalmente, las profesiones de los PNJ y los nombres de los animales. Y hasta ahora, hemos traducido prácticamente todo. Claro que olvidamos algunas cosas, pero es cuestión de que alguien que esté experimentando con problemas de principiante implemente las partes omitidas. Tú, querido lector, también puedes hacerlo .
Contáctame en Discord o Zulip ; probablemente pueda guiarte. Y si eres traductor y notas que falta algo en el juego y no hay problemas, no dudes en crear uno (no olvides añadir la etiqueta wg:translation ).
El futuro
¿Cuál será entonces el siguiente paso en la internacionalización de Veloren? Con nuestra cobertura casi completa, necesitamos subsanar pequeñas deficiencias, probablemente también implementar i18n para plugins y centrarnos en mejorar la calidad de vida. Quizás incluso contribuyamos a Weblate, ¿quién sabe?
Pero si tuviera que dibujar un gran tema, diría una palabra: Género.
Es un tema complejo, pero eso lo hace aún más emocionante. Y creo que compartiré algunas reflexiones con ustedes. Para empezar, ya tenemos una base (algo inestable) sobre la que construir. Consulten 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. }
No leo italiano, pero apuesto a que te resultará aún más difícil con el ejemplo ucraniano, así que ten paciencia. Aquí puedes ver el poder de Fluent : cada mensaje no solo puede empalmar los argumentos que se le pasan, sino que puede actuar sobre ellos. Esto es especialmente útil para números, ya que Fluent es compatible con todo el estándar Unicode , pero también se puede usar para otras cosas.
Casi todas las cadenas en el chat tienen uno o varios argumentos que especifican el atributo de género de un actor en contexto. En este caso, comprobamos si el género del usuario es masculino (usamos una forma); si es femenino, usamos otra ( scollegata vs. scollegato ). (Si no lo sabemos, usamos masculino por defecto; para eso sirve * ).
Y si vas al principio de ese archivo, los nombres de los PNJ siguen un patrón similar, solo que aquí empleamos una táctica diferente. La razón es que en ambos casos se establece una coincidencia de género, pero no se trata del mismo tipo de género. Hay más de un género; de hecho, hay más de dos. Como puedes imaginar, hud-chat-connection_lost en inglés no tiene coincidencias. Esto se debe a que el inglés carece casi por completo del concepto de género gramatical . Tiene el concepto de sexo y el de género. Al fin y al cabo, tenemos todos los pronombres.
Sin embargo, la palabra "left" es la misma, ya sea "she" quien se fue, "he", "they" o incluso "it". No existen "scollegata" ni "scollegato". Y lo más importante, si bien la mayoría de las lenguas tienen un concepto similar de sexo y género, dado que no es realmente una cuestión lingüística, el concepto de género gramatical puede ser muy diferente, por lo que no podíamos exponer un solo atributo para abarcarlo todo.
Por cierto, si aún te preguntas a qué me refiero con género gramatical, déjame explicarte rápidamente. En algunos idiomas, cada palabra tiene un género. En la mayoría de los idiomas europeos, este influye en el artículo y la terminación de la palabra. Así, "cat" en alemán sería "die Katze", lo que indica que los gatos son inherentemente femeninos. En español, "the red cat" sería "el gato rojo", mientras que "the red flower" sería "la flor roja". Y así sucesivamente. Lee la página de Wikipedia al respecto si quieres saber más.
Con todo esto, defino tres conceptos que debemos considerar: sexo, género social y género gramatical.
Estos están vinculados, y nos interesan principalmente el género social (para nombres y demás) y el género gramatical (para todo lo demás). Desafortunadamente, por ahora solo tenemos uno: sexo, que en nuestro código base llamamos BodyType , una enumeración binaria para Masculino y Femenino. Necesitamos ampliar este sistema, crear el concepto de género social para jugadores y PNJ, y luego encontrar la manera de inferir o definir el género gramatical. El reto reside en que las reglas de género gramatical son totalmente diferentes en cada idioma, así que será divertido .
Lo termino aquí. Si tienes alguna idea, puedes consultar nuestros problemas de Zulip o Gitlab .
GitLab: !4829
Zulip: [reseña] Nombre i18n !4829
Más cambios:
- Enlace de patrocinio actualizado en github - @walpo - !4852
- Modelo de nivel de detalle (LoD) reorientado para las catacumbas de Haniwa - @horblegorble - !4844
- solidificó un piso de la mazmorra Myrmidon - @floppy - !4855
- Calificaciones de calidad de artículos actualizadas para recetas, bombas y pociones medianas - @horblegorble - !4867
- El re-orient express avanzó lentamente con modificadores para ataques a distancia - @srpapinha - !4861
- Revertí algunas confirmaciones duplicadas para un historial más limpio - @juliancoffee - !4876
- Entrada de manifiesto de armadura corregida para manos de guardia enanas - @horblegorble - !4878
- Comprobaciones limitadas
git lfspara corregir el uso de punteros - @imbris - !4879 - reemplazó las matrices de cadenas con enumeraciones para las secciones del diario y los árboles de habilidades - @coffee-compiler - !4888
- tótems rotados invocados por Gnarling Chieftain para enfrentarse a su objetivo - @horblegorble - !4887
Trabajo en curso no fusionado
(Re)juicio de fuego

La máquina de vapor hipercrítica — por @Necti
La programación de @do-no-van y el equilibrio de @Necti se sometieron a un duro examen de combate en la segunda ronda de pruebas de Spicy Gigas. El grandullón se enfrentó a jugadores y PNJ por igual; por suerte, el alboroto no cocinó el servidor de @isse.

Pilares piréticos — @horblegorble
Los viajeros se unen contra Gigas — @horblegorble
Discusiones
Las guerras del almacenamiento han comenzado
@Knightress_Paladin ha escrito el último capítulo de la antología Veloren RFC, con una oda a las bolsas, los bancos y las cajas. Dados los diferentes caminos a recorrer, han trazado y articulado una ruta, junto con los peligros del terreno. Todo para alcanzar un mismo destino: un lugar para todo, ya sea necesario o novedoso.
Echemos un vistazo al interior:
- Almacenamiento persistente por jugador basado en la ciudad en estructuras de "banco"
- Se puede transferir entre personajes a través de escondites.
- Cambiar la interfaz de usuario del mapa para mostrar los escondites activos
- Motivaciones
- Puede dedicar su inventario a una salida en particular, liberando espacio para adquirir cosas nuevas y brillantes.
- Destrona el tamaño de la bolsa de inventario de ser la estadística principal
- Los desarrolladores tienen cierta libertad para agregar elementos sin molestar a los jugadores.
- Los barajadores de sitios transfieren automáticamente los escondites a la ciudad más cercana
- Se realiza en el momento del inicio de sesión del jugador, para evitar la deriva en múltiples barajas
- Posible sistema de mensajería para aliviar el trabajo de reubicación de artículos después de la reubicación del sitio
- Diferenciar entre asentamientos subterráneos y sobre la superficie en el futuro
- Preguntas abiertas
- ¿Cómo decidir qué pueblos tienen almacenamiento? Por ejemplo, requiere un muelle para dirigibles.
- ¿Cómo interactúan los NPC con el sistema de almacenamiento?
- ¿Debería haber robos en almacenes y mensajería?
- Posibilidades futuras
- Mejoras en el almacenamiento en cada ciudad (¿capacidad, seguridad?)
- Podría variar desde tarifas únicas hasta la incorporación de un sistema de misiones.
- Influencias de facción/sentimiento
- Fuera del alcance por el momento, pero es probable que influya en las cosas en el futuro.
- Las alineaciones entre ciudades podrían aumentar los costos de mensajería
- Diferentes asentamientos podrían tener sus propios sistemas de precios y tarifas.
- Una alineación no amigable podría significar costos iniciales y basados en el tiempo para el almacenamiento
- Los asentamientos hostiles no deberían recibir elementos después de una reorganización del sitio
- Mejoras en el almacenamiento en cada ciudad (¿capacidad, seguridad?)
Aunque implementar una función de almacenamiento persistente proporcionaría un área de preparación para inventarios basados en peso (u otras nerfs de inventario), no es deseable que esto ocurra antes de que se desempaqueten correctamente los asuntos de almacenamiento. No queremos terminar con lo peor de ambos mundos.
Contando bichos
El cielo abierto se abre paso a través de la sombra del dosel al adentrarse en el claro. Ante uno, una visión que desconcierta a la mente ecológica: media docena de lobos, apiñados contra un rebaño de ovejas. Ninguno de los dos se preocupa por el otro. Como siempre ha sido, pero quizá no en futuros aún por ver.
En lugar de la vida silvestre como islas aisladas, ¿qué otras geografías podrían ser posibles? Un gran archipiélago RTSIM sería la apuesta más directa, pero podría arruinar el presupuesto de seguimiento. Así que, en lugar de un juego a escala mundial de "este cerdito", una visión más amplia podría evitar reducir la capacidad de la CPU.
El Proyecto Pangea lidera una expedición a este ámbito del diseño de juegos, con una reciente sesión de intercambio de ideas sobre la conexión de poblaciones rastreadas regionalmente. Entre la multitud de caquis estuvieron presentes @Neura, @zesterer, @isse, @juliancoffee, @Gemu y @Knightress_Paladin. Estas son sus ideas hasta el momento:
- La vida silvestre se reproduce según los recuentos de población que se rastrean por región/fragmento
- Si el terreno lo permite, estas poblaciones se difunden y se extienden entre regiones adyacentes.
- Las interacciones entre entidades dan lugar a una muerte, un asesinato o una retirada que se contabiliza en la población.
- Modelado dinámico de depredador/presa ( simple o complejo ) que se ejecuta junto con las interacciones del juego
- Con suficiente información sobre los números (¡suena delicioso!), esto debería conducir a sistemas estables.
- Hay algunas formas diferentes de dividir las categorías de vida silvestre para el seguimiento.
- Especie, tipo de cuerpo, función en el ecosistema (presa, depredador (ápice))
- Los efectos de sujeción y los mecanismos de repoblación pueden ser necesarios para evitar extinciones globales
- Por ejemplo, una extinción local puede provocar la repoblación de la población en otro lugar.
- Dado que los escenarios postapocalípticos están de moda, siempre podemos dejar que los jugadores deambulen libremente y aniquilen todo (nos encanta ver que nuestras acciones tienen consecuencias, ¿verdad?).
- Un punto de seguimiento : los PNJ podrían mantener sentimientos hacia especies particulares de vida silvestre (en lugar de individuos), comunicándolos a otros PNJ y alimentando un sistema de generación de misiones.
Una lista de verificación de preguntas
¡Tú, viajero! Tráeme 10 brazaletes Gnarling que caen al azar y te daré una inmersión total en el juego. Suena realista, ¿verdad? @isse no está de acuerdo y cree que la receta para las misiones va a ser más que una comida de microondas.
Sólo para nombrar algunas propiedades que nos vienen a la mente:
- Tiene que implementarse en rtsim , nuestra simulación mundial, y tener efectos sobre ella.
- Las misiones deberían basarse en las necesidades reales del PNJ o facción. Si un cíclope ha atacado recientemente, podrían generar una misión para eliminarlo. (Aunque carecemos de mucha simulación para las necesidades de misiones más interesantes).
- Queremos un rastreador global de misiones, pero cada misión debe tener un actor/facción que la haya asignado y al que se pueda regresar para completarla. Y un actor/facción que la haya recibido.
- Dado que las misiones se basan en necesidades, también están sujetas a un cierto tiempo, ya que estas pueden cumplirse. Alguien podría matar al cíclope, o el que aceptó la misión tardó demasiado y el PNJ decidió hacerlo él mismo, etc. El sistema de misiones debería poder gestionar esto de alguna manera.
- No es necesario para la primera iteración, pero las misiones deberían poder gestionar los casos en que el PNJ original que las asignó murió. Además, podrían migrar la misión a otro PNJ conocido.
- Tampoco es necesario para las primeras iteraciones, pero dado que una gran mayoría de la población de un mundo veloren son NPC, también deberían poder realizar misiones.
escaparate de la comunidad
Arte conceptual
Relatos de primera mano sobre diversas exploraciones en el espacio vóxel. Una combinación de elementos pensados para el juego y propuestas más experimentales.

¡Vamos, vamos, rangers más delgados! — por @GoodMan29

Casco para gran altitud — por @Supa

Sueños imposibles — por @Supa + un recoloreado por @Dan113
Este es el camino
Los dirigibles son geniales para viajar rápido, pero un buen mapa es lo que necesitas para viajar con inteligencia. Para ayudarnos a planificar nuestros desplazamientos, @Limina cambió su rol de traductora a desarrolladora de herramientas, adoptando un enfoque de desarrollo basado en blogs:
Después de ver el mapa completo de rutas de dirigibles de @Froggy en el devblog 245 , me encargué de cumplir con el comentario que se encontraba debajo: "Ahora solo necesitamos una aplicación para planificar viajes".
¡Pide y recibirás! El Planificador de Viajes de Veloren para el servidor oficial de Veloren está disponible en itch.io , todo en la web, ¡sin necesidad de descargarlo! El código está en GitHub , bajo la licencia GPLv3. Actualizaré cualquier ruta incorrecta que encuentre; no dudes en avisarme si hay alguna que se me haya pasado por alto. Si quieres más detalles, sigue leyendo; de lo contrario, puedes pasar a la siguiente sección. No te juzgaré (mucho).
La herramienta se creó con Godot 4.1.1, ya que es mi motor preferido (¡y además es de código abierto!). Utiliza la función de búsqueda de rutas A* para determinar la ruta más corta entre ciudades. Las rutas están predefinidas, ya que las conocemos todas. Sin embargo, son bastante fáciles de intercambiar: cada "pueblo" es un nodo que contiene una lista de todas las demás ciudades a las que está conectado. Esto fue especialmente útil cuando noté que algunas rutas habían cambiado desde que se creó el mapa de @Froggy.
Actualmente, recrea rutas cada vez que le solicitamos una. Admito que podría omitir ese paso y generarlo solo una vez, pero no importa mucho dado que la cantidad de rutas es bastante baja. Esto también permitiría ignorar ciudades dinámicamente o incluso agregarlas o eliminarlas en tiempo de ejecución si queremos, aunque eso aún no está disponible. :P Una vez que conocemos las ciudades de inicio y fin, podemos usar las rutas creadas con el algoritmo A*, ¡y listo! ¡Tenemos una ruta!
Realmente no tengo una lista de cosas por hacer, así que cualquier sugerencia es bienvenida, o incluso solicitudes de extracción si así lo deseas.
Weave tiene un nuevo rival
Sobre la competencia se cierne una nueva propuesta de @Moaaswell para el desafío de alfombras presentado anteriormente . Más allá del simple cuadrado, ¿esta propuesta alargará la estructura del concurso?

Piensa fuera de lo establecido. ¡Sé una caja aún más grande!
Nuevo meta explosivo
Prepárate para sorprenderte con la función de @Necti del metajuego de bombas arrojadizas, que está arrasando con todos los demás estilos de juego. Aprende a proteger tu equipo contra las ondas de choque, adéntrate en la guerra de trincheras personalizada y quédate con nosotros para descubrir algunos consejos fascinantes para infligir aún más daño.
No es difícil imaginar un papel de apoyo al bombardeo aéreo.
Los cultivadores de cocos de Veloren se frotan las manos con avidez, anticipando el aumento de la demanda. Pero el tiempo dirá si el apetito de los jugadores perdura y si estos aspirantes a especuladores sobrevivirán a las consecuencias.
Fuegos artificiales de Phoenix
Tras convertir sus inventarios en fábricas de bombas, los jugadores de Sporia se enfrentaron a una escasez de velorita y cocos que amenazaba con arruinar su habitual espectáculo de fuegos artificiales. Para compensar la escasez local de pirotecnia, algunos ingeniosos decidieron importar un nuevo espectáculo de luces.
@horblegorble nos trae un relato fotográfico del desagradable incidente familiar que tuvo lugar a continuación. Se han omitido las identidades y las groserías para proteger a los (no tan) inocentes.
Atrápala Iluminando la calle principal Recetas para el desastre El entusiasmo menguó Aquí viene la lluvia Un nuevo sol sale Ser eclipsado Tiempo de flecha Vista de pájaro Un crujiente resultado








Eventos
Era la temporada de las tonterías primaverales en Veloren, cuando los conocidos tramposos y los huevos del tesoro entraban en acción. Pero este año también trajo consigo una sorpresa inesperada.
Día de los inocentes
Dejaremos que @Necti haga la gran revelación, con esta primicia sobre la nueva celebridad de Veloren.
No hagas caso a pistas falsas — por @Necti
El maestro ha llegado
El Pigmaster es un cerdo que te enamorará; al menos, eso te dirá su grupo de ratas si les preguntas sobre la construcción de esta torre inclinada del problema. Acaba con la más pequeña (sin perderle el rastro) para tener la oportunidad de conseguir tu propiaCola de Rata .

Amo, rata, pequeño, diminuto, mini, pequeñito — @horblegorble | @Alley_Oop | @Crabo
Este montón de sorpresas fue introducido de contrabando en un paquete de "pequeños cambios" por @isse, junto con colaboradores desconocidos.
Por emocionante que fuera, la novedad no se llevó todo el espectáculo. La gente disfrutó de la típica y peculiar diversión del Día de los Inocentes .
Salta, brinca y rueda para llegar a tiempo al concierto — por @Supa Una tradición anual — por @souffle Se meten en todo tipo de situaciones complicadas — por (➜) @souffle | @horblegorble x3 Senderos abiertos — @horblegorble @Necti se integra para liderar la banda — @horblegorble Una curiosa poción le da la vuelta a la tortilla a @horblegorble Ratas de tejado — @horblegorble






Pascua de Resurrección
Aunque un poco eclipsados por la nueva emoción de las festividades, los jugadores seguían deseando participar en el evento de Pascua . Al fin y al cabo, no se puede regalar huevos sorpresa el resto del año sin abastecerse primero.
¡Oíd, oíd! — por @souffle | @horblegorble @souffle se despertó y descubrió que el Hada de los Dientes estaba ayudando con las entregas de Pascua este año.

En la naturaleza
Ida y vuelta otra vez
Déjate llevar por la narración de @Gbone, quien nos regala una historia de maravillas y contratiempos. ¿Conquistará este grupo de aventureros todo, o el mundo los conquistará a ellos? Míralos enfrentarse a lobos, cuevas, mazmorras e incluso a dirigibles y PNJ de la ciudad, además de un fuego amigo inesperado. Todo en un ambiente divertido mientras encuentran el camino de regreso a casa.
¡Fama, fortuna, gloria y ensalada de tomate! — @Gbone
Capturas de pantalla
Solo tenemos un puente, así que mejor que sea resistente. — por @isse Los mundos pequeños crean grandes fiestas — por @Alley_Oop Demostrando el valor de todos esos estiramientos de cuello — por @unii Aromas que invitan — por @isse Tomando un paseo — por (➜) @Val | @Limina | @horblegorble Volando hacia amaneceres frescos — @horblegorble Volcanaurora — @Alley_Oop Valle de la luz — @horblegorble Buscando raíz de miel — @horblegorble








Bub bub bub... — @Trentus Vibrando — @Limina
¿Encontré la Atlántida? — @isse Envidia de Sahagin — por @Alley_Oop Jorobas de niebla — por @Sam113 Vivir una vida bien sombreada — por @term_junkie Anhelando un nuevo día — @horblegorble Noches largas en la playa — por @Sam113 Reflexiones puntuales — por @Sam113 Distrito de los rascacielos — por @Alley_Oop 







He oído que te gustan los garabatos tontos.

Cara de sorpresa de la torre-chu
'bigflyingrock' — de @Supa, nombrado por @Sam113 Tumba del héroe volador — @horblegorble, encontrada por @Alley_Oop Definitivamente algún tipo de entrada a una cueva — @DaforLynx Hongos extra picantes — por @Alley_Oop Líneas liminales — por @And_i Espeleología brillante (dígalo cinco veces rápido) — por @And_i Acantilados de Chillwater — por @Limina






Este blog para desarrolladores se basa en información recopilada en #blog-content , donde siempre se invita a los contribuyentes del juego a comunicar sus actualizaciones o simplemente publicar un enlace a un canal diferente.

El Legoom perdido contempla un camino más oscuro. Ojalá encuentre el camino de regreso :)