Example #1
0
        public static RegisterResponse Register(string login, string password)
        {
            using (var t = new TransactionScope()) {
                var db   = new DbDataContext();
                var user = db.SpringAccounts.SingleOrDefault(x => x.Name == login);
                if (user == null)
                {
                    return(RegisterResponse.NotValidSpringLogin);
                }

                if (user.Players != null)
                {
                    return(RegisterResponse.AlreadyRegistered);
                }

                if (db.SpringAccounts.Any(x => x.UserCookie == user.UserCookie && x.Players != null))
                {
                    return(RegisterResponse.IsSmurf);
                }

                if (user.Password != SpringAccount.HashPassword(password))
                {
                    return(RegisterResponse.NotValidSpringPassword);
                }

                // create player and assign to smallest alliance
                var player = new Player()
                {
                    IsActive = true, StarSystem = db.StarSystems.OrderBy(x => x.Players.Where(y => y.IsActive).Count()).First()
                };
                user.Players          = player;
                player.MothershipName = player.SpringAccount.Name + "'s mothership";

                // create his planet
                var mg        = new MapGen();
                var hisPlanet = mg.CreateHomeworld(player.StarSystem.CelestialObject);
                hisPlanet.Name   = player.SpringAccount.Name + "'s home";
                hisPlanet.Player = player;
                player.StarSystem.CelestialObject.ChildCelestialObjects.Add(hisPlanet);

                hisPlanet.UpdateIncomeInfo();

                db.SubmitChanges();

                var e = db.AddEvent(EventType.Player, "{0} joined the {1}", player.Name, player.StarSystem.Name);
                e.Connect(player);
                e.Connect(hisPlanet);
                db.MarkDirty();
                db.SubmitChanges();
                t.Complete();
                return(RegisterResponse.Ok);
            }
        }
        public static Tuple <Player, CelestialObject> OrderMothership(string playerName, string password, int toBodyID)
        {
            using (var t = new TransactionScope())
            {
                var db     = new DbDataContext();
                var player = db.GetPlayer(playerName, password);
                if (player.Transit == null)
                {
                    player.Transit = new Transit()
                    {
                        CelestialObject = player.CelestialObject
                    }
                }
                ;
                var originalBody = player.CelestialObject;
                var target       = db.CelestialObjects.Single(x => x.CelestialObjectID == toBodyID);
                var transit      = player.Transit;

                var oldOrbit  = transit.OrbitsObjectID;
                var oldTarget = transit.CelestialObjectByToObjectID;

                transit.SetTransit(target, FleetBaseWarp, db.GetConfig().CombatTurn + 1, db.GetConfig()); // will start next turn

                if (oldOrbit == null && oldTarget != null)                                                // was heading to another planet
                {
                    var ev = db.AddEvent(EventType.Fleet, "{0} changed destination from {1} to {2}, ETA {3}", transit.GetNameWithOwner(), oldTarget.GetNameWithOwner(), transit.CelestialObjectByToObjectID.GetNameWithOwner(), transit.GetEtaString(db.GetConfig().SecondsPerTurn));
                    ev.Connect(transit.Fleets);
                    ev.Connect(transit.GetOwner());
                    ev.Connect(transit.CelestialObjectByToObjectID, oldTarget);
                    ev.Connect(transit.CelestialObjectByToObjectID.Player, oldTarget.Player);
                }

                if (originalBody != null)
                {
                    originalBody.UpdateIncomeInfo();
                }
                db.MarkDirty();
                db.SubmitChanges();
                t.Complete();
                return(new Tuple <Player, CelestialObject>(player, originalBody));
            }
        }
        public static Fleet OrderFleet(string playerName, string password, int fleetID, int toBodyID, int futureOffset)
        {
            if (futureOffset < 0)
            {
                throw new ApplicationException("Future offset cannot be smaller than 0");
            }
            using (var t = new TransactionScope())
            {
                var db     = new DbDataContext();
                var player = db.GetPlayer(playerName, password);
                var fleet  = player.Fleets.Single(x => x.FleetID == fleetID);
                var target = db.CelestialObjects.Single(x => x.CelestialObjectID == toBodyID);

                var oldOrbit  = fleet.Transit.OrbitsObjectID;
                var oldTarget = fleet.Transit.CelestialObjectByToObjectID;

                fleet.Transit.SetTransit(target, FleetBaseWarp, db.GetConfig().CombatTurn + 1 + futureOffset, db.GetConfig()); // will start next turn

                if (oldOrbit == null && oldTarget != null)                                                                     // was heading to another planet
                {
                    var transit = fleet.Transit;
                    var ev      = db.AddEvent(EventType.Fleet, "{0} changed destination from {1} to {2}, ETA {3}", transit.GetNameWithOwner(), oldTarget.GetNameWithOwner(), transit.CelestialObjectByToObjectID.GetNameWithOwner(), transit.GetEtaString(db.GetConfig().SecondsPerTurn));
                    ev.Connect(transit.Fleets);
                    ev.Connect(transit.GetOwner());
                    ev.Connect(transit.CelestialObjectByToObjectID, oldTarget);
                    ev.Connect(transit.CelestialObjectByToObjectID.Player, oldTarget.Player);
                }


                db.MarkDirty();
                db.SubmitChanges();
                fleet.FleetShips.Load();
                t.Complete();
                return(fleet);
            }
        }
		public static RegisterResponse Register(string login, string password)
		{
			using (var t = new TransactionScope()) {
				var db = new DbDataContext();
				var user = db.SpringAccounts.SingleOrDefault(x => x.Name == login);
				if (user == null) return RegisterResponse.NotValidSpringLogin;

				if (user.Players != null) return RegisterResponse.AlreadyRegistered;

				if (db.SpringAccounts.Any(x => x.UserCookie == user.UserCookie && x.Players != null)) return RegisterResponse.IsSmurf;

				if (user.Password != SpringAccount.HashPassword(password)) return RegisterResponse.NotValidSpringPassword;

				// create player and assign to smallest alliance
				var player = new Player() { IsActive = true, StarSystem = db.StarSystems.OrderBy(x => x.Players.Where(y => y.IsActive).Count()).First() };
				user.Players = player;
				player.MothershipName = player.SpringAccount.Name + "'s mothership";

				// create his planet 
				var mg = new MapGen();
				var hisPlanet = mg.CreateHomeworld(player.StarSystem.CelestialObject);
				hisPlanet.Name = player.SpringAccount.Name + "'s home";
				hisPlanet.Player = player;
				player.StarSystem.CelestialObject.ChildCelestialObjects.Add(hisPlanet);

				hisPlanet.UpdateIncomeInfo();

				db.SubmitChanges();

				var e = db.AddEvent(EventType.Player, "{0} joined the {1}", player.Name, player.StarSystem.Name);
				e.Connect(player);
				e.Connect(hisPlanet);
				db.MarkDirty();
				db.SubmitChanges();
				t.Complete();
				return RegisterResponse.Ok;
			}
		}
        public static void ProcessTransitTurn(DbDataContext db)
        {
            var config = db.GetConfig();

            foreach (var transit in db.Transits)
            {
                if (transit.StartBattleTurn >= config.CombatTurn && transit.EndBattleTurn >= config.CombatTurn && transit.OrbitsObjectID != null)
                {
                    // log set sail
                    var owner = transit.GetOwner();
                    var ev    = db.AddEvent(EventType.Fleet,
                                            "{0} set sail from {1} to {2}. It will need {3} to get there",
                                            transit.GetNameWithOwner(),
                                            transit.CelestialObjectByFromObjectID.GetNameWithOwner(),
                                            transit.CelestialObjectByToObjectID.GetNameWithOwner(),
                                            transit.GetEtaString(config.SecondsPerTurn));
                    ev.Connect(transit.Fleets);
                    ev.Connect(owner);
                    if (transit.FromObjectID != null)
                    {
                        ev.Connect(transit.CelestialObjectByFromObjectID);
                        ev.Connect(transit.CelestialObjectByFromObjectID.Player);
                    }
                    ev.Connect(transit.CelestialObjectByToObjectID);
                    ev.Connect(transit.CelestialObjectByToObjectID.Player);

                    // process set sail
                    transit.OrbitsObjectID = null;
                    if (transit.Players.Any())                     // its mothership and it just left homeworld
                    {
                        var p = transit.Players.First();
                        if (p.HomeworldID != null)
                        {
                            var eve = db.AddEvent(EventType.Player, "{0} has lost homeworld {1}", p.Name, p.CelestialObject.GetName());
                            eve.Connect(p);
                            eve.Connect(p.CelestialObject);
                        }
                        p.HomeworldID = null;
                    }
                }
                else if (transit.EndBattleTurn <= config.CombatTurn && transit.OrbitsObjectID == null)
                {
                    // log arrival
                    var owner = transit.GetOwner();
                    var ev    = db.AddEvent(EventType.Fleet, "{0} arrived to {1}", transit.GetNameWithOwner(), transit.CelestialObjectByToObjectID.GetNameWithOwner());
                    ev.Connect(transit.Fleets);
                    ev.Connect(owner);
                    ev.Connect(transit.CelestialObjectByToObjectID);
                    ev.Connect(transit.CelestialObjectByToObjectID.Player);

                    // process arrival
                    transit.CelestialObject = transit.CelestialObjectByToObjectID;
                    transit.FromObjectID    = null;
                    transit.ToObjectID      = null;
                    transit.FromX           = 0;
                    transit.ToX             = 0;
                    transit.FromY           = 0;
                    transit.ToY             = 0;

                    PopulationTransport transport = transit.PopulationTransports;
                    if (transport != null)
                    {
                        if (transit.CelestialObjectByToObjectID.OwnerID == transport.OwnerID)                         // todo handle alliances!!
                        {
                            transit.CelestialObjectByToObjectID.Population += transport.Count;
                            if (transit.CelestialObjectByToObjectID.Population > transit.CelestialObjectByToObjectID.MaxPopulation)
                            {
                                transit.CelestialObjectByToObjectID.Population = transit.CelestialObjectByToObjectID.MaxPopulation;
                            }
                            transit.PopulationTransports = null;
                            db.Transits.DeleteOnSubmit(transit);
                            db.PopulationTransports.DeleteOnSubmit(transport);
                        }
                    }

                    if (transit.Players.Any())
                    {
                        var p = transit.Players.First();
                        p.CelestialObject = transit.CelestialObjectByToObjectID;                         // set homeworld to object where we arrived

                        var eve = db.AddEvent(EventType.Player, "{0} has new homeworld {1}", p.Name, p.CelestialObject.GetName());
                        eve.Connect(p);
                        eve.Connect(p.CelestialObject);
                    }
                }
            }
        }
		public static void ProcessTransitTurn(DbDataContext db)
		{
			var config = db.GetConfig();
			foreach (var transit in db.Transits)
			{
				if (transit.StartBattleTurn >= config.CombatTurn && transit.EndBattleTurn >= config.CombatTurn && transit.OrbitsObjectID != null)
				{
					// log set sail
					var owner = transit.GetOwner();
					var ev = db.AddEvent(EventType.Fleet,
					                     "{0} set sail from {1} to {2}. It will need {3} to get there",
					                     transit.GetNameWithOwner(),
					                     transit.CelestialObjectByFromObjectID.GetNameWithOwner(),
					                     transit.CelestialObjectByToObjectID.GetNameWithOwner(),
					                     transit.GetEtaString(config.SecondsPerTurn));
					ev.Connect(transit.Fleets);
					ev.Connect(owner);
					if (transit.FromObjectID != null)
					{
						ev.Connect(transit.CelestialObjectByFromObjectID);
						ev.Connect(transit.CelestialObjectByFromObjectID.Player);
					}
					ev.Connect(transit.CelestialObjectByToObjectID);
					ev.Connect(transit.CelestialObjectByToObjectID.Player);
          
					// process set sail
					transit.OrbitsObjectID = null;
					if (transit.Players.Any()) // its mothership and it just left homeworld
					{
						var p = transit.Players.First();
						if (p.HomeworldID != null)
						{
							var eve = db.AddEvent(EventType.Player, "{0} has lost homeworld {1}", p.Name, p.CelestialObject.GetName());
							eve.Connect(p);
							eve.Connect(p.CelestialObject);
						}
						p.HomeworldID = null;
					}
				}
				else if (transit.EndBattleTurn <= config.CombatTurn && transit.OrbitsObjectID == null)
				{
					// log arrival
					var owner = transit.GetOwner();
					var ev = db.AddEvent(EventType.Fleet, "{0} arrived to {1}", transit.GetNameWithOwner(), transit.CelestialObjectByToObjectID.GetNameWithOwner());
					ev.Connect(transit.Fleets);
					ev.Connect(owner);
					ev.Connect(transit.CelestialObjectByToObjectID);
					ev.Connect(transit.CelestialObjectByToObjectID.Player);

					// process arrival
					transit.CelestialObject = transit.CelestialObjectByToObjectID;
					transit.FromObjectID = null;
					transit.ToObjectID = null;
					transit.FromX = 0;
					transit.ToX = 0;
					transit.FromY = 0;
					transit.ToY = 0;

					PopulationTransport transport = transit.PopulationTransports;
					if (transport != null)
					{
						if (transit.CelestialObjectByToObjectID.OwnerID == transport.OwnerID) // todo handle alliances!!
						{ 
							transit.CelestialObjectByToObjectID.Population += transport.Count;
							if (transit.CelestialObjectByToObjectID.Population > transit.CelestialObjectByToObjectID.MaxPopulation) transit.CelestialObjectByToObjectID.Population = transit.CelestialObjectByToObjectID.MaxPopulation;
							transit.PopulationTransports = null;
							db.Transits.DeleteOnSubmit(transit);
							db.PopulationTransports.DeleteOnSubmit(transport);
						}
					}

					if (transit.Players.Any())
					{
						var p = transit.Players.First();
						p.CelestialObject = transit.CelestialObjectByToObjectID; // set homeworld to object where we arrived
					
						var eve = db.AddEvent(EventType.Player, "{0} has new homeworld {1}", p.Name, p.CelestialObject.GetName());
						eve.Connect(p);
						eve.Connect(p.CelestialObject);
	
					}
				}
			}
		}
		public static Tuple<Player, CelestialObject> OrderMothership(string playerName, string password, int toBodyID)
		{
			using (var t = new TransactionScope())
			{
				var db = new DbDataContext();
				var player = db.GetPlayer(playerName, password);
				if (player.Transit == null) player.Transit = new Transit()
				                                             	{
				                                             		CelestialObject = player.CelestialObject
				                                             	};
				var originalBody = player.CelestialObject;
				var target = db.CelestialObjects.Single(x => x.CelestialObjectID == toBodyID);
				var transit = player.Transit;

				var oldOrbit = transit.OrbitsObjectID;
				var oldTarget = transit.CelestialObjectByToObjectID;

				transit.SetTransit(target, FleetBaseWarp, db.GetConfig().CombatTurn + 1, db.GetConfig()); // will start next turn

				if (oldOrbit == null && oldTarget != null) // was heading to another planet
				{
					var ev = db.AddEvent(EventType.Fleet, "{0} changed destination from {1} to {2}, ETA {3}", transit.GetNameWithOwner(), oldTarget.GetNameWithOwner(), transit.CelestialObjectByToObjectID.GetNameWithOwner(), transit.GetEtaString(db.GetConfig().SecondsPerTurn));
					ev.Connect(transit.Fleets);
					ev.Connect(transit.GetOwner());
					ev.Connect(transit.CelestialObjectByToObjectID, oldTarget);
					ev.Connect(transit.CelestialObjectByToObjectID.Player, oldTarget.Player);
				}

				if (originalBody != null) originalBody.UpdateIncomeInfo();
				db.MarkDirty();
				db.SubmitChanges();
				t.Complete();
				return new Tuple<Player, CelestialObject>(player, originalBody);
			}
		}
		public static Fleet OrderFleet(string playerName, string password, int fleetID, int toBodyID, int futureOffset)
		{
			if (futureOffset < 0) throw new ApplicationException("Future offset cannot be smaller than 0");
			using (var t = new TransactionScope())
			{
				var db = new DbDataContext();
				var player = db.GetPlayer(playerName, password);
				var fleet = player.Fleets.Single(x => x.FleetID == fleetID);
				var target = db.CelestialObjects.Single(x => x.CelestialObjectID == toBodyID);

				var oldOrbit = fleet.Transit.OrbitsObjectID;
				var oldTarget = fleet.Transit.CelestialObjectByToObjectID;

				fleet.Transit.SetTransit(target, FleetBaseWarp, db.GetConfig().CombatTurn + 1 + futureOffset, db.GetConfig()); // will start next turn

				if (oldOrbit == null && oldTarget != null) // was heading to another planet
				{
					var transit = fleet.Transit;
					var ev = db.AddEvent(EventType.Fleet, "{0} changed destination from {1} to {2}, ETA {3}", transit.GetNameWithOwner(), oldTarget.GetNameWithOwner(), transit.CelestialObjectByToObjectID.GetNameWithOwner(), transit.GetEtaString(db.GetConfig().SecondsPerTurn));
					ev.Connect(transit.Fleets);
					ev.Connect(transit.GetOwner());
					ev.Connect(transit.CelestialObjectByToObjectID, oldTarget);
					ev.Connect(transit.CelestialObjectByToObjectID.Player, oldTarget.Player);
				}


				db.MarkDirty();
				db.SubmitChanges();
				fleet.FleetShips.Load();
				t.Complete();
				return fleet;
			}
		}