public PlanetWarsHandler(string host, int port, AutoHost autoHost, TasClient tas, MainConfig config)
        {
            this.autoHost = autoHost;
            this.tas = tas;
            this.host = host;
            account = new AuthInfo(config.AccountName, config.PlanetWarsServerPassword);

            server = (ISpringieServer) Activator.GetObject(typeof (ISpringieServer), String.Format("tcp://{0}:{1}/IServer", host, port));
            // fill factions for channel monitoring and join channels
            planetWarsChannels = new List<string>();
            var factions = server.GetFactions(account);
            foreach (var fact in factions) {
                string name = fact.Name.ToLower();
                planetWarsChannels.Add(name);
                if (!config.JoinChannels.Contains(name)) {
                    var list = new List<string>(config.JoinChannels);
                    list.Add(name);
                    config.JoinChannels = list.ToArray();
                    if (tas != null && tas.IsConnected && tas.IsLoggedIn) tas.JoinChannel(name);
                }
            }
            timer.Interval = 2000;
            timer.Elapsed += timer_Elapsed;
            timer.AutoReset = true;
            timer.Start();
        }
Пример #2
0
		public static string AddPlayer()
		{
			ConnectIfNecessary();
			var faction = Program.SpringieServer.GetFactions(springieAuth).TakeRandom();
			var auth = new AuthInfo(Resources.names.Replace("\r\n", "\n").Split('\n').TakeRandom(), "1");
			var result = Program.SpringieServer.Register(springieAuth, auth, faction.Name, null);
			if (result.StartsWith("Welcome to PlanetWars!")) {
				auths.Add(auth);
				return result + " (success)";
			}
			return result + " (failed)";
		}
