private void OnTimer(object sender, System.Timers.ElapsedEventArgs e) { myTimer.Enabled = false; room.Dispose(); PlayRoomsManager.Remove(sessionId); SendMessageAsJson("Timeout."); base.Close(); }
public ActionResult RuleTest() { var sid = PlayRoomsManager.MakeTempSession(RuleTestHandler.ROOM_ID_PREFIX); PlayRoomsManager.GetOrCreate(sid); ViewBag.RoomId = sid; return(View()); }
public ActionResult Room(string id) { var playroom = PlayRoomsManager.Get(id); ViewBag.RoomID = id; ViewBag.Rule = id.StartsWith("A") ? "A" : "B"; return(View(playroom)); }
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()); }
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(); } }
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()); }
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()); }
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); }
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); } } }
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); }
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(); } }