using System.Collections.Generic; using Chop.Game.User; using System; namespace Chop.Game.Rooms.Games { public class VirtualGame { #region Fields public int mID; public string mName; public GameClient mOwner; public byte mMapID; public VirtualGameState mState; public Lobby mLobby; public bool mIsStarting; public short mSecondsToStart; public GameRoom mRoom; public GameTeam[] mTeams; //public List mPlayers; public List mSubscribers; // guys looking at info, for updating public List mSpectators; #endregion #region Properties public bool Launchable { get { return true; byte b = 0; for (int i = 0; i < mTeams.Length; i++) if (!mTeams[i].IsEmpty) b++; return (b > 1); } } public List Users { get { List d = new List(); for (int i = 0; i < mTeams.Length; i++) foreach (GamePlayer user in mTeams[i].Players) d.Add(user); return d; } } #endregion #region (De)Constructors ETC public VirtualGame() { //mPlayers = new List(); mSubscribers = new List(); mSpectators = new List(); } public void Start() { mIsStarting = true; mRoom = new GameRoom(); mRoom.mGame = this; mRoom.Init(); } public void Stop() { RemoveAllPlayers(6); RemoveAllSpectators(6); RemoveAllSubscribers(6); mLobby.RemoveGame(mID); } #endregion #region User managament public void InitTeams(byte count) { mTeams = new GameTeam[count]; for (byte i = 0; i < mTeams.Length; i++) mTeams[i] = new GameTeam(i, (byte)(12 / count)); } public byte GetFreeTeam() { byte i = 0; foreach (GameTeam team in mTeams) { if (team.HasOpenSpace) return i; i++; } return 12; } public void AddSubscriber(GameClient client) { client.mGame = this; if (!mSubscribers.Contains(client)) mSubscribers.Add(client); } public void RemoveSubscriber(GameClient client) { if (client.GamePlayer == null) client.mGame = null; if (mSubscribers.Contains(client)) mSubscribers.Remove(client); } //public void AddSpectator(GameClient client) //{ // RemoveSubscriber(client); // if (!mSpectators.ContainsKey(client.ID)) // mSpectators.Add(client.ID, client); //} //public void RemoveSpectator(GameClient client) //{ // if (mSpectators.ContainsKey(client.ID)) // mSpectators.Remove(client.ID); //} //public void AddPlayer(GamePlayer user) //{ // byte team = GetFreeTeam(); // RemoveSubscriber(user.mClient); // mTeams[team].Add(user.mDynID, user); // user.mTeamID = team; // user.mGame = this; // SendGameInfo(); //} public void AddPlayer(GameClient client, byte team) { RemoveSubscriber(client); if (!mTeams[team].HasOpenSpace) return; if (client.GamePlayer != null) { mTeams[client.GamePlayer.mTeamID].RemovePlayer(client.GamePlayer); client.GamePlayer.mTeamID = team; } else { GamePlayer player = new GamePlayer(); player.mTeamID = team; player.mX = (byte)new Random().Next(0, 15); player.mY = (byte)new Random(player.mTeamID).Next(0, 15); client.mGame = this; client.GamePlayer = player; } mTeams[team].AddPlayer(client.GamePlayer); SendGameInfo(); } public void RemoveMember(GameClient client, bool error, byte reason) { //if (mSpectators.ContainsKey(client.ID)) // RemoveSpectator(client); else if (mSubscribers.Contains(client)) RemoveSubscriber(client); else RemovePlayer(client.GamePlayer, error, reason); } public void RemovePlayer(GamePlayer player, bool error, byte reason) { if (!ContainsPlayer(player)) return; mTeams[player.mTeamID].RemovePlayer(player); Response r; if (error) r = new Response(236); // "Cl" else r = new Response(237); // "Cm" r.AppendWired(reason); player.mClient.SendMessage(r); SendGameInfo(); if (player.mClient == mOwner) // STOP GAME!!!!! { Stop(); return; } player.mClient.GamePlayer = null; player.mClient.mGame = null; } public void RemoveAllPlayers(byte reason) { Response r = new Response(236); // "Cl" r.AppendWired(reason); for (int i = 0; i < mTeams.Length; i++) foreach (GamePlayer player in mTeams[i].Players) { player.mClient.SendMessage(r); player.mClient.GamePlayer = null; player.mClient.mGame = null; } } public void RemoveAllSpectators(byte reason) { Response r = new Response(236); // "Cl" r.AppendWired(reason); foreach (GameClient client in mSpectators) { client.mGame = null; client.SendMessage(r); } } public void RemoveAllSubscribers(byte reason) { Response r = new Response(236); // "Cl" r.AppendWired(reason); foreach (GameClient client in mSubscribers) { client.mGame = null; client.SendMessage(r); } } public bool ContainsPlayer(GamePlayer player) { for (int i = 0; i < mTeams.Length; i++) if (mTeams[i].ContainsPlayer(player)) return true; return false; } #endregion #region Data sending public void SendGameInfo() { Response r = new Response(233); // "Ci" r.Append(ToInfoString()); if (!mIsStarting) { SendMessageToPlayers(r); SendMessageToSpectators(r); } SendMessageToSubscribers(r); } public void SendMessageToPlayers(Response r) { for (int i = 0; i < mTeams.Length; i++) foreach (RoomUser user in mTeams[i].Players) user.mClient.SendMessage(r); } public void SendMessageToSpectators(Response r) { foreach (GameClient client in mSpectators) client.SendMessage(r); } public void SendMessageToSubscribers(Response r) { foreach (GameClient client in mSubscribers) client.SendMessage(r); } #endregion #region Messages public string ToFuseString() { Response r = new Response(); r.AppendWired(mID); r.AppendString(mName); r.AppendString(mOwner.mHabbo.mName); r.AppendWired(mMapID); return r.ToString(); } public string ToInfoString() { // Can't figure out how to get the start game button on/off //return "HHXelta BB" + Convert.ToChar(2) + "PAXelta" + Convert.ToChar(2) + "IHJIPAXelta" + Convert.ToChar(2) + "H1,2,3,4,5,6,7,8,9" + Convert.ToChar(2) + ""; Response r = new Response(); r.AppendWired(mState); // if 1, nothing happends r.AppendWired(mID); r.AppendString(mName); r.AppendWired(mOwner.mRoomUser.mDynamicID); r.AppendString(mOwner.mHabbo.mName); r.AppendWired(mMapID); r.AppendWired(mSpectators.Count); r.AppendWired(mTeams.Length); for (int i = 0; i < mTeams.Length; i++) { List players = mTeams[i].Players; r.AppendWired(players.Count); foreach (RoomUser user in players) { r.AppendWired(user.mDynamicID); r.AppendString(user.mClient.mHabbo.mName); } } r.AppendString(9); return r.ToString(); } #endregion } }