void serverCallWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { throw e.Error; } ServerCallParam param = (ServerCallParam)e.Result; if (param.callResult.Equals("ERROR")) { if (param.retryCount > 0) { param.retryCount--; print("Problem occur when changing state, retrying..." + param.retryCount); showInstruction("重試與伺服器連接中:" + param.retryCount); serverCallWorker.RunWorkerAsync(param); } else { showInstruction("與伺服器失去聯絡,請立即通知管理員。"); //throw new Exception("State Change Failed after " + conf.server_retry + " tries!"); } } else if (param.callback != null) { param.callback(param); } }
void handleLogin(object args) { ServerCallParam param = (ServerCallParam)args; if (isCallOK(param.callResult)) { txtUser.Enabled = false; txtPassword.Enabled = false; btnLogin.Enabled = true; btnLogin.Text = "登出"; //"OK#DEALER_ID:1;SESSION_ID:0C524B4B-F170-4FD6-A500-AC70868DEFB9;" string[] pairs = splitPairs(param.callResult); iDealerID = int.Parse(splitValue(pairs[0])[1]); sessionID = splitValue(pairs[1])[1]; print("SessionID:" + sessionID); //These line should be used in development environment only //in production the previous state must be PREPARE_NEXT even the previous game aborted. resetState(); } else { MessageBox.Show("登入失敗,請重試。", "錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); switchLoginButton(true); switchCloseButton(true); } }
//for debug purpose void resetState() { ServerCallParam param = new ServerCallParam(); param.url = server_url + "resetGame.aspx?tableID=" + tableID; param.callback = hResetState; serverCallWorker.RunWorkerAsync(param); }
void hReadB2Complete(object args) { ServerCallParam param = new ServerCallParam(); param.url = string.Format(urlFirst, server_url, sessionID, iDealerID, currentGameID, cardP1, cardP2, cardB1, cardB2, _iPTotal, _iBTotal); param.callback = hSetFirstCardsDone; serverCallWorker.RunWorkerAsync(param); }
void checkState(AsyncCallDelegate callback = null) { ServerCallParam param = new ServerCallParam(); param.url = string.Format(urlCheckState, server_url, sessionID, iDealerID, tableID); param.callback = callback; serverCallWorker.RunWorkerAsync(param); }
void hReadB3Complete(object args) { ServerCallParam param = new ServerCallParam(); param.url = string.Format(urlB3, server_url, sessionID, iDealerID, currentGameID, cardB3, _iBTotal); param.callback = hSetBanker3Done; serverCallWorker.RunWorkerAsync(param); }
void loginDealer(string username, string password) { ServerCallParam param = new ServerCallParam(); param.url = string.Format(urlLogin, server_url, username, password); param.callback = handleLogin; serverCallWorker.RunWorkerAsync(param); }
void state_change(string stateChange) { ServerCallParam param = new ServerCallParam(); param.url = string.Format(urlChangeState, server_url, sessionID, iDealerID, currentGameID, "sp_state_change:" + stateChange); param.stateChange = stateChange; param.callback = hChangeState; serverCallWorker.RunWorkerAsync(param); }
void newGame() { resetGameValues(); string gameName = getNewGameName(); ServerCallParam param = new ServerCallParam(); param.url = string.Format(urlNewGame, server_url, sessionID, iDealerID, tableID, gameName); param.callback = handleNewGame; serverCallWorker.RunWorkerAsync(param); }
void hResetState(object args) { ServerCallParam param = (ServerCallParam)args; if (isCallOK(param.callResult)) { print("Checking state after login..."); checkState(hCheckState_Login_Completed); } else { print("Reset state fai!"); } }
void hSetFirstCardsDone(object args) { ServerCallParam param = (ServerCallParam)args; print(string.Format(strPrintFirsts, currentGameID, _iPCard1, _iPCard2, _iBCard1, _iBCard2, _iPTotal, _iBTotal, param.callResult)); if (isCallOK(param.callResult)) { state_change("DEAL_FIRST_>_DONE_FIRST"); } else { throw new Exception("Set first cards failed. Server returned #FAIL"); } }
void hSetPlayer3Done(object args) { ServerCallParam param = (ServerCallParam)args; print(string.Format(strPrintP3, currentGameID, _iPCard3, _iPTotal, param.callResult)); if (isCallOK(param.callResult)) { state_change("DEAL_PLAYER3_>_DONE_PLAYER3"); } else { throw new Exception("Set player 3rd card failed. Server returned #FAIL"); } }
void serverCallWorker_DoWork(object sender, DoWorkEventArgs e) { ServerCallParam param = (ServerCallParam)e.Argument; try { param.callResult = web_client.DownloadString(param.url); } catch { param.callResult = "ERROR"; } e.Result = param; }
void hCheckState_Login_Completed(object args) { ServerCallParam param = (ServerCallParam)args; if (isCallOK(param.callResult)) { currentState = extractState(param.callResult); btnLogin.Text = "登出"; switchNewGameButton(true); plMain.Enabled = true; } else { print("check state after login failed"); } }
void handleNewGame(object args) { ServerCallParam param = (ServerCallParam)args; print("create game result:" + param.callResult); if (isCallOK(param.callResult)) { currentGameID = int.Parse(param.callResult.Split('#')[1]); showInstruction("新局開始"); wait(conf.dNewGame); checkState(hCheckState); } else { showInstruction("開局失敗,請再試。"); printError("Failed to create game."); switchNewGameButton(true); } }
void hChangeState(object args) { ServerCallParam param = (ServerCallParam)args; print(string.Format(strPrintStateChange, currentGameID, param.url.Substring(param.url.IndexOf("spName=") + 7), param.callResult)); if (isCallOK(param.callResult)) { switch (param.stateChange) { case "NEW_GAME_>_READY_BET": showMsgWaitThenCheckState("開始投注", "Allow bet, last call in " + convert2Second(conf.dAllowBet) + " seconds.", conf.dAllowBet); break; case "READY_BET_>_LAST_CALL": showMsgWaitThenCheckState("最後投注", "Last call, stop bet in " + convert2Second(conf.dLastCall) + " seconds.", conf.dLastCall); break; case "LAST_CALL_>_STOP_BET": showMsgWaitThenCheckState("停止投注", "Synchoizing bet information, wait...", conf.dStopBet); break; case "STOP_BET_>_DEAL_FIRST": showMsgWaitThenCheckState("開始派牌", "Start dealing first two cards.", conf.dDeal1st); break; case "GAME_DONE_>_RESULT": showMsgWaitThenCheckState("計算結果", "Calculating result, please wait...", conf.dResult); break; case "RESULT_>_ANNOUNCE": showMsgWaitThenCheckState("公佈贏家", "Paying out, please wait...", conf.dAnnounce); break; case "ANNOUNCE_>_CALC_PAY": showMsgWaitThenCheckState("計算派彩", "Calculating payout, please wait...", conf.dCalcPay); break; case "CALC_PAY_>_CALC_PAY_DONE": showMsgWaitThenCheckState("計算完畢", "Calculation done, please wait...", conf.dCalcDone); break; case "CALC_PAY_DONE_>_PAYOUT": showMsgWaitThenCheckState("派彩", "Paying out, please wait...", conf.dPayout); break; case "PAYOUT_>_PREPARE_NEXT": showMsgWaitThenCheckState("準備新局", "Game ended. Press button again to start a new game.", conf.dPrepareNext); break; case "DEAL_FIRST_>_DONE_FIRST": showMsgWaitThenCheckState("派牌完畢", "Upload succeed. Wait to ensure all client in sync.", conf.dDone1st); break; case "DONE_FIRST_>_WATCH_FIRST": showMsgWaitThenCheckState("玩家睇牌", "Player can start watching cards now, please wait...", conf.dWatch1st); break; case "WATCH_FIRST_>_OPEN_FIRST": showMsgWaitThenCheckState("開牌", "wait...", conf.dOpen1st); break; case "DEAL_BANKER3_>_DONE_BANKER3": showMsgWaitThenCheckState("補牌完畢", "Upload succeed. Wait to ensure all client in sync.", conf.dDoneB3); break; case "DONE_BANKER3_>_WATCH_BANKER3": showMsgWaitThenCheckState("玩家睇牌", "Player can start watching banker third card now, please wait...", conf.dWatchB3); break; case "OPEN_FIRST_>_DEAL_PLAYER3": showMsgWaitThenCheckState("閒家補牌", "Start dealing player third card. Press button when finish.", conf.dDealP3); break; case "DEAL_PLAYER3_>_DONE_PLAYER3": showMsgWaitThenCheckState("補牌完畢", "Upload succeed. Wait to ensure all client in sync.", conf.dDoneP3); break; case "DONE_PLAYER3_>_WATCH_PLAYER3": showMsgWaitThenCheckState("玩家睇牌", "Player can start watching player third card now, please wait...", conf.dWatchP3); break; case "WATCH_PLAYER3_>_OPEN_PLAYER3": showMsgWaitThenCheckState("開牌", "wait...", conf.dOpenP3); break; case "OPEN_FIRST_>_DEAL_BANKER3": case "OPEN_PLAYER3_>_DEAL_BANKER3": showMsgWaitThenCheckState("莊家補牌", "Start dealing banker third card. Press button when finish.", conf.dDealB3); break; case "WATCH_FIRST_>_GAME_DONE": case "WATCH_BANKER3_>_GAME_DONE": case "WATCH_PLAYER3_>_GAME_DONE": showMsgWaitThenCheckState("牌局結束", getGameDoneString(), conf.dGameDone); break; default: break; } } else { printError("State change returned #FAIL."); showInstruction("Game Terminated."); throw new Exception("Server returned #FAIL when attempting to change state."); } }
void hCheckState(object args) { ServerCallParam param = (ServerCallParam)args; if (isCallOK(param.callResult)) { currentState = extractState(param.callResult); print("currentState:" + currentState); switch (currentState) { case "NEW_GAME": state_change("NEW_GAME_>_READY_BET"); break; case "READY_BET": state_change("READY_BET_>_LAST_CALL"); break; case "LAST_CALL": state_change("LAST_CALL_>_STOP_BET"); break; case "STOP_BET": state_change("STOP_BET_>_DEAL_FIRST"); break; case "GAME_DONE": state_change("GAME_DONE_>_RESULT"); break; case "RESULT": state_change("RESULT_>_ANNOUNCE"); break; case "ANNOUNCE": state_change("ANNOUNCE_>_CALC_PAY"); break; case "CALC_PAY": state_change("CALC_PAY_>_CALC_PAY_DONE"); break; case "CALC_PAY_DONE": state_change("CALC_PAY_DONE_>_PAYOUT"); break; case "PAYOUT": state_change("PAYOUT_>_PREPARE_NEXT"); break; case "PREPARE_NEXT": switchNewGameButton(true); switchLoginButton(true); break; case "DEAL_FIRST": setFirstCards(); break; case "DONE_FIRST": state_change("DONE_FIRST_>_WATCH_FIRST"); break; case "WATCH_FIRST": // Determine whether need to deal 3rd banker card or not if ((_iPTotal >= 8 || _iBTotal >= 8) || (_iPTotal >= 6 && _iBTotal >= 6)) { state_change("WATCH_FIRST_>_GAME_DONE"); } else { state_change("WATCH_FIRST_>_OPEN_FIRST"); } break; case "OPEN_FIRST": // pTotal 6 - 7 if (_iPTotal >= 6 && _iBTotal < 6) { state_change("OPEN_FIRST_>_DEAL_BANKER3"); } else // pTotal 0 - 5 { state_change("OPEN_FIRST_>_DEAL_PLAYER3"); } break; case "DEAL_BANKER3": setBankerCard3(); break; case "DONE_BANKER3": state_change("DONE_BANKER3_>_WATCH_BANKER3"); break; case "WATCH_BANKER3": state_change("WATCH_BANKER3_>_GAME_DONE"); break; case "DEAL_PLAYER3": setPlayerCard3(); break; case "DONE_PLAYER3": state_change("DONE_PLAYER3_>_WATCH_PLAYER3"); break; case "WATCH_PLAYER3": if ((_iBTotal == 6 && (_iPCard3 == 6 || _iPCard3 == 7)) || (_iBTotal == 5 && (_iPCard3 >= 4 && _iPCard3 <= 7)) || (_iBTotal == 4 && (_iPCard3 >= 2 && _iPCard3 <= 7)) || (_iBTotal == 3 && (_iPCard3 != 8)) || _iBTotal <= 2) { state_change("WATCH_PLAYER3_>_OPEN_PLAYER3"); break; } else { state_change("WATCH_PLAYER3_>_GAME_DONE"); break; } case "OPEN_PLAYER3": state_change("OPEN_PLAYER3_>_DEAL_BANKER3"); break; default: break; } } }