feat(world): add persistent citizen simulation with needs, jobs, and social features

- Adds Character model with survival needs (hunger, thirst, energy) and state machine
- Implements city:tick world ticker for offline progression every minute
- Adds city territory expansion and building construction system
- Introduces job economy, inventory, and transaction audit trail
- Adds social graph (friends, marriage, children) and character chat
- Implements admin approval workflow for new registrations
- Adds hospital admission system for traffic accidents
- Includes comprehensive feature tests and world seeders
This commit is contained in:
2026-10-17 21:46:23 -03:00
parent 79d12fa2f4
commit 79ce2a1825
132 changed files with 11809 additions and 1036 deletions
Regular → Executable
+102 -1
View File
@@ -103,5 +103,106 @@
"city.chat_accepted": "Mensaje enviado al agente.",
"city.chat_error": "Lo siento, no puedo responder ahora. Inténtalo de nuevo.",
"city.chat_send": "Enviar",
"city.chat_with": "Chateando con"
"city.chat_with": "Chateando con",
"city.clock": "Hora",
"city.weather": "Clima",
"city.weather_clear": "Soleado",
"city.weather_cloudy": "Nublado",
"city.weather_rain": "Lluvia",
"city.weather_storm": "Tormenta",
"city.vehicles_count": "vehículos",
"city.pedestrians_count": "peatones",
"auth.pending": "Su cuenta espera la aprobación del administrador.",
"auth.pending_title": "Esperando aprobación",
"auth.pending_body": "Su registro fue recibido. Un administrador debe aprobar su cuenta antes de entrar a la ciudad. Puede cerrar esta página e intentar más tarde.",
"admin.citizens.title": "Ciudadanos",
"admin.citizens.hint": "Apruebe cuentas pendientes para crear su personaje en la ciudad.",
"admin.citizens.name": "Nombre",
"admin.citizens.status": "Estado",
"admin.citizens.character": "Personaje",
"admin.citizens.actions": "Acciones",
"admin.citizens.approve": "Aprobar",
"admin.citizens.approved": "Ciudadano aprobado y personaje creado.",
"admin.citizens.ban": "Banear",
"admin.citizens.banned": "Ciudadano baneado.",
"admin.citizens.cannot_ban_self": "No puede banear su propia cuenta.",
"admin.cities.title": "Ciudades y territorio",
"admin.cities.hint": "Cree nuevas ciudades o expanda el territorio (+40 por cuadra).",
"admin.cities.name": "Nombre de la ciudad",
"admin.cities.create": "Crear ciudad",
"admin.cities.created": "Ciudad creada.",
"admin.cities.bounds": "Límites",
"admin.cities.expansions": "Expansiones",
"admin.cities.expand": "Expandir",
"admin.cities.expanded": "Territorio expandido.",
"admin.cities.max_expansions": "Límite de expansiones alcanzado.",
"nav.citizens": "Ciudadanos",
"nav.cities": "Ciudades",
"city.action_unknown": "Acción desconocida.",
"city.action_ok": "Acción realizada.",
"city.no_food": "No tiene comida en el inventario.",
"city.no_water": "No tiene agua en el inventario.",
"city.no_house": "Necesita una casa terminada para dormir.",
"city.no_job": "No tiene empleo. Solicite una vacante.",
"city.no_school": "No hay escuela disponible en esta ciudad.",
"city.job_other_city": "Esa vacante es de otra ciudad.",
"city.job_education": "Educación insuficiente para esta vacante.",
"city.no_money": "Dinero insuficiente.",
"city.no_inventory": "Cantidad insuficiente en el inventario.",
"city.out_of_bounds": "Posición fuera de los límites de la ciudad.",
"city.no_materials": "Necesita 50 materiales para construir.",
"city.site_taken": "Este terreno ya está ocupado.",
"city.build_started": "Construcción iniciada. El ticker termina la casa.",
"city.social_unknown": "Acción social desconocida.",
"city.social_self": "No puede hacer eso consigo mismo.",
"city.social_exists": "La relación ya existe o está pendiente.",
"city.social_friend_sent": "Solicitud de amistad enviada.",
"city.social_friend_ok": "Amistad aceptada.",
"city.social_need_friend": "Primero deben ser amigos aceptados.",
"city.social_married": "Ya está casado(a).",
"city.social_married_ok": "Matrimonio realizado.",
"city.social_need_spouse": "Debe estar casado(a) para tener un hijo.",
"city.social_child_ok": "¡Nació un hijo en la ciudad!",
"city.chat_sent": "Mensaje enviado.",
"city.hud_hunger": "Hambre",
"city.hud_thirst": "Sed",
"city.hud_energy": "Energía",
"city.hud_money": "Dinero",
"city.hud_state": "Estado",
"city.hud_education": "Educación",
"city.hud_inventory": "Inventario",
"city.hud_jobs": "Empleos",
"city.hud_actions": "Acciones",
"city.hud_social": "Social",
"city.act_eat": "Comer",
"city.act_drink": "Beber",
"city.act_sleep": "Dormir",
"city.act_wake": "Despertar",
"city.act_work": "Trabajar",
"city.act_stop": "Parar",
"city.act_study": "Estudiar",
"city.act_buy": "Comprar kit",
"city.act_sell_v": "Vender producto",
"city.act_build": "Construir casa (50 mat.)",
"city.act_apply": "Solicitar",
"city.act_friend": "Amistad",
"city.act_marry": "Casarse",
"city.act_child": "Hijo",
"city.me": "Mi personaje",
"city.citizens_near": "Ciudadanos",
"city.apply_job": "Solicitar",
"city.buy_hint": "Compra 1 comida + 1 agua + 10 materiales",
"city.hospital_hit": "¡Te atropelló un vehículo! Internado en el hospital por 2 días.",
"city.hospital_already": "Ya está internado en el hospital.",
"city.hospital_blocked": "Está internado y no puede hacer eso ahora.",
"city.hospital_bed": "Internado en el hospital",
"city.hospital_released": "Alta del hospital: libre para salir.",
"city.hospital_title": "Hospitalizado",
"city.hospital_left": "Alta en",
"city.audio": "Audio",
"city.vol_master": "General",
"city.vol_music": "Música",
"city.vol_sfx": "Efectos",
"city.mute": "Silenciar",
"city.audio_hint": "Volumen guardado en este dispositivo."
}