// 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>(); }
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)); }
/// <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); }
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); }
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]); }