// Start is called before the first frame update
    void Start()
    {
        GameTick currentTick = ApplicationState.CurrentGame.TimeMachine.GetCurrentTick();
        // Update the position and rotation of the sub.
        Vector3   location  = new Vector3(sub.GetCurrentPosition(currentTick).X, sub.GetCurrentPosition(currentTick).Y, 0);
        Transform transform = GetComponent <Transform>();

        transform.localPosition = location;

        int rotationAngle = (int)(sub.GetRotationRadians() * (360 / (2 * Math.PI)) - 90);

        transform.rotation = Quaternion.Euler(0, 0, rotationAngle);

        // Set color based on the owner
        SpriteRenderer renderer = GetComponent <SpriteRenderer>();
        int            playerId = 0;

        if (sub.GetOwner() != null)
        {
            playerId = ApplicationState.CurrentGame.TimeMachine.GetState().GetPlayers().IndexOf(sub.GetOwner()) + 1;
        }
        switch (playerId)
        {
        case 0:
            renderer.color = Color.white;
            break;

        case 1:
            renderer.color = Color.red;
            break;

        case 2:
            renderer.color = Color.blue;
            break;

        case 3:
            renderer.color = Color.green;
            break;

        case 4:
            renderer.color = Color.cyan;
            break;

        case 5:
            renderer.color = Color.magenta;
            break;

        case 6:
            renderer.color = Color.yellow;
            break;

        case 7:
            renderer.color = Color.black;
            break;
        }


        textMesh = gameObject.GetComponentInChildren <TextMeshPro>();
    }
Esempio n. 2
0
        public void CanSeeLocationInVisionRange()
        {
            RftVector currentLocation   = _sub.GetCurrentPosition(new GameTick(1));
            RftVector insideVisionRange = new RftVector(currentLocation.X + _sub.getVisionRange() - 1, currentLocation.Y);
            Outpost   insideRange       = new Outpost("0", insideVisionRange, new Player("1"), OutpostType.Generator);

            Assert.IsTrue(_sub.isInVisionRange(new GameTick(1), insideRange));
        }
Esempio n. 3
0
        /// <summary>
        /// Creates any combat events that will result in the launch.
        /// </summary>
        private List <GameEvent> CreateCombatEvents(Sub launchedSub, GameState state)
        {
            List <GameEvent> _combatEvents = new List <GameEvent>();

            // Create the combat event for arrival
            CombatEvent arriveCombat = new CombatEvent(launchedSub, launchedSub.GetDestination(), launchedSub.GetExpectedArrival());

            _combatEvents.Add(arriveCombat);

            // Determine any combat events that may exist along the way.
            // First determine if any subs are on the same path.
            // Subs will only be on the same path if it is outpost to outpost
            if (launchedSub.GetDestination() is Outpost && launchedSub.GetSource() is Outpost)
            {
                foreach (Sub sub in state.getSubsOnPath((Outpost)launchedSub.GetSource(), (Outpost)launchedSub.GetDestination()))
                {
                    // Don't combat with yourself
                    if (sub == launchedSub)
                    {
                        continue;
                    }

                    // Determine if we combat it
                    if (sub.GetDirection() == launchedSub.GetDirection())
                    {
                        GameTick ourArrival   = launchedSub.GetExpectedArrival();
                        GameTick theirArrival = sub.GetExpectedArrival();
                        if (ourArrival < theirArrival)
                        {
                            // We can catch it. Determine when and create a combat event.
                            float distanceBetween    = (sub.GetCurrentPosition(state.CurrentTick) - launchedSub.GetCurrentPosition(state.GetCurrentTick())).ToVector2().Length();
                            float velocityDifference = launchedSub.GetSpeed() - sub.GetSpeed();
                            int   catchInTicks       = (int)Math.Ceiling(distanceBetween / velocityDifference);

                            CombatEvent catchCombat = new CombatEvent(launchedSub, sub, state.GetCurrentTick().Advance(catchInTicks));
                            _combatEvents.Add(arriveCombat);
                        }
                    }
                    else
                    {
                        // Sub is moving towards us.
                        if (sub.GetOwner() != launchedSub.GetOwner())
                        {
                            // Combat will occur
                            // Determine when and create a combat event.

                            // Determine the number of ticks between the incoming sub & the launched sub.
                            int ticksBetweenSubs = sub.GetExpectedArrival() - launchedSub.GetLaunchTick();

                            // Determine the speed ratio as a number between 0-0.5
                            double speedRatio = (sub.GetSpeed() / launchedSub.GetSpeed()) - 0.5;

                            int ticksUntilCombat = (int)Math.Floor(speedRatio * ticksBetweenSubs);

                            // Determine collision position:
                            RftVector combatPosition = new RftVector(RftVector.Map, launchedSub.GetDirection().ToVector2() * ticksUntilCombat);

                            CombatEvent combatEvent = new CombatEvent(sub, launchedSub, state.CurrentTick.Advance(ticksUntilCombat));
                            _combatEvents.Add(combatEvent);
                        }
                    }
                }
            }
            return(_combatEvents);
        }
Esempio n. 4
0
        public void EventsSwitchQueuesWhenPassedForward()
        {
            Player  player1 = new Player(1);
            Rft     map     = new Rft(3000, 3000);
            Outpost outpost = new Outpost(new RftVector(map, 0, 0), player1, OutpostType.Generator);

            outpost.AddDrillers(10);
            Sub         sub         = new Sub(outpost, outpost, new GameTick(), 10, player1);
            CombatEvent arriveEvent = new CombatEvent(sub, outpost, GameTick.FromTickNumber(5), outpost.GetTargetPosition(sub.GetCurrentPosition(), sub.GetSpeed()));

            Game.TimeMachine.AddEvent(arriveEvent);
            Assert.AreEqual(1, Game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, Game.TimeMachine.GetQueuedEvents()[0]);

            // Go past the tick
            Game.TimeMachine.Advance(6);
            Assert.AreEqual(0, Game.TimeMachine.GetQueuedEvents().Count);
        }
Esempio n. 5
0
        public void AddEvent()
        {
            Player  player1 = new Player(1);
            Rft     map     = new Rft(3000, 3000);
            Outpost outpost = new Outpost(new RftVector(map, 0, 0), player1, OutpostType.Generator);

            outpost.AddDrillers(10);
            Sub         sub         = new Sub(outpost, outpost, new GameTick(), 10, player1);
            CombatEvent arriveEvent = new CombatEvent(sub, outpost, new GameTick(), outpost.GetTargetPosition(sub.GetCurrentPosition(), sub.GetSpeed()));

            Game.TimeMachine.AddEvent(arriveEvent);
            Assert.AreEqual(1, Game.TimeMachine.GetQueuedEvents().Count);
            Assert.AreEqual(arriveEvent, Game.TimeMachine.GetQueuedEvents()[0]);
        }