public IEnumerable <Rotation> GetRotations()
        {
            var log     = GetLog();
            var players = log.Agents.OfType <Player>();

            if (characterNames != null)
            {
                players = players.Where(x => characterNames.Contains(x.Name));
            }

            var rotationCalculator = new RotationCalculator();

            foreach (var player in players)
            {
                var playerRotation = rotationCalculator.GetRotation(log, player);
                var items          = new List <RotationItem>();
                foreach (var item in playerRotation.Items)
                {
                    if (item is SkillCastItem skillCast)
                    {
                        items.Add(GetSkillCast(skillCast));
                    }
                    else if (item is WeaponSwapItem weaponSwap)
                    {
                        items.Add(GetWeaponSwap(weaponSwap));
                    }
                }
                yield return(new Rotation(player.Name, player.Profession, player.EliteSpecialization, items));
            }
        }
    void Rotate()
    {
        if (target == null)
        {
            return;
        }

        Quaternion lookRotation = RotationCalculator.RotationToHitTarget(gameObject, wc.PrimaryWeapon, target);

        transform.rotation = Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * rotationFactor);
    }
Exemple #3
0
 public async Task ThrowsArgumentExceptionOnCrossTeamDuplicateWish()
 {
     var dc     = new Daycare();
     var rc     = new RotationCalculator();
     var wishes = new List <Wish>()
     {
         new Wish(dc.Employees.Find(e => e.Id == 2), 10, 1),
         new Wish(dc.Employees.Find(e => e.Id == 10), 10, 1)
     };
     await rc.DaycareShiftsOfThreeWeeks(dc, 0, wishes, 0);
 }
Exemple #4
0
 public async Task ThrowsExceptionOnSimilarWishesWithinTeam()
 {
     var dc     = new Daycare();
     var rc     = new RotationCalculator();
     var wishes = new List <Wish>()
     {
         new Wish(dc.Employees.Find(e => e.Id == 2), 10, 1),
         new Wish(dc.Employees.Find(e => e.Id == 1), 11, 1)
     };
     await rc.DaycareShiftsOfThreeWeeks(dc, 0, wishes, 0);
 }
Exemple #5
0
 void Rotate()
 {
     if (target != null)
     {
         Quaternion lookRotation = RotationCalculator.RotationToHitTarget(gameObject, weaponsController.PrimaryWeapon, target, RandomOffset.SMALL, Vector3.zero, true);
         transform.rotation = lookRotation;//Quaternion.Slerp(transform.rotation, lookRotation, Time.deltaTime * turnRate);
     }
     else
     {
         target = UnitTracker.PlayerShip;
     }
 }
Exemple #6
0
    public void PlaceObjByGraph(GameObject obj)
    {
        //Debug.Log(obj.name);
        place             = ScriptableObject.CreateInstance <PlaceObjectToGround>();
        rotCalc           = ScriptableObject.CreateInstance <RotationCalculator>();
        rotCalc.rectRad   = 1.0f;
        rotCalc.rectRadZ  = 1.0f;
        rotCalc.yMod      = 2.0f;
        rotCalc.maxAngleX = 60.0f;
        rotCalc.maxAngleZ = 45.0f;
        //Debug.Log("graph length: "+graphLength);
        GameObject tempObj;
        float      rnd = 0.2f;

        for (int i = 0; i < vec3points.Length - 1; i++)
        {
            if (i % rar == 0)
            {
                tempObj = Instantiate(obj, objsParent);
                tempObj.transform.position = new Vector3(vec3points[i].x, vec3points[i].y + offset, vec3points[i].z);
                tempObj.transform.parent   = objsParent;

                rnd = 0.2f;
                tempObj.transform.rotation = new Quaternion(
                    tempObj.transform.rotation.x,
                    tempObj.transform.rotation.y + Random.Range(-rnd, rnd),
                    tempObj.transform.rotation.z,
                    tempObj.transform.rotation.w
                    );
                tempObj.transform.rotation = Vec3Mathf.GetDir(vec3points[i], vec3points[0]);
                rotCalc.MakeCalculations(tempObj.transform, tempObj.transform);
                place.corr = corr;
                place.Place(ref tempObj);
            }
        }

        tempObj = Instantiate(obj, objsParent);
        tempObj.transform.position = new Vector3(vec3points[vec3points.Length - 1].x, vec3points[vec3points.Length - 1].y + offset, vec3points[vec3points.Length - 1].z);
        tempObj.transform.parent   = objsParent;


        tempObj.transform.rotation = new Quaternion(
            tempObj.transform.rotation.x,
            tempObj.transform.rotation.y + Random.Range(-rnd, rnd),
            tempObj.transform.rotation.z,
            tempObj.transform.rotation.w
            );
        //tempObj.transform.rotation = Vec3Mathf.GetDir(vec3points[vec3points.Length - 3], vec3points[vec3points.Length-2]);
        rotCalc.MakeCalculations(tempObj.transform, tempObj.transform);
        place.corr = corr;
        place.Place(ref tempObj);
    }
 void Awake()
 {
     agent   = GetComponent <NavMeshAgent> ();
     handler = GameObject.FindGameObjectWithTag("StepsPool").transform;
     steps   = new Transform[poolSize];
     for (int i = 0; i < steps.Length; i++)
     {
         steps [i] = Instantiate(stepPrefab, Vector3.zero, Quaternion.identity, handler).transform;
         steps [i].gameObject.SetActive(false);
     }
     rotCalc = ScriptableObject.CreateInstance <RotationCalculator>();
     place   = ScriptableObject.CreateInstance <PlaceObjectToGround>();
     SetParams();
     //StartCoroutine(DebugSteps());
 }
