feat(city): add city landmarks, stores, luminous signs, and ATC echo guard

Add university and fire station civic buildings plus 7 new store types,
each with facade and luminous blade signs. Extend landmark material
colors and sign accents. Fix ATC dispatch to reject prompt-echoing AI
responses via heuristic guard. Add CityPlacesTest for collision and
roadway avoidance, and extend AirportTest and SignLabelsTest.
This commit is contained in:
2026-10-31 22:22:44 -03:00
parent e7498e1566
commit 46b15ec7be
14 changed files with 297 additions and 13 deletions
+1 -1
View File
@@ -119,7 +119,7 @@ class CityContentSeeder extends Seeder
'description' => 'Material de construção e ferramentas.',
'type' => 'hardware',
'owner_id' => $shopkeeper?->id,
'pos_x' => 8, 'pos_y' => 0, 'pos_z' => 6,
'pos_x' => 11, 'pos_y' => 0, 'pos_z' => 10,
'width' => 10, 'height' => 7, 'depth' => 10,
'is_open' => true,
],
+59
View File
@@ -136,6 +136,65 @@ class CityWorldSeeder extends Seeder
],
);
// More civic landmarks (rendered with luminous letreiros).
Building::updateOrCreate(
['city_id' => $city->id, 'type' => 'university'],
[
'owner_character_id' => null,
'name' => 'Universidade City10',
'pos_x' => 100,
'pos_z' => 140,
'width' => 26,
'depth' => 18,
'height' => 12,
'is_complete' => true,
'build_progress' => 100,
],
);
Building::updateOrCreate(
['city_id' => $city->id, 'type' => 'fire_station'],
[
'owner_character_id' => null,
'name' => 'Corpo de Bombeiros',
'pos_x' => -100,
'pos_z' => -20,
'width' => 20,
'depth' => 14,
'height' => 9,
'is_complete' => true,
'build_progress' => 100,
],
);
// ---- City places (all get facade + front board + blade letreiro)
// Each sits on its own free block zone (not on a plaza row), so
// the plaza pattern and the AABB audit both stay clean.
$places = [
['Supermercado Bom Preço', 'supermarket', 100, -20, 22, 9, 16, 'Grande sortimento, hortifrúti e padaria interna.'],
['Drogaria Saúde Total', 'pharmacy', 60, 20, 14, 7, 12, 'Remédios, cosméticos e atendimento 24 horas.'],
['Restaurante Sabor da City', 'restaurant', 100, 100, 16, 8, 14, 'Comida caseira, churrasco e culinária regional.'],
['Cabeleireiro Estilo', 'salon', -60, 20, 12, 6, 10, 'Cortes, colorações e escovas com hora marcada.'],
['Banco Central City10', 'bank', 140, 20, 16, 10, 14, 'Conta corrente, crédito e cooperativa da cidade.'],
['Hotel City10 Palace', 'hotel', 60, 100, 20, 14, 16, 'Suítes com vista para a praça e Wi-Fi gratuito.'],
['Shopping City10', 'mall', -60, 100, 26, 16, 22, 'Lojas, praça de alimentação e cinema.'],
];
foreach ($places as [$name, $type, $px, $pz, $width, $height, $depth, $description]) {
Store::updateOrCreate(
['name' => $name],
[
'description' => $description,
'type' => $type,
'pos_x' => $px,
'pos_y' => 0,
'pos_z' => $pz,
'width' => $width,
'height' => $height,
'depth' => $depth,
'is_open' => true,
],
);
}
Mission::updateOrCreate(
['code' => 'exercise-5'],
[