public bool ProcessTrade(bool oneTimeOnly)
        {
            var fac1 = FactionByProposingFactionID;
            var fac2 = FactionByAcceptingFactionID;

            double metalFac1toFac2 = 0;
            double energyFac1toFac2 = 0;
            double dropshipsFac1toFac2 = 0;
            double bombersFac1toFac2 = 0;
            double warpsFac1toFac2 = 0;


            foreach (var te in TreatyEffects.Where(x => x.TreatyEffectType.IsOneTimeOnly == oneTimeOnly))
            {
                var tr = te.TreatyEffectType;
                if (tr.EffectGiveMetal == true)
                {
                    if (fac1 == te.FactionByGivingFactionID) metalFac1toFac2 += te.Value ?? 0;
                    else metalFac1toFac2 -= te.Value ?? 0;
                }

                if (tr.EffectGiveEnergy == true)
                {
                    if (fac1 == te.FactionByGivingFactionID) energyFac1toFac2 += te.Value ?? 0;
                    else energyFac1toFac2 -= te.Value ?? 0;
                }

                if (tr.EffectGiveDropships == true)
                {
                    if (fac1 == te.FactionByGivingFactionID) dropshipsFac1toFac2 += te.Value ?? 0;
                    else dropshipsFac1toFac2 -= te.Value ?? 0;
                }

                if (tr.EffectGiveBombers == true)
                {
                    if (fac1 == te.FactionByGivingFactionID) bombersFac1toFac2 += te.Value ?? 0;
                    else bombersFac1toFac2 -= te.Value ?? 0;
                }

                if (tr.EffectGiveWarps == true)
                {
                    if (fac1 == te.FactionByGivingFactionID) warpsFac1toFac2 += te.Value ?? 0;
                    else warpsFac1toFac2 -= te.Value ?? 0;
                }

            }

            if (fac1.Metal < metalFac1toFac2 || fac2.Metal < -metalFac1toFac2) return false;
            if (fac1.EnergyProducedLastTurn < energyFac1toFac2 || fac2.EnergyProducedLastTurn < -energyFac1toFac2) return false;
            if (fac1.Dropships < dropshipsFac1toFac2 || fac2.Dropships < -dropshipsFac1toFac2) return false;
            if (fac1.Bombers < bombersFac1toFac2 || fac2.Bombers < -bombersFac1toFac2) return false;
            if (fac1.Warps < warpsFac1toFac2 || fac2.Warps < -warpsFac1toFac2) return false;




            fac1.ProduceMetal(-metalFac1toFac2);
            fac2.ProduceMetal(metalFac1toFac2);
            fac1.EnergyProducedLastTurn -= energyFac1toFac2;
            fac2.EnergyProducedLastTurn += energyFac1toFac2;
            fac1.ProduceDropships(-dropshipsFac1toFac2);
            fac2.ProduceDropships(dropshipsFac1toFac2);
            fac1.ProduceBombers(-bombersFac1toFac2);
            fac2.ProduceBombers(bombersFac1toFac2);
            fac1.ProduceWarps(-warpsFac1toFac2);
            fac2.ProduceWarps(warpsFac1toFac2);

            foreach (var te in TreatyEffects.Where(x => x.TreatyEffectType.IsOneTimeOnly == oneTimeOnly && x.TreatyEffectType.EffectGiveInfluence == true))
            {
                var org = te.Planet.PlanetFactions.FirstOrDefault(x => x.FactionID == te.GivingFactionID);
                if (org != null)
                {
                    var entry = te.Planet.PlanetFactions.FirstOrDefault(x => x.FactionID == te.ReceivingFactionID);
                    if (entry == null)
                    {
                        entry = new PlanetFaction() { PlanetID = te.Planet.PlanetID, FactionID = te.ReceivingFactionID };
                        te.Planet.PlanetFactions.Add(entry);
                    }
                    entry.Influence += org.Influence;
                    org.Influence = 0;
                }
            }

            return true;
        }
