Lección 53 de 170

Una facción gestiona relaciones, no el mundo entero

Curso de desarrollo de videojuegos con IA

Define una responsabilidad acotada para una facción mediante el estado de la relación, sus entradas, umbrales, autoridad de mutación, invariantes y consumidores autorizados.

772. Identidad de la lección

Módulo
2.9 — Sistemas de facciones
Lección
Una facción gestiona relaciones, no el mundo entero
Tipo académico
Concepto
Tipo de esquema
texto
Orden
Lección 1 del módulo
Tiempo estimado
25–35 minutos, incluida la práctica

Esta lección establece un contrato acotado para las relaciones de una facción. Un sistema de facciones debe responder por las relaciones que gestiona sin convertirse en una autoridad oculta sobre la moneda, las misiones, el diálogo, el combate o todo el estado del juego.

773. Objetivo de aprendizaje

Después de esta lección, podrás especificar un contrato para una relación de facción al nombrar su estado, sus entradas aceptadas, la autoridad que puede modificarlo, sus invariantes, sus reglas de umbral y sus consumidores autorizados.

774. Por qué es importante

Los sistemas de facciones se vuelven difíciles de modificar cuando controlan en silencio dominios que no les corresponden. Un valor de reputación puede comenzar como una medida de relación y terminar siendo una fuente accidental de recompensas, disponibilidad de misiones, texto de diálogo y cambios de dificultad. Un contrato acotado proporciona un límite que los colaboradores pueden inspeccionar. También permite discutir con precisión si un valor es el estado de la relación, una entrada que lo modifica, una clasificación derivada o una salida gestionada por otro sistema.

La autoridad explícita de mutación y los invariantes permiten comprobar ese límite. Indican quién puede cambiar la relación, cómo se aplica el cambio y qué condiciones deben seguir siendo verdaderas después de cada actualización.

775. Conocimientos previos

Ya deberías poder:

  • Separar una decisión de diseño del sistema responsable de su consecuencia.
  • Identificar escrituras globales ocultas y sustituirlas por cambios de estado explícitos.
  • Describir una elección mediante un contrato que distinga la selección de la consecuencia.

Estas capacidades provienen del Módulo 2.8 — Decisiones de diseño sin escrituras globales ocultas.

776. Concepto central

Una facción gestiona el estado de la relación entre un actor y esa facción. No controla automáticamente todos los sistemas afectados por la relación.

Un contrato útil para una relación de facción identifica el límite en cada paso:

  1. Estado: ¿Qué valor o categoría de relación gestiona la facción?
  2. Entrada aprobada: ¿Qué eventos o comandos explícitos pueden solicitar un cambio?
  3. Autoridad de mutación: ¿Qué sistema aplica el cambio y mediante qué operación nombrada?
  4. Comprobación de invariantes: ¿Qué condiciones deben seguir siendo verdaderas después de la mutación?
  5. Clasificación: ¿Qué umbrales convierten el estado resultante en una etiqueta documentada?
  6. Consumidores: ¿Qué sistemas pueden leer el resultado y qué respuesta corresponde a cada uno?

El flujo completo es:

entrada aprobada → autoridad de mutación → estado de la relación → comprobación de invariantes → clasificación por umbral → respuesta del consumidor autorizado

Un umbral solo convierte el estado resultante de la relación en una clasificación documentada. Cruzar un umbral no transfiere al sistema de facciones la responsabilidad sobre las consecuencias posteriores.

Por ejemplo, una facción puede gestionar playerRelationship = -20, los eventos aprobados que modifican ese valor y las clasificaciones hostile, wary y trusted. El sistema de relaciones de facción puede ser la única autoridad autorizada para ejecutar adjustRelationship(input), mientras un invariante mantiene el valor entre -100 y 100. El sistema de misiones puede consumir la etiqueta resultante para decidir si una misión está disponible. El sistema de facciones no debería crear silenciosamente la misión, entregar moneda, reescribir el diálogo ni cambiar la salud de los enemigos porque la relación haya cruzado un umbral.

Mantén separadas estas responsabilidades:

