Änderung: Hinzufügung der Haus-Logik zur Taxi-Map

Änderungen:
- Integration des neuen Modells TaxiMapTileHouse zur Verwaltung von Häusern auf der Karte.
- Anpassung der TaxiMap- und TaxiMapService-Logik zur Unterstützung der Hausplatzierung und -verwaltung.
- Erweiterung der Benutzeroberfläche in TaxiToolsView.vue zur Erfassung und Anzeige von Hausinformationen.
- Implementierung von Methoden zur Speicherung und Aktualisierung von Hausdaten in der Datenbank.

Diese Anpassungen verbessern die Funktionalität und Benutzererfahrung im Taxi-Minispiel, indem sie eine detaillierte Verwaltung von Häusern auf der Karte ermöglichen.
This commit is contained in:
Torsten Schulz (local)
2025-09-18 14:27:14 +02:00
parent ab8e12cbcd
commit 7207274ab5
8 changed files with 290 additions and 13 deletions

View File

@@ -4,6 +4,7 @@ import TaxiMapType from '../models/taxi/taxiMapType.js';
import TaxiMapTile from '../models/taxi/taxiMapTile.js';
import TaxiStreetName from '../models/taxi/taxiStreetName.js';
import TaxiMapTileStreet from '../models/taxi/taxiMapTileStreet.js';
import TaxiMapTileHouse from '../models/taxi/taxiMapTileHouse.js';
class TaxiMapService extends BaseService {
constructor() {
@@ -43,7 +44,8 @@ class TaxiMapService extends BaseService {
{ model: TaxiStreetName, as: 'streetNameH' },
{ model: TaxiStreetName, as: 'streetNameV' }
]
}
},
{ model: TaxiMapTileHouse, as: 'tileHouses' }
],
order: [['name', 'ASC']]
});
@@ -74,7 +76,8 @@ class TaxiMapService extends BaseService {
{ model: TaxiStreetName, as: 'streetNameH' },
{ model: TaxiStreetName, as: 'streetNameV' }
]
}
},
{ model: TaxiMapTileHouse, as: 'tileHouses' }
]
});
return map;
@@ -112,7 +115,7 @@ class TaxiMapService extends BaseService {
*/
async createMap(mapData) {
try {
const { tiles, tileStreetNames, ...mapFields } = mapData;
const { tiles, tileStreetNames, tileHouses, ...mapFields } = mapData;
// mapData JSON ist entfernt map erstellen ohne mapData
const map = await TaxiMap.create(mapFields);
// Tiles upsert (optional)
@@ -123,6 +126,9 @@ class TaxiMapService extends BaseService {
if (tileStreetNames && Object.keys(tileStreetNames).length > 0) {
await this.upsertTileStreetNames(map.id, tileStreetNames);
}
if (tileHouses && Object.keys(tileHouses).length > 0) {
await this.upsertTileHouses(map.id, tileHouses);
}
return await this.getMapById(map.id);
} catch (error) {
console.error('Error creating map:', error);
@@ -135,7 +141,7 @@ class TaxiMapService extends BaseService {
*/
async updateMap(mapId, updateData) {
try {
const { tiles, tileStreetNames, ...mapFields } = updateData;
const { tiles, tileStreetNames, tileHouses, ...mapFields } = updateData;
const [updatedRowsCount] = await TaxiMap.update(mapFields, {
where: { id: mapId }
});
@@ -151,6 +157,9 @@ class TaxiMapService extends BaseService {
if (tileStreetNames && Object.keys(tileStreetNames).length > 0) {
await this.upsertTileStreetNames(mapId, tileStreetNames);
}
if (tileHouses && Object.keys(tileHouses).length > 0) {
await this.upsertTileHouses(mapId, tileHouses);
}
return await this.getMapById(mapId);
} catch (error) {
console.error('Error updating map:', error);
@@ -205,6 +214,24 @@ class TaxiMapService extends BaseService {
return { success: true };
}
/**
* Speichert Häuser pro Tile (je Ecke eine Zeile)
* @param {number} mapId
* @param {{[cellKey:string]: {[corner:string]: number}}} tileHouses
*/
async upsertTileHouses(mapId, tileHouses) {
// Löschen und neu anlegen pro Zelle ist am einfachsten und robust
const entries = Object.entries(tileHouses || {});
for (const [cellKey, cornerMap] of entries) {
const [x, y] = cellKey.split(',').map(Number);
await TaxiMapTileHouse.destroy({ where: { map_id: mapId, x, y } });
for (const [corner, rotation] of Object.entries(cornerMap || {})) {
await TaxiMapTileHouse.create({ mapId, x, y, corner, rotation: Number(rotation) || 0 });
}
}
return { success: true };
}
/**
* Löscht eine Map (soft delete)
*/