Saltar a contenido

Receta: incorporar hambre a los personajes

Supongamos que querés que un personaje pierda saciedad con el tiempo, pueda alimentarse y reciba consecuencias cuando el nivel llega a cero. El problema interesante no es restar un número: es colaborar con inventario, salud, IA, presentación y guardado sin convertir Hunger en un administrador universal.

Estado e invariantes

La instancia del personaje conserva current_satiety y un máximo definido por sus atributos. El módulo de necesidades garantiza que la saciedad no supere los límites y especifica si puede disminuir durante pausa, sueño u otras situaciones.

Las definiciones de comidas son compartidas. Un ítem individual y su cantidad en el inventario son estado mutable: no deben guardarse en el YAML de la definición.

Primer corte vertical

CharacterNeeds:
    current_satiety
    max_satiety

NeedsSystem.tick:
    for each affected character:
        lower_satiety_as_rules_allow()

UseFood action:
    validate_actor_and_item()
    validate_character_needs()
    apply_food_effect()
    consume_inventory_item()
    return_result()

La operación de consumo debe definir qué ocurre cuando no se puede completar una parte. Validar antes de aplicar y utilizar las interfaces de cada propietario suele alcanzar para una primera versión local.

Definiciones configurables

id: item.apple
kind: consumable
use:
  strategy: consume_food
  effects:
    - type: restore_satiety
      amount: 18
    - type: consume_item
      amount: 1

El algoritmo consume_food existe en código. El YAML elige las operaciones permitidas y sus parámetros. Si se incorporan efectos arbitrarios, necesitás reglas claras de orden, rollback lógico e incompatibilidades.

IA y presentación

La IA detecta saciedad baja, busca alimentos o solicita consumir uno. No modifica la variable directamente. La UI lee un modelo observable y dibuja el nivel; no decide si comer fue válido.

Qué probar

  • Comer con y sin comida disponible.
  • Saciedad mínima y máxima.
  • Múltiples solicitudes en el mismo tick.
  • Guardar y restaurar una entidad hambrienta.
  • Ejecutar cien ticks sin renderer.
  • En red, rechazar resultados impuestos por un cliente.

Si crece a miles de NPC, medí el presupuesto del sistema y considerá un ritmo de simulación reducido para entidades lejanas. No empieces por ECS solo por existir un contador.

Fundamentos: Agregar una mecánica sin acoplar todo el juego, Estado del mundo, definiciones e identidad, Autoridad: quién puede cambiar el mundo, Gameplay dirigido por datos y comportamientos declarativos, Probar la simulación y medir antes de optimizar.


Mencionado desde