Esempio n. 1
0
        public static Tuple <PopulationTransport, CelestialObject> CreatePopulationTransport(string playerName, string password, int fromBodyID, int toBodyID, int count)
        {
            using (var t = new TransactionScope())
            {
                var db     = new DbDataContext();
                var player = db.GetPlayer(playerName, password);
                var from   = player.CelestialObjects.Single(x => x.CelestialObjectID == fromBodyID);
                var target = db.CelestialObjects.Single(x => x.CelestialObjectID == toBodyID);

                if (from.Population < count)
                {
                    throw new ApplicationException("There are not enough people on this planet");
                }
                from.Population -= count;
                from.UpdateIncomeInfo();
                var transport = new PopulationTransport()
                {
                    Count = count, Player = player, Transit = new Transit()
                };
                player.PopulationTransports.Add(transport);

                var transit = transport.Transit;

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


                db.MarkDirty();
                db.SubmitChanges();
                t.Complete();
                return(new Tuple <PopulationTransport, CelestialObject>(transport, from));
            }
        }
Esempio n. 2
0
        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);
                    }
                }
            }
        }