public bool Adventure(IEnumerable <UnitDTO> units, int adventureTypeId)
        {
            if (units == null)
            {
                throw new NullReferenceException("Adventure service - Adventure(...) units cant be null");
            }

            if (!units.Any()) //nestane s k neni nejak blbo pl spravena
            {
                return(false);
            }

            if (numOfUnits(units) <= 0)
            {
                return(false);
            }

            units = units.Where(u => u.Count > 0);

            var villageID = units.First().VillageID;

            if (!CheckUnits(units))
            {
                return(false);   //ak neposielam nikoho tak ok, lebo tolko mam
            }

            AdventureType adventureType;

            using (var uow = UnitOfWorkProvider.Create())
            {
                adventureType = adventureTypeRepository.GetById(adventureTypeId, a => a.Enemy);
            }

            if (!CheckBread(units, adventureType))
            {
                return(false);
            }

            units = units.OrderByDescending(u => u.HP);//nebudu sa rovnat hp roznym jednotkam

            UnitDTO tank = FindTank(units);

            // if (tank == null) return false;//zmazat mozem myslim, lebo ani any, ani nm neni 0

            unitTypeListQuery.Filter = new UnitTypeFilter {
                Name = adventureType.Enemy.Name
            };

            UnitTypeDTO enemyUnit;

            using (var uow = UnitOfWorkProvider.Create())
            {
                enemyUnit = unitTypeListQuery.Execute().SingleOrDefault(); //meno bude jednoznacne //tak potm asi required ked musi existovat enemy Unit, hm
            }

            if (enemyUnit == null)
            {
                throw new NullReferenceException("Adventure service - Adventure(...) enemyUnit cant be null"); //spravim obsadenie bez enemies, takze to bude moyne toto_?
            }


            /*int enemyUnitDMG = enemyUnit.Damage;
             * int enemyUnitHP = enemyUnit.HP;
             */
            var tankHP  = tank.HP;      //tank.hp nemenim, potrebujem si pamatat kolko nastavit tankovi zase hp a dmg pri dalsom kole
            var tankDMG = tank.Damage;

            int myUnitsDmg = GetMyUnitsDMG(units);

            for (int i = 0; i < adventureType.NumberOfEnemies; ++i)
            {
                int enemyUnitDMG = enemyUnit.Damage;
                int enemyUnitHP  = enemyUnit.HP;

                while (enemyUnitHP > 0)
                {
                    tankHP      -= enemyUnitDMG;
                    enemyUnitHP -= myUnitsDmg;     //vratane dmgu tanka, on bojuje tiez

                    if (tankHP <= 0)
                    {
                        Kill(tank.ID);
                        if (tank.Count > 1) //ak ich bolo pred kill viacej, cize ostava ten isty typ jednotky
                        {
                            tank.Count--;
                        }
                        else if (tank.Count == 1)                                               //ak bol pred kill len 1, cize prechadzam na iny typ Unit
                        {
                            units = units.Where(u => u.ID != tank.ID);                          //
                            if (!units.Any())                                                   //vsetci dead, uz nemam v units ziadny typ jednotky
                            {
                                if (enemyUnitHP <= 0 && i == adventureType.NumberOfEnemies - 1) //aj oni dead
                                {
                                    Accomplished(villageID, adventureType.ID);
                                    GetReward(adventureType, villageID);
                                    return(true);
                                }
                                else//oni prezili
                                {
                                    return(false);
                                }
                            }

                            tank = FindTank(units);
                        }
                        tankHP     = tank.HP;
                        tankDMG    = tank.Damage;
                        myUnitsDmg = GetMyUnitsDMG(units);
                    }
                }
            }


            Accomplished(villageID, adventureType.ID);
            GetReward(adventureType, villageID);
            return(true);
        }
Ejemplo n.º 2
0
        //vytvori village, resources, buildings, products, units pre village
        //pre kazdy typ budovy budovu, pre kazdy typ res res atd

        public void CreateVillage(int playerID)
        {
            var village = new Village();

            using (var uow = UnitOfWorkProvider.Create())
            {
                var player = playerRepository.GetById(playerID, p => p.Villages, p => p.Account);
                player.NumOfVillages++;

                village.Player           = player;
                village.Huts             = 1;
                village.AvailableWorkers = 4;
                if (player.Villages.Count() == 0)
                {
                    village.Number = 1;
                }
                else
                {
                    village.Number = player.Villages.Last().Number + 1;
                }
                villageRepository.Insert(village);
                playerRepository.Update(player);
                uow.Commit();
            }

            using (var uow = UnitOfWorkProvider.Create())
            {
                var v = villageRepository.GetById(village.ID);

                var        resourceTypesCount = resourceTypeListQuery.GetTotalRowCount();
                Resource[] resources          = new Resource[resourceTypesCount];

                //takto, alebo i = 0  inicializovat, i++ inicializovat a for od 2 //opakovanie kodu, ci efektivita?
                for (int i = 0; i < resourceTypesCount; ++i)
                {
                    resources[i] = new Resource();
                    resources[i].ResourceType = resourceTypeRepository.GetById(i + 1);

                    if (i == 0)
                    {
                        resources[i].Amount = 90;
                    }

                    if (i == 1)
                    {
                        resources[i].Amount = 50;
                    }

                    resources[i].Village = v;
                    resourceRepository.Insert(resources[i]);
                }

                var        buildingTypesCount = buildingTypeListQuery.GetTotalRowCount();
                var        buildingTypes      = buildingTypeRepository.GetByIds(Enumerable.Range(1, buildingTypesCount).ToArray()); // 2. Sposob na priradovanie type
                Building[] buildings          = new Building[buildingTypesCount];

                for (int i = 0; i < buildingTypesCount; ++i)
                {
                    buildings[i] = new Building();
                    buildings[i].BuildingType = buildingTypes[i];   //2. sposob
                    buildings[i].Village      = v;
                    buildingRepository.Insert(buildings[i]);
                }


                var       productTypesCount = productTypeListQuery.GetTotalRowCount();
                Product[] products          = new Product[productTypesCount];

                for (int i = 0; i < productTypesCount; ++i)
                {
                    products[i]             = new Product();
                    products[i].ProductType = productTypeRepository.GetById(i + 1);
                    products[i].Village     = v;
                    productRepository.Insert(products[i]);
                }


                var unitTypesCount = unitTypeListQuery.Execute().Where(u => u.Role.Equals(UnitRole.Friendly)).Count();    //friendly/hostile units

                Unit[] units = new Unit[unitTypesCount];
                for (int i = 0; i < unitTypesCount; ++i)
                {
                    units[i]          = new Unit();
                    units[i].UnitType = unitTypeRepository.GetById(i + 1);
                    units[i].Village  = v;
                    unitRepository.Insert(units[i]);
                }

                var         adventureTypesCount = adventureTypeListQuery.GetTotalRowCount();
                var         adventureTypes      = adventureTypeRepository.GetByIds(Enumerable.Range(1, adventureTypesCount).ToArray()); // 2. Sposob na priradovanie type
                Adventure[] adventures          = new Adventure[adventureTypesCount];

                for (int i = 0; i < adventureTypesCount; ++i)
                {
                    adventures[i] = new Adventure();
                    adventures[i].AdventureType = adventureTypes[i];   //2. sposob
                    adventures[i].Village       = v;
                    adventureRepository.Insert(adventures[i]);
                }

                uow.Commit();
            }
        }