using System; using System.Text; using System.Collections; using System.Collections.ObjectModel; using Holo.Managers; using Holo.Virtual.Users; using Ion.Storage; namespace Holo.Virtual.Rooms.Games { /// /// A generic game lobby object for a 'BattleBall' or 'SnowStorm' game lobby. /// internal class gameLobby { #region Declares /// /// The virtualRoom object where this lobby is hosted in. /// internal virtualRoom Room; /// /// The rankManager.gameRank object for this lobby, containing the rank title and the minimum and maximimum game points for this lobby. /// internal rankManager.gameRank Rank; /// /// The collection that contains the games in this lobby. /// internal Hashtable Games = new Hashtable(); /// /// Indicates if this gamelobby hosts 'BattleBall' games. If false, then 'SnowStorm' games are hosted. /// internal bool isBattleBall = true; /// /// 'BattleBall' only. Specifies the IDs of the powerup objects that are allowed in this lobby. /// private int[] allowedPowerups; #endregion #region Constructors/destructor /// /// Intializes the game lobby with a 'BattleBall'/'SnowStorm' mode. /// /// The minimum amount of points that a virtual user requires to start/join a game here. /// Indicates if this gamelobby hosts 'BattleBall' games. If false, then 'SnowStorm' games are hosted. /// The title of the rank for players that are playing in this lobby. The matching minimum and maximum amounts for game points are loaded. /// The ID of the room that the user is currently in. internal gameLobby(virtualRoom Room, bool isBattleBall, string rankTitle) { this.Room = Room; this.Rank = rankManager.getGameRank(isBattleBall, rankTitle); this.isBattleBall = isBattleBall; if (isBattleBall) { string[] Powerups; using (DatabaseClient dbClient = Eucalypt.dbManager.GetClient()) { Powerups = dbClient.getString("SELECT bb_allowedpowerups FROM games_lobbies WHERE id = '" + Room.roomID + "'").Split(','); } this.allowedPowerups = new int[Powerups.Length]; for (int i = 0; i < Powerups.Length; i++) this.allowedPowerups[i] = int.Parse(Powerups[i]); } } /// /// Clears the games from the game lobby and nulls the virtualRoom object. /// internal void Clear() { Games.Clear(); Games = null; Room = null; } #endregion #region Properties /// /// The type of the games being played in this game lobby as a two character, lowercase string. /// internal string Type { get { if (isBattleBall) return "bb"; else return "ss"; } } /// /// The ranks and points of the virtual users inside this gamelobby. /// internal string playerRanks { get { ICollection Users = Room.Users; StringBuilder Ranks = new StringBuilder(Encoding.encodeVL64(Users.Count)); foreach (virtualRoomUser roomUser in Users) Ranks.Append(Encoding.encodeVL64(roomUser.roomUID) + roomUser.gamePoints + Convert.ToChar(2) + rankManager.getGameRankTitle(this.isBattleBall, roomUser.gamePoints) + Convert.ToChar(2)); return Ranks.ToString(); } } /// /// Returns a boolean that indicates if a certain amount of gamepoints is (skill level) valid for creating/joining a game in this lobby. /// /// The amount of gamepoints. internal bool validGamerank(int Points) { return (Points >= Rank.minPoints && (Rank.maxPoints == 0 || Points <= Rank.maxPoints)); } /// /// Returns the list with 'BattleBall'/'SnowStorm' games, depending on the mode of this lobby. This list is for usage in the game browser's index. /// internal string gameList() { try { int[] Amounts = new int[3]; // [0] = waiting, [1] = started, [2] = ended StringBuilder List = new StringBuilder(); foreach (Game Game in ((Hashtable)Games.Clone()).Values) { List.Append(Encoding.encodeVL64(Game.ID)); if (isBattleBall == false) // SnowStorm game List.Append(Encoding.encodeVL64(Game.leftTime)); List.Append(Encoding.encodeVL64(Game.mapID)); Amounts[(int)Game.State]++; } if (Amounts[1] > 0 || Amounts[2] > 0) // There are started/ended games return Encoding.encodeVL64(Amounts[0]) + Encoding.encodeVL64(Amounts[1]) + Encoding.encodeVL64(Amounts[2]) + List.ToString(); else // Only games in 'waiting for players'-mode return Encoding.encodeVL64(Amounts[0]) + List.ToString(); } catch (Exception e) { Console.WriteLine(e.Message); return ""; } } internal string getCreateGameSettings() { if (isBattleBall) { StringBuilder Settings = new StringBuilder(Encoding.encodeVL64(4)); // 4 values Settings.Append("fieldType" + Convert.ToChar(2) + "HJIII" + Encoding.encodeVL64(5)); // Amount of maps to show //Settings.Append("maximumSimultaneousPowerups" + Convert.ToChar(2) + "HIJIII" + Encoding.encodeVL64(10)); // Maximum amount of spawned powerups on game field on same time //Settings.Append("powerupCreateChance" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(50) + "III" + Encoding.encodeVL64(100)); // Spawn ratio of powerups Settings.Append("numTeams" + Convert.ToChar(2) + "HJJIJI" + Encoding.encodeVL64(4)); // Max amount of teams selectable //Settings.Append("coloringForOpponentTimePulses" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(15) + "III" + Encoding.encodeVL64(100)); // ??? //Settings.Append("gameLengthSeconds" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(Config.Game_BattleBall_gameLength_Seconds) + "IHH"); Settings.Append("allowedPowerups" + Convert.ToChar(2) + "IJ"); int powerupsAmount = allowedPowerups.Length; if (powerupsAmount == 0) Settings.Append("9"); else { for (int i = 0; i < powerupsAmount; i++) { if (i == powerupsAmount - 1) Settings.Append(allowedPowerups[i]); else Settings.Append(allowedPowerups[i] + ","); } } Settings.Append(Convert.ToChar(2) + "H"); //Settings.Append("cleaningTilesTimePulses" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(15) + "III" + Encoding.encodeVL64(100)); //Settings.Append("powerupCreateFirstTimePulses" + Convert.ToChar(2) + "HIHIHI" + Encoding.encodeVL64(100)); //Settings.Append("secondsUntilRestart" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(Config.Game_scoreWindow_restartGame_Seconds) + "IHH"); //Settings.Append("powerupTimeToLivePulses" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(60) + "I" + Encoding.encodeVL64(5) + "I" + Encoding.encodeVL64(100)); //Settings.Append("powerupCreateIntervalPulses" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(20) + "I" + Encoding.encodeVL64(5) + "I" + Encoding.encodeVL64(100)); //Settings.Append("stunTimePulses" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(10) + "III" + Encoding.encodeVL64(100)); //Settings.Append("highJumpsTimePulses" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(15) + "III" + Encoding.encodeVL64(100)); Settings.Append("name" + Convert.ToChar(2) + "IJ" + Convert.ToChar(2) + "H"); //Settings.Append("secondsUntilStart" + Convert.ToChar(2) + "HI" + Encoding.encodeVL64(Config.Game_Countdown_Seconds) + "IHH"); return Settings.ToString(); } else return "#"; } internal bool allowsPowerup(int ID) { try { for (int i = 0; i < allowedPowerups.Length; i++) if (allowedPowerups[i] == ID) return true; return false; } catch { return false; } } #endregion #region Functions internal void createGame(gamePlayer Owner, string Name, int mapID, int teamAmount, int[] enabledPowerups) { int gameID = 0; while (Games.ContainsKey(gameID)) gameID++; Owner.Game.movePlayer(Owner, -1, 0); Games.Add(gameID, Owner.Game); } #endregion } }