public void GetPregnant() { _stringBuilder.Clear(); FemaleImplOwner.IsPregnant = true; FemaleImplOwner.CurrentPregnancyTime = 0; _gettingPregnantEvent.ActorId = FemaleImplOwner.Id; _gettingPregnantEvent.ActorType = FemaleImplOwner.GetType(); _gettingPregnantEvent.StepNumber = GameSession.StepCount; _eventRecorder.Record(_gettingPregnantEvent); _stringBuilder.Append($"{FemaleImplOwner.GetType().Name}({FemaleImplOwner.Id}) got pregnant."); _logger.LogInformation(_stringBuilder.ToString()); }
public void InitiateReproduction() { _stringBuilder.Clear(); var females = MaleImplOwner.Map.Tiles .First(x => x.Coordinates.Equals(MaleImplOwner.Coordinates)) .GameObjectsOnTile .OfType <IGender>() .Where(x => x.Status == Status.Adult && x.GetType() == MaleImplOwner.GetType() && x.GenderType == GenderType.Female && x.IsPregnant == false) .ToList <IFemale>(); if (females.Count > 0) { int index = GameSession.Random.Next(0, females.Count); _stringBuilder.Append( $"{MaleImplOwner.GetType().Name}({MaleImplOwner.Id}) initiated reproduction with {MaleImplOwner.GetType().Name}({females[index].Id})\n"); females[index].GetPregnant(); _reproductionEvent.ActorId = MaleImplOwner.Id; _reproductionEvent.ActorType = MaleImplOwner.GetType(); _reproductionEvent.FemaleId = females[index].Id; _reproductionEvent.StepNumber = GameSession.StepCount; _eventRecorder.Record(_reproductionEvent); _logger.LogInformation(_stringBuilder.ToString()); } }
public void Generate() { //Как появится конфиг, можно будет брать значения из него int totalTilesCount = Map.WorldDimensions.X * Map.WorldDimensions.Y; int tilesLeft = totalTilesCount; for (int i = 0; i < _areaTypeCounts.Capacity - 1; i++) { _areaTypeCounts.Add(totalTilesCount / _areaTypeCounts.Capacity); tilesLeft -= _areaTypeCounts[i]; } _areaTypeCounts.Add(tilesLeft); for (var i = 1; i < Map.WorldDimensions.X + 1; i++) { for (var j = 1; j < Map.WorldDimensions.Y + 1; j++) { while (true) { var randomAreaTypeIndex = GameSession.Random.Next(0, Enum.GetNames(typeof(AreaType)).Length); if (_areaTypeCounts[randomAreaTypeIndex] > 0) { Map.Tiles.Add(new GameTile((AreaType)randomAreaTypeIndex, new Coordinates(i, j))); _areaTypeCounts[randomAreaTypeIndex]--; break; } } } } _mapGenerationEvent.Tiles = Map.Tiles; _mapGenerationEvent.StepNumber = GameSession.StepCount; _eventRecorder.Record(_mapGenerationEvent); }
public void Eat() { _stringBuilder.Clear(); var eatableObjects = EaterOwner.Map.Tiles .First(x => x.Coordinates.Equals(EaterOwner.Coordinates)) .GameObjectsOnTile .Where(x => x.GetType() != EaterOwner.GetType()) .OfType <IEatable>() .ToList(); if (eatableObjects.Count > 0) { int index = GameSession.Random.Next(0, eatableObjects.Count); _stringBuilder.Append( $"{EaterOwner.GetType().Name}({EaterOwner.Id}) ate {eatableObjects[index].GetType().Name}({eatableObjects[index].Id}). " + $"{EaterOwner.GetType().Name}({EaterOwner.Id}) Hp: {EaterOwner.Hp} -> "); _eatingEvent.VictimId = eatableObjects[index].Id; _eatingEvent.VictimType = eatableObjects[index].GetType(); var hpChange = eatableObjects[index].GetEaten(); EaterOwner.Hp += hpChange; _stringBuilder.Append($"{EaterOwner.Hp}\n"); _eatingEvent.ActorId = EaterOwner.Id; _eatingEvent.ActorType = EaterOwner.GetType(); _eatingEvent.HpChange = hpChange; _eatingEvent.StepNumber = GameSession.StepCount; _eventRecorder.Record(_eatingEvent); _logger.LogInformation(_stringBuilder.ToString()); } }
public int GetEaten() { var stringBuilder = new StringBuilder(); stringBuilder.Append($"{EatableOwner.GetType().Name}({EatableOwner.Id}) was eaten. Hp: {EatableOwner.Hp} -> "); int hpReturn; //todo: можно отказаться от isFullyEatable. (Но нужно ли?) //В таком случае, если урон равен здоровью, то объект по смыслу полностью съедобен. //Иначе существу будет нанесен фиксированный урон, и можно урон же и возвращать в качестве результата. if (EatableOwner.IsFullyEatable) { hpReturn = EatableOwner.Hp; EatableOwner.Hp = 0; } else { hpReturn = EatableOwner.BeingEatenDamage; EatableOwner.Hp -= EatableOwner.BeingEatenDamage; } stringBuilder.Append($"{EatableOwner.Hp}. "); _beingEatenEvent.ActorId = EatableOwner.Id; _beingEatenEvent.ActorType = EatableOwner.GetType(); _beingEatenEvent.HpChange = hpReturn; _beingEatenEvent.StepNumber = GameSession.StepCount; _eventRecorder.Record(_beingEatenEvent); _logger.LogInformation(stringBuilder.ToString()); return(hpReturn); }
public void Generate() { for (int i = 0; i < 2; i++) { foreach (var type in _gameObjectTypes) { _map.GameObjects.Add(CreateObject(type)); } } _gameObjectsCreationEvent.GameObjects = _map.GameObjects; _gameObjectsCreationEvent.StepNumber = GameSession.StepCount; _eventRecorder.Record(_gameObjectsCreationEvent); }
public override bool HandleDequeuedItem(WatchEventType eventType, DeploymentScriptResource item, int previousExecutionCount) { Metrics.Measure.Counter.Increment(options); if (eventType != WatchEventType.Deleted) { try { int executionCount = 0; var databases = k8sService.GetDatabases(item.Metadata.NamespaceProperty, item.Spec.DatabaseSelector); foreach (var database in databases.Items) { if (database.Status.Reason == "Available") { var servers = k8sService.GetDatabaseServer(item.Metadata.NamespaceProperty, database.Spec.DatabaseServerSelector); foreach (var server in servers.Items) { rehydrator.Rehydrate(server); sqlService.ExecuteScript(server.Spec, database, item.Spec.Script); executionCount++; } } } if (executionCount > 0) { k8sService.UpdateDeploymentScriptStatus(item, "Executed", "Successfully executed", DateTimeOffset.Now); return(true); } } catch (Exception ex) { Logger.LogError(ex, "An error occurred during message processing"); try { k8sService.UpdateDeploymentScriptStatus(item, "Failed", ex.GetType().Name, DateTimeOffset.Now); eventRecorder.Record("ExecuteDeploymentScript", "Failed", ex.Message, new V1ObjectReference( item.ApiVersion, kind: item.Kind, name: item.Metadata.Name, namespaceProperty: item.Metadata.NamespaceProperty) ); } catch (HttpOperationException httpEx) { Logger.LogError(httpEx, "An error occurred logging this info to Kubernetes"); Logger.LogDebug(httpEx.Response.Content); } catch (Exception) { throw; } } return(false); } return(true); }
public override void HandleItem(WatchEventType eventType, DatabaseResource item) { Logger.LogDebug("Recieved new Database object (v {ResourceVersion})", item.Metadata.ResourceVersion); try { var servers = GetServerResources(item.Metadata.NamespaceProperty, item.Spec.DatabaseSelector); foreach (var server in servers) { if (eventType == WatchEventType.Added) { if (sqlService.DoesDatabaseExist(server.Spec, item.Metadata.Name)) { Logger.LogInformation("Database {database} already exists on server {server}", item.Metadata.Name, server.Metadata.Name); k8sService.UpdateDatabaseStatus(item, "Available", "Database already exists", DateTimeOffset.Now); continue; } if (item.Spec.BackupFiles?.Any() ?? false) { sqlService.RestoreDatabase(server.Spec, item); k8sService.UpdateDatabaseStatus(item, "Available", "Database restored", DateTimeOffset.Now); } else { sqlService.CreateDatabase(server.Spec, item); k8sService.UpdateDatabaseStatus(item, "Available", "Database created", DateTimeOffset.Now); } Logger.LogInformation("Created database {database}", item.Metadata.Name); } else if (eventType == WatchEventType.Deleted) { if (item.Spec.GCStrategy == GarbageCollectionStrategy.Delete) { sqlService.DeleteDatabase(server.Spec, item.Metadata.Name); } } } } catch (Exception ex) { Logger.LogError(ex, "An error occurred during message processing"); try { k8sService.UpdateDatabaseStatus(item, "Failed", ex.GetType().Name, DateTimeOffset.Now); eventRecorder.Record("CreateDatabase", "Failed", ex.Message, new V1ObjectReference( item.ApiVersion, kind: item.Kind, name: item.Metadata.Name, namespaceProperty: item.Metadata.NamespaceProperty) ); } catch (HttpOperationException httpEx) { Logger.LogError(httpEx, "An error occurred logging this info to Kubernetes"); Logger.LogDebug(httpEx.Response.Content); } catch (Exception) { throw; } } }
public void Move() { _stringBuilder.Clear(); var direction = GetRandomDirection(); var moveType = GetRandomMoveType(); _intermediatePlace = MovableOwner.Coordinates; _lastSafePlace = MovableOwner.Coordinates; _stringBuilder.Append($"{MovableOwner.GetType().Name}({MovableOwner.Id}) moves {direction} " + $"from {MovableOwner.Coordinates.X}:{MovableOwner.Coordinates.Y}"); string extraInformation = ""; var distance = 0; for (int i = 0; i < MovableOwner.AllowedMoveTypes[moveType]; i++) { var tileInDirection = GetTileInDirection(direction); if (tileInDirection != null) { if (AreaTypeToMoveTypes[tileInDirection.AreaType].Contains(moveType)) { if (CheckTileForSafety(tileInDirection)) { _lastSafePlace = tileInDirection.Coordinates; } _intermediatePlace = tileInDirection.Coordinates; distance++; if (CheckTileForObstacles(tileInDirection)) { if (moveType == MoveType.Fly) { continue; } else { extraInformation = " Met an obstacle."; break; } } } else { extraInformation = $" Can't {Enum.GetName(typeof(MoveType), moveType)} in {Enum.GetName(typeof(Direction), direction)}"; break; } } else { extraInformation = " Met end of map."; break; } } MovableOwner.Coordinates = _lastSafePlace; var defaultEnding = $" to {MovableOwner.Coordinates.X}:{MovableOwner.Coordinates.Y}!"; _stringBuilder.Append(defaultEnding + extraInformation + "\n"); _movementEvent.ActorId = MovableOwner.Id; _movementEvent.ActorType = MovableOwner.GetType(); _movementEvent.Direction = direction; _movementEvent.Distance = distance; _movementEvent.MoveType = moveType; _movementEvent.StepNumber = GameSession.StepCount; _eventRecorder.Record(_movementEvent); _logger.LogInformation(_stringBuilder.ToString()); }
private void RecordEvent(object eventItem) => _eventRecorder.Record(eventItem);