# 比賽系統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}]
```
---