Ejemplo n.º 2
0
        public bool ProcessTrade(bool oneTimeOnly)
        {
            var fac1 = FactionByProposingFactionID;
            var fac2 = FactionByAcceptingFactionID;

            double metalFac1toFac2     = 0;
            double energyFac1toFac2    = 0;
            double dropshipsFac1toFac2 = 0;
            double bombersFac1toFac2   = 0;
            double warpsFac1toFac2     = 0;


            foreach (var te in TreatyEffects.Where(x => x.TreatyEffectType.IsOneTimeOnly == oneTimeOnly))
            {
                var tr = te.TreatyEffectType;
                if (tr.EffectGiveMetal == true)
                {
                    if (fac1 == te.FactionByGivingFactionID)
                    {
                        metalFac1toFac2 += te.Value ?? 0;
                    }
                    else
                    {
                        metalFac1toFac2 -= te.Value ?? 0;
                    }
                }

                if (tr.EffectGiveEnergy == true)
                {
                    if (fac1 == te.FactionByGivingFactionID)
                    {
                        energyFac1toFac2 += te.Value ?? 0;
                    }
                    else
                    {
                        energyFac1toFac2 -= te.Value ?? 0;
                    }
                }

                if (tr.EffectGiveDropships == true)
                {
                    if (fac1 == te.FactionByGivingFactionID)
                    {
                        dropshipsFac1toFac2 += te.Value ?? 0;
                    }
                    else
                    {
                        dropshipsFac1toFac2 -= te.Value ?? 0;
                    }
                }

                if (tr.EffectGiveBombers == true)
                {
                    if (fac1 == te.FactionByGivingFactionID)
                    {
                        bombersFac1toFac2 += te.Value ?? 0;
                    }
                    else
                    {
                        bombersFac1toFac2 -= te.Value ?? 0;
                    }
                }

                if (tr.EffectGiveWarps == true)
                {
                    if (fac1 == te.FactionByGivingFactionID)
                    {
                        warpsFac1toFac2 += te.Value ?? 0;
                    }
                    else
                    {
                        warpsFac1toFac2 -= te.Value ?? 0;
                    }
                }
            }

            if (fac1.Metal < metalFac1toFac2 || fac2.Metal < -metalFac1toFac2)
            {
                return(false);
            }
            if (fac1.EnergyProducedLastTurn < energyFac1toFac2 || fac2.EnergyProducedLastTurn < -energyFac1toFac2)
            {
                return(false);
            }
            if (fac1.Dropships < dropshipsFac1toFac2 || fac2.Dropships < -dropshipsFac1toFac2)
            {
                return(false);
            }
            if (fac1.Bombers < bombersFac1toFac2 || fac2.Bombers < -bombersFac1toFac2)
            {
                return(false);
            }
            if (fac1.Warps < warpsFac1toFac2 || fac2.Warps < -warpsFac1toFac2)
            {
                return(false);
            }



            fac1.ProduceMetal(-metalFac1toFac2);
            fac2.ProduceMetal(metalFac1toFac2);
            fac1.EnergyProducedLastTurn -= energyFac1toFac2;
            fac2.EnergyProducedLastTurn += energyFac1toFac2;
            fac1.ProduceDropships(-dropshipsFac1toFac2);
            fac2.ProduceDropships(dropshipsFac1toFac2);
            fac1.ProduceBombers(-bombersFac1toFac2);
            fac2.ProduceBombers(bombersFac1toFac2);
            fac1.ProduceWarps(-warpsFac1toFac2);
            fac2.ProduceWarps(warpsFac1toFac2);

            foreach (var te in TreatyEffects.Where(x => x.TreatyEffectType.IsOneTimeOnly == oneTimeOnly && x.TreatyEffectType.EffectGiveInfluence == true))
            {
                var org = te.Planet.PlanetFactions.FirstOrDefault(x => x.FactionID == te.GivingFactionID);
                if (org != null)
                {
                    var entry = te.Planet.PlanetFactions.FirstOrDefault(x => x.FactionID == te.ReceivingFactionID);
                    if (entry == null)
                    {
                        entry = new PlanetFaction()
                        {
                            PlanetID = te.Planet.PlanetID, FactionID = te.ReceivingFactionID
                        };
                        te.Planet.PlanetFactions.Add(entry);
                    }
                    entry.Influence += org.Influence;
                    org.Influence    = 0;
                }
            }

            return(true);
        }
        public ActionResult SendDropships(int planetID, int count, bool? useWarp)
        {
            var db = new ZkDataContext();
            Account acc = db.Accounts.Single(x => x.AccountID == Global.AccountID);
            if (acc.Faction == null) return Content("Join a faction first");
            Planet planet = db.Planets.SingleOrDefault(x => x.PlanetID == planetID);
            int there = planet.PlanetFactions.Where(x => x.FactionID == acc.FactionID).Sum(x => (int?)x.Dropships) ?? 0;
            bool accessible = useWarp == true ? planet.CanDropshipsWarp(acc.Faction) : planet.CanDropshipsAttack(acc.Faction);
            if (!accessible) return Content(string.Format("That planet cannot be attacked"));
            if (Global.Server.GetPlanetBattles(planet).Any(x => x.IsInGame)) return Content("Battle in progress on the planet, cannot send ships");

            int cnt = Math.Max(count, 0);

            int capa = acc.GetDropshipCapacity();

            if (cnt + there > capa) return Content("Too many ships, increase fleet size");
            cnt = Math.Min(cnt, (int)acc.GetDropshipsAvailable());
            if (useWarp == true) cnt = Math.Min(cnt, (int)acc.GetWarpAvailable());
            if (cnt > 0)
            {
                acc.SpendDropships(cnt);
                if (useWarp == true) acc.SpendWarps(cnt);

                if (planet.Account != null) {
                    Global.Server.GhostPm(planet.Account.Name, string.Format(
                        "Warning: long range scanners detected fleet of {0} ships inbound to your planet {1} {3}/Planetwars/Planet/{2}",
                        cnt,
                        planet.Name,
                        planet.PlanetID,
                        GlobalConst.BaseSiteUrl));
                }
                PlanetFaction pac = planet.PlanetFactions.SingleOrDefault(x => x.FactionID == acc.FactionID);
                if (pac == null)
                {
                    pac = new PlanetFaction { FactionID = Global.FactionID, PlanetID = planetID };
                    db.PlanetFactions.InsertOnSubmit(pac);
                }
                pac.Dropships += cnt;
                pac.DropshipsLastAdded = DateTime.UtcNow;

                if (cnt > 0)
                {
                    db.Events.InsertOnSubmit(Global.CreateEvent("{0} sends {1} {2} dropships to {3} {4} {5}",
                                                                acc,
                                                                cnt,
                                                                acc.Faction,
                                                                planet.Faction,
                                                                planet,
                                                                useWarp == true ? "using warp drives" : ""));
                }
                db.SubmitChanges();
            }
            return RedirectToAction("Planet", new { id = planetID });
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Spread influence through wormholes
        /// </summary>
        public void SpreadInfluence()
        {
            foreach (var planet in Planets)
            {
                var sumInfluence = planet.PlanetFactions.Sum(x => (double?)x.Influence) ?? 0;
                var freeRoom     = GlobalConst.PlanetWarsMaximumIP - sumInfluence;
                if (freeRoom > 0)
                {
                    var spreads = new Dictionary <Faction, double>();

                    var hasInhibitor = planet.PlanetStructures.Any(x => x.IsActive && x.StructureType.EffectBlocksInfluenceSpread == true);

                    // check all linked planets to spread influence here
                    foreach (var link in planet.LinksByPlanetID1.Union(planet.LinksByPlanetID2))
                    {
                        var otherPlanet = link.PlanetID1 == planet.PlanetID ? link.PlanetByPlanetID2 : link.PlanetByPlanetID1;

                        if (otherPlanet.Faction != null)
                        {
                            if (otherPlanet.Faction != planet.Faction && hasInhibitor)
                            {
                                continue;
                            }

                            // diplomacy check
                            if (!otherPlanet.Faction.GaveTreatyRight(planet, x => x.EffectPreventInfluenceSpread == true))
                            {
                                var spread =
                                    otherPlanet.PlanetStructures.Where(x => x.IsActive).Sum(x => (double?)(x.StructureType.EffectInfluenceSpread ?? 0)) ??
                                    0;

                                double oldVal;
                                spreads.TryGetValue(otherPlanet.Faction, out oldVal);
                                spreads[otherPlanet.Faction] = oldVal + spread;
                            }
                        }
                    }

                    // handle guerilla jumpgates
                    foreach (var guerillaWormhole in planet.PlanetStructuresByTargetPlanetID.Where(x => x.IsActive && x.StructureType.EffectRemoteInfluenceSpread > 0))
                    {
                        var sourcePlanet = guerillaWormhole.Planet;

                        if (sourcePlanet.Faction != null)
                        {
                            if (sourcePlanet.Faction != planet.Faction && hasInhibitor)
                            {
                                continue;
                            }

                            // diplomacy check
                            if (!sourcePlanet.Faction.GaveTreatyRight(planet, x => x.EffectPreventInfluenceSpread == true))
                            {
                                var spread = guerillaWormhole.StructureType.EffectRemoteInfluenceSpread ?? 0;

                                double oldVal;
                                spreads.TryGetValue(sourcePlanet.Faction, out oldVal);
                                spreads[sourcePlanet.Faction] = oldVal + spread;
                            }
                        }
                    }


                    // same-planet spread
                    if (planet.Faction != null)
                    {
                        var    autospread = planet.PlanetStructures.Where(x => x.IsActive).Sum(x => (double?)(x.StructureType.EffectInfluenceSpread ?? 0)) ?? 0;
                        double oldVal2;
                        spreads.TryGetValue(planet.Faction, out oldVal2);
                        spreads[planet.Faction] = oldVal2 + autospread;
                    }


                    /*
                     * Replacement proposal for free = 0
                     * var sumSpreads = spreads.Sum(x => x.Value);
                     * double squeeze = 1.0;
                     * if (sumSpreads > 100)
                     * squeeze = 100 / sumSpreads
                     * foreach spread IP
                     * IP *= squeeze
                     * end for
                     * sumSpreads = 100
                     * end if
                     *
                     * if (sumSpreads > freeRoom)
                     * factor = (100 - sumSpreads)/(100 - freeRoom)
                     * foreach current IP
                     * IP *= factor
                     * end for
                     * end if
                     * that is it
                     */

                    if (spreads.Count > 0)
                    {
                        var    sumSpreads = spreads.Sum(x => x.Value);
                        double squeeze    = 1.0;
                        if (sumSpreads > freeRoom)
                        {
                            squeeze = freeRoom / sumSpreads;
                        }

                        foreach (var kvp in spreads)
                        {
                            var entry = planet.PlanetFactions.SingleOrDefault(x => x.FactionID == kvp.Key.FactionID);
                            if (entry == null)
                            {
                                entry = new PlanetFaction()
                                {
                                    FactionID = kvp.Key.FactionID, PlanetID = planet.PlanetID
                                };
                                planet.PlanetFactions.Add(entry);
                            }
                            var gain = kvp.Value * squeeze;

                            /*if (kvp.Key != planet.Faction && entry.Influence < GlobalConst.InfluenceToCapturePlanet && entry.Influence + gain >= GlobalConst.InfluenceToCapturePlanet)
                             * {
                             *  entry.Influence = GlobalConst.InfluenceToCapturePlanet - 0.1;
                             * }
                             * else */
                            entry.Influence += gain;

                            if (entry.Influence > GlobalConst.PlanetWarsMaximumIP)
                            {
                                entry.Influence = GlobalConst.PlanetWarsMaximumIP;
                            }
                        }
                    }
                }
            }
        }
    /// <summary>
    /// Process planet wars turn
    /// </summary>
    /// <param name="mapName"></param>
    /// <param name="extraData"></param>
    /// <param name="db"></param>
    /// <param name="winNum">0 = attacker wins, 1 = defender wins</param>
    /// <param name="players"></param>
    /// <param name="text"></param>
    /// <param name="sb"></param>
    public static void EndTurn(string mapName, List<string> extraData, ZkDataContext db, int? winNum, List<Account> players, StringBuilder text, SpringBattle sb, List<Account> attackers)
    {
        if (extraData == null) extraData = new List<string>();
        Galaxy gal = db.Galaxies.Single(x => x.IsDefault);
        Planet planet = gal.Planets.Single(x => x.Resource.InternalName == mapName);

        text.AppendFormat("Battle on {1}/PlanetWars/Planet/{0} has ended\n", planet.PlanetID, GlobalConst.BaseSiteUrl);


        Faction attacker = attackers.Where(x => x.Faction != null).Select(x => x.Faction).First();
        var defenders = players.Where(x => x.FactionID != attacker.FactionID && x.FactionID != null).ToList();
        bool isAttackerWinner;
        bool wasAttackerCcDestroyed = false;
        bool wasDefenderCcDestroyed = false;

        if (winNum != null)
        {
            if (winNum == 0) isAttackerWinner = true;
            else isAttackerWinner = false;

            wasAttackerCcDestroyed = extraData.Any(x => x.StartsWith("hqkilled,0"));
            wasDefenderCcDestroyed = extraData.Any(x => x.StartsWith("hqkilled,1"));
        }
        else
        {
            text.AppendFormat("No winner on this battle!");
            Trace.TraceError("PW battle without a winner {0}", sb != null ? sb.SpringBattleID : (int?)null);
            return;
        }

        int dropshipsSent = (planet.PlanetFactions.Where(x => x.Faction == attacker).Sum(x => (int?)x.Dropships) ?? 0);
        bool isLinked = planet.CanDropshipsAttack(attacker);
        string influenceReport = "";

        // distribute influence
        // save influence gains
        // give influence to main attackers
        double planetDropshipDefs = (planet.PlanetStructures.Where(x => x.IsActive).Sum(x => x.StructureType.EffectDropshipDefense) ?? 0);
        double planetIpDefs = (planet.PlanetStructures.Where(x => x.IsActive).Sum(x => x.StructureType.EffectReduceBattleInfluenceGain) ?? 0);

        double baseInfluence = GlobalConst.BaseInfluencePerBattle;
        double influence = baseInfluence;


        double effectiveShips = Math.Max(0, (dropshipsSent - planetDropshipDefs));
        double shipBonus = effectiveShips*GlobalConst.InfluencePerShip;

        double defenseBonus = -planetIpDefs;
        double techBonus = attacker.GetFactionUnlocks().Count() * GlobalConst.InfluencePerTech;
        double ipMultiplier = 1;
        string ipReason;
        if (!isAttackerWinner)
        {
            if (wasDefenderCcDestroyed)
            {
                ipMultiplier = 0.2;
                ipReason = "from losing but killing defender's CC";
            }
            else
            {
                ipMultiplier = 0;
                ipReason = "from losing horribly";
            }
        }
        else
        {
            if (wasAttackerCcDestroyed)
            {
                ipReason = "from losing own CC";
                ipMultiplier = 0.5;
            }
            else
            {
                ipReason = "from winning flawlessly";
            }
        }
        if (!isLinked && effectiveShips < GlobalConst.DropshipsForFullWarpIPGain)
        {
            var newMult = effectiveShips/GlobalConst.DropshipsForFullWarpIPGain;
            ipMultiplier *= newMult ;
            ipReason = ipReason + string.Format(" and reduced to {0}% because only {1} of {2} ships needed for warp attack got past defenses", (int)(newMult*100.0), (int)effectiveShips, GlobalConst.DropshipsForFullWarpIPGain);
        }


        influence = (influence + shipBonus + techBonus) * ipMultiplier + defenseBonus;
        if (influence < 0) influence = 0;
        influence = Math.Floor(influence * 100) / 100;

        // main winner influence 
        PlanetFaction entry = planet.PlanetFactions.FirstOrDefault(x => x.Faction == attacker);
        if (entry == null)
        {
            entry = new PlanetFaction { Faction = attacker, Planet = planet, };
            planet.PlanetFactions.Add(entry);
        }

        entry.Influence += influence;


        // clamping of influence
        // gained over 100, sole owner
        if (entry.Influence >= 100)
        {
            entry.Influence = 100;
            foreach (var pf in planet.PlanetFactions.Where(x => x.Faction != attacker)) pf.Influence = 0;
        }
        else
        {
            var sumOthers = planet.PlanetFactions.Where(x => x.Faction != attacker).Sum(x => (double?)x.Influence) ?? 0;
            if (sumOthers + entry.Influence > 100)
            {
                var excess = sumOthers + entry.Influence - 100;
                foreach (var pf in planet.PlanetFactions.Where(x => x.Faction != attacker)) pf.Influence -= pf.Influence / sumOthers * excess;
            }
        }
        try
        {
            influenceReport = String.Format("{0} gained {1} influence ({2}% {3} of {4}{5}{6}{7})",
                attacker.Shortcut,
                influence,
                (int)(ipMultiplier * 100.0),
                ipReason,
                baseInfluence + " base",
                techBonus > 0 ? " +" + techBonus + " from techs" : "",
                shipBonus > 0 ? " +" + shipBonus + " from dropships" : "",
                defenseBonus != 0 ? " -" + -defenseBonus + " from defenses" : "");
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
        }


        // distribute metal
        var attackersTotalMetal = Math.Floor(GlobalConst.PlanetWarsAttackerMetal);
        var defendersTotalMetal = Math.Floor(GlobalConst.PlanetWarsDefenderMetal);
        var attackerMetal = Math.Floor(attackersTotalMetal / attackers.Count);
        var defenderMetal = Math.Floor(defendersTotalMetal / defenders.Count);
        foreach (Account w in attackers)
        {
            w.ProduceMetal(attackerMetal);
            var ev = Global.CreateEvent("{0} gained {1} metal from battle {2}",
                                        w,
                                        attackerMetal,
                                        sb);
            db.Events.InsertOnSubmit(ev);
            text.AppendLine(ev.PlainText);
        }

        foreach (Account w in defenders)
        {
            w.ProduceMetal(defenderMetal);
            var ev = Global.CreateEvent("{0} gained {1} metal from battle {2}",
                                        w,
                                        defenderMetal,
                                        sb);

            db.Events.InsertOnSubmit(ev);
            text.AppendLine(ev.PlainText);
        }


        // remove dropships
        foreach (var pf in planet.PlanetFactions.Where(x => x.Faction == attacker)) pf.Dropships = 0;


        // add attack points
        foreach (Account acc in players)
        {
            int ap = acc.Faction == attacker ? GlobalConst.AttackPointsForVictory : GlobalConst.AttackPointsForDefeat;
            if (acc.Faction != null)
            {
                AccountPlanet apentry = planet.AccountPlanets.SingleOrDefault(x => x.AccountID == acc.AccountID);
                if (apentry == null)
                {
                    apentry = new AccountPlanet { AccountID = acc.AccountID, PlanetID = planet.PlanetID };
                    db.AccountPlanets.InsertOnSubmit(apentry);
                }

                apentry.AttackPoints += ap;
            }
            acc.PwAttackPoints += ap;
        }

        // paranoia!
        try
        {
            var mainEvent = Global.CreateEvent("{0} attacked {1} {2} in {3} and {4}. {5}",
                attacker,
                planet.Faction,
                planet,
                sb,
                isAttackerWinner ? "won. " : "lost. ",
                influenceReport
                );
            db.Events.InsertOnSubmit(mainEvent);
            text.AppendLine(mainEvent.PlainText);

        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
        }

        // destroy pw structures killed ingame
        if (!isAttackerWinner)
        {
            var handled = new List<string>();
            foreach (string line in extraData.Where(x => x.StartsWith("structurekilled")))
            {
                string[] data = line.Substring(16).Split(',');
                string unitName = data[0];
                if (handled.Contains(unitName)) continue;
                handled.Add(unitName);
                foreach (PlanetStructure s in planet.PlanetStructures.Where(x => x.StructureType.IngameUnitName == unitName))
                {
                    if (s.StructureType.IsIngameDestructible)
                    {
                        s.IsActive = false;
                        s.ActivatedOnTurn = gal.Turn + (int)(s.StructureType.TurnsToActivate * (GlobalConst.StructureIngameDisableTimeMult - 1));

                        var ev = Global.CreateEvent("{0} has been disabled on {1} planet {2}. {3}", s.StructureType.Name, planet.Faction, planet, sb);
                        db.Events.InsertOnSubmit(ev);
                        text.AppendLine(ev.PlainText);
                    }
                }
            }
        }
        else
        {
            // attacker won disable all
            foreach (var s in planet.PlanetStructures.Where(x => x.StructureType.IsIngameDestructible))
            {
                s.IsActive = false;
                s.ActivatedOnTurn = gal.Turn + (int)(s.StructureType.TurnsToActivate * (GlobalConst.StructureIngameDisableTimeMult - 1));
            }
            // destroy structures by battle (usually defenses)
            foreach (PlanetStructure s in planet.PlanetStructures.Where(x => x.StructureType.BattleDeletesThis).ToList()) planet.PlanetStructures.Remove(s);

            var ev = Global.CreateEvent("All structures have been disabled on {0} planet {1}. {2}", planet.Faction, planet, sb);
            db.Events.InsertOnSubmit(ev);
            text.AppendLine(ev.PlainText);
        }

        db.SaveChanges();

        gal.DecayInfluence();
        gal.SpreadInfluence();

        // process faction energies
        foreach (var fac in db.Factions.Where(x => !x.IsDeleted)) fac.ProcessEnergy(gal.Turn);

        // process production
        gal.ProcessProduction();


        // process treaties
        foreach (var tr in db.FactionTreaties.Where(x => x.TreatyState == TreatyState.Accepted || x.TreatyState == TreatyState.Suspended))
        {
            if (tr.ProcessTrade(false))
            {
                tr.TreatyState = TreatyState.Accepted;
                if (tr.TurnsTotal != null)
                {
                    tr.TurnsRemaining--;
                    if (tr.TurnsRemaining <= 0)
                    {
                        tr.TreatyState = TreatyState.Invalid;
                        db.FactionTreaties.DeleteOnSubmit(tr);
                    }
                }
            }
            else tr.TreatyState = TreatyState.Suspended;
        }

        // burn extra energy
        foreach (var fac in db.Factions.Where(x => !x.IsDeleted)) fac.ConvertExcessEnergyToMetal();


        int? oldOwner = planet.OwnerAccountID;
        gal.Turn++;
        db.SaveChanges();

        db = new ZkDataContext(); // is this needed - attempt to fix setplanetownersbeing buggy
        PlanetwarsController.SetPlanetOwners(db, sb);
        gal = db.Galaxies.Single(x => x.IsDefault);

        planet = gal.Planets.Single(x => x.Resource.InternalName == mapName);
        if (planet.OwnerAccountID != oldOwner && planet.OwnerAccountID != null)
        {
            text.AppendFormat("Congratulations!! Planet {0} was conquered by {1} !!  {3}/PlanetWars/Planet/{2}\n",
                planet.Name,
                planet.Account.Name,
                planet.PlanetID,
                GlobalConst.BaseSiteUrl);
        }

        try
        {

            // store history
            foreach (Planet p in gal.Planets)
            {
                db.PlanetOwnerHistories.InsertOnSubmit(new PlanetOwnerHistory
                {
                    PlanetID = p.PlanetID,
                    OwnerAccountID = p.OwnerAccountID,
                    OwnerClanID = p.OwnerAccountID != null ? p.Account.ClanID : null,
                    OwnerFactionID = p.OwnerFactionID,
                    Turn = gal.Turn
                });
            }

            db.SubmitChanges();
        }
        catch (Exception ex)
        {
            Trace.TraceError(ex.ToString());
            text.AppendLine("error saving history: " + ex);
        }

        //rotate map
        if (GlobalConst.RotatePWMaps)
        {
            db = new ZkDataContext();
            gal = db.Galaxies.Single(x => x.IsDefault);
            planet = gal.Planets.Single(x => x.Resource.InternalName == mapName);
            var mapList = db.Resources.Where(x => x.MapPlanetWarsIcon != null && x.Planets.Where(p => p.GalaxyID == gal.GalaxyID).Count() == 0 && x.FeaturedOrder != null
                                                  && x.ResourceID != planet.MapResourceID && x.MapWaterLevel == planet.Resource.MapWaterLevel).ToList();
            if (mapList.Count > 0)
            {
                int r = new Random().Next(mapList.Count);
                int resourceID = mapList[r].ResourceID;
                Resource newMap = db.Resources.Single(x => x.ResourceID == resourceID);
                text.AppendLine(String.Format("Map cycler - {0} maps found, selected map {1} to replace map {2}", mapList.Count, newMap.InternalName, planet.Resource.InternalName));
                planet.Resource = newMap;
                gal.IsDirty = true;
            }
            else
            {
                text.AppendLine("Map cycler - no maps found");
            }
            db.SaveChanges();
        }
    }
 public static MvcHtmlString PrintInfluence(this HtmlHelper helper, PlanetFaction planetFaction) {
     return PrintInfluence(helper, planetFaction.Faction, planetFaction.Influence);
 }