# 比賽系統DB
## RYAccountsDB.SystemSetting
新增一組系統設定, 這個設定是 人滿即開, 一個模板背後會開幾組比賽
- SystemKey = MatchFullStartContestCount
# 比賽資訊
## RYContestDB.dbo.Match
| name | type | description |
|:------------------------------- |:------------- |:------------------------------------------------------------------------------------------------------------------------------------ |
| ID | BIGINT | 流水號 |
| MatchName | NVARCHAR(20) | 比賽名稱 |
| MatchSubName | NVARCHAR(50) | 副標題 |
| MatchModeID | TINYINT | 比賽模式ID 1:定時賽, 2:人滿即開 |
| MatchFullStartTag | TINYINT | 人開即開標記 0:無, 1:這一場, 2:下一場 |
| IsMatchMultiple | BIT | 比賽是否允許併行, 0:否, 不併行, 1:是, 可併行 |
| MatchTypeID | TINYINT | 比賽類型, 1:淘汰賽 |
| GameKindID | INTEGER | 游戏ID, |
| MatchTagID | TINYINT | 分類標籤, 1:免費, 2:金幣 |
| RegisterFeeCoin | BIGINT | 報名費 - 金幣 |
| RegisterFeeTokenTypeID | TINYINT | 報名費 - 門票類型, 對應TreatureDB.GameStoreTokenType |
| RegisterFeeTokenValue | BIGINT | 報名費 - 門票數量 |
| MinPlayer | INTEGER | 最小參賽人數, 0 = 不限制 |
| MaxPlayer | INTEGER | 最大參賽人數 |
| MatchRotationTypeID | TINYINT | 比賽循環類別 0:無, 1:單次(不循環) 2: 每日循環 3:每周循環 4:每月循環 5:每年循環 |
| MatchRotationTime | NVARCHAR(200) | 循環時間, 以逗號(,)分隔, e.g. TypeID = 周循環, Time = "2,3,4", 代表每周2,3,4; TypeID=月循環, Time="1,5,15,20", 代表1號,5號,15號,20號 |
| MatchRevealedAt | DateTime | 比賽展示/揭示開始時間 |
| MatchRegistedAt | DateTime | 比賽報名開始時間 |
| MatchPreparedAt | DateTime | 比賽準備開始時間 |
| MatchStartedAt | DateTime | 比賽開始時間 |
| MatchFinishedAt | DATETIME | 比賽結束時間 |
| IsAddRobot | BIT | 是否讓機器人陪打, 0:否, 1:是 |
| TotalPrizeCoin | BIGINT | 比賽總獎金(金幣) |
| TotalPrizeTokenValue | BIGINT | 比賽總獎金(門票) |
| TotalPrizeRewardTicketTypeValue | BIGINT | 比賽總獎金(積分) |
| TotalPlayerNumber | INTEGER | 最終參賽人數 |
| TotalRegisterFeeCoin | BIGINT | 最終收取的金幣報名費總和 |
| TotalRegisterFeeTokenValue | BIGINT | 最終收取的非金幣報名費的總和 |
| TotalReviveCoin | BIGINT | 最終收取的復活金幣總和(每一輪加總, 門票換算成金幣) |
| ExtraRewardPool | BIGINT | 額外獎池金額(金幣) |
| TotalExtraReward | BIGINT | 最終從額外獎池發送出去的金幣總和 |
| TotalRewardCoin | BIGINT | 最終發送的金幣獎勵數量總和 |
| EntryTicketTypeID | TINYINT | 門票獎勵類型 |
| TotalEntryTicketTypeValue | BIGINT | 最終發送的門票獎勵數量總和 |
| RewardTicketTypeID | TINYINT | 獎勵獎券類型 |
| TotalRewardTicketTypeValue | BIGINT | 最終發送的獎券數量總和 |
| CurrentRound | INTEGER | 比賽目前在第幾輪次 |
| IsAllowRevive | BIT | 是否允許復活 |
| ReviveReturnRate | INTEGER | 復活返獎比例 |
| MatchParentID | BIGINT | 父比賽ID, 不可重複 |
| MatchChildID | BIGINT | 子比賽ID, 不可重複 |
| StartCountDown | INTEGER | 比賽開始前的倒數秒數, 預設=10秒 |
| MatchStatus | TINYINT | 比賽狀態, 1:等待中, 2:預告中, 3:報名中, 4:準備中, 5:進行中, 6:已完成, 7:已停用 |
# 比賽輪次配置
## RYContestDB.dbo.MatchRoundSetting
| name | type | description |
|:------------------ |:------- |:--------------------------------------------------------- |
| ID | BIGINT | 流水號 |
| MatchID | BIGINT | 比賽ID, |
| RoundNumber | INTEGER | 第幾輪 |
| InitChips | INTEGER | 初始籌碼 |
| AnteValue | INTEGER | 底注價值 |
| RoundDuration | INTEGER | 本輪時間, 單位為分鐘, 時間到後強制開始下一輪(每輪固定5局) |
| PromotionQualifier | TINYINT | 每桌晉級名額, 最後一輪須為0, 其餘輪次需大於等於1 |
| IsAllowRevive | BIT | 是否允許復活進入下一輪, 0:否, 1:是 |
| ReviveCoin | BIGINT | 金幣復活費用 |
| ReviveDiamond | BIGINT | 鑽石復活費用 |
| ReviveTokenTypeID | TINYINT | 非金幣復活費用類型, 對應TreatureDB.GameStoreTokenType |
| ReviveTokenValue | BIGINT | 非金幣復活費用 |
| IsAllowSortItem | TINYINT | 是否准許自動組牌 0 否, 1 是 |
# 比賽獎勵配置
## RYContestDB.dbo.MatchRewardSetting
| name | type | description |
|:--------------------- |:------- |:-------------------------------------------------------------------------------------------- |
| ID | BIGINT | 流水號 |
| MatchID | BIGINT | 比賽ID, |
| RankStart | INTEGER | 起始獎勵排名(含) |
| RankEnd | INTEGER | 最後的獎勵排名(含) |
| RewardNumber | INTEGER | 獎勵人數, Ex: rankStart=1, RankEnd=1, --> 獎勵人數=1, rankStart=4, rankEnd=10 --> 獎勵人數=7 |
| RewardCoin | BIGINT | 獎勵金幣 |
| EntryTicketTypeID | TINYINT | 獎勵門票類型, 對應TreatureDB.GameStoreTokenType |
| EntryTicketTypeValue | BIGINT | 獎勵門票數量 |
| RewardTicketTypeID | TINYINT | 獎勵獎券類型, 對應TreatureDB.GameStoreTokenType |
| RewardTicketTypeValue | BIGINT | 獎勵獎券 (GameStoreTokenType = 1) |
| ExtraRewardRate | INTEGER | 額外獎池比例 |
# 比賽模式定義
## RYContestDB.dbo.MatchModeDefine
| name | type | description |
|:--------- |:------------ |:----------- |
| ID | BIGINT | 流水號 |
| Name | NVARCHAR(50) | 模式名稱 |
| Comment | NVARCHAR(50) | 備註說明 |
| IsEnabled | BIT | 是否啟用 |
| CreatedAt | DATETIME | 建立日期 |
| UpdatedAt | DATETIME | 更新日期 |
# 比賽標籤定義
## RYContestDB.dbo.MatchTag
| name | type | description |
|:--------- |:------------ |:----------- |
| ID | BIGINT | 流水號 |
| Name | NVARCHAR(50) | 模式名稱 |
| Comment | NVARCHAR(50) | 備註說明 |
| IsEnabled | BIT | 是否啟用 |
| CreatedAt | DATETIME | 建立日期 |
| UpdatedAt | DATETIME | 更新日期 |
# 比賽玩家紀錄
## RYContestDB.dbo.MatchPlayerRecord
當玩家報名比賽的同時, 會需要同時在這張表建立一筆該玩家資料,
反之當玩家退出比賽的同時, 也需要更新這張表的紀錄
玩家獎勵紀錄的內容也在這張表內
| name | type | description |
|:--------------------- |:------------ |:------------------------------------------------------------------------------------------------------------------------------------- |
| ID | BIGINT | 流水號 |
| MatchID | BIGINT | 比賽ID |
| UserID | INTEGER | 玩家ID |
| UserNickName | NVARCHAR(31) | 玩家名稱 |
| Rank | INTEGER | 最終排名 |
| MatchRound | INTEGER | 目前輪次 |
| MatchGame | INTEGER | 目前局數 |
| MatchRoundTableRank | INTEGER | 目前桌(局)排名 |
| RewardCoin | BIGINT | 最終獲得的獎勵金幣數量 |
| EntryTicketTypeID | TINYINT | 獎勵門票類型, 對應TreatureDB.GameStoreTokenType |
| EntryTicketTypeValue | BIGINT | 獎勵門票數量 |
| RewardTicketTypeID | TINYINT | 獎勵獎券類型 |
| RewardTicketTypeValue | BIGINT | 獎勵獎券數量 (GameStoreTokenType = 1) |
| ExtraRewardValue | BIGINT | 從額外獎池獲得的金幣數量 |
| RegistedAt | DATETIME | 玩家報名時間 |
| RegisterStatusID | TINYINT | 0:已報名, 1:準備中(TakeSeat), 2:比賽中, 3:(先暫時空著), 4:棄賽, 5:(先暫時空著), 6:等待比賽結果 7:結算完畢(比賽已結束, 獎勵也發放完畢) |
| IsRobot | BIT | 是否為機器人, 0:否, 1:是 |
| UpdatedAt | DATETIME | 更新時間 |
# 比賽玩家復活紀錄
## RYContestDB.dbo.MatchPlayerReviveRecord
當玩家付費復活晉級下一輪時, 寫入一筆紀錄
| name | type | description |
|:---------------------- |:------------ |:----------------------------------------------------- |
| ID | BIGINT | 流水號 |
| MatchID | BIGINT | 比賽ID |
| UserID | INTEGER | 玩家ID |
| UserNickName | NVARCHAR(31) | 玩家暱稱 |
| MatchRoundID | BIGINT | 輪次設定ID |
| ReviveCoin | BIGINT | 金幣復活費用 |
| ReviveDiamond | BIGINT | 鑽石復活費用 |
| ReviveDiamondToCoin | BIGINT | 鑽石轉換成金幣的數量 |
| ReviveTokenTypeID | TINYINT | 非金幣復活費用類型, 對應TreatureDB.GameStoreTokenType |
| ReviveTokenValue | BIGINT | 非金幣復活費用 |
| ReviveTokenValueToCoin | BIGINT | 非金幣復活費用轉換成金幣的數量 |
| IsCanceled | BIT | 是否取消費復活並退費,0 正常復活,1 不復活且退費 |
| CreatedAt | DATETIME | 資料建立時間=玩家復活時間 |
---
# 比賽退款紀錄
## RYContestDB.dbo.MatchRefundRecord
| name | type | description |
|:----------------------- |:------------ |:------------------------------------------- |
| ID | BIGINT | 流水號 |
| MatchID | BIGINT | 比賽ID |
| UserID | INTEGER | 玩家ID |
| UserNickName | NVARCHAR(31) | 玩家名稱 |
| RefundTypeID | INTEGER | 退款類型, 1:比賽無法正常進行 |
| RefundComment | VARCHAR(50) | 退款理由 |
| RefundCoin | BIGINT | 退款金幣數量 |
| RefundEntryTicketTypeID | TINYINT | 退款門票類型, TreatureDB.GameStoreTokenType |
| RefundEntryTicketValue | BIGINT | 退款門票數量 |
| IsClaimed | BIT | 是否領取 |
| OperetorID | INTEGER | 操作人員ID |
| OperatorAccount | VARCHAR(255) | 執行者帳號名稱 |
| CreatedAt | DATETIME | 資料建立時間 |
---
輪次紀錄, 輪次桌紀錄等確認後會再更新, 暫時先用舊的
# 輪次紀錄
## RYContestDB.dbo.MatchRoundRecord
| name | type | description |
|:-------------- |:-------- |:-------------------------- |
| ID | BIGINT | 流水號 |
| MatchID | BIGINT | 比賽ID |
| RoundNumber | INTEGER | 第幾輪 |
| StartedAt | DATETIME | 輪次開始時間 |
| EndedAt | DATETIME | 輪次結束時間 |
| TotalPlayer | INTEGER | 本輪參與玩家人數 |
| TotalPromotion | INTEGER | 本輪晉級人數(不含復活晉級) |
| TotalRevive | INTEGER | 本輪復活晉級人數 |
---
# 輪次桌紀錄
## RYContestDB.dbo.MatchRoundTableRecord
| name | type | description |
|:----------- |:-------- |:----------------------- |
| ID | BIGINT | 流水號 |
| MatchID | BIGINT | 比賽ID |
| RoundNumber | INTEGER | 第幾輪 |
| GameNumber | INTEGER | 第幾局 |
| TableID | SMALLINT | 桌子號 |
| ChairID | SMALLINT | 椅子號 |
| UserID | INTEGER | 用户ID |
| IsRobot | BIT | 是否為機器人 0:否, 1:是 |
| BetScore | BIGINT | 下注分 |
| WinScore | BIGINT | 贏分 |
| Rank | INTEGER | 桌排名 |
| StartedAt | DATETIME | 開始時間 |
| EndedAt | DATETIME | 結束時間 |
---
# 比賽機器人資料
## RYContestDB.dbo.MatchRobot
| name | type | description |
|:--------- |:------------ |:---------------------------- |
| ID | BIGINT | 流水號 |
| UserID | INTEGER | 機器人的UserID |
| NickName | NVARCHAR(31) | 帳號暱稱 |
| MatchID | BIGINT | 正在參加的比賽ID, 未參賽 = 0 |
| AvatarID | SMALLINT | 頭像ID |
| IsPlaying | BIT | 是否正在比賽中, 0:否, 1:是 |
---
# 比賽判斷真人玩家報名時間間隔設定
## RYContestDB.dbo.MatchRegisterIntervalConfig
| name | type | description |
|:-------------------- |:-------- |:------------------------------- |
| ID | BIGINT | 流水號 |
| MatchModeID | TINYINT | 比賽模式ID 1:定時賽, 2:人滿即開 |
| MinTimeIntervalRange | SMALLINT | 短期時間判斷(秒) |
| MaxTimeIntervalRange | SMALLINT | 長期時間判斷(秒) |
---
# 比賽機器人報名詳細設定
## RYContestDB.dbo.MatchRobotConfig
:::info
ConfigTypeID
1. 無真人玩家報名
2. 真人玩家報名增長
3. 真人玩家報名放緩
4. 真人玩家報名停止
5. 真人玩家報名過快
6. 等待時間1 (報名時間超過50%,且玩家報名數量不足)
7. 等待時間2 (報名時間超過80%,且玩家報名數量不足)
:::
| name | type | description |
|:---------------- |:------- |:------------------------------- |
| ID | BIGINT | 流水號 |
| MatchModeID | TINYINT | 比賽模式ID 1:定時賽, 2:人滿即開 |
| ConfigTypeID | TINYINT | 設定類型ID |
| RobotNumberRatio | TINYINT | 機器人最大占比 0 ~ 100% |
| ActionJoinRatio | TINYINT | 行為權重: 加入 0 ~ 100% |
| ActionWaitRatio | TINYINT | 行為權重: 等待 0 ~ 100% |
| ActionLeaveRatio | TINYINT | 行為權重: 離開 0 ~ 100% |
---
# 人滿即開等待佇列
## RYContestDB.dbo.FullStartWaittingInfo
| name | type | description |
|:------ |:------- |:----------- |
| ID | BIGINT | 流水號 |
| UserID | INTEGER | 用戶ID |