Responsabilidad Sistema de relaciones de facción Puede corresponder a otro sistema
Guardar el estado de la relación No, salvo delegación explícita
Aplicar entradas de relación aprobadas No debe haber escrituras directas ocultas
Autorizar la operación de mutación No debe haber asignación directa al campo de relación
Preservar los invariantes No debe haber límites duplicados ni reglas contradictorias
Clasificar el estado con umbrales documentados No debe haber interpretaciones duplicadas sin contrato
Decidir si una misión está disponible No Sistema de misiones
Entregar una recompensa No Sistema de recompensas o economía
Presentar texto sobre la relación No Sistema de diálogo o interfaz
Cambiar la dificultad del combate No Sistema de dificultad o combate

Una decisión sobre la autoridad de mutación responde: «¿Quién puede cambiar este estado?». En un contrato acotado, el sistema de relaciones de facción lo modifica mediante una operación explícita que acepta entradas aprobadas. Un productor de eventos puede solicitar un cambio, pero no debe escribir directamente el valor de la relación.

Una decisión sobre invariantes responde: «¿Qué debe seguir siendo cierto después del cambio?». Algunos ejemplos son un rango numérico limitado, una única clasificación vigente derivada del valor actual y el rechazo de tipos de entrada desconocidos. Los invariantes protegen el contrato de relación; no conceden responsabilidad sobre las consecuencias posteriores.

777. Modelo mental

Utiliza el modelo Entradas → Autoridad de mutación → Estado → Invariantes → Umbrales → Consumidores.

solicitud de entrada aprobada
            |
            v
 [autoridad de mutación]
            |
            v
  [estado de la relación]
            |
[comprobación de invariantes]
            |
            v
 [clasificación por umbral]
         /       |        \
    misiones  diálogo/UI  recompensas
     decide     presenta     entrega

Completa este contrato para cada relación de facción:

Campo Pregunta Ejemplo
Estado ¿Qué valor de relación se gestiona? harborLeagueStanding de -100 a 100
Entradas ¿Qué puede solicitar un cambio? returnedCargo, attackedCourier
Autoridad de mutación ¿Quién aplica el cambio y cómo? Sistema de facciones mediante adjustRelationship(input)
Invariantes ¿Qué debe seguir siendo cierto? El valor permanece entre -100 y 100; se rechazan entradas desconocidas
Umbrales ¿Cómo se clasifica el estado resultante? menos de -25: hostil; de -25 a 24: cauteloso; 25 o más: de confianza
Consumidores ¿Quién puede leer el resultado y para qué? misiones comprueba el acceso; la interfaz presenta la etiqueta
Exclusiones ¿Qué no hace la facción? no entrega moneda ni modifica el estado de las misiones

Las filas de autoridad e invariantes son esenciales. Sin una autoridad definida, varios sistemas pueden modificar la misma relación mediante escrituras ocultas. Sin invariantes, un contrato puede nombrar un rango o conjunto de clasificaciones sin explicar cómo se protege. Las exclusiones explícitas evitan que el sistema de facciones se convierta en un controlador global.

778. Ejemplo concreto

Supón que el juego tiene una facción llamada Liga del Puerto. Su contrato de relación podría ser:

  • Estado: harborLeagueStanding, un entero entre -100 y 100.
  • Entradas: completar una entrega para la Liga suma +10; robar carga de la Liga resta -15.
  • Autoridad de mutación: solo el sistema de relaciones de facción aplica estos cambios mediante adjustRelationship(input); los productores de eventos no asignan directamente el valor.
  • Invariantes: el valor permanece entre -100 y 100; una entrada desconocida se rechaza; exactamente una etiqueta de relación se deriva del valor actual.
  • Umbrales: menos de -25 es hostile; de -25 a 24 es wary; 25 o más es trusted.
  • Consumidores: el sistema de misiones comprueba la clasificación antes de ofrecer un encargo de la Liga; el sistema de diálogo elige una variante de relación escrita de forma explícita; la interfaz muestra la etiqueta actual.
  • Exclusiones: el sistema de facciones no paga la recompensa de la entrega, no crea la misión, no selecciona las líneas de diálogo ni modifica las estadísticas de los enemigos.

Cuando se completa una entrega, el evento envía una entrada aprobada. El sistema de relaciones de facción valida la entrada, aplica la mutación mediante su operación nombrada y comprueba los invariantes. Después clasifica el valor resultante mediante los umbrales documentados. Los consumidores autorizados leen el estado o su clasificación y realizan únicamente las responsabilidades que les corresponden.

