feat(city): add plaza exercise system with health tracking

- Adds CityPlazas support class for deterministic public plaza generation with outdoor gym equipment
- Implements exercise and stop-exercise actions with proximity validation to equipment
- Introduces health (0-100) and exercise_count attributes to Character model
- Reduces hospital stay duration from two game days to one game hour
- Adds 3D gym equipment rendering (bench, bars, bike, treadmill) in city viewer
- Includes exercise state machine handling in world ticker with energy drain
- Adds comprehensive PlazaExerciseTest and updates HospitalAdmissionTest
- Provides localized UI strings for health HUD and exercise prompts
This commit is contained in:
2026-10-17 22:10:50 -03:00
parent 79ce2a1825
commit 090b530481
18 changed files with 848 additions and 21 deletions
+14 -2
View File
@@ -192,7 +192,7 @@
"city.citizens_near": "Cidadãos",
"city.apply_job": "Aplicar para",
"city.buy_hint": "Compra 1 comida+1 água+10 materiais",
"city.hospital_hit": "Você foi atropelado! Internado no hospital por 2 dias.",
"city.hospital_hit": "Você foi atropelado! Internado no hospital por 1 hora.",
"city.hospital_already": "Você já está internado no hospital.",
"city.hospital_blocked": "Você está internado no hospital e não pode fazer isso agora.",
"city.hospital_bed": "Internado no hospital",
@@ -204,5 +204,17 @@
"city.vol_music": "Música",
"city.vol_sfx": "Efeitos",
"city.mute": "Mudo",
"city.audio_hint": "Volume salvo neste dispositivo."
"city.audio_hint": "Volume salvo neste dispositivo.",
"city.hud_health": "Saúde",
"city.hud_exercise": "Exercícios",
"city.exercise_use": "Pressione E para exercitar",
"city.exercise_active": "Exercitando",
"city.exercise_stopHint": "para parar",
"city.exercise_ok": "Boa! +2 de saúde.",
"city.exercise_need_equipment": "Aproxime-se de um equipamento da praça.",
"city.exercise_need_awake": "Você precisa estar acordado para se exercitar.",
"city.exercise_tired": "Você está cansado demais para se exercitar.",
"city.exercise_max_health": "Saúde já está no máximo!",
"city.exerciseStart": "Começando a se exercitar…",
"city.exerciseStop": "Exercício encerrado."
}