Exemple #8
0
    /// <summary>
    /// Spawns a given unit type at given location.
    /// </summary>
    /// <param name="unitType">Type of unit to spawn.</param>
    /// <param name="spawnLocation">Location to spawn the unit.</param>
    /// <returns>Reference to the spawned unit.</returns>
    public static GameObject SpawnUnit(GameObject unitType, Vector3 spawnLocation)
    {
        Quaternion lookRotation = Quaternion.identity;

        if (unitType.GetComponent <UnitInfo>().IsPlayerShip)
        {
            lookRotation = RotationCalculator.RotationTowardZero(spawnLocation);
        }
        else
        {
            lookRotation = RotationCalculator.RotationTowardPlayerShip(spawnLocation);
        }

        return(SpawnUnit(unitType, spawnLocation, lookRotation));
    }
Exemple #9
0
        public void CalculatesCorrectShiftsForSmallDaycare()
        {
            var teams = new List <Team>()
            {
                new Team(0, 1),
                new Team(1, 2)
            };
            var dc     = new Daycare(teams);
            var rc     = new RotationCalculator();
            var wishes = new List <Wish>();

            rc.DaycareShiftsOfThreeWeeks(dc, 0, wishes, 1);
            var emp0Shifts = dc.Teams[0].TeamEmp[0].Shifts;
            var emp1Shifts = dc.Teams[0].TeamEmp[1].Shifts;
            var emp2Shifts = dc.Teams[0].TeamEmp[2].Shifts;
            var emp3Shifts = dc.Teams[1].TeamEmp[0].Shifts;
            var emp4Shifts = dc.Teams[1].TeamEmp[1].Shifts;
            var emp5Shifts = dc.Teams[1].TeamEmp[2].Shifts;

            var expShifts1 = new List <WorkShift>()
            {
                new WorkShift(0),
                new WorkShift(2),
                new WorkShift(4),
                new WorkShift(1, true),
                new WorkShift(2),

                new WorkShift(5),
                new WorkShift(1),
                new WorkShift(3),
                new WorkShift(4, true),
                new WorkShift(0),

                new WorkShift(2),
                new WorkShift(4),
                new WorkShift(0),
                new WorkShift(2),
                new WorkShift(5)
            };

            CollectionAssert.AreEqual(expShifts1, emp1Shifts);
        }
Exemple #10
0
        public void SwitchWorksCorrectly()
        {
            var dc     = new Daycare();
            var rc     = new RotationCalculator();
            var wishes = new List <Wish>()
            {
                new Wish(dc.Employees.Find(e => e.Id == 1), 1, 1),
                new Wish(dc.Employees.Find(e => e.Id == 9), 10, 1)
            };

            rc.DaycareShiftsOfThreeWeeks(dc, 0, wishes, 1);
            var actual = dc.Employees.Select(e => (int)e.Shifts[1].Shift).ToList();

            var expected = new List <int>()
            {
                8, 4, 1, 0, 5, 9, 2, 6, 11, 3, 10, 7
            };

            CollectionAssert.AreEqual(expected, actual);
        }
    void Rotate()
    {
        if (target == null)
        {
            return;
        }

        Quaternion lookRotation = RotationCalculator.RotationToHitTarget(turretHead, wc.PrimaryWeapon, target, randomAimOffset, aimOffset, false);

        turretHead.transform.rotation = Quaternion.Slerp(turretHead.transform.rotation, lookRotation, Time.deltaTime * rotateSpeed);

        if (turretHead.transform.localRotation.eulerAngles.x > 30 && turretHead.transform.localRotation.eulerAngles.x <= 90)
        {
            canFire = false;
        }
        else
        {
            canFire = true;
        }
    }