Пример #3
0
		public string GetStartupModOptions(AuthInfo springieLogin, string mapName, ICollection<IPlayer> players)
		{
			if (mapName == null) {
				throw new ArgumentNullException("mapName");
			}
			if (players == null) {
				throw new ArgumentNullException("players");
			}

			var planet = Galaxy.Planets.Single(p => p.MapName == mapName);
			if (!GetAttackOptions(springieLogin).Any(p => p.ID == planet.ID)) {
				throw new ApplicationException("You cannot attack this planet right now");
			}

			var planetOwner = Galaxy.GetPlayer(planet.OwnerName);
			var leaderName = players.Any(p => p.Name == planetOwner.Name)
			                 	? planetOwner.Name
			                 	: (from p in players
			                 	   where p.FactionName == planetOwner.FactionName
			                 	   orderby p.RankOrder
			                 	   select p.Name).First();
			var factions = players.Select(p => p.FactionName).Distinct().ToList();
			var difference = players.Count(p => p.FactionName == factions[1]) - players.Count(p => p.FactionName == factions[0]);
			var outNumberedFaction = difference > 0 ? factions[0] : factions[1];
			var playersToReinforce = players // fixme: dont hardcode units and factions
				.Where(p => p.FactionName == outNumberedFaction).OrderBy(p => p.RankOrder).Take(Math.Abs(difference))
				// FIXME: might not give enough comms
				.ToDictionary(p => p.Name, p => 1); // fixme: use right number of comms instead of 1

			File.AppendAllText("modOptionsLog.txt", "Factions: " + String.Join(" ", factions.ToArray()) + "\n");
			File.AppendAllText("modOptionsLog.txt", "Difference: " + difference + "\n");
			File.AppendAllText("modOptionsLog.txt", "Outnumbered faction: " + outNumberedFaction + "\n");
			File.AppendAllText(
				"modOptionsLog.txt", "Players to reinforce: " + String.Join(" ", playersToReinforce.Keys.ToArray()) + "\n");

			if (players.Contains(planetOwner) && planetOwner.Name != leaderName) {
				throw new Exception("Owner is in battle but is not leader");
			}

			// get list of blocked factions
			var blockedFactions = new List<string>();
			var factionFleets =
				Galaxy.Fleets.Where(f => f.TargetPlanetID == planet.ID && f.Arrives <= Galaxy.Turn).GroupBy(
					f => Galaxy.GetPlayer(f.OwnerName).FactionName).OrderByDescending(g => g.Count()).ToList();

			for (var i = 0; i < factionFleets.Count(); i++) {
				blockedFactions.AddRange(Galaxy.Factions.Where(f => f.Name != factionFleets[i].Key).Select(f => f.Name.ToUpper()));
				// disable enemy factions

				if (i < factionFleets.Count() - 1 && factionFleets[i].Count() > factionFleets[i + 1].Count()) {
					break; // more ships than other faction, no other factions block upgrades
				}
			}

			var main = new LuaTable();
			var teams = new LuaTable();
			main["teams"] = teams;
			var teamID = 0;

			var isWithoutUpgrades = disabledUpgradesHosts.Contains(springieLogin.Login);

			foreach (var player in players) {
				var plTable = new LuaTable();
				var mobiles = new LuaTable();
				var structures = new LuaTable();
				var purchases = new LuaTable();
				var galPlayer = Galaxy.GetPlayer(player.Name);
				teams.Add("[" + teamID++ + "]", plTable);

				plTable["mobiles"] = mobiles;
				plTable["structures"] = structures;
				plTable["purchases"] = purchases;
				plTable["money"] = galPlayer.MetalAvail;
				plTable["name"] = galPlayer.Name;

				// extra commanders
				int reinforcementNumber;
				if (playersToReinforce.TryGetValue(player.Name, out reinforcementNumber) && reinforcementNumber > 0) {
					var unit = player.FactionName.ToUpper() == "ARM" ? "armcom" : "corcom";
					for (var i = 0; i < reinforcementNumber; i++) {
						mobiles.Add(new LuaTable {{"unitname", unit}});
					}
				}

				if (isWithoutUpgrades) {
					continue;
				}

				var isAllyOwnedPlanet = player.FactionName.ToUpper() == planetOwner.FactionName.ToUpper();

				List<UpgradeDef> playerUpgrades;
				if (UpgradeData.TryGetValue(player.Name, out playerUpgrades)) {
					if (!blockedFactions.Contains(player.FactionName.ToUpper())) {
						foreach (var upgrade in playerUpgrades.Where(u => !u.IsBuilding || isAllyOwnedPlanet)) {
							purchases.Add(new LuaTable {{"unitname", upgrade.UnitChoice}, {"owner", player.Name}});
							if (!upgrade.IsBuilding && upgrade.QuantityMobiles > 0) {
								for (var i = 0; i < upgrade.QuantityMobiles; i++) {
									mobiles.Add(new LuaTable {{"unitname", upgrade.UnitChoice}, {"owner", player.Name}});
								}
							}
						}
					}

					if (isAllyOwnedPlanet) {
						foreach (var upgrade in playerUpgrades.Where(u => u.IsBuilding)) {
							foreach (var d in upgrade.DeployLocations) {
								if (d.PlanetID == planet.ID) {
									structures.Add(
										new LuaTable
										{
											{"unitname", upgrade.UnitChoice},
											{"x", d.X},
											{"z", d.Z},
											{"orientation", d.Orientation},
											{"owner", player.Name}
										});
								}
							}
						}
					}
				}

				// deploy other structures present on the planet to the leader
				if (player.Name == leaderName) {
					foreach (var kvp in UpgradeData) {
						if (players.Any(x => x.Name == kvp.Key) || Galaxy.GetPlayer(kvp.Key).FactionName != planetOwner.FactionName) {
							continue; //skip players which play
						}
						foreach (var upg in kvp.Value.Where(u => u.IsBuilding)) {
							// give allied deployed units
							foreach (var d in upg.DeployLocations.Where(p => p.PlanetID == planet.ID)) {
								structures.Add(
									new LuaTable
									{{"unitname", upg.UnitChoice}, {"x", d.X}, {"z", d.Z}, {"orientation", d.Orientation}, {"owner", kvp.Key}});
							}
						}
					}
				}
			}
			main["allyteams"] = new LuaTable();
			main["hostname"] = springieLogin.Login;
			var optionsString = "return " + main;

			File.AppendAllText("modOptionsLog.txt", optionsString);

			return Convert.ToBase64String(Encoding.ASCII.GetBytes(optionsString)).Replace("\t", "  ").Replace("=", "_");
		}
		public string Register(AuthInfo springieLogin, AuthInfo account, string side, string planet)
		{
			return s.Register(springieLogin, account, side, planet);
		}
        public IFaction GetOffensiveFaction(AuthInfo springieLogin)
		{
            return s.GetOffensiveFaction(springieLogin);
		}
        public ICollection<IFaction> GetFactions(AuthInfo springieLogin)
		{
            return s.GetFactions(springieLogin);
		}
	    public bool ChangePlayerPassword(string newPassword, AuthInfo authorization, out string message)
		{
			return s.ChangePlayerPassword(newPassword, authorization, out message);
		}
	    public bool ChangeCommanderInChiefTitle(string newTitle, AuthInfo authorization, out string message)
		{
			return s.ChangeCommanderInChiefTitle(newTitle, authorization, out message);
		}
	    public void AddAward(AuthInfo springieLogin, string playerName, string awardType, string awardText, string mapName)
	    {
	        s.AddAward(springieLogin, playerName, awardType, awardText, mapName);
	    }
	    public bool SendBlockadeFleet(AuthInfo login, int targetPlanetID, out string message)
	    {
	        return s.SendBlockadeFleet(login, targetPlanetID, out message);
	    }
	    public void BuyUpgrade(AuthInfo login, int upgradeDefID, string choice)
	    {
	        s.BuyUpgrade(login, upgradeDefID, choice);
	    }
 public bool SetTimeZone(TimeZoneInfo LocalTimeZone, AuthInfo authorization, out string message)
 {
     return s.SetTimeZone(LocalTimeZone, authorization, out message);
 }
		public bool SetReminderOptions(ReminderEvent reminderEvent, ReminderLevel reminderLevel, ReminderRoundInitiative reminderRoundInitiative, AuthInfo authorization, out string message)
		{
			return s.SetReminderOptions(reminderEvent, reminderLevel, reminderRoundInitiative, authorization, out message);
		}
		public SendBattleResultOutput SendBattleResult(AuthInfo springieLogin, string mapName, ICollection<EndGamePlayerInfo> participants)
		{
			return s.SendBattleResult(springieLogin, mapName, participants);
		}
