# 比賽系統SP # 定時賽/人滿即開賽 狀態變化 定時賽有 1. 未報名 -> 報名, SP:Join(0: 報名), Status : 0(已報名) 2. 報名 -> 入座, SP:Join(1:入座), Status : 1(入座) 3. 入座 -> 報名 (離開準備房間), SP:quit(3:離開入座), Status: 0(已報名) 4. 入座 -> 未報名, SP:quit(1:直接退款), 刪除MatchPlayerRecord資料 5. 報名 -> 未報名, SP:quit(1:直接退款), 刪除MatchPlayerRecord資料 5. 入座/報名 -> 未報名, SP:quit(0:不退款), 刪除MatchPlayerRecord資料 人滿即開 1. 未報名 -> 入座, SP:Join, Status : 1(入座) 2. 入座 -> 未報名, SP:quit(1:直接退款), 刪除MatchPlayerRecord資料 3. 入座 -> 未報名, SP:quit(0:不退款), 刪除MatchPlayerRecord資料 # 玩家報名比賽 - 定時賽專用 1. 根據報名費扣款 2. 寫入一筆玩家紀錄(MatchPlayerRecord) ## SP_JoinMatch - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:--------- |:------- | ---- |:------------------------------- | | @UserID | INTEGER | Y | 玩家ID | | @MatchID | BIGINT | Y | 比賽ID | | @JoinType | TINYINT | Y | 0: 報名, 1:入座 | | @IsRobot | BIT | N | 是否為機器人, 預設0, 0:否, 1:是 | ### 輸出參數 | 參數 | 型別 | 註解 | |:-------------------- |:------------- |:------------------------------------------------------------------------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | | @OutputMatchStatus | TINYINT | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 | --- # 玩家報名比賽 - 人滿即開用 ## SP_JoinFullStartMatch - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:--------- |:------- | ---- |:------------------------------- | | @UserID | INTEGER | Y | 玩家ID | | @MatchID | BIGINT | Y | 比賽ID | | @IsRobot | BIT | N | 是否為機器人, 預設0, 0:否, 1:是 | ### 輸出參數 | 參數 | 型別 | 註解 | |:-------------------- | ------------- |:------------------------------------------------------------------------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | | @OutputMatchStatus | TINYINT | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 | | @OutputMatchID | BIGINT | 加入的比賽ID | --- # 玩家報名比賽, 分配版本 - 人滿即開用 ## SP_RandomJoinFullstartMatch - 資料庫: `RYContestDB` - 分配方式 : 人少優先, 相同人數時隨機 ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:----------------------- |:------- | ---- |:------------------------------- | | @UserID | INTEGER | Y | 玩家ID | | @RegisterFeeTokenTypeID | TINYINT | Y | 門票類型 | | @IsRobot | BIT | N | 是否為機器人, 預設0, 0:否, 1:是 | ### 輸出參數 | 參數 | 型別 | 註解 | |:-------------------- | ------------- |:------------------------------------------------------------------------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | | @OutputMatchStatus | TINYINT | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 | | @OutputMatchID | BIGINT | 加入的比賽ID | --- # 玩家退出比賽 1. 根據輸入參數決定是否退款 (比賽中自行離開 : 不退款, 開賽前申請退出比賽 : 退款, 開賽前, 準備時間結束後, 沒有進入準備房間 : 寄信退款) 2. 參賽紀錄(MatchPlayerRecord)更改退款資訊 3. 新增必須判斷 人滿即開-併行/非併行的例外處理 ## SP_QuitMatch - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:------------- |:------- |:---- |:-------------------------------------------- | | @UserID | INTEGER | Y | 玩家ID | | @MatchID | BIGINT | Y | 比賽ID | | @RefundTypeID | TINYINT | Y | 0:不退款, 1:直接退款, 2:寄信退款, 3:離開入座 | ### 輸出參數 | 參數 | 型別 | 註解 | |:-------------------- |:------------- |:------------------------------------------------------------------------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | | @OutputMatchStatus | TINYINT | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 | --- # 玩家比賽復活處裡 1. 根據輪次紀錄(MatchRoundSetting)決定是否能復活, 復活費用 2. 寫入一筆復活紀錄(MatchPlayerReviveRecord) ## SP_MatchRevive - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:---------------- |:------- |:---- |:---------------------------------------- | | @UserID | INTEGER | Y | 玩家ID | | @MatchID | BIGINT | Y | 比賽ID | | @RoundID | BIGINT | Y | 輪次ID | | @RevivePayTypeID | TINYINT | Y | 玩家選擇用哪種資源復活, 1:金幣, 2: Token | ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- | ------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 比賽獎勵發放 1. SP : "更新比賽玩家紀錄" -> 更新所有玩家紀錄的最終排名, 接著呼叫 SP : "比賽發放獎勵" -> 一次發放該比賽所有獎勵 --- # 比賽發放獎勵 1. 根據玩家排名與獎勵配置(MatchRewardSetting)發放獎勵 2. 更新玩家比賽紀錄(MatchPlayerRecord) 3. 發放完獎勵後更新 比賽資訊(Match)內的統計資料 4. 要先檢查該玩家是否已經領取過獎勵了(PlayerRecord.RewardCoin/Status) ## SP_MatchReward - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:-------- |:------ |:---- |:------ | | @MatchID | BIGINT | Y | 比賽ID | ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- | ------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 比賽個別發放獎勵 1. 根據玩家排名與獎勵配置(MatchRewardSetting)發放獎勵 2. 更新玩家比賽紀錄(MatchPlayerRecord) 3. 發放完獎勵後更新 比賽資訊(Match)內的統計資料 4. 要先檢查該玩家是否已經領取過獎勵了(PlayerRecord.RewardCoin/Status) ## SP_MatchRewardIndividual - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:-------- |:------- |:---- |:-------- | | @MatchID | BIGINT | Y | 比賽ID | | @UserID | INTEGER | Y | 玩家ID | | @Rank | INTEGER | Y | 玩家排名 | ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- | ------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 更新比賽玩家資料 1. 比賽結束後, 整理每位玩家的排名, 並呼叫這支sp更新玩家最終排名 2. (需討論確認) PlayerInfo 可以帶入比賽中資訊, 並進行更新 ## SP_UpdateMatchPlayerRecord - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:---------------- |:------------- |:---- |:------------------ | | @MatchID | BIGINT | Y | 比賽ID | | @PlayerInfo | NVARCHAR(Max) | Y | 玩家比賽資料, json | ``` @PlayerInfo [ { "UserID":10010, "Rank":1, --> 最終排名, 比賽結束後的整體最終排名 }, { "UserID":10011, "Rank":1, --> 最終排名, 比賽結束後的整體最終排名 } ] ``` ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- |:------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 更新輪次紀錄 1. 每輪結束後, 呼叫這支sp做個紀錄 ## SP_UpdateMatchRoundRecord - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:--------------- |:------------- |:---- |:---------------------------- | | @MatchID | BIGINT | Y | 比賽ID | | @MatchRound | INTEGER | Y | 輪次, 目前第幾輪 | | @TotalPlayer | INTEGER | Y | 本輪參賽總人數 | | @TotalPromotion | INTEGER | Y | 本輪晉級人數(不包含復活晉級) | | @TotalRevive | INTEGER | Y | 本輪復活人數 | | @StartedAt | DATETIME | Y | 本輪開始時間 | | @EndedAt | DATETIME | Y | 本輪結束時間 | ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- | ------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 更新輪次桌紀錄 1. 每局結束後, 呼叫這支sp做個紀錄 2. 記得同時去更新 MatchPlayerRecord 內的 目前輪數, 局數, 桌排名 ## SP_UpdateMatchRoundTableRecord - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:---------------- |:------------- |:---- |:------------------ | | @MatchID | BIGINT | Y | 比賽ID | | @MatchRound | INTEGER | Y | 輪次, 目前第幾輪 | | @MatchRoundTable | INTEGER | Y | 局數, 目前第幾局 | | @RoundTableInfo | NVARCHAR(Max) | Y | 玩家比賽資料, json | ``` @RoundInfo [ { "UserID": 10010, --> 玩家ID "TableID": 1, --> 桌子號 "ChairID": 2, --> 椅子號 "IsRobot": 0, --> 是否為機器人 0:否, 1:是 "BetScore": 100, --> 下注分 "WinScore": 100, --> 贏分 "Rank": 3, --> 最終桌排名 "StartedAt":"2024-07-25 00:00:00", --> 本局開始時間 "EndedAt": "2024-07-25 01:00:00", --> 本局結束時間 } ] ``` ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- | ------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 玩家復活取消 ## SP_MatchReviveCancel - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:----------- |:------- | ---- |:---------------- | | @MatchID | BIGINT | Y | 比賽ID | | @MatchRound | INTEGER | Y | 要取消復活的輪次 | | @UserID | INTEGER | Y | 玩家ID | ### 輸出參數 | 參數 | 型別 | 註解 | |:-------------------- | ------------- |:------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 新增機器人帳號 - 新增AccountDB.AccountsInfo - 新增RecordDB.GameScoreInfo - 新增ContestDB.MatchRobot ## SP_AddRobotAccounts - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:--------- |:------- |:---- |:---------- | | @RobotNum | INTEGER | Y | 機器人數量 | ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- | ------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 機器人參加比賽 - 還要檢查該比賽是否處於可報名的狀態 - 可指定數量 - 會有一個Table紀錄機器人資訊及狀態 - 先從機器人的Table中拿出空閒的機器人 - 空閒的不夠就呼叫 SP_AddRobotAccounts 新增 - 將空閒的機器人加入比賽 - 更新機器人Table的狀態 ## SP_RobotJoinMatch - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:--------- |:------- |:---- |:---------- | | @MatchID | BIGINT | Y | 比賽ID | | @RobotNum | INTEGER | Y | 機器人數量 | ### 輸出參數 | 參數 | 型別 | 註解 | |:-------------------- |:-------------- |:------------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 機器人比賽入座 ## SP_RobotTakeSeatMatch - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:--------- |:------- |:---- |:----------------------------------------------- | | @MatchID | BIGINT | Y | 比賽ID | | @RobotNum | INTEGER | Y | 機器人數量, RobotNum = 0 時, 代表全部機器人入座 | ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:------------- | ------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 機器人退出比賽 - 還要檢查該比賽是否在比賽中 - 會有一個Table紀錄機器人資訊及狀態 - 先從機器人的Table中拿出參與該比賽的機器人 - 修改機器人的PlayerRecord Status - 修改機器人的Table中參與該比賽的機器人狀態 ## SP_RobotQuitMatch - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:--------- |:------- |:---- |:------------------------------------------------------ | | @MatchID | BIGINT | Y | 比賽ID | | @RobotNum | INTEGER | Y | 機器人數量, RobotNum = 0時, 代表該場比賽全部機器人離開 | ### 輸出參數 | 參數 | 型別 | 註解 | | -------------------- |:-------------- | ------------------ | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | --- # 人滿即開輪替 ## SP_RotateFullStartMatch 1. 呼叫這支sp的時間點 1. 比賽開賽時, 2. 比賽結束時 2. 傳入的MatchID為 "現在場" 的 MatchID, 即MatchModeID=2的那筆 - 資料庫: `RYContestDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:-------- |:------ |:---- |:------ | | @MatchID | BIGINT | Y | 比賽ID | --- # 領取信件物品 ## SP_ClaimUserItem - 資料庫: `RYTreasureDB` ### 輸入參數 | 參數 | 型別 | 必填 | 註解 | |:----------- |:------- | ---- |:-------------------------------- | | @UserID | INTEGER | Y | 玩家ID | | @UserItemID | BIGINT | Y | 領取物品ID | | @IsCliamAll | BIT | N | 預設為0,1為領取該玩家ID全部物品 | ### 輸出參數 | 參數 | 型別 | 註解 | |:--------------------- |:------------- |:-------------------- | | @OutputResultMessage | NVARCHAR(255) | 執行結果訊息 | | @OutputClaimedContent | NVARCHAR(Max) | 領取的物品內容(總計) | @OutputClaimedContent 範例 ``` [{"tokenTypeId":1,"value":12},{"tokenTypeId":3,"value":6},{"tokenTypeId":99,"value":1012000}] ``` ---