Bitácora 17: de .cs a .json

Bitácora de desarrollo: narrativa condicional basada en JSON, variantes de texto por nodo y migración de armas a JSON con importadores y validadores.

8 sept 2025 • 7 min read • Q2BSTUDIO Team

Inteligencia-Artificial-

Bitácora de desarrollo Condicional Narrative y mejora del sistema de nodos

Ampliamos la rama de historia añadiendo el nodo node_0004 como continuación de la decisión Seguir la línea de costa hacia la derecha del nodo node_0001. Conservamos el formato JSON existente de los nodos y alineamos estilo, espaciado y metadatos con las entradas anteriores. Desde node_0004 definimos tres nuevas elecciones: Subir la duna de arena para tener mejor vista que lleva a node_0005, Seguir la costa hacia la derecha que lleva a node_0006 y Acercarse a las rocas de la orilla que lleva a node_0007. Para consistencia, clonamos el perfil de entorno de node_0001.

Presentamos un sistema de texto narrativo condicional incorporando textVariants en el JSON de StoryNode. Cada variante incluye su propio texto y de forma opcional ubicación, objetos, condiciones y requisitos de conocimiento. El cargador elige la primera variante que cumpla con el estado actual del jugador y si ninguna coincide vuelve al campo principal de texto del nodo, manteniendo compatibilidad retroactiva. Esto permite adaptar los textos según equipo equipado como botas impermeables, estado físico como lesionado o agotado, condiciones de salud como sangrado o fiebre, umbrales de stamina, banderas de enfermedades preparadas para un futuro sistema más amplio y banderas de historia generadas por elecciones previas.

Cambios de código clave. En StoryNodeLoader añadimos el método público GetNodeTextForPlayer para resolver el texto correcto y VariantMatchesPlayer para comprobar requisitos de variantes contra las estadísticas del jugador. Mantuvimos intacta la lógica IsChoiceVisible para filtrar opciones y toda la compatibilidad hacia atrás. En StoryUIManager actualizamos DisplayNode para llamar a nodeLoader.GetNodeTextForPlayer en lugar de usar node.text directamente, conservando el comportamiento de la interfaz como ocultar botones, barajar y mostrar dirección de la brújula si el jugador tiene el objeto. No duplicamos lógica, la resolución de variantes sucede solo en el cargador. En la clase StoryNode agregamos la lista textVariants y creamos la clase TextVariant con los mismos campos de requisitos que Choice.requires.

Beneficios de flujo de trabajo y pruebas. No editamos JSON en tiempo de ejecución, todas las variantes viven en datos estáticos y se eligen al vuelo. Una única fuente de verdad centralizando la coincidencia de variantes en el cargador. Preparado para el futuro, añadir nuevos tipos de condición implica actualizar VariantMatchesPlayer. Amigable para depuración, podremos registrar qué variante se eligió y por qué. Excelente para playtests, funciona en paralelo con scripts simulados de equipo para ver cambios narrativos al activar o desactivar estados. Sumamos un modo ligero de depuración que cuando está habilitado muestra la variante seleccionada, las que se descartaron y los requisitos exactos de cada una; al deshabilitarlo, el cargador opera en silencio.

Bitácora 5 sept 2025 Proyecto: renovación de sistemas de armas. Tema central: adiós base de datos monolítica, hola JSON. Migramos desde un ScriptableObject RangedWeaponItemDatabase gigante a un flujo limpio basado en archivos. Exportamos todos los datos de armas a JSON legible y construimos un RangedWeaponImporter que lee el JSON y genera activos RangedWeaponItem individuales. Ajustamos el validador de equipo para rango. Ahora cada arma es su propio archivo .asset, fácil de editar, amigable con control de versiones y sin errores globales por un simple typo.

Hicimos cruzada por la seguridad de tipos. Antes compatibleAmmoTypes era una lista de cadenas, hoy es una lista de un enum, con el importador convirtiendo cadenas de JSON a enums y avisando valores desconocidos. Las piezas también guardan su tipo de munición como enum y la compatibilidad se comprueba con comparaciones directas sin conversiones a texto.

Puesta a punto del sistema de accesorios. Arreglamos IsAttachmentCompatible para enums. Simplificamos GetCombinedModifiers con un helper WeaponStatModifier.FromFloats para iniciar valores por defecto de forma segura, sin tener que inicializar campo a campo.

Rehabilitamos depuradores. Retiramos scripts dependientes de la antigua base a una carpeta archivada y los convertimos al patrón de listas asignadas por Inspector. AmmoTypeDebugger ahora usa listas tipadas; AttachmentCompatibilityDebugger comprueba compatibilidades por arma; WeaponDebugger localiza por nombre y calcula estadísticas finales con modificadores; WeaponStatSheetDebugger imprime hoja completa; WeaponNullCheckDebugger detecta nombres faltantes, accesorios nulos y modificadores vacíos. Todo con comprobaciones de nulos y compilación limpia.

Evolución de modos de disparo. Añadimos fireMode y semiAutoRate al item de arma a distancia. FireModeController arranca en semi o auto según el arma, permite alternar en armas selectivas, aplica modificadores de accesorios, limita tasas a mínimos seguros y queda listo para integrarse con sistemas de proyectiles, munición y efectos.

Resucitamos WeaponStatModifier como struct serializable con los campos adecuados y un helper FromFloats. Se usa de forma consistente en importador, accesorios y depuradores. Resultado final del día: pasamos de más de doscientos errores a cero. Código más limpio y modular, pipeline de datos preparado para crecer, herramientas de depuración reutilizables y seguridad de enums que evita corrupción silenciosa por errores tipográficos.