Пример #15
0
		public SendBattleResultOutput SendBattleResult(AuthInfo springieLogin,
		                                               string mapName,
		                                               ICollection<EndGamePlayerInfo> usersInGame)
		{
			var ret = new SendBattleResultOutput();
			ret.RankNotifications = new List<RankNotification>();
			if (springieLogin == null) {
				throw new ArgumentNullException("springieLogin");
			}
			if (usersInGame == null) {
				throw new ArgumentNullException("usersInGame");
			}
			if (!ValidateSpringieLogin(springieLogin)) {
				return ret; // silently ignore other than valid springie
			}

			var invalids = usersInGame.Where(x => !x.Spectator && Galaxy.GetPlayer(x.Name) == null).ToList();
			foreach (var u in invalids) {
				ret.MessageToDisplay += "Invalid players " + u.Name + " ignored";
				usersInGame.Remove(u);
			}

			if (!usersInGame.Any(p => p.OnVictoryTeam)) {
				ret.MessageToDisplay += "No losing players";
				return ret;
			}
			if (!usersInGame.Any(p => !p.OnVictoryTeam)) {
				ret.MessageToDisplay += "Only losing players";
				return ret;
			}

			if (!usersInGame.All(u => u.Spectator || Galaxy.GetPlayer(u.Name) != null)) {
				throw new Exception("Player is not registered.");
			}
			if (
				!usersInGame.All(
				 	u =>
				 	u.Spectator ||
				 	String.Equals(Galaxy.GetPlayer(u.Name).FactionName, u.Side, StringComparison.InvariantCultureIgnoreCase))) {
				throw new Exception("Faction mismatch.");
			}

			var isWithoutUpgrades = disabledUpgradesHosts.Contains(springieLogin.Login);

			Faction victoriousFaction = null;

			foreach (var user in usersInGame) {
				if (user.Spectator) {
					continue;
				}
				var player = Galaxy.Players.Single(p => p.Name == user.Name);
				if (user.OnVictoryTeam) {
					player.Victories++;
					player.MeasuredVictories++;
					player.MetalEarned += Settings.Default.MetalForVictory;
					if (victoriousFaction == null) {
						victoriousFaction = Galaxy.Factions.Single(f => f.Name == player.FactionName);
					}
				} else {
					player.Defeats++;
					player.MeasuredDefeats++;
					player.MetalEarned += Settings.Default.MetalForDefeat;
				}
			}

			if (victoriousFaction == null) {
				ret.MessageToDisplay += "No winners";
				return ret;
			}
			var planet = Galaxy.Planets.Single(p => p.MapName == mapName);
			var isConquest = planet.FactionName != victoriousFaction.Name;
			planet.FactionName = victoriousFaction.Name;

			if (!isWithoutUpgrades) {
				KillFleetsAndUpgrades(victoriousFaction, planet);
			}

			LastChanged = DateTime.Now;

			var sb = new StringBuilder();
			var encircledPlanetIDs = new List<int>();
			if (isConquest) {
				var encircledPlanets =
					Galaxy.Planets.Where(p => p.FactionName != victoriousFaction.Name && Galaxy.IsPlanetEncircled(p));
				foreach (var p in encircledPlanets) {
					p.FactionName = victoriousFaction.Name;
					sb.AppendFormat(",{0} ", p.Name);
					encircledPlanetIDs.Add(p.ID);
				}
				if (sb.Length != 0) {
					sb.Append("have fallen due to lack of supply.");
				}
			}

			if (!SpringieStates.ContainsKey(springieLogin.Login)) {
				throw new Exception("No springie state found!");
			}
			var attackingFaction = SpringieStates[springieLogin.Login].GameStartedStatus.OffensiveFactionName;
			var defendingFaction = Galaxy.Factions.Single(f => f.Name != attackingFaction).Name;
			Galaxy.Turn++;
			Galaxy.OffensiveFactionInternal = victoriousFaction.Name;

			List<PlayerRankChangedEvent> changedRanks;
			Galaxy.CalculatePlayerRanks(out changedRanks);
			Galaxy.SwapUnusedPlanets();
			CalculateEndTurnMetal();

			foreach (var e in changedRanks) {
				if (e.NewRank > e.OldRank) {
					new RankNotification(e.PlayerName, string.Format("Congratulations, you have been promoted to {0}!", e.NewRank));
				} else {
					new RankNotification(e.PlayerName, string.Format("You have just lost a rank! Conquer planets to regain it!"));
				}
			}

			var spaceFleetOwners = from f in Galaxy.Fleets
			                       where f.IsAtDestination(Galaxy.Turn)
			                       select f.OwnerName;

			var battleEvent = new BattleEvent(
				DateTime.Now,
				usersInGame.Where(u => !u.Spectator).ToList(),
				mapName,
				attackingFaction,
				defendingFaction,
				victoriousFaction.Name,
				disabledUpgradesHosts.Contains(springieLogin.Login),
				State.Galaxy,
				encircledPlanetIDs,
				spaceFleetOwners);
			State.Galaxy.Events.Add(battleEvent);
			Galaxy.CalculateBattleElo(battleEvent);

			var enemyPlanetCount = Galaxy.Planets.Count(p => p.FactionName != victoriousFaction.Name);
			if (enemyPlanetCount == 0) {
				State.Galaxy = Galaxy.AdvanceRound(Settings.Default.GalaxyTemplatePath);
				ForceSaveState();
				ret.MessageToDisplay += string.Format(
					"{0} HAS FINALLY CONQUERED THE GALAXY! (New round is starting)", victoriousFaction.Name);
				return ret;
			}

			ForceSaveState();
			ret.MessageToDisplay += string.Format(
				"Congratulations, planet {0} {2} by {1} {3}",
				planet.Name,
				victoriousFaction.Name,
				isConquest ? "conquered" : "held",
				sb);
			return ret;
		}
		public bool ChangePlanetName(string newName, AuthInfo authorization, out string message)
		{
			return s.ChangePlanetName(newName, authorization, out message);
		}
	    public bool ChangePlanetDescription(string newDescription, AuthInfo authorization, out string message)
	    {
	        return s.ChangePlanetDescription(newDescription, authorization, out message);
	    }
	    public void SendChatLine(AuthInfo springieLogin, string channel, string playerName, string text)
	    {
	        s.SendChatLine(springieLogin, channel, playerName, text);
	    }
	    public bool SendAid(string toPlayer, double ammount, AuthInfo authorization, out string message)
	    {
	        return s.SendAid(toPlayer, ammount, authorization, out message);
	    }
		public void UnitDeployed(AuthInfo springieLogin, string mapName, string playerName, string unit, int x, int z, string rotation)
		{
			s.UnitDeployed(springieLogin, mapName, playerName, unit, x, z, rotation);
		}
		public ICollection<IPlanet> GetAttackOptions(AuthInfo springieLogin)
		{
			return s.GetAttackOptions(springieLogin);
		}
 public string ResetPassword(AuthInfo springieLogin, string loginName)
 {
    return s.ResetPassword(springieLogin, loginName);
 }
		public ICollection<string> GetPlayersToNotify(AuthInfo springieLogin, string mapName, ReminderEvent reminderEvent)
		{
			return s.GetPlayersToNotify(springieLogin, mapName, reminderEvent);
		}
	    public void UnitDied(AuthInfo springieLogin, string playerName, string unitName, int x, int z)
	    {
	        s.UnitDied(springieLogin, playerName, unitName, x, z);
	    }
		public IPlayer GetPlayerInfo(AuthInfo springieLogin, string name)
		{
            return s.GetPlayerInfo(springieLogin, name);
		}
	    public void UnitPurchased(AuthInfo springieLogin, string playerName, string unitName, double cost, int x, int z)
	    {
	        s.UnitPurchased(springieLogin, playerName, unitName, cost, x, z);
	    }
		public string GetStartupModOptions(AuthInfo springieLogin, string mapName, ICollection<IPlayer> players)
		{
			return s.GetStartupModOptions(springieLogin, mapName, players);
		}
	    public Galaxy GetGalaxyMap(AuthInfo authorization)
		{
			return s.GetGalaxyMap(authorization);
		}
		public bool ChangePlanetMap(string mapName, AuthInfo authorization, out string message)
		{
			return s.ChangePlanetMap(mapName, authorization, out message);
		}
