Godot: Afinando la Maquinaria

Proyecto: Una Playa Oscura Godot: Afinando la Maquinaria

  • Este debate está vacío.
Mostrando 0 respuestas a los debates
  • Autor
    Entradas
    • #98
      Drk0027
      Superadministrador
        Up
        0
        Down
        ::

        Esta vez los cambios son un poco transparentes en el sentido que he cambiado muy poco de la apariencia y mucho del motor del juego. Pero marca el final del desarrollo de este, pues, ya estan contempladas todas las situaciones que se deberian programar y el resto seria solo meter la historia a los JSON.

        Introduccion

        He dejado atras los cambios esteticos para concentrarme en lo que deberia ser el corazon del juego. La maquinaria necesaria para soportar la historia y su manifestacion. Asi que el motor ya soporta las siguientes particularidades:

        • Narrativa determinista. La historia puede ser escrita en bloques cuya unica direccion, es el siguiente bloque.
        • Maquina de estados. Cada turno puede cambiar las variables del mundo segun se crea necesario.
        •  Disparadores de accion. Cada turno puede disparar una accion que varia la ruta determinada. Ej. atacar con hacha puede llevar a victoria o derrota en el mismo turno
        • Sistema de presagios. Breves mensajes que representan la conciencia del jugador.
        • Sistema de Eventos Globales. Cada turno evalua las condiciones globales y establece la probabilidad de ejecucion.

        Conseguidas estas estructuras logicas, los cambios a partir de ahora deberian ser a nivel narrativo y estetico, pero el juego en si ya se encuentra en su primer loop funcional.

        DevLog 4. Montones de cambios

        • Sistema de Presagios Amarillo Ocre (#E6C229): Implementado un motor de renderizado de texto condicional dinámico en el JSON. Al deambular por las habitaciones, la interfaz evalúa el riesgo y actualiza los mensajes amarillos de advertencia en orden de prioridad.
        • Separación de Responsabilidades: Creado el Autoload LogicaEventos.gd para aislar el procesamiento matemático. El script main.gd ahora solo maneja la interfaz visual y el GameManager.gd resguarda los datos puros.
        • Interruptores de Estado Global: Reemplazamos la necesidad de saturar el JSON escena por escena. El peligro ahora se controla con banderas generales como evento_intruso_activo, protegiendo el diseño contra errores de dedo.
        • Intercepción de Emergencia en Flujo: Modificado _cambiar_escena para frenar el movimiento normal del jugador y forzar la carga de la escena encuentro_intruso en el instante exacto en que el riesgo llega a 100%.
        • Solución del Bug Nil: Corregido el paso 4 de _cambiar_escena en main.gd para que no intente cargar lineales inexistentes si la acción procesa un trigger.
        • Saltos de archivo seguros: Adaptado los triggers en Gamemanager.gd usando cambiar_escena("json:id") para que el motor cargue el archivo correcto en disco antes de renderizar la interfaz.
        • Reset de memoria automatizado: Implementado .duplicate() en el _ready() del manager para limpiar la RAM al iniciar una partida nueva sin arrastrar muertes ni riesgos viejos, ahorrándote duplicar código en el futuro.
        • Triggers de Combate Robustos: El hacha calcula el 70/30 de probabilidad sin romper el flujo de la interfaz mediante redirecciones nativas de cambiar_escena().
        • Persistencia Limpia de RAM: El Menú Principal clona la plantilla inicial mediante .duplicate(), erradicando el bug de quedar atrapado en pantallas de muerte al reiniciar.
        • Intercepción por Flags de Estado: Creamos un centinela en LogicaEventos.gd que unifica los dos disparadores (pelear con éxito o leer la nota con el hacha en mano) mandando al jugador limpiamente hacia la secuencia de la niebla en final/bosque.json.
        • Sistema de Estados de Texto para Habitaciones: Reemplazado los interruptores simples (true/false) por strings de estado en el GameManager. hab1_estado ahora maneja "cerrada", "abierta" y "reforzada", mientras que hab3_estado controla "abierta" y "cerrada". Esto eliminó el bug de la «viga duplicada» y protegió la escalabilidad del JSON.
        • Mecánica de Recuperación de Viga («Quitar Viga»): Añadido opciones dinámicas en los JSON de las habitaciones 1 y 3 para que el jugador pueda retirar la viga si se arrepiente. Esto habilitó un rompecabezas de gestión de recursos bajo presión.
        • Operaciones Aritméticas Dinámicas en set_flag: Mejorado la función _ejecutar_accion en el motor. El JSON ahora puede enviar operaciones matemáticas en formato String (como "-1", "+2", "*2", "/2"). El motor las procesa automáticamente sobre las variables del juego.
        • Escudo Anti-Inventario Negativo: Implementado una protección con max(0, nuevo_valor) en el procesador de flags. Ningún recurso (como leños o cerillos) puede bajar de cero de forma errónea.
        • Escena de Muerte del Bosque (ataque_acecho_bosque): Diseñado por completo el nodo de Game Over del bosque, aplicando formato gramatical estricto, comillas españolas (« ») y efectos visuales avanzados de BBCode ([shake], [wave], [pulse]).
        • Fórmula de Seguridad del Refugio: Rediseñado el bloque de la casa en procesar_eventos_accion(). El evento del intruso ahora se apaga únicamente si hab1_estado == "cerrada" AND hab3_estado == "cerrada". Romper la Habitación 1 inhabilita la condición de victoria y acelera la subida del riesgo (sube de 3 en 3).
        • Mecánica de Alivio Emocional (La Intuición): Implementado un reinicio parcial del riesgo_intruso a 30 en el instante en que el refugio se vuelve seguro. Esto evita que los presagios de pánico absoluto parpadeen al segundo exacto de quitar la viga, dando una ventana justa de toma de decisiones.
        • Unificación de Variables del Bosque: Eliminada la bandera huérfana riesgo_bosque y unificado todo el sistema bajo la bandera real del GameManager: acecho_bosque.
        • Corte de Bucles y Funciones Fantasma:
            • Eliminamos un bloque duplicado del bosque en el script que duplicaba la velocidad del peligro.
            • Eliminamos una función intrusa que sumaba +5 de acecho de forma fantasma estando el jugador dentro del refugio.

        • Sistema de Castigo por Acciones en el Bosque: Tras notar que los «turnos técnicos» de las pantallas intermedias del JSON inflaban el peligro, fue retirado el incremento automático del motor y lo inyectamos directamente en los resultados lógicos de procesar_exploracion() (castigando con +6 la oscuridad, +2 la luz, +10 la huida y +20 el botín ruidoso). Conectar el regreso a casa limpia el medidor a 0.
        • Resolución del Bug de Operandos (String vs int): Corregido un colapso en evaluar_condicion() causado por tener la bandera gema_rota_encontrada inicializada por error como un String ("false") en lugar de un booleano puro (false).

        Conclusiones

        Me hubiese gustado hacer cambios mas visuales para llamar mas la atencion, pero trabajar en todo esto era necesario para poder llegar a eso. por supuesto, es adecuado destacar las cosas que quedan pendientes como por ejemplo.

        1. La exploración de la casa con luz encendida: Redactar los cambios de textos y condiciones en la Cocina, Habitación 1 y Habitación 2 para cuando fogata_luz > 0 (revelando la nota y la gema rota de forma real).
        2. Valor a los niveles medios de luz: Configurar las penalizaciones o limitaciones lógicas si el jugador permite que la fogata caiga a nivel 1 o 2 en lugar de mantenerla en 3.
        3. Punto final de exploración (Disparador de Escape): Definir la regla exacta (ej. tener la viga puesta, la fogata encendida y la nota leída) para cambiar evento_escape_casa_activo a true y saltar a la secuencia final de la casa.
        4. Acercamiento del Checkpoint: Mover la lógica del primer punto de control a la entrada de la sala_3 para mitigar la frustración del azar (RNG) en el bosque sin alterar la dificultad de supervivencia.
        5. Fase Casa (Ciclo Intruso):
            • Hacer funcionar el trigger del hacha: Programar el acierto (70%) o fallo (30%) dentro de GameManager.procesar_exploracion() para el trigger espantar_intruso_hacha.
            • Crear la escena del Bad End: Escribir en el JSON el texto definitivo de la escena final_malo_atrapado para cuando el jugador falle con el hacha o elija huir.
            • Resolver el bug de redirección al bosque: Rastrear por qué el motor salta a busqueda_y_batalla_bosque tras interactuar con la escena de emergencia y corregir la lectura del trigger.

        6. Fase Exterior (Ciclo Bosque):
            • Diseñar el «Acecho del Bosque»: Implementar la lógica para la flag evento_bosque_activo que castigará al jugador si decide caminar por el bosque con la fogata apagada ("fogata_luz": 0).
            • Temporizador letal del exterior: Crear el freno de emergencia para el bosque, simulando que andar desarmado o a oscuras demasiado tiempo activa una muerte definitiva o un encuentro con los monstruos.

        Ah y por cierto. el sistema de debuging tambien ha crecido. ahora tambien tiene un Log por sesion que permite ver que pasos se ha tomado en cada oportunidad y claro, si presionas el boton de enviar reporte, me llega el conjunto de pasos que tomaste para llegar al bug que encontraste. No dudes en usarlo si le echas un ojo al juego.

        https://drk0027.itch.io/una-playa-oscura

    Mostrando 0 respuestas a los debates
    • Debes estar registrado para responder a este debate.