Este diseño permite respuestas distintas ante el mismo resultado. El sistema de misiones puede denegar una misión a un jugador hostil mientras el sistema de diálogo presenta una advertencia. Ninguna de las dos respuestas tiene que estar incorporada en la actualización de la facción.

779. Error frecuente

Un error frecuente es tratar el cruce de un umbral como permiso para que el sistema de facciones ejecute todas las consecuencias. Por ejemplo: «Cuando la reputación llegue a 25, desbloquea la misión, entrega 100 créditos, reemplaza el árbol de diálogo y reduce el daño de los guardias». Eso mezcla la clasificación de la relación con responsabilidades de misiones, economía, diálogo y combate.

Otro error es permitir que cualquier manejador de eventos asigne directamente el campo de relación. Eso elude la autoridad de mutación y puede omitir la validación, los límites u otros invariantes.

Un diseño mejor expone un resultado claro, como el valor subyacente y su clasificación trusted, y permite que cada consumidor autorizado decida cómo utilizarlo dentro de su propio dominio. Las consecuencias necesarias deben documentarse como contratos de los consumidores, no ocultarse dentro de la actualización de la facción.

780. Práctica guiada

Escribe un contrato de una página para una facción inventada. No lo implementes. Completa la siguiente tabla:

Campo Tu decisión
Nombre de la facción
Estado y rango de la relación
Dos entradas válidas
Una entrada inválida o no autorizada
Autoridad de mutación y operación nombrada
Invariantes que deben cumplirse después de la mutación
Clasificaciones por umbral
Dos consumidores autorizados
Responsabilidad de cada consumidor
Tres exclusiones explícitas

Después, prueba el contrato con este escenario:

La relación del jugador pasa de wary a trusted después de un evento.

Escribe seis frases:

  1. ¿Qué entrada aprobada se acepta?
  2. ¿Qué autoridad aplica la mutación?
  3. ¿Qué estado subyacente de la relación cambia?
  4. ¿Qué invariante se comprueba o preserva?
  5. ¿Qué clasificación se deriva mediante los umbrales y qué consumidor la lee primero?
  6. ¿Qué decide ese consumidor y qué consecuencia tentadora permanece fuera de la responsabilidad de la facción?

Las decisiones de diseño obligatorias son la autoridad de mutación, la lista de invariantes y la lista de exclusiones. Elige al menos una consecuencia que sería conveniente colocar en el sistema de facciones y asígnala deliberadamente a otro sistema.

781. Validación y evidencias

La evidencia consiste en el contrato de relación completado y el escenario de umbral. Cumple los requisitos cuando:

  • El estado subyacente de la relación tiene un responsable claro y un rango o conjunto de categorías válido.
  • Cada entrada que modifica el estado está nombrada explícitamente.
  • Se especifican una autoridad de mutación y una operación nombrada.
  • El contrato incluye al menos dos invariantes y explica cómo la autoridad los preserva o rechaza entradas inválidas.
  • Los umbrales están ordenados, no se solapan y producen clasificaciones documentadas.
  • Cada consumidor tiene un propósito concreto, no acceso ilimitado.
  • Al menos tres consecuencias ajenas quedan fuera de la responsabilidad de la facción.
  • El escenario puede seguirse desde la entrada hasta la autoridad de mutación, el estado, la comprobación de invariantes, la clasificación y la respuesta del consumidor sin una escritura global no declarada.

Si el lector no puede distinguir el valor subyacente de la relación de su clasificación por umbral, no puede identificar quién está autorizado para modificarlo o no puede determinar qué sistema gestiona una consecuencia, revisa el contrato antes de continuar.

782. Ideas clave

  • Una facción gestiona el estado de la relación y las reglas para modificarlo y clasificarlo.
  • Las entradas deben ser explícitas y la autoridad de mutación debe concentrarse en una operación nombrada.
  • Los invariantes protegen el contrato de relación después de cada mutación.
  • Los umbrales producen clasificaciones documentadas; no transfieren la responsabilidad sobre las consecuencias posteriores.
  • Los consumidores leen los resultados de la facción y gestionan las respuestas propias de su dominio.
  • Las exclusiones explícitas impiden que el sistema de facciones se convierta en un controlador global oculto.