Lecciones aprendidas. Las cadenas son poesía, no tipos de munición. Si no puedes borrar un sistema legado sin romperlo todo, sustitúyelo pieza a pieza hasta que pida ser retirado. Inicializa siempre tus structs, los multiplicadores no inicializados arruinan el balance. Un buen importador es como un portero, deja entrar datos correctos y expulsa los inválidos con aviso.

Bitácora 6 sept 2025 Manifiesto cuerpo a cuerpo. Migramos toda la base de armas melee a JSON modular, preservando fidelidad de estadísticas para cuchillos, mazas y lanzas. Partimos los datos en siete bloques listos para pegar por limitaciones de raíz única en JSON. Añadimos 35 armas melee únicas. Creamos un extractor por bloques que lee MeleeWeapons.json y escribe un archivo por arma, evitando duplicados, limpiando nombres de archivo y sin sobreescribir datos de rango. Cada arma vive en StreamingAssets Data WeaponExtracted.

Unificamos validación con WeaponJSONValidator que detecta si el objeto usa weaponName o itemName y aplica verificaciones de campos requeridos, rangos válidos y accesorios nulos. Es un validador incansable que revisa tu precisión con lupa. Reconstruimos el importador de melee, ahora analiza enums correctamente, maneja campos anulables y genera .asset en Assets ItemAssets MeleeWeapons. Se registró en el menú Tools, resolvimos errores de Enum.TryParse añadiendo using System y el menú aparece mediante el atributo MenuItem.

Problemas y arreglos del día. Error de parseo por texto adicional tras cerrar el contenido JSON causado por múltiples bloques raíz, solucionado unificando en un único arreglo. Error de compilación por no reconocer Enum arreglado importando el espacio de nombres adecuado. Importador que no aparecía en menú corregido encapsulándolo como EditorWindow y registrándolo con el atributo de menú. Incompatibilidades de enums resueltas verificando estructura y esquema JSON. Conclusión práctica: JSON exige una sola raíz y cero sorpresas, y cada arma merece su propio asset, incluso un humilde cuchillo de mantequilla. Total de armas únicas hasta ahora 85. Próximos pasos: herramientas de uso mixto, objetos varios, líquidos y contenedores, alimentos enlatados, carnes, frutas, verduras y semillas, utensilios de cocina, items mecánicos, ambientales y todo lo que aún falte. El avance es lento, pero es avance.

En Q2BSTUDIO vivimos estas transformaciones todos los días en proyectos reales, creando aplicaciones a medida y software a medida que convierten bases de datos monolíticas en pipelines flexibles y mantenibles, integrando validadores, importadores y automatizaciones para reducir errores y acelerar despliegues. Si buscas llevar tu plataforma al siguiente nivel, descubre cómo abordamos la ingeniería de producto de principio a fin en nuestro servicio de desarrollo de aplicaciones y software multiplataforma a medida.

Combinamos inteligencia artificial aplicada, agentes IA, ciberseguridad y pentesting, servicios cloud AWS y Azure, así como servicios de inteligencia de negocio y power BI, para que tu narrativa dinámica, tus sistemas de juego o tus aplicaciones corporativas evolucionen con datos fiables, tipados y seguros. También impulsamos la eficiencia con automatización de procesos, orquestando validaciones, importaciones y despliegues con un enfoque reproducible y auditable. Conoce más sobre nuestras estrategias de automatización en automatización de procesos de software.

Q2BSTUDIO es tu socio tecnológico para llevar ideas desde el .cs al .json y más allá, con gobernanza de datos, seguridad por diseño y escalabilidad en la nube, para que el progreso, por pequeño que sea, siempre cuente.

A BREAK?

Play for a moment before you go

OUR SERVICES

How we can help you

Artificial intelligence

AI agents, chatbots, and intelligent assistants that automate tasks and serve your customers 24/7 to improve the efficiency of your business.

More info

Software Development

Web, mobile, and desktop applications, intranets, e-commerce, SaaS, and management platforms designed for your company's specific needs.

More info

Cloud services

Migration, infrastructure, managed hosting, high availability, and security on Microsoft Azure and Amazon Web Services to help your business scale without limits.

More info

Cybersecurity and pentesting

Security audits, penetration testing and protection of applications, data and infrastructure on-premise and cloud, with ethical hacking and regulatory compliance.

More info

Business Intelligence

Dashboards and data analysis with Power BI: we integrate your sources, design dashboards and KPIs and turn your data into decisions.

More info

Process automation

We automate repetitive tasks and connect your applications with n8n, Power Automate, Make, and RPA, eliminating manual work and increasing productivity.

More info

Training for Companies

We train your teams in technology with criteria: web development, databases, Git, best practices and security, automation with n8n, artificial intelligence for companies and creation of AI solutions with Azure AI Foundry.

More info

Code Auditing

We audit the code that you, your team or an AI create: we tell you what is good and what to improve, we secure it and make it ready for production, web or app.

More info

AI Image Generation

We create for you the images that your business needs with artificial intelligence: product, networks, advertising, illustration and avatars. You tell us what you want and we deliver it ready to use.

More info

AI Video Generation

We create videos with artificial intelligence for you: promotional, networking, virtual presenters, dubbing and animations. You tell us the idea and we will deliver it assembled and ready to publish.

More info

AI Conversational Avatars

We create conversational avatars with AI – digital humans with a face and voice – that serve your customers and teams with the knowledge of your company, on your website, interactive monitors, WhatsApp or Teams.

More info

Online Marketing and AI

Google Ads, Meta Ads, LinkedIn Ads and AI Engine Positioning (GEO/AEO): we attract customers and make your brand appear where they search for you, also on ChatGPT, Gemini and Perplexity.

More info

Do you have a project in mind?

Tell us your vision and we'll turn it into a software solution. Whatever the scope, we make your idea real.

Live Chat