Пример #30
0
		public string Register(AuthInfo springieLogin, AuthInfo account, string side, string planetName)
		{
			if (account == null) {
				throw new ArgumentNullException("account");
			}
			if (springieLogin == null) {
				throw new ArgumentNullException("springieLogin");
			}
			if (!ValidateSpringieLogin(springieLogin)) {
				return string.Empty; // silently ignore other than valid springie
			}
			if (Galaxy.Players.Any(p => p.Name == account.Login)) {
				return "Name already taken.";
			}

			var faction =
				Galaxy.Factions.SingleOrDefault(f => string.Equals(f.Name, side, StringComparison.InvariantCultureIgnoreCase));
			if (faction == null) {
				return "Invalid faction chosen.";
			}

			var teams = (from p in Galaxy.Players
			             where p.FactionName != faction.Name && (p.Victories > 0 || p.Defeats > 0)
			             group p by p.FactionName
			             into gr select gr.Count());
			var smallestTeam = teams.Count() > 0 ? teams.Min() : 0;

			var myFaction = Galaxy.Players.Count(p => p.FactionName == faction.Name && (p.Victories > 0 || p.Defeats > 0));

			if (myFaction - smallestTeam > Settings.Default.MaxFactionSizeDifference) {
				return "Selected faction already has too many active players.";
			}

			string result;
			Event playerEvent;
			var planets = Galaxy.GetClaimablePlanets(faction).ToArray();
			if (planets.Any()) {
				var planet = string.IsNullOrEmpty(planetName)
				             	? planets.TakeRandom()
				             	: planets.SingleOrDefault(p => p.Name.ToUpper() == planetName.ToUpper());
				if (planet == null) {
					return string.Format("Planet {0} is occupied or not in the galaxy.", planetName);
				}
				var mapName = Galaxy.GetAvailableMaps().TakeRandom();
				planet.OwnerName = account.Login;
				planet.MapName = mapName;
				planet.FactionName = faction.Name;
				playerEvent = new PlayerRegisteredEvent(DateTime.Now, account.Login, planet.ID, State.Galaxy);
				result = string.Format("Welcome to PlanetWars! Your planet is {0}, with map {1}.", planet.Name, planet.MapName);
			} else {
				result = "Welcome to PlanetWars! You are in, but you don't own any planet (no free planets left.)";
				playerEvent = new PlayerRegisteredEvent(DateTime.Now, account.Login, null, State.Galaxy);
			}
			State.Accounts[account.Login] = Hash.HashString(account.Password);
			Galaxy.Players.Add(new Player(account.Login, faction.Name));
			State.Galaxy.Events.Add(playerEvent);
			SaveState();
			return result;
		}