diff --git a/game/scenes/Levels/location_level.gd b/game/scenes/Levels/location_level.gd index 38858af..992c8bb 100644 --- a/game/scenes/Levels/location_level.gd +++ b/game/scenes/Levels/location_level.gd @@ -241,6 +241,7 @@ func _load_existing_locations() -> void: _locations_loaded = true return + var loaded_count := 0 for item in parsed: if typeof(item) != TYPE_DICTIONARY: continue @@ -254,5 +255,10 @@ func _load_existing_locations() -> void: if location_name.is_empty(): location_name = "Location %d,%d" % [coord.x, coord.y] _known_locations[coord] = location_name + loaded_count += 1 + + print("LocationLevel loaded %d visible locations for character %s." % [loaded_count, character_id]) + if loaded_count == 0: + push_warning("Visible locations request succeeded but returned 0 locations for character %s." % character_id) _locations_loaded = true diff --git a/microservices/CharacterApi/Controllers/CharactersController.cs b/microservices/CharacterApi/Controllers/CharactersController.cs index bea7bf2..bc04546 100644 --- a/microservices/CharacterApi/Controllers/CharactersController.cs +++ b/microservices/CharacterApi/Controllers/CharactersController.cs @@ -8,14 +8,16 @@ namespace CharacterApi.Controllers; [ApiController] [Route("api/[controller]")] -public class CharactersController : ControllerBase -{ - private readonly CharacterStore _characters; - - public CharactersController(CharacterStore characters) - { - _characters = characters; - } +public class CharactersController : ControllerBase +{ + private readonly CharacterStore _characters; + private readonly ILogger _logger; + + public CharactersController(CharacterStore characters, ILogger logger) + { + _characters = characters; + _logger = logger; + } [HttpPost] [Authorize(Roles = "USER,SUPER")] @@ -66,7 +68,25 @@ public class CharactersController : ControllerBase if (character is null) return NotFound(); - var locations = await _characters.GetOrCreateVisibleLocationsAsync(character); + _logger.LogInformation( + "Visible locations requested for character {CharacterId} at ({X},{Y}) radius {VisionRadius} by user {UserId}", + character.Id, + character.Coord.X, + character.Coord.Y, + character.VisionRadius, + userId + ); + + var generation = await _characters.GetOrCreateVisibleLocationsAsync(character); + var locations = generation.Locations; + + _logger.LogInformation( + "Visible locations resolved for character {CharacterId}: generated {GeneratedCount}, returned {ReturnedCount}", + character.Id, + generation.GeneratedCount, + locations.Count + ); + return Ok(locations); } diff --git a/microservices/CharacterApi/Services/CharacterStore.cs b/microservices/CharacterApi/Services/CharacterStore.cs index aa220e2..f5cfd1a 100644 --- a/microservices/CharacterApi/Services/CharacterStore.cs +++ b/microservices/CharacterApi/Services/CharacterStore.cs @@ -9,6 +9,8 @@ public class CharacterStore private readonly IMongoCollection _col; private readonly IMongoCollection _locations; + public sealed record VisibleLocationResult(List Locations, int GeneratedCount); + public CharacterStore(IConfiguration cfg) { var cs = cfg["MongoDB:ConnectionString"] ?? "mongodb://127.0.0.1:27017"; @@ -46,10 +48,11 @@ public class CharacterStore return GetVisibleLocationsInternalAsync(character, ensureGenerated: false); } - public async Task> GetOrCreateVisibleLocationsAsync(Character character) + public async Task GetOrCreateVisibleLocationsAsync(Character character) { - await EnsureVisibleLocationsExistAsync(character); - return await GetVisibleLocationsInternalAsync(character, ensureGenerated: true); + var generatedCount = await EnsureVisibleLocationsExistAsync(character); + var locations = await GetVisibleLocationsInternalAsync(character, ensureGenerated: true); + return new VisibleLocationResult(locations, generatedCount); } private Task> GetVisibleLocationsInternalAsync(Character character, bool ensureGenerated) @@ -70,9 +73,10 @@ public class CharacterStore return _locations.Find(filter).ToListAsync(); } - private async Task EnsureVisibleLocationsExistAsync(Character character) + private async Task EnsureVisibleLocationsExistAsync(Character character) { var radius = character.VisionRadius > 0 ? character.VisionRadius : 3; + var generatedCount = 0; for (var x = character.Coord.X - radius; x <= character.Coord.X + radius; x++) { @@ -91,7 +95,9 @@ public class CharacterStore try { - await _locations.UpdateOneAsync(filter, update, new UpdateOptions { IsUpsert = true }); + var result = await _locations.UpdateOneAsync(filter, update, new UpdateOptions { IsUpsert = true }); + if (result.UpsertedId is not null) + generatedCount += 1; } catch (MongoWriteException ex) when (ex.WriteError.Category == ServerErrorCategory.DuplicateKey) { @@ -99,6 +105,8 @@ public class CharacterStore } } } + + return generatedCount; } private static string DefaultLocationName(int x, int y)