---
# System prepended metadata

title: G67 葉猴專案開發紀錄

---

# G67 葉猴專案開發紀錄
## 參考
[專案企劃](https://7f1azz.axshare.com)
[成果影片](https://drive.google.com/drive/u/0/folders/1DC4lXvb1eH4UBBHmW_M80TJJLjUishM7)
[競品](https://www.youtube.com/watch?v=DJ2cNzB_IIw)
## 事情準備
- 閱讀企劃
- 確認需求
- 檢查特效
- Git 開專案
    - 改分支 master、預設: develop，刪除 main
    - common 開分支
        - 設置 SDK
        - SenceManager、DataManager 新增遊戲設定
        - 更換語系 csv
    - 複製專案
- 閱讀後端接口文件
- 熟悉規則、路圖
## 開發
- [葉猴]複製專案
    - 複製 & 更改編號(資料夾、code)
    - 修正 uuid
    - 完成後檢查
### Loading
- [葉猴]Loading
    - UI
    - 載入功能
### Game
- [葉猴]Game 下注區域
    - 
    - 
    - 
- [葉猴]Game 玩家面板
    - 玩家資訊 沿用
    - 重複下注 / 確定取消 
    - 籌碼列
        - 滑動時縮放(中央大側邊小)
        - 選中時發光 & 上移
        - 出界效果待確認
- [葉猴]Game 按鈕
    - 選單
    - 退回大廳 沿用
    - 更多遊戲
    - 進行中牌局
    - 聊天室
- [葉猴]Game 跑馬燈
    - 沿用
- [葉猴]Game 聊天室
    - 橫版沿用
    - 直版另外獨立一個按鈕與聊天室
#### 介面控制
- [葉猴]骰子
    - 規劃屬性
    - 熟悉 3D 物件
    - 設定骰子各面角度
- [葉猴]下注區域
    - 規劃屬性
    - 劃分區域
    - 下注回饋動畫
    - 勝利區域動畫
    - 勝利倍率提示
- [葉猴]籌碼列
    - 規劃屬性
    - 橫向滑動
    - 選中動畫
- [葉猴]籌碼池
    - 規劃屬性
    - 籌碼流動
- [葉猴]DynamicPopUpManager
#### 彈跳窗
- [葉猴]HistoryPanel
    - 歷史注單
    - Admin 注單
- [葉猴]SettingPanel
    - 音量條
    - 靜音鈕
    - 版本號(點擊複製)
- [葉猴]RoadMapPanel
    - 詳細路圖
    - 置頂 new 提示
- [葉猴]訊息視窗
    - 訊息串接
    - 設定 callback
#### 階段
- [葉猴]階段循環
    - 倒數時鐘
    - 階段提示(開始、停止、加載)
    - 莊家控制
- [葉猴]加載中
    - 還原階段畫面
- [葉猴]壓注
    - 點擊加注，籌碼流動 玩家 -> 下注區
    - 其他玩家下注，籌碼流動 其他玩家 -> 下注區
    - 確定下注
- [葉猴]開獎
    - 開盅演出
    - 設定骰子結果
- [葉猴]派彩
    - 籌碼回收 莊家 -> 勝利區域
    - 派彩演出 勝利區域 -> 玩家
    - 派彩演出 勝利區域 -> 其他玩家
    - 更新簡易路圖
- [葉猴]切分頁
    - 離開分頁
    - 進入分頁
### 其他遊戲
- [葉猴]更多遊戲
- [葉猴]進行中牌局
- [葉猴]好友房


## 遊戲概述
遊戲以四個階段作為一個週期，不斷循環
- 開局
- 壓注 15s
- 開獎 5s
- 派彩 5s

遊戲中會有六顆骰子作為勝利的依據，骰子上對應六種圖案，當圖案出現兩個以上時即為中獎。
桌面上也會有六個區域對應六個圖案提供下注，可同時下注所有花色。

### 載入遊戲
- 提示遊戲加載中
- 還原目前遊戲階段
### 準備(?s)
- 簡易路圖更新
- 清空畫面籌碼
### 壓注(15s)
- 提示開始下注
- 開放下注區域
- 金額超過限紅時，關閉區域
- 下注演出
- 點擊下注後，重複下注按鈕 換成 確認/取消按鈕
- 取消時收回玩家籌碼，按鈕換回 重複下注
### 開獎(5s)
- 提示停止下注
- 開獎演出
- 勝利下注區顯示獲勝倍率

### 派彩(5s)
- 籌碼流動
    莊家 -> 獲勝區域 -> 贏家
- 玩家頭像得分演出
- 籌碼列蓋上遮罩

## 後端接口
### 請求
### ThemeDataList
- 取得廳別列表
    
    ```typescript
    GameClient.themeDataList();
    ```
- Response
    ```typescript
    interface IThemeDataListRes {
      themeDataList: IThemeData[];
    }

    interface IThemeData {
      // 底注金額
      ante: number; 

      // 限紅列表
      betLimitList: Array<{
        betType: number; // 下注類型
        lowerBetLimit: number; // 下注下限
        upperBetLimit: number; // 下注上限
      }>;

      // 准入金額
      minCoin: number; 

      // 房間列表
      roomList: Array<{
        customData: JSON;
        roomId: string;
      }>;

      // 廳房
      themeId: number;
    }
    ```
---
### JoinRoom

- 加入房間
    
    ```typescript
    GameClient.joinRoom(data);
    ```
- Request
    ```typescript
    interface IJoinRoomReq {
      carryAmount: number; // 攜帶金額
      roomId: number;
      themeId: number;
    }
    ```
---
### Leave

- 離開房間
    
    ```typescript
    GameClient.leave();
    ```
---
### Bet

- 下注
    
    ```typescript
    GameClient.bet(data);
    ```
- Request
    ```typescript
    interface IBetReq {
      playerBet: Array<{
        betAmount: number; // 下注金額
        diceType: number; // 下注區種類 1:梅花 2:方塊 3:皇冠 4:旗子 5:黑桃 6:紅心
      }>;
    };
    ```
- Response
    ```typescript
    interface IBetRes {
      balance: number; // 玩家餘額
    }
    ```
---
### Restore

- 狀態恢復(加入玩家已開始的房間內)
    
    ```typescript
    GameClient.restore(data);
    ```
- Request
    ```typescript
    interface IrestoreReq {
      topicName: number; // 房號
    }
    ```
- Response
    ```typescript
    interface IrestoreRes {
      url: string; // laungeGameUrl
    }
    ```
---
### 通知
### SelfJoin

- 玩家加入房間通知(通知對象: 玩家自己)
    
    ```typescript
    GameClient.setSelfJoinEvent(callback);
    ```
- Notice
    ```typescript
    interface ISelfJoinNotice {
      // 下注列表
      betList: Array<{
        betAmount: number; // 下注金額
        diceType: number; // 下注區種類 1:梅花 2:方塊 3:皇冠 4:旗子 5:黑桃 6:紅心
      }>;

      // 遊戲歷程(路圖)
      histories: IRoadMap[][];

      // 玩家人數
      numberOfPlayer: number;

      // 玩家下注列表
      playerBets: Array<{
        betAmount: number; // 下注金額
        diceType: number; // 下注區種類 1:梅花 2:方塊 3:皇冠 4:旗子 5:黑桃 6:紅心
      }>;

      // 廳房 ID
      themeId: string;
    }

    interface IRoadMap {
      diceCount: number; // 骰子出現次數
      diceType: number; // 下注區種類 1:梅花 2:方塊 3:皇冠 4:旗子 5:黑桃 6:紅心
    }
    ```
---
### PlayerWin

- 玩家加入房間通知(通知對象: 玩家自己)
    
    ```typescript
    GameClient.setPlayerWinEvent(callback);
    ```
- Notice
    ```typescript
    interface IPlayerWinNotice {
      winBonus: number; // 中獎金額
    }
    ```
---
### KickOutPlayer

- 玩家掛機過久踢人通知(準備階段發送: StageReady)(通知對象: 玩家自己)
    備註: 需判斷isKickOut是否為true來斷定是否把玩家踢出
    
    ```typescript
    GameClient.setKickOutPlayerEvent(callback);
    ```
- Notice
    ```typescript
    interface IKickoutPlayerNotice {
        isKickout: number; // 是否踢出
        round: number // 回合數
    }
    ```
---
### CurrentNumberOfPlayer

- 房間人數通知(根據設定每?秒發一次通知)(通知對象: 房間內的所有人)。
    
    ```typescript
    GameClient.setCurrentNumberOfPlayerEvent(callback);
    ```
- Notice
    ```typescript
    interface ICurrentNumberOfPlayerNotice {
        numberOfPlayer: number; // 玩家人數
    }
    ```
---
### CurrentBettingTable

- 房間下注盤面通知(根據設定每?秒發一次通知，且只有開始下注階段到開獎階段會通知StageStartBet->StageLottery)(通知對象: 房間內的所有人或玩家自己)
    
    ```typescript
    GameClient.setCurrentBettingTableEvent(callback);
    ```
- Notice
    ```typescript
    interface ICurrentBettingTableNotice {
      betList: Array<{
        betAmount: number; // 下注金額
        diceType: number; // 下注區種類 1:梅花 2:方塊 3:皇冠 4:旗子 5:黑桃 6:紅心
      }>;
    }
    ```
---
### StageReady

- 切換到準備階段通知(通知對象: 房間內的所有人或玩家自己)
    
    ```typescript
    GameClient.setStageReadyEvent(callback);
    ```
- Notice
    ```typescript
    interface IStageReadyEvent {
      histories: IHistory[][];
      nextStatusTimestamp: number; // 下階段開始時間
      nowStatusTimestamp: number; // 當前階段開始時間
    }

    interface IHistory {
      diceCount: number; // 骰子出現次數
      diceType: number; // 下注區種類 1:梅花 2:方塊 3:皇冠 4:旗子 5:黑桃 6:紅心
    }
    ```
---
### StageStartBet

- 切換到準備階段通知(通知對象: 房間內的所有人或玩家自己)
    
    ```typescript
    GameClient.setStageStartBetEvent(callback);
    ```
- Notice
    ```typescript
    interface IStageStartBetNotice {
      betLimitList: Array<{
        diceType: number; // 下注區種類 1:梅花 2:方塊 3:皇冠 4:旗子 5:黑桃 6:紅心
        lowerLimitAmount: number; // 限紅下限
        uppperLimitAmount: number; // 限紅上限
      }>;
      nextStatusTimestamp: number; // 下個遊戲階段開始時間
      nowStatusTimestamp: number; // 牌桌當前階段的開始時間
    }
    ```
---
### StageStopBet

- 切換到停止下注階段通知(通知對象: 房間內的所有人或玩家自己)
    
    ```typescript
    GameClient.setStageStopBetEvent(callback);
    ```
- Notice
    ```typescript
    interface IStageStopBetNotice {
      nextStatusTimestamp: number; // 下個遊戲階段開始時間
      nowStatusTimestamp: number; // 牌桌當前階段的開始時間
    }
    ```
---
### StageLottery

- 切換到開獎階段通知(通知對象: 房間內的所有人或玩家自己)
    
    ```typescript
    GameClient.setStageLotteryEvent(callback);
    ```
- Notice
    ```typescript
    interface IStageLotteryEvent {
      dices: number[]; //  六顆骰子結果
      nextStatusTimestamp: number; // 下個遊戲階段開始時間
      nowStatusTimestamp: number; // 牌桌當前階段的開始時間
      winTypes: number[]; // 中獎類型
    }
    ```
---
### StageSettlement

- 切換到結算階段通知(通知對象: 房間內的所有人或玩家自己)
    
    ```typescript
    GameClient.setStageSettlementEvent(callback);
    ```
- Notice
    ```typescript
    interface IStageSettlementNotice {
      dices: number[]; //  六顆骰子結果
      nextStatusTimestamp: number; // 下個遊戲階段開始時間
      nowStatusTimestamp: number; // 牌桌當前階段的開始時間
    }
    ```
---