Example #1
0
        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());
        }
Example #2
0
        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());
            }
        }
Example #3
0
        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);
        }
Example #4
0
        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());
            }
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #8
0
        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;
                }
            }
        }
Example #9
0
        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());
        }
Example #10
0
 private void RecordEvent(object eventItem) => _eventRecorder.Record(eventItem);