예제 #1
0
 private void OnTimer(object sender, System.Timers.ElapsedEventArgs e)
 {
     myTimer.Enabled = false;
     room.Dispose();
     PlayRoomsManager.Remove(sessionId);
     SendMessageAsJson("Timeout.");
     base.Close();
 }
예제 #2
0
        public ActionResult RuleTest()
        {
            var sid = PlayRoomsManager.MakeTempSession(RuleTestHandler.ROOM_ID_PREFIX);

            PlayRoomsManager.GetOrCreate(sid);
            ViewBag.RoomId = sid;
            return(View());
        }
예제 #3
0
        public ActionResult Room(string id)
        {
            var playroom = PlayRoomsManager.Get(id);

            ViewBag.RoomID = id;
            ViewBag.Rule   = id.StartsWith("A") ? "A" : "B";
            return(View(playroom));
        }
예제 #4
0
        public ActionResult Practice(string id)
        {
            var rule = id;
            var sid  = PlayRoomsManager.MakeTempSession(PracticeHandler.ROOM_ID_PREFIX);

            PlayRoomsManager.GetOrCreate(sid, rule);
            ViewBag.RoomId = sid;
            return(View());
        }
예제 #5
0
        public override void OnOpen()
        {
            // nameパラメータの取り出し
            var playerName = this.WebSocketContext.QueryString["name"];

            if (string.IsNullOrWhiteSpace(playerName))
            {
                SendMessageAsJson("URL Parameter 'name' is not specified.");
                Close();
            }

            var mc = Regex.Matches(this.WebSocketContext.RequestUri.OriginalString, @"/test/practice/([\-A-Z0-9]+)");

            if (mc.Count > 0)
            {
                sessionId = mc[0].Groups[1].Success ? mc[0].Groups[1].Value.ToString() : "";

                if (!string.IsNullOrWhiteSpace(sessionId))
                {
                    room = PlayRoomsManager.Get(sessionId);
                }
            }

            if (room == null || !sessionId.StartsWith(ROOM_ID_PREFIX))
            {
                SendMessageAsJson("Invalid session ID");
                base.Close();
                return;
            }

            _startTimer(PLAYROOM_LIFETIME * 1000);

            var key = this.WebSocketContext.CreatePlayerKey(playerName);

            pAdapter = room.FindRemotePlayer(key) as GamePlayerAdapter;
            if (pAdapter != null && !pAdapter.IsConnected)
            {
                // 再接続とみなす
                pAdapter.Reconnect(playerName, (str) => Send(str));
            }
            else
            {
                // プレイヤー通信ハンドラを作成
                pAdapter = new GamePlayerAdapter(room, playerName, (str) => Send(str));
                pAdapter.TurnTimeoutSec = TIMEOUT_SEC;
                room.AddPlayer(key, pAdapter);
            }
            if (room.Master.NumOfPlayers == 1)
            {
                // 他のプレイヤーを追加
                room.DoComplementPlayers(4);

                // ゲーム開始
                room.Master.Start();
            }
        }
예제 #6
0
        public ActionResult Index(string rule, string name)
        {
            // あいているところを自動で探す
            var id = PlayRoomsManager.MakeTempSession();

            ViewBag.RoomId    = id;
            ViewBag.Name      = string.IsNullOrWhiteSpace(name) ? "あなた" : name;
            ViewBag.Rule      = rule;
            ViewBag.AutoStart = true;
            ViewBag.Monitor   = false;
            return(View());
        }
예제 #7
0
        public ActionResult Start(string id, string name, string rule)
        {
            if (id == null)
            {
                // あいているところを自動で探す
                id = PlayRoomsManager.MakeTempSession();
            }

            ViewBag.RoomId = id;
            ViewBag.Name   = name;
            ViewBag.Rule   = rule;

            return(View());
        }
예제 #8
0
            internal static ViewModel Create()
            {
                var vm = new ViewModel();

                for (int i = 1; i <= 10; i++)
                {
                    string id = string.Format("A-{0:00}", i);
                    vm.RoomsA[id] = PlayRoomsManager.Get(id);
                }
                for (int i = 1; i <= 5; i++)
                {
                    string id = string.Format("B-{0:00}", i);
                    vm.RoomsB[id] = PlayRoomsManager.Get(id);
                }
                return(vm);
            }
