using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace Chop.Game.Rooms.Games { public class GameRoom : Room { private static short COUNTDOWN_SECONDS = 15; private static short TOTAL_TIME = 60; private static short TIME_TO_RESTART = 20; public short mSecondsToStart; public short mSecondsRemaining; new public ArenaTemplate mTemplate; public VirtualGame mGame; public override void Init() { mSecondsToStart = COUNTDOWN_SECONDS; mSecondsRemaining = TOTAL_TIME; mGame.mState = VirtualGameState.Running; mGame.SendGameInfo(); mTemplate = new ArenaTemplate(); Response s = new Response(241); // "Cq" s.AppendWired(-1); mGame.SendMessageToPlayers(s); Core.CommonDelegate d = new Core.CommonDelegate(Countdown); d.BeginInvoke(null, null); } public void Countdown() // must be own thread { while (mSecondsToStart > 0) { Thread.Sleep(1000); mSecondsToStart--; } Response r = new Response(247); // "Cw" r.AppendWired(mSecondsRemaining); mGame.SendMessageToPlayers(r); Core.CommonDelegate d = new Core.CommonDelegate(Timer); d.BeginInvoke(null, null); Runner = new Thread(new ThreadStart(Run)); Runner.Start(); } public override void Run() // must be own thread { while (mSecondsRemaining > 0) { bool updated = false; Response Response = new Response(244); // "Ct" Response.AppendWired(mGame.Users.Count); foreach (GamePlayer sUser in mGame.Users) { try { //if (!sUser.mIsWalking && !sUser.mStatusUpdated) // No update // continue; //if (sUser.mStatusUpdated && !sUser.mIsWalking) //{ // sUser.mStatusUpdated = false; // Response.AppendString(sUser.ToStatusString(), 13); // continue; //} updated = true; Response.AppendWired(0); Response.AppendWired(sUser.mDynamicID); Response.AppendWired(sUser.mX); Response.AppendWired(sUser.mY); Response.AppendWired(sUser.mHeight); Response.AppendWired(sUser.mBodyRotation); Response.AppendWired(0); Response.AppendWired(-1); //byte[] sNextPosition = mPathfinder.Path(sUser.mX, sUser.mY, sUser.mWalkingX, sUser.mWalkingY); ////byte[] sNextPosition = AWAPathfinder.GetNext(sUser.mX, sUser.mY, sUser.mWalkingX, sUser.mWalkingY, mSquareMap); //if (sNextPosition.Length == 0) //{ // sUser.mIsWalking = false; // sUser.RemoveStatus("mv", false); // if (mSquareMap[sUser.mX, sUser.mY] == SquareState.Chair) // sUser.AddStatus("sit", mTemplate.mDynamicHeight[sUser.mX, sUser.mY], false); // else if (mSquareMap[sUser.mX, sUser.mY] == SquareState.Bed) // sUser.AddStatus("lay", mTemplate.mDynamicHeight[sUser.mX, sUser.mY], false); // CheckTrigger(sUser); // Response.AppendString(sUser.ToStatusString(), 13); // continue; //} //if (mSquareMap[sNextPosition[0], sNextPosition[1]] == SquareState.Closed) // System.Console.WriteLine("Pathfinder sucks :("); //// Set some variables //mDynamicHeightmap[sUser.mX, sUser.mY] = 1; // old open //mDynamicHeightmap[sNextPosition[0], sNextPosition[1]] = 0; // new closed //sUser.mBodyRotation = Rotation.Calculate(sUser.mX, sUser.mY, sNextPosition[0], sNextPosition[1]); //sUser.mHeadRotation = sUser.mBodyRotation; //// Send movement-packet //sUser.RemoveStatus("sit", false); //sUser.RemoveStatus("lay", false); //sUser.AddStatus("mv", sNextPosition[0] + "," + sNextPosition[1] + "," + mTemplate.mDynamicHeight[sNextPosition[0], sNextPosition[1]], false); //Response.AppendString(sUser.ToStatusString(), 13); //// Set position //sUser.mX = sNextPosition[0]; //sUser.mY = sNextPosition[1]; //sUser.mHeight = mTemplate.mDynamicHeight[sNextPosition[0], sNextPosition[1]]; } catch (InvalidOperationException) { mGame.RemovePlayer(sUser, false, 0); } // Not really dangerous catch (Exception x) { System.Console.WriteLine(x); mGame.RemovePlayer(sUser, false, 0); } } Response.AppendWired(0); foreach (GameTeam team in mGame.mTeams) Response.AppendWired(team.mScore); Response.AppendWired(1); Response.AppendWired(0); if (updated) mGame.SendMessageToPlayers(Response); Thread.Sleep(470); } } public void Timer() { while (mSecondsRemaining > 0) { Thread.Sleep(1000); mSecondsRemaining--; } mGame.mState = VirtualGameState.Closed; Response r = new Response(248); // "Cx" r.AppendWired(TIME_TO_RESTART); r.AppendWired(mGame.mTeams.Length); foreach (GameTeam team in mGame.mTeams) { byte playerCount = (byte)team.Players.Count; if (playerCount > 0) { r.AppendWired(playerCount); foreach (GamePlayer player in team.Players) { r.AppendWired(player.mDynamicID); r.AppendString(player.mClient.mHabbo.mName); r.AppendWired(player.mScore); } r.AppendWired(team.mScore); } else r.AppendWired(-1); } mGame.SendMessageToPlayers(r); } public Response GetPlayers() { Response r = new Response(243); // "Cs" r.AppendWired(1); r.AppendWired(mSecondsToStart); r.AppendWired(COUNTDOWN_SECONDS); r.AppendWired(mGame.Users.Count); byte b = 0; foreach (GamePlayer sUser in mGame.Users) { r.Append(sUser.ToFuseString(b)); b++; } r.AppendWired(mTemplate.maxX); r.AppendWired(mTemplate.maxY); for (int y = 0; y < mTemplate.maxY; y++) for (int x = 0; x < mTemplate.maxX; x++) { r.AppendWired(mTemplate.bbTColor[x, y]); r.AppendWired(mTemplate.bbTState[x, y]); } r.AppendWired(1); r.AppendWired(0); return r; } public string GetStageInfo() { Response s = new Response(); s.AppendWired(1); s.AppendWired(mSecondsToStart); s.AppendWired(COUNTDOWN_SECONDS); s.AppendWired(0); s.AppendWired(mTemplate.maxX); s.AppendWired(mTemplate.maxY); for (int y = 0; y < mTemplate.maxY; y++) for (int x = 0; x < mTemplate.maxX; x++) { s.AppendWired(mTemplate.bbTColor[x, y]); s.AppendWired(mTemplate.bbTState[x, y]); } s.AppendWired(1); s.AppendWired(0); return s.ToString(); } } }