---
# System prepended metadata

title: 遊戲規格書(不要看)
tags: [document]

---

:::danger
不要改動，以設計書那份為準

:::



# 遊戲說明
**遊戲名稱：** Fate of thrones: Kingdoms Collide
**遊戲平台：** Android手機(5.0以上版本)、IOS手機(11.0以上版本) (參考自皇室戰爭)
**遊戲類型：** 卡牌遊戲(PVP、PVE)
**遊戲收益：** 10抽30元
**遊戲概要：** 取材自《謊言遊戲》第五集-不等邊三角關係
**遊戲玩法介紹:**
遊戲開始(執行玩家技能) -> 雙方於時間內從手牌中選出一張 -> 於揭牌區同時揭牌，並比較卡牌強弱(有勝負，勝方將揭牌區所有卡牌收進贏牌區、平手，雙方卡牌累積在揭牌區、若平民平手且發動效果，則執行效果) -> 若一方無手牌，則遊戲結束 -> 另一方剩餘手牌算入贏牌區 -> 遊戲結果：贏牌區牌數較多者獲勝
**初始牌組：**
![](https://hackmd.io/_uploads/BJRvRhZgT.png)


# 遊戲規格
**開發環境:** Unity (2022.3.9f1版)
**遊戲包裝:** 軟工宇宙中，各世界平衡突然被L紀打亂，所有世界的角色、故事及時代都混亂不堪，請你號召屬於你的世界隊伍，擊敗所有對手，取得軟工宇宙的故事主導權！
**主視覺:** 黑白分裂多重宇宙，透過取得更稀有的遊戲角色增加遊戲色彩

## 介面
![](https://hackmd.io/_uploads/ryLrbHZga.png)

1. 遊戲進行時UI:
![](https://hackmd.io/_uploads/S1gkqfNk6.png =50%x)
2. 使用者同意UI:【】
    * 「我同意」按鈕
    * 「我不同意」按鈕
3. 登入UI:
    ![](https://hackmd.io/_uploads/By_XOBkep.png =50%x)
    * 輸入帳號區
    * 輸入密碼區
    * 忘記密碼按鈕
    * 登入按鈕
4. 註冊UI:
    ![](https://hackmd.io/_uploads/rkdYtHyxp.png =50%x)
    * 填入帳號區
    * 填入密碼區
    * 填入電子信箱
    * 註冊按鈕
5. 找回密碼UI:
![](https://hackmd.io/_uploads/BJ6iqSJe6.png =50%x)
![](https://hackmd.io/_uploads/HyqTcHygT.png =50%x)

    
6. 遊戲主頁UI:
    ![](https://hackmd.io/_uploads/HkOqtnRka.png)
    * 進入遊戲按鈕
    * 抽卡按鈕
    * 玩家資料按鈕
7. 玩家資料UI:【】
    * 玩家資料修改功能
        * 遊戲名稱修改
        * 密碼修改
    * 玩家背包功能
        * 技能
        * 金幣
        * 卡牌造型
8. 抽卡UI:【】
    * 金幣抽卡按鈕
    * 課金抽卡按鈕
9. 遊戲介紹UI:【】
    * 新手教學功能
        * 【設計新手教學】
10. 遊戲開始UI:【】
    * 技能選擇功能
        * 技能欄1
        * 技能欄2
        * 技能欄3
11. 遊戲結束UI:【】
    * 顯示遊戲結果
        * 輸贏
        * 等級變動
        * 金幣變動
12. 課金UI(要夠假)【】

等級系統:
*	遊戲結束皆獲得經驗值
*	經驗值提升等級(等級越高間距越大)
*	等級影響普通模式對手配對
*	等級無上限

    
金幣系統:
* 贏遊戲獲得金幣
* 抽卡消耗金幣
* 金幣比率：遊戲勝一場金幣+100，1000金幣抽卡一次

抽卡系統:
* 抽卡資格
    1. 金幣抽卡( 1000 金幣抽卡一次 )
    2. 課金抽卡( 抽到技能機率高 )
* 抽卡內容
    1. 玩家技能
    2. 卡牌造型
    3. 金幣
* 抽卡動畫
    * 依稀有程度有所不同 
* 抽卡音效
* 卡池：玩家技能、卡牌樣式 ( 服裝 )、金幣 100
* 重複卡牌處理方式：升級 ( 消耗金幣 )、累積 ( 重複攜帶於遊戲中 )、出售 ( 轉成金幣 )
* 【設計抽卡機率】


玩家資料儲存系統:【存什麼】、【存在哪裡】、【如何存】
```mermaid
erDiagram
    account ||--o{ account_card_styles : ""
    account ||--o{ account_skills : ""
    account ||--o{ account_achievement : ""
    account ||--o{ account_data: ""
    account_card_styles }o--|| card_style : ""
    account_skills }o--|| skill : ""
    account_achievement }o--|| achievement : ""
    account{
        int id PK "Player ID"
        varchar name "Account name"
        varchar email
        varchar password
        varchar token_id "UniqueKey"
        int token_validity
    }
    account_card_styles{
        int id PK
        int account_id FK
        int card_style_id FK
    }
    card_style{
        int card_style_id PK
        int card_style_name
        varchar card_style_description
    }
    account_skills{
        int id PK
        int account_id FK
        int skill_id FK
    }
    skill {
        int skill_id PK
        varchar skill_name
        varchar skill_description
    }
    
    account_achievement{
        int id PK
        int account_id FK
        int achievement_id FK
    }
    achievement{
        int achievement_id PK
        varchar achievement_name
        varchar achievement_type
        varchar achievement_description
    }
    account_data{
        int account_id FK
        varchar nickname "Player name"
        int level
        int experience
        varchar rank
        int total_match
        int total_win
        int coin
    }
```
1. 帳號
```mermaid
sequenceDiagram

    participant UI
    participant signUp manager
    participant Server
    UI->>UI: 輸入 username,email,password
    UI->>signUp manager: 點擊註冊按鈕

    signUp manager->>Server: send username,email,password
    
    Server->>Server: check account eligibity
    Note right of Server: go through database<br/>to check duplicates
    Note over Server: check username & email
    
    opt if not eligible
        Server-->>UI: send sign Up failed notification
        Note over signUp manager,Server: case 1: Username is already used<br/>case 2: email is already registered<br/>case 3: password too short
    end

    Server->>Server: generate & send verification code to user email
    Note over UI: user receive verification<br/>code from email
   
    UI->>UI: 輸入 verification code
    UI->>signUp manager: confirm verification code
    signUp manager->>Server: send verification code
    Server->>Server: check verification code
    
    alt if verCode wrong
        Server-->>UI: code doesnt match notification
    else if verCode right
        Server->>Server: username & password hashing
        Server->>Server: add account to the database
        Server->>Server: generate user identification token
    end

    Server->>signUp manager: (sign up succesfull) notification
    Server->>signUp manager: send user identification token
    signUp manager->>signUp manager: record player token
    signUp manager-->>UI: sign up status : success
```

**UI (前端)**
Input :

- user email
- username
- password
(user will receive a verification code through email)

Output :

- registration status (username has been used, email is already registered, password too short)
- sign up status : success -> logged in (with token)


**Server**
Input :

- user email
- username
- password
(server will sent a verification code to verify email)

Output :

- account verification code
- account identification token
- status : sign up successfull
  

2. 密碼

忘記密碼
可以讓玩家找回密碼。
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    前端->>前端: 輸入username和email
    前端->>APP: 按忘記密碼按鈕，送出username和email
    APP->>APP: 檢查username和email輸入是否合法
    alt 輸入不合法
        APP-->>前端: 輸入不合法，改密碼失敗！
    else 輸入合法
        APP->>Server: 輸入合法，送出username和email
        Server->>Server: 搜尋username
        alt 找不到username
            Server-->>前端: 忘記密碼失敗
        else 找得到username
            Server->>Server: 檢查user輸入的email與資料庫裏記錄的userEmail是否相等
            alt 不相等
                Server-->>Server: 改密碼失敗
            else 相等  
                Server->>Server: 發驗證碼到user的email
                alt 驗證失敗
                    APP-->>前端: 驗證失敗，忘記密碼失敗
                else 驗證成功
                    APP->>前端: 驗證成功
                    前端->>前端: 輸入新的密碼
                    前端->>前端: 輸入確認新密碼
                    前端->>APP: 送出新密碼和確認新密碼
                    APP->>APP: 檢查新密碼是否跟確認新密碼相等
                    alt 新密碼和確認密碼不相等
                        APP-->>前端: 新密碼!=確認新密碼，改密碼失敗
                    else 新密碼和確認密碼相等
                        APP->>APP: 檢查密碼輸入是否合法
                        alt 新密碼輸入不合法
                            APP-->>前端: 密碼不合法，改密碼失敗
                        else 新密碼輸入合法
                            APP->>Server: 送出新密碼
                            Server->>Server: 新密碼hash處理，存新密碼
                            Server->>前端: 改密碼成功
                        end
                    end
                end
            end
        end
    end
```
**前端使用方法：**
Input: username, 新密碼，確認新密碼
Output: 是否成功改密碼
**Server需要的功能:**
Input: username, 新密碼
Output: username是否存在，email, 是否成功改密碼

3. 遊戲名稱
4. 等級

玩家升級系統
更新玩家統計數據的系統，包含等級，場數。
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    APP->>APP: 檢查token是否還有效
    alt token已過期
        APP-->>前端: 請從新登入
    else token還有效
        APP->>Server: 送出user's token
        Server->>APP: 送出user目前的等級，exp,total match played, total match won
        APP->>APP: total match played++
        opt 勝者
            APP->>APP: total match won++
            APP->>Server: 送出新的total match won
            Server->>Server: 更新total match won記錄
            Server->>Server: user金幣增加
        end
        APP->>APP: exp+=游戲結束後所得的exp
        APP->>APP: 判斷user有沒有升級
        opt 有升級
            APP->>前端: 送出升級的通知
            APP->>Server: 送出新的等級
            Server->>Server: 更新等級記錄
        end
        APP->>Server: 送出新的exp，total match played
        Server->>Server: 更新exp, total match played記錄
    end
```
**前端使用方法：**
（若有升級）Output: 升級通知
**Server需要的功能:**
Input: user's token
Output: user的等級, exp, total match played, total match won
更新數據

成就系統
可以將玩家所得到的成就按照他的分類顯示出來。
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    前端->>APP: 請求查看玩家成就
    APP->>APP: 檢查token是否還有效
    alt token已過期
        APP-->>前端: 請重新登入
    else token還有效
        APP->>Server: 送出user's token
        Server->>Server: 搜尋user's token
        Server->>APP: 送出user所得的成就名單
        APP->>APP: 成就分類
        note over APP: (on db achievement_type)<br/> 1. 有功能:協助遊戲進行<br/>ex: 新手玩家 ( 配對機制友善 )<br/>2. 無功能:增加遊戲趣味姓<br/>ex: 革命家 ( 連續三場以平民打敗王 )<br/>3. 顯示於玩家資料
        APP->>前端: 送出結果
    end
```
**前端使用方法**：
Output: user的數據

**Server需要的功能**:
Input: user’s token
Output: user是否存在，user的數據


顯示玩家統計數據
可以將玩家的統計數據顯示出來給玩家看。
```mermaid
sequenceDiagram
    participant 前端
    participant APP
    participant Server
    APP->>APP: 檢查token是否還有效
    alt token已過期
        APP-->>前端: 請從新登入
    else token還有效
        APP->>Server: 送出user's token
        Server->>Server: 搜尋token
        Server->>APP: 送出等級，排名，total match played, total match won
        APP->>APP: 計算勝率
        APP->>前端: 送出等級，排名，total match played, total match won, 勝率
    end
    
```
**前端使用方法：**
Output: user的數據
**Server需要的功能:**
Input: user's token
Output: user是否存在，user的數據

5. 金幣
6. 擁有的玩家技能
7. 擁有的卡牌造型

## 遊戲機制:

1. 配對玩家機制
    ```mermaid
    sequenceDiagram
    participant A as UI
    participant B as 前端
    participant C as 後端

    alt 勝率入口
        A ->> B: 玩家選擇勝率入口
        B ->> C: 呼叫勝率入口配對函式

        alt 玩家等級為0
            C ->> C: 規定配對玩家須為0等
        else 玩家是新手玩家
            C ->> C: 規定配對玩家須介於n-10到n
        else 玩家是老手玩家
            C ->> C: 規定配對玩家須介於n到n+10
        else 玩家是一般玩家
            C ->> C: 規定配對玩家須介於n-10到n+10
        end

        alt 10秒內有相對應現場玩家
            C ->> C: 選擇與玩家勝率最為接近之現場玩家
        else 10秒內無相對應現場玩家
            C ->> C: 創建對戰之電腦玩家
        end

        C ->> B: 回傳配對結果
        B ->> A: 顯示配對結果
    
    else 排位入口
        A ->> B: 玩家選擇排位入口
        B ->> C: 呼叫排位入口配對函式
        alt 有現場玩家
            C ->> C: 選擇與玩家排位最接近之現場玩家
            C ->> B: 回傳配對結果
        else 無現場玩家
            C ->> B: 回傳配對失敗
        end
        B ->> A: 顯示配對結果
    end
    ```
    本遊戲分成兩個遊戲入口：勝率入口及排位入口，此處亦將分成兩種入口進行說明：
    - 勝率入口
        > 當玩家A進入勝率入口，系統會檢查玩家身分，若玩家等極為0，則會配對等級亦為0之玩家；若玩家為新手玩家，則會配對等級小於等於玩家A十等以內的玩家；若玩家為老手玩家，則會配對等級大於等於玩家A十等以內的玩家；若為一般玩家，則會配對等級正負10之內的玩家。確認身分後，系統會從在勝率入口中的玩家進行篩選，並配對勝率與玩家A最為接近之玩家B進行對戰，若無法在10秒內搜尋到相對應玩家，則由電腦創建角色與玩家A進行對戰。
    - 排位入口
        > 當玩家A進入排位入口，且存在其他現場玩家也進入排位入口，則從中搜尋排位與玩家A最為接近之玩家B進行配對，若配對成功則進入遊戲，反之進行其他配對；若不存在其他現場玩家進入排位入口，則由電腦創建角色與玩家A進行對戰。
2. 遊戲進行流程
    ```mermaid
    sequenceDiagram
    participant A as UI
    participant B as 前端
    participant C as 後端

    critical 遊戲開場 15秒
        A ->> B: 進入遊戲
        B ->> C: 呼叫玩家配對函式
        alt 成功
            C ->> B: 回傳玩家配對結果
            B ->> A: 顯示玩家配對結果
        else 失敗
            C ->> B: 回傳玩家配對失敗
            B ->> A: 顯示玩家配對失敗
        end
        B ->> C: 呼叫遊戲開場動畫
        C ->> B: 回傳遊戲開場動畫
        B ->> A: 顯示遊戲開場動畫
    end

    loop 遊戲進行 13 回合

        critical 選牌階段 10秒
            alt 玩家於時間內選牌
                A ->> C: 傳送選牌結果
            else 玩家位於時間內選牌
                A ->> B: 隨機挑選最右側卡牌送出
            end
        end

        critical 揭牌階段 5秒
            C ->> C: 呼叫卡牌強弱判斷函式
            C ->> B: 回傳卡牌強弱判斷結果
            B ->> A: 顯示卡牌強弱判斷結果
        end

    end
    
    critical 遊戲結束 15秒
        C ->> C: 呼叫遊戲勝負判斷函式
        C ->> B: 回傳遊戲勝負判斷函式
        B ->> A: 顯示遊戲勝負結果、獎勵
    end
    ```

    > 共計一局遊戲約 5 分鐘
    1. 開場動畫：約15秒
        > 開場動畫包括玩家配對及進入遊戲之開場動畫，玩家配對至多10秒，若在10秒內仍未找到對應之適合玩家，則會由電腦創建角色與玩家進行對戰
    2. **選牌階段**：最多10秒，最少3秒
        > 一般情況下，玩家有10秒選牌時間，若玩家未於10秒內出牌，則由電腦直接選擇玩家手中最右方一張牌丟出，若雙方皆提早出牌，則提早結束選牌階段
        > 【==技能名稱TBD==】技能會縮短對方玩家出牌時間，進而影響此處10秒之設定
    3. 揭牌階段：約5秒
        > 揭牌階段會顯示卡牌強弱判斷之結果
    4. 結束動畫：約15秒
        > 結束動畫包括顯示遊戲勝負及顯示經驗值、金幣獲取量，若超過15秒玩家仍未畫面則會自動跳至【==主畫面==】
3. 回合記錄(現在是第幾回合)
 * 玩家應該在遊戲進行中不會看得到每個回合的紀錄，但遊戲結束的畫面中可以顯示每個回合的紀錄。
4. 卡牌強弱判斷
![](https://hackmd.io/_uploads/rJZ--dpJ6.png)

| Player 1 | Player 2 | 勝者 |
| -------- | -------- | ---- |
| 王     | 王     | 平手     |
| 王     | 王子     |Player 1      |
| 王     | 女王     |Player 2      |
| 王     | 騎士     |Player 1      |
| 王     | 暗殺者     |Player 2      |
| 王     | 平民     |Player 1      |
| 王子     | 王     |Player 2      |
| 王子     | 王子     |平手      |
| 王子     | 女王     |Player 1      |
| 王子     | 騎士     |Player 1      |
| 王子     | 暗殺者     |Player 2    |
| 王子     | 平民     |Player 1    |
| 女王     | 王     |Player 1    |
| 女王     | 王子     |Player 2    |
| 女王     | 女王     |平手   |
| 女王     | 騎士     |Player 1    |
| 女王     | 暗殺者     |Player 2    |
| 女王     | 平民     |Player 1    |
| 騎士     | 王     |Player 2    |
| 騎士     | 王子     |Player 2    |
| 騎士     | 女王     |Player 2    |
| 騎士     | 騎士     |平手   |
| 騎士     | 暗殺者     |Player 1   |
| 騎士     | 平民    |Player 1    |
| 暗殺者    | 王    |Player 1    |
| 暗殺者    | 王子    |Player 1    |
| 暗殺者    | 女王    |Player 1    |
| 暗殺者    | 騎士    |Player 2    |
| 暗殺者    | 暗殺者    |平手    |
| 暗殺者    | 平民    |平手   |
| 平民    | 王    |Player 2    |
| 平民    | 王子    |Player 2    |
| 平民    | 女王    |Player 2    |
| 平民    | 騎士    |Player 2    |
| 平民    | 暗殺者    |平手    |
| 平民    | 平民    |平手    |
        

5. 遊戲結束判斷
    1. 當其中一方玩家手牌耗盡，遊戲就會進入結算階段。
    2. 如果另一方玩家手牌尚有剩餘，則將手牌全部放入該玩家贏牌區。
    
6. 遊戲結果判斷
    1. 贏牌區卡牌數量較多的玩家勝出，如果兩位玩家贏牌區卡牌張數相同則平手。
    2. 獲勝的玩家可以得到較多獎勵與積分，落敗的玩家則會扣除積分並獲得少許獎勵。
    3. 結算完獎勵後將退出遊戲並回到主畫面。
    ![](https://hackmd.io/_uploads/rJ7xpUJxa.png)

7. 平民卡效果執行
    - 當玩家該回合丟出平民卡時，根據該回合結果觸發平民卡效果

    | 陣營 | 名稱 | 觸發條件 | 技能 |
    | -------- | -------- | -------- | -------- |
    | Ａ    | 簡易剔除     | 平手     | 從對手手排中選出一張卡牌移出遊戲 |
    |Ａ     | 全部重置     | 平手     | 將對手贏到的牌全部放到揭牌區 | 
    |Ａ     | 不敗的勇者   | 不限輸贏平手| 可以贏過任何一張牌 |
    | Ｂ    | 爆發式成長    | 平手     | 增加Ｘ張自身的贏取卡（Ｘ為回合數） | 
    |Ｂ     | 大革命     | 平手     | 從此以後，所有卡牌優劣反轉 |
    |Ｂ     | 特洛伊木馬 | 當輸給王家或騎士時|把對手玩家的一半贏取卡牌（半張自動進位為一張）加到自身贏取卡牌當中|
    
![](https://hackmd.io/_uploads/HJ2gTL-la.png)


8. 玩家技能執行
   
    1. UI互動
         - 遊戲中顯示技能狀態
            - 可使用 : 達成技能使用條件
		    - 已使用 : 技能已使用過
		    - 無法使用 : 未達成技能使用條件、被敵方玩家干擾
		    
		- 點擊 : 第一次點擊該技能圖案放大(或其他特效)，表示被選取，再次點擊技能會發動

	    - 長按 : 顯示技能詳細敘述

    2. 技能發動
    
        點選發動後，呼叫該玩家技能的函式，由後端計算完後將結果回傳至前端，前端將結果轉換成對應的技能效果、特效，顯示至螢幕上

![](https://hackmd.io/_uploads/ByfhJEbg6.png)

        


10. PVE機制
    * 【設計電腦玩家】
    * 電腦玩家根據強度分為不同等級，強度越強所攜帶的技能強度越強
    * 同一職業（王家、騎士、暗殺者、平民）出牌機率相同
    * 沒有技能的平民出牌機率為0![](https://hackmd.io/_uploads/S1pzP-ygp.png)

    

伺服器:
1. 抽卡
2. 玩家資料
3. 玩家連線
4. 金流系統

資料庫:
1. 【設計資料如何儲存】
2. 【設計資料如何傳送】

---

資安規格：
1. 行動應用程式應於發布時說明欲存取之敏感性資料、行動裝置資源及宣告之權限用途
2. 行動應用程式開發者應提供回報安全性問題之管道
3. 行動應用程式應於蒐集敏感性資料前，取得使用者同意
4. 行動應用程式應提供使用者拒絕蒐集敏感性資料之權利
5. 行動應用程式應於儲存敏感性資料前，取得使用者同意
6. 行動應用程式應提供使用者拒絕儲存敏感性資料之權利
7. 行動應用程式應避免在關閉及登出後將敏感性資料儲存於冗餘檔案或日誌檔案中
8. 行動應用程式應避免將敏感性資料儲存於冗餘檔案或日誌檔案中
9. 敏感性資料應採用適當且有效之金鑰長度與加密演算法，進行加密處理再儲存
10. 敏感性資料應儲存於受作業系統保護之區域，以防止其他應用程式未經授權之存取
11. 敏感性資料應避免出現於行動應用程式之程式碼
12. 行動應用程式於非使用者主動進行的畫面擷取時應主動警示使用者
13. 行動應用程式應將個人可識別資訊、使用者憑證及加密金鑰等敏感性資料儲存於系統憑證儲存設施
14. 行動應用程式應於使用者輸入敏感性資料時將鍵盤的快取機制關閉
15. 行動應用程式應避免在 IPC 機制中洩漏敏感性資料
17. 行動應用程式中的使用者介面應避免洩漏敏感性資料
18. 行動作業系統的備份資料中不應存有行動應用程式的敏感性資料
19. 行動應用程式透過網路傳輸敏感性資料，應使用適當且有效之金鑰長度與加密演算法進行安全加密
20. 行動裝置內之不同行動應用程式間，應於分享敏感性資料前，取得使用者同意
21. 行動應用程式應提供使用者拒絕分享敏感性資料之權利
22. 行動應用程式分享敏感性資料時，應避免未授權之行動應用程式存取
24. 行動應用程式應於使用交易資源時主動通知使用者
25. 行動應用程式應提供使用者拒絕使用交易資源之權利
26. 行動應用程式應於使用交易資源時進行使用者身分鑑別
27. 行動應用程式應記錄使用之交易資源與時間
28. 行動應用程式應有適當之身分鑑別機制，確認使用者身分
29. 行動應用程式應依使用者身分授權
30. 行動應用程式應避免使用具有規則性之交談識別碼
31. 行動應用程式應確認伺服器憑證之有效性
32. 行動應用程式應確認伺服器憑證為可信任之憑
33. 行動應用程式應避免含有惡意程式碼
34. 行動應用程式應避免資訊安全漏洞
35. 行動應用程式於引用之函式庫有更新時，應備妥對應之更新版本
36. 行動應用程式應針對使用者於輸入階段之字串，進行安全檢查
37. 行動應用程式應提供相關注入攻擊防護機制
38. 行動應用程式於 Webview 呈現功能時，所連線之網域應為安全網域

---

### 技能升級系統
想法：在資料庫中，用低等級的 skill 換高等級的 skill
(e.g., Skill_1_Lv1 numbers:3->1; Skill1_Lv2 numbers:0->1)

```mermaid
sequenceDiagram
    participant UI
    participant Upgrade System
    participant Server
    UI->>UI: 選擇想要升級的卡牌
    UI->>Upgrade System: 發出升級請求
    Upgrade System->>Upgrade System: 檢查內部變數是否符合條件
    note left of Upgrade System: 特定 Skills 數目不足，無法升級
    Upgrade System-->>UI: Fail: Not enough skills for upgrade
    note left of Upgrade System: 特定 Skills 不可以升級
    Upgrade System-->>UI: Fail: This skills can NOT upgrade
    note right of Upgrade System: 符合升級條件
    Upgrade System->>Server: 傳送要用戶升級的資訊
    Server->>Server: 檢查資料庫中玩家特定技能數量
    note left of Server: 特定技能數量不足
    Server-->>UI: Fail: NOT enough numbers of certain skills
    note right of Server: 特定技能數量正確
    Server->>Server: 將資料庫中舊技能的數目扣除 
    Server->>Server: 將資料庫中新技能的數目增加
    Server->>Upgrade System: 傳送用戶目前擁有的道具變數
    Upgrade System->>Upgrade System: 更新遊戲內道具變數
    Upgrade System->>UI: Success / new skill = skill_id
```

- 升級系統 - UI Input

    - skill_id：想要升級的技能id
    - HandleLoginResult：回調函數
    
- 升級系統 - UI Output
    - Status：動作結果 (Fail/Success)
    - new_skill： 新獲得skill的skill_id (If status = Success) 


- 升級系統 - Server Input
    - Token：用戶Token
    - Upgrade_Skill_ID：用戶想要升級的卡片ID

- 升級系統 - Server Output
    - Status：Success / Fail , Reasons
    - Skill_Data：更新過後的Player skill data
    
---
### 用戶登入
```mermaid
sequenceDiagram
    participant UI
    participant LoginManerger
    participant Server
    UI->>UI    : 輸入帳號、密碼
    UI->>LoginManerger    : 點擊登入按鈕
    LoginManerger->>LoginManerger    : 檢查連線狀況
    note left of LoginManerger: 沒有連線到網路
    LoginManerger-->>UI: Status:Poor Network
    note right of LoginManerger: 有連線到網路
    LoginManerger->>LoginManerger: 檢查帳號密碼輸入是否合法
    note left of LoginManerger: 帳號密碼不合法
    LoginManerger-->>UI: Status: Invalid Password or Account
    LoginManerger-->>UI: Status: Invalid Account
    note right of LoginManerger: 帳號密碼合法
    LoginManerger->>Server: 傳送帳號、密碼
    Server->>Server: 檢查帳號、密碼格式與內容
    note left of Server: 格式不合法
    Server-->>UI: Status: Invalid Input
    note right of Server: 格式合法
    Server->>Server: 帳號、密碼 hash 處理
    Server->>Server: 資料庫驗證帳號密碼
    note left of Server: 登入失敗
    Server-->>UI: Status: Wrong Password or Account
    note right of Server: 登入成功
 
    
    Server->>Server: 產生用戶識別 Token
    Server->>Server: 紀錄 Tokne 於 Database
    Server->>LoginManerger: Status: Success / Token = ...
    LoginManerger->>LoginManerger: 紀錄玩家取得的 Token
    LoginManerger-->>UI: Status: Success
```
- 用戶登入 - UI Input

    - account：用戶帳號
    - password：用戶密碼
    - HandleLoginResult：回調函數
    
- 用戶登入 - UI Output
    - Status：登入結果
    - Token：(登入成功) 用戶識別token


- 用戶登入 - Server Input
    - account：用戶帳號
    - password：用戶密碼

- 用戶登入 - Server Output
    - Status：登入結果
    - Token：(登入成功) 用戶識別token

---

### 換裝系統--換造型
```mermaid
sequenceDiagram
    participant UI
    participant EquipmentManerger
    participant Server
    UI->>UI: 選擇想要更換的造型
    UI->>EquipmentManerger: 按下更換造型按鈕
    EquipmentManerger->>EquipmentManerger: 檢查內部變數是否符合條件
    note left of EquipmentManerger: 使用者沒有此造型，無法裝備
    EquipmentManerger-->>UI: Fail: User do NOT have this Item.
    note right of EquipmentManerger: 使用者有此造型
    EquipmentManerger->>Server: 檢查使用者是否擁有造型
    Server->>Server: 資料庫數據比對
    note left of Server: 使用者沒有此造型，無法裝備
    Server-->>UI: Fail: User do NOT have this Item.
    note right of Server: 使用者有此造型
    Server->>Server: 資料庫儲存使用者目前使用的造型
    Server->>EquipmentManerger: Success: User do have this Item
    EquipmentManerger->>EquipmentManerger: 更改裝備造型變數
    EquipmentManerger->>UI: Success 


    
```


```EquipmentManerger.change_card_style``` --- 用來換造型

- **UI Input**
    - Style_Id：造型辨識碼
    - Result：回調函數

- **UI Output**
    - Status：是否成功更換造型 (Success / Fail)

- **Server Input**
    - Token：用戶識別token
    - Style_Id：造型辨識碼

- **Server Output**
    - Result：玩家是否成功更換造型

- **內部**
    - 修改”玩家目前使用造型“ 的變數

---

### 換裝系統--換技能
``EquipmentManerger.change_skills``--- 用來換攜帶技能

```mermaid
sequenceDiagram
    participant UI
    participant EquipmentManerger
    participant Server
    UI->>UI: 選擇想要更換的技能
    UI->>EquipmentManerger: 按下更換技能按鈕
    EquipmentManerger->>EquipmentManerger: 檢查內部變數是否符合條件
    note left of EquipmentManerger: 使用者沒有此技能，無法裝備
    EquipmentManerger-->>UI: Fail: User do NOT have this Item.
    note right of EquipmentManerger: 使用者有此技能
    EquipmentManerger->>Server: 檢查使用者是否擁有技能
    Server->>Server: 資料庫數據比對
    note left of Server: 使用者沒有此技能，無法裝備
    Server-->>UI: Fail: User do NOT have this Item.
    note right of Server: 使用者有此技能
    Server->>Server: 資料庫儲存使用者目前使用的技能
    Server->>EquipmentManerger: Success: User do have this Item
    EquipmentManerger->>EquipmentManerger: 更改裝備技能變數
    EquipmentManerger->>UI: Success 


    
```


```EquipmentManerger.change_card_style``` --- 用來換技能

- **UI Input**
    - Style_Id：技能辨識碼
    - Result：回調函數

- **UI Output**
    - Status：是否成功更換技能 (Success / Fail)

- **Server Input**
    - Token：用戶識別token
    - Style_Id：技能辨識碼

- **Server Output**
    - Result：玩家是否成功更換技能

- **內部**
    - 修改”玩家目前使用技能“ 的變數
     
---
     
     
### 抽卡

該功能提供抽卡的功能。
流程如下所示。


#### 流程
```mermaid
sequenceDiagram
    participant UI
    participant APP
    participant Server
    UI->>APP    : 按抽卡
    APP->>Server: 傳送帳號，等級，抽卡分類
    Server->>Server: 按照抽卡的分類進行抽卡(玩家技能，卡牌造型，金幣)
    Server->>Server: 執行抽卡
    note right of Server: 若需檢查(是否抽到不可以重複擁有的事物)
    Server->>Server: 儲存抽到的事物和其數量
    Server->>APP: 傳送抽到的事物與數量
    APP->>UI    : 顯示抽到的事物
```

#### 輸入
- **APP** 按抽卡
- **Server** 帳號，等級，抽卡分類(AccountId, Class, LotteryType)

#### 輸出
- **Server** 抽到的事物，數量
- **APP** 抽到的事物，數量，特效

---

### 用戶設定儲存

該功能提供以下功能。
1. 更改名字
2. 更改背景音樂
3. 調整音量
4. 更改背景主題

---

#### 1. 更改名字(nickname)

#### 輸入
- **UI** 新的名字
- **APP** 帳號，新的名字

#### 輸出
- **Server** 通知儲存成功

```mermaid
sequenceDiagram
    participant UI
    participant APP
    participant Server
    UI->>UI    : 按更改名字
    UI->>UI    : 輸入新的名字
    note right of UI: 檢查不可以使用的字
    UI->>APP   : 檢證過的新的名字
    APP->>Server: 傳送帳號，新的名字
    Server->>Server: 儲存新的名字
    Server->>APP: 通知儲存成功
    Server-->>APP: 通知儲存失敗
    APP->>UI    : 顯示新的名字
    APP-->>UI    : 顯示錯誤訊息
```

---

#### 2. 更改背景音樂(background music)

該功能可以更改遊戲過程中播放的 BGM。
BGM 更改流程如下所示。

```mermaid
sequenceDiagram
    participant UI
    participant APP
    UI->>UI    : 按背景音樂
    UI->>APP   : 音量分類ID
    APP->>APP: 更改播放背景音樂ID
    APP->>UI    : 播放
```

---

#### 3. 調整音量(system volume, Voice volume, etc)

該功能可調節背景音樂和音效的音量。
音量控制流程如下所示。

```mermaid
sequenceDiagram
    participant UI
    participant APP
    UI->>UI    : 按調整音量
    UI->>APP   : 音量分類ID，數值
    APP->>APP: 更改音量變數的數值
    APP->>UI    : 播放
```

---

#### 4. 更改背景主題(background theme)

該功能可以更改背景主題。
更改背景主題的流程如下所示。

```mermaid
sequenceDiagram
    participant UI
    participant APP
    UI->>UI    : 按背景主題
    UI->>APP   : 背景主題ID
    APP->>APP: 更改背景主題ID
    APP->>UI    : 換背景主題
```

---


### 背包賣出系統(item trade)

該功能提供可將背包裡的物品兌換成虛擬金幣的功能。
兌換的金幣數量取決於物品的類型和數量。
系統管理員可根據情況更改金幣兌換率。
背包賣出系統的流程如下所示。

```mermaid
sequenceDiagram
    participant UI
    participant APP
    participant Server
    UI->>UI    : 按背包賣出
    UI->>APP    : 選擇物品和數量
    APP->>APP: 計算每個物品的價值
    APP->>UI: 顯示總價值
    UI->>APP: 確定
    APP->>Server: 傳送帳號，物品，數量
    Server->>Server: 計算&兌換
    Server->>Server: 更改該帳號的物品數量和金幣資訊
    Server->>APP: 通知成功
    Server-->>APP: 通知失敗
    APP->>UI    : 顯示兌換的金幣
    APP-->>UI    : 顯示錯誤訊息
```