예제 #9
0
        public override void OnOpen()
        {
            Debug.WriteLine(WebSocketContext.Headers);
            lock (lockObj)
            {
                AllClients.Add(this);

                // クエリストリングを自力で解析
                playerName = this.WebSocketContext.QueryString["name"];

                var mc = Regex.Matches(this.WebSocketContext.RequestUri.OriginalString, @"/play/(A|B)/([\-A-Z0-9]*)\?");
                if (mc.Count > 0)
                {
                    rule      = mc[0].Groups[1].Success ? mc[0].Groups[1].Value.ToString() : "A";
                    sessionId = mc[0].Groups[2].Success ? mc[0].Groups[2].Value.ToString() : "1";
                }

                room = PlayRoomsManager.GetOrCreate(sessionId, rule);
                var key = this.WebSocketContext.CreatePlayerKey(playerName);

                pAdapter = room.FindRemotePlayer(key) as GamePlayerAdapter;
                if (pAdapter != null && !pAdapter.IsConnected)
                {
                    // 再接続とみなす
                    logger.Debug("Reconnect [{0}] sessionId={1}", playerName, sessionId);
                    pAdapter.Reconnect(playerName, (str) => Send(str));
                }
                else
                {
                    // すでにプレイ中なら切断する
                    logger.Debug("Connect [{0}] sessionId={1}", playerName, sessionId);
                    if (room == null || room.NumOfRounds > 0)
                    {
                        this.Close(); return;
                    }

                    pAdapter = new GamePlayerAdapter(room, playerName, (str) => Send(str));
                    room.AddPlayer(key, pAdapter);
                }
            }
        }
예제 #10
0
        public override void OnOpen()
        {
            var mc = Regex.Matches(this.WebSocketContext.RequestUri.OriginalString, @"/monitor/([\-A-Z0-9]+)");

            if (mc.Count > 0)
            {
                sessionId = mc[0].Groups[1].Success ? mc[0].Groups[1].Value.ToString() : "";

                if (!string.IsNullOrWhiteSpace(sessionId))
                {
                    room = PlayRoomsManager.Get(sessionId);
                }
            }

            if (room == null)
            {
                base.Close();
                return;
            }
            room.AddObserver(this);
        }
예제 #11
0
        public override void OnOpen()
        {
            // nameパラメータの取り出し
            var playerName = this.WebSocketContext.QueryString["name"];

            if (string.IsNullOrWhiteSpace(playerName))
            {
                SendMessageAsJson("URL Parameter 'name' is not specified.");
                Close();
            }

            var mc = Regex.Matches(this.WebSocketContext.RequestUri.OriginalString, @"/test/ruletest/([\-A-Z0-9]+)");

            if (mc.Count > 0)
            {
                sessionId = mc[0].Groups[1].Success ? mc[0].Groups[1].Value.ToString() : "";

                if (!string.IsNullOrWhiteSpace(sessionId))
                {
                    room = PlayRoomsManager.Get(sessionId);
                }
            }

            if (room == null || !sessionId.StartsWith(ROOM_ID_PREFIX))
            {
                SendMessageAsJson("Invalid session ID");
                base.Close();
                return;
            }

            _startTimer(PLAYROOM_LIFETIME * 1000);

            var key = this.WebSocketContext.CreatePlayerKey(playerName);

            pAdapter = room.FindRemotePlayer(key) as GamePlayerAdapter;
            if (pAdapter != null && !pAdapter.IsConnected)
            {
                // 再接続とみなす
                pAdapter.Reconnect(playerName, (str) => Send(str));
            }
            else
            {
                // プレイヤー通信ハンドラを作成
                pAdapter = new GamePlayerAdapter(room, playerName, (str) => Send(str));
                pAdapter.TurnTimeoutSec = TIMEOUT_SEC;
                room.AddPlayer(key, pAdapter);
            }
            if (room.Master.NumOfPlayers == 1)
            {
                // 他のプレイヤーを追加
                p1 = new TestcasePlayer("革命マシン", (c) => room.Master.PutCards(p1, c), TestSettings.Player1Hands);
                p2 = new TestcasePlayer("早あがり太郎", (c) => room.Master.PutCards(p2, c), TestSettings.Player2Hands);
                room.AddPlayer("1", p1);
                room.AddPlayer("2", p2);

                room.Master.CardDistributer = new TestCardDistributer(TestSettings.Player0InitialDeck, p1.GetInitialDeck(), p2.GetInitialDeck());

                // ゲーム開始
                room.Master.Start();
            }
        }