783. Siguiente lección

A continuación: Mantén las consecuencias de facción acotadas y explícitas, la siguiente lección del Módulo 2.9 — Sistemas de facciones.

784. Comprobación

Responde estas preguntas por tu cuenta antes de leer las respuestas.

¿Qué debería gestionar principalmente un sistema de relaciones de facción?

  • A. El estado de la relación, sus entradas aprobadas, la autoridad de mutación, los invariantes y la clasificación por umbrales
  • B. Cada misión, recompensa, línea de diálogo y ajuste de combate afectado por la relación
  • C. Solo la etiqueta visual mostrada en la interfaz
  • D. Todo el estado global del juego
Mostrar respuesta y explicación

Respuesta: El estado de la relación, sus entradas aprobadas, la autoridad de mutación, los invariantes y la clasificación por umbrales

Por qué: El sistema de facciones gestiona el estado de la relación y las reglas controladas para modificarlo, validarlo y clasificarlo. Los demás dominios conservan la responsabilidad sobre sus propias respuestas.

¿Cuál es el papel de un consumidor del estado de una relación de facción?

  • A. Reescribir el estado de la facción cuando necesite un resultado diferente
  • B. Sustituir las reglas de umbral de la facción por reglas privadas
  • C. Leer el resultado de la relación y tomar una decisión dentro de su propio dominio
  • D. Ejecutar todas las consecuencias asociadas con el cruce de un umbral
Mostrar respuesta y explicación

Respuesta: Leer el resultado de la relación y tomar una decisión dentro de su propio dominio

Por qué: Un consumidor utiliza el resultado de la relación para una responsabilidad concreta, como comprobar el acceso a una misión o presentar una variante de diálogo. No adquiere autoridad para reescribir la relación ni controlar otros dominios.

¿Por qué debe incluir exclusiones explícitas un contrato de relación de facción?

  • A. Para impedir que los consumidores lean el estado de la relación
  • B. Para eliminar la necesidad de definir umbrales
  • C. Para hacer que el sistema de facciones sea responsable de más funciones del juego
  • D. Para evitar que el sistema de facciones se convierta en un controlador global no declarado
Mostrar respuesta y explicación

Respuesta: Para evitar que el sistema de facciones se convierta en un controlador global no declarado

Por qué: Las exclusiones indican lo que el sistema de facciones no hace. Hacen visibles los límites de responsabilidad y reducen el acoplamiento accidental con misiones, economía, diálogo, combate o estado del mundo.

¿Qué secuencia describe mejor un contrato de relación acotado?

  • A. Recompensa → estado de facción → reescritura del diálogo → umbral
  • B. Consumidor → escritura oculta → consecuencia global → etiqueta de facción
  • C. Umbral → responsabilidad sobre sistemas ajenos → entrada → estado
  • D. Entrada aprobada → autoridad de mutación → estado de la relación → comprobación de invariantes → clasificación por umbral → respuesta del consumidor autorizado
Mostrar respuesta y explicación

Respuesta: Entrada aprobada → autoridad de mutación → estado de la relación → comprobación de invariantes → clasificación por umbral → respuesta del consumidor autorizado

Por qué: La secuencia completa identifica quién aplica la mutación, valida el estado resultante mediante sus invariantes, deriva una clasificación y deja cada respuesta posterior en manos de un consumidor autorizado.

¿Cuál de estos valores es el estado subyacente de una relación y no una clasificación por umbral, un valor económico ni una salida del estado del mundo?

  • A. El precio actual de un suministro médico
  • B. La cantidad de créditos en la cuenta del jugador
  • C. Relación con la Liga del Puerto: -20
  • D. Si un puesto de control está abierto actualmente en el mundo
Mostrar respuesta y explicación

Respuesta: Relación con la Liga del Puerto: -20

Por qué: Relación con la Liga del Puerto: -20 es el valor subyacente de la relación. Una etiqueta como wary sería una clasificación derivada de ese valor mediante umbrales documentados. Los precios y los créditos corresponden a sistemas económicos, mientras que la apertura de un puesto de control es una salida del estado del mundo.

Apoyar