Exemple #12
0
        static void Main(string[] args)
        {
            var dc = new Daycare();

            var calc = new RotationCalculator();

            try
            {
                var wishes = new List <Wish>()
                {
                    new Wish(dc.Employees.Find(e => e.Id == 1), 10, 4),
                    //new Wish(dc.Employees.Find(e => e.Id == 6), 10, 4),
                    new Wish(dc.Employees.Find(e => e.Id == 10), 6, 1)
                };
                calc.DaycareShiftsOfThreeWeeks(dc, 0, wishes, 0);

                foreach (var team in dc.Teams)
                {
                    foreach (var emp in team.TeamEmp)
                    {
                        var shifts = emp.Id.ToString() + " " + emp.Status.ToString() + ": ";
                        foreach (var shift in emp.Shifts)
                        {
                            var num = Convert.ToInt32(shift.Shift);
                            shifts += num + ((num > 9) ? " " : "  ");
                        }
                        Console.WriteLine(shifts);
                    }
                    Console.WriteLine("\n");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
Exemple #13
0
    // Use this for initialization
    void Awake()
    {
        instance = this;

        UnitTracker.Clear();
        ProjectileTracker.Clear();

        UnitSpawner.SpawnUnit(GameSettings.CurrentPlayerShip, currentLevelController.CurrentPlayerSpawn.transform.position, RotationCalculator.RotationTowardLocation(currentLevelController.CurrentPlayerSpawn.transform.position, currentLevelController.PositionPlayerLooksAtSpawn));
    }
Exemple #14
0
        private void CalculatePlayerData()
        {
            var players = GetPlayers();

            var deathCounts = players.ToDictionary(x => x, x => 0);
            var downCounts  = players.ToDictionary(x => x, x => 0);
            var usedSkills  = players.ToDictionary(x => x, x => new HashSet <Skill>());

            foreach (var deadEvent in log.Events.OfType <AgentDeadEvent>().Where(x => x.Agent is Player))
            {
                var player = (Player)deadEvent.Agent;
                deathCounts[player]++;
            }

            foreach (var downEvent in log.Events.OfType <AgentDownedEvent>().Where(x => x.Agent is Player))
            {
                var player = (Player)downEvent.Agent;
                downCounts[player]++;
            }

            // Buff damage events only tell us which conditions/buffs, not what skill actually applied them
            foreach (var damageEvent in log.Events.OfType <PhysicalDamageEvent>().Where(x => x.Attacker is Player))
            {
                var player = (Player)damageEvent.Attacker;
                usedSkills[player].Add(damageEvent.Skill);
            }

            foreach (var activationEvent in log.Events.OfType <SkillCastEvent>().Where(x => x.Agent is Player))
            {
                var player = (Player)activationEvent.Agent;
                usedSkills[player].Add(activationEvent.Skill);
            }

            var playerData = new List <PlayerData>();

            foreach (var player in players)
            {
                HashSet <SkillData> utilitySkills = null;
                HashSet <SkillData> healingSkills = null;
                HashSet <SkillData> eliteSkills   = null;
                if (ApiData != null)
                {
                    utilitySkills = new HashSet <SkillData>();
                    healingSkills = new HashSet <SkillData>();
                    eliteSkills   = new HashSet <SkillData>();
                    foreach (var usedSkill in usedSkills[player])
                    {
                        var skillData = ApiData.GetSkillData(usedSkill);

                        // Skills may be also registered as used if they affect other players and do damage through them
                        if (skillData != null && skillData.Professions.Contains(player.Profession))
                        {
                            if (skillData.Slot == SkillSlot.Elite)
                            {
                                eliteSkills.Add(skillData);
                            }
                            else if (skillData.Slot == SkillSlot.Utility)
                            {
                                utilitySkills.Add(skillData);
                            }
                            else if (skillData.Slot == SkillSlot.Heal)
                            {
                                healingSkills.Add(skillData);
                            }
                        }
                    }
                }

                WeaponType land1Weapon1 = WeaponType.Other;
                WeaponType land1Weapon2 = WeaponType.Other;
                WeaponType land2Weapon1 = WeaponType.Other;
                WeaponType land2Weapon2 = WeaponType.Other;
                IEnumerable <SkillData> land1WeaponSkills = null;
                IEnumerable <SkillData> land2WeaponSkills = null;

                // TODO: Dual wield skill handling for Thieves
                if (ApiData != null)
                {
                    WeaponSet currentWeaponSet = WeaponSet.Unknown;
                    // We are only interested in land weapons. This may be imperfect if started on an underwater set.
                    var firstWeaponSwap = log.Events.OfType <AgentWeaponSwapEvent>().FirstOrDefault(x =>
                                                                                                    x.NewWeaponSet == WeaponSet.Land1 || x.NewWeaponSet == WeaponSet.Land2);

                    if (firstWeaponSwap == null)
                    {
                        currentWeaponSet = WeaponSet.Land1;
                    }
                    else
                    {
                        // First weapon set is the other one than the first swap swaps to (unless it was an underwater one)
                        currentWeaponSet = firstWeaponSwap.NewWeaponSet == WeaponSet.Land1
                                                        ? WeaponSet.Land2
                                                        : WeaponSet.Land1;
                    }

                    foreach (var logEvent in log.Events)
                    {
                        if (logEvent is AgentWeaponSwapEvent weaponSwapEvent && weaponSwapEvent.Agent == player)
                        {
                            currentWeaponSet = weaponSwapEvent.NewWeaponSet;
                            continue;
                        }

                        SkillData skillData = null;
                        if (logEvent is StartSkillCastEvent castEvent && castEvent.Agent == player)
                        {
                            skillData = ApiData.GetSkillData(castEvent.Skill);
                        }

                        if (skillData != null)
                        {
                            if (skillData.Professions.Contains(player.Profession) && skillData.Type == SkillType.Weapon)
                            {
                                if (skillData.WeaponType.IsTwoHanded() || skillData.Slot == SkillSlot.Weapon1 ||
                                    skillData.Slot == SkillSlot.Weapon2 || skillData.Slot == SkillSlot.Weapon3)
                                {
                                    if (currentWeaponSet == WeaponSet.Land1)
                                    {
                                        land1Weapon1 = skillData.WeaponType;
                                    }
                                    else if (currentWeaponSet == WeaponSet.Land2)
                                    {
                                        land2Weapon1 = skillData.WeaponType;
                                    }
                                }

                                if (skillData.WeaponType.IsTwoHanded() || skillData.Slot == SkillSlot.Weapon4 ||
                                    skillData.Slot == SkillSlot.Weapon5)
                                {
                                    if (currentWeaponSet == WeaponSet.Land1)
                                    {
                                        land1Weapon2 = skillData.WeaponType;
                                    }
                                    else if (currentWeaponSet == WeaponSet.Land2)
                                    {
                                        land2Weapon2 = skillData.WeaponType;
                                    }
                                }
                            }
                        }
                    }

                    land1WeaponSkills = WeaponSkillData
                                        .GetWeaponSkillIds(player.Profession, land1Weapon1, land1Weapon2)
                                        .Select(x => x == -1 ? null : ApiData.GetSkillData(x));
                    land2WeaponSkills = WeaponSkillData
                                        .GetWeaponSkillIds(player.Profession, land2Weapon1, land2Weapon2)
                                        .Select(x => x == -1 ? null : ApiData.GetSkillData(x));
                }

                if (ApiData != null)
                {
                    var skillDetections = SkillDetections.GetSkillDetections(player.Profession).ToArray();
                    foreach (var e in log.Events)
                    {
                        foreach (var detection in skillDetections)
                        {
                            if (detection.Detection.IsDetected(player, e))
                            {
                                var skill = ApiData.GetSkillData(detection.SkillId);
                                if (detection.Slot == SkillSlot.Utility)
                                {
                                    utilitySkills.Add(skill);
                                }
                                else if (detection.Slot == SkillSlot.Heal)
                                {
                                    healingSkills.Add(skill);
                                }
                                else if (detection.Slot == SkillSlot.Elite)
                                {
                                    eliteSkills.Add(skill);
                                }
                            }
                        }
                    }
                }

                var ignoredSkills = SkillDetections.GetIgnoredSkillIds(player.Profession);
                healingSkills?.RemoveWhere(x => ignoredSkills.Contains(x.Id));
                utilitySkills?.RemoveWhere(x => ignoredSkills.Contains(x.Id));
                eliteSkills?.RemoveWhere(x => ignoredSkills.Contains(x.Id));

                var specializationDetections =
                    SpecializationDetections.GetSpecializationDetections(player.Profession).ToArray();
                var badges = new List <PlayerBadge>();

                var specializations = new HashSet <CoreSpecialization>();
                foreach (var e in log.Events)
                {
                    foreach (var detection in specializationDetections)
                    {
                        if (detection.Detection.IsDetected(player, e))
                        {
                            specializations.Add(detection.Specialization);
                        }
                    }
                }

                foreach (var spec in specializations.OrderBy(x => x.ToString()))
                {
                    badges.Add(new PlayerBadge(spec.ToString(), BadgeType.Specialization));
                }

                var rotation = RotationCalculator.GetRotation(log, player);

                var data = new PlayerData(player, downCounts[player], deathCounts[player], rotation, usedSkills[player],
                                          healingSkills, utilitySkills, eliteSkills, land1Weapon1, land1Weapon2, land2Weapon1, land2Weapon2,
                                          land1WeaponSkills, land2WeaponSkills, badges);

                playerData.Add(data);
            }

            logPlayerData = playerData;
        }
Exemple #15
0
 private void InitializeRotationCalculator()
 {
     rotationCalculator = new RotationCalculator(Model);
 }
Exemple #16
0
        public void ReversedGivesCorrectShifts()
        {
            var dc     = new Daycare();
            var rc     = new RotationCalculator();
            var actual = new List <WorkShift>();

            dc.Teams.ForEach(d => actual.AddRange(rc.TeamShiftsOfWeek(d, 0, dc.Teams.Count, false)));
            var expected = new List <WorkShift>()
            {
                new WorkShift(0),
                new WorkShift(8),
                new WorkShift(4),
                new WorkShift(0),
                new WorkShift(8),

                new WorkShift(8),
                new WorkShift(4),
                new WorkShift(0),
                new WorkShift(8),
                new WorkShift(4),

                new WorkShift(4),
                new WorkShift(0),
                new WorkShift(8),
                new WorkShift(4),
                new WorkShift(0),

                new WorkShift(1),
                new WorkShift(9),
                new WorkShift(5),
                new WorkShift(1),
                new WorkShift(9),

                new WorkShift(9),
                new WorkShift(5),
                new WorkShift(1),
                new WorkShift(9),
                new WorkShift(5),

                new WorkShift(5),
                new WorkShift(1),
                new WorkShift(9),
                new WorkShift(5),
                new WorkShift(1),

                new WorkShift(2),
                new WorkShift(10),
                new WorkShift(6),
                new WorkShift(2),
                new WorkShift(10),

                new WorkShift(10),
                new WorkShift(6),
                new WorkShift(2),
                new WorkShift(10),
                new WorkShift(6),

                new WorkShift(6),
                new WorkShift(2),
                new WorkShift(10),
                new WorkShift(6),
                new WorkShift(2),

                new WorkShift(3),
                new WorkShift(11),
                new WorkShift(7),
                new WorkShift(3),
                new WorkShift(11),

                new WorkShift(11),
                new WorkShift(7),
                new WorkShift(3),
                new WorkShift(11),
                new WorkShift(7),

                new WorkShift(7),
                new WorkShift(3),
                new WorkShift(11),
                new WorkShift(7),
                new WorkShift(3)
            };

            CollectionAssert.AreEqual(expected, actual);
        }
Exemple #17
0
 public static void GoToWaypoint(Waypoint waypoint, RotationCalculator rotationProgressCalculator)
 {
     rotationCalculator = rotationProgressCalculator;
     currentWaypoint    = waypoint;
     initialPosition    = Camera.main.transform.position;
 }
 public DCShiftsController(ShiftContext context)
 {
     _context = context;
     _calc    = new RotationCalculator();
 }
 void Start()
 {
     rotCalc = ScriptableObject.CreateInstance <RotationCalculator>();
     StartCoroutine(ModifyAngle());
 }