---
# System prepended metadata

title: 妙問答 遊戲封包

---

# 妙問答 遊戲封包

```
剛進遊戲

client送

command:"create" 或者將來送 "tablelist" 
data:"{}"

game server回傳

public class ResultToGame {
private int state = 0;
private long Credit = 0L;
private final String PackageVersion = "0.0.1";
private String command = null;
private String data = null;
private String jackpot = null;
private String ErrorCode = null;
private int ResultCode = 0;
}

ResultCode = 1為成功,其他都失敗,代碼再找時間定義
command = "create"

client收到以data為主,依據command命令會有不同的格式

client會收到TableList,裡面的字串為TableInfo的json格式

public class TableList {
    private ArrayList<String> table;
    private String playerName;
    private long balance;
    private int lasttabletype; //-1表示沒有復原桌
    private int lasttablelevel;//-1表示沒有復原桌
    private long wincoin; //是否贏錢
    private String round; //桌回合
    private String announe; //公告
    private int serverStatus;//有復原時,此桌的server到哪個階段 
    private String ver; //gs版號內含機率版號
    private String currency; //玩家的幣別,client需要記起來,將來用在廣播的handrecord發現跟自己的幣別依樣才更新,因會會收到不同幣別的handrecord
    private long rank; //玩家品級
    private long points;//玩家點數
    private long vip; //玩家VIP等級
    private long lv;    //玩家目前等級
    private long next;  //下次升級經驗值
    private long exp; //目前經驗值
    private long totalbet;//表示玩家使用的金額.
}
公告格式:{\"announce\":\"System under maintenance, we will be back at 08:00 07/09 2021 UTC+8\",\"action\":0}

public class TableDesc {
    private int tableid; //桌號
    private int tabletype; //0萬人桌 1:5人桌
    private long minlimit; //最小限紅
    private long maxlimit; //最大限紅
    private int tableplayer; //桌內人數
    private String option; //client可以選擇下注項目
    private String currency; //此桌幣別
    private int tablelevel; // 等級限制
    private int vip;  // vip限制
    private int quest; //需答題數
    private int reward; //答題數獎勵
    private int difficulty; //難度
    private int rank;  //品級
    private int tokens; //報名費
    private boolean recommend;;//true為推薦桌
    private float taxi; //抽稅(贏家)
}


PS:要能接受沒有桌子的情況
```

```
準備入桌

client送

command:"jointable"
data:"{"tabletype":0,tablenum":0}"
tabletype = 0 萬人桌

tablenum 加入桌號

game server回傳

public class ResultToGame {
private int state = 0;
private long Credit = 0L;
private final String PackageVersion = "0.0.1";
private String command = null;
private String data = null;
private String jackpot = null;
private String ErrorCode = null;
private int ResultCode = 0;
}

ResultCode = 1為成功,其他都失敗,代碼再找時間定義

command = "jointable"

client會收到TableInfo的json格式
public class TableInfo {
    private ArrayList<Integer> totalbethorse;  //萬人桌目前所有馬匹累積投注人數(0~35含獨贏),配合桌內人數client自成一個比例表現
    private int tabletype; //0萬人桌 1五人桌
    private long coin; //玩家目前身上餘額
    private int serverstatus; //目前server到哪個流程
    private int defoption; //玩家入桌後的預設押住選項
    private int tableid;
    private String command;
    private int waitsec; //倒數秒數
    private int resutlCode; //1進桌成功 其他都失敗
    private int tableplayer; //桌內人數
    private String round; //回合
    private int quest; //需答題數
    private int questindex;//0為基底,目前答第幾題
}

public class ServerStatus { //server的狀態代碼,不排除將來還會有新增狀態
public static final int SERVER_INIT = 0;        // 初始狀態
    public static final int SERVER_WAITPLAYER = 1;  // 等待玩家加入
    public static final int SERVER_STARTGAME = 2;  // 開始遊戲表演動畫
    public static final int SERVER_BET = 3;   //下注
    public static final int SERVER_BETSTOP = 4; // 停止下注
    public static final int SERVER_WAITANI = 5; //等待client跑馬表演動畫含結算面板顯示
    public static final int SERVER_NOSERVICE = 9;        //此桌不在服務
    
}
```

```
遊戲開始

client不需要送,由server主動觸發

game server回傳

public class ResultToGame {
private int state = 0;
private long Credit = 0L;
private final String PackageVersion = "0.0.1";
private String command = null;
private String data = null;
private String jackpot = null;
private String ErrorCode = null;
private int ResultCode = 0;
}

ResultCode = 1為成功,其他都失敗,代碼再找時間定義

command = "gamestart"

client會收到StartGame的json格式
public class StartGame {
private int waitsec; //倒數秒數
private int tableid; //此桌編號
private String round; //這局名稱
private int tableplayer; //桌人數
}
```

```
client在表演動畫或結算的狀態,若表演結束時,client上傳一個封包讓server知道表演結束,在server判斷全部client都表演完或者server時間到就會往下一個階段

client送

command:"play"  //目前lobby只接受play命令可以不用等回傳
data:"{}"     //預留將來也許有其他要用

data:"{“updatcoin":10000}" //通知gs更新玩家餘額變成1元

data:"{“again":1}" //妙問答繼續下一局

data:"{“lang":"TW"}" //玩家選擇的語系

server不會回傳任何封包
```


```
通知client使用表情符號

client收到 
command: "emoticon"

public class Emoticon {
    private String nickname; //玩家暱稱
    private int horsenum; //馬匹編號
    private int emot;  //表情圖組
}

public class EmoticonArray {
    private ArrayList<Emoticon> emots; //client會收到使用表情符賀的玩家陣列
}
```
    

```
client打算離開這一桌回到桌列表
client送
command:"returnlobby"
data:{}


game server回傳

public class ResultToGame {
private int state = 0;
private long Credit = 0L;
private final String PackageVersion = "0.0.1";
private String command = null;
private String data = null;
private String jackpot = null;
private String ErrorCode = null;
private int ResultCode = 0;
}

ResultCode = 1為成功,其他都失敗,代碼再找時間定義

command = "returnlobby"

public class ReturnLobby {

private long balance; //玩家身上餘額
private int ResultCode; //離桌原因
private int tableid;
    
}

ResultCode:
1:正常離桌
其他代碼都是不允許
```


```
通知client可以下注

client收到
command:"firstbet"
就能下注,注意倒數秒數到就不能再下注

client會收到FirstBet的json格式
public class FirstBet { //收到這個可以下注
private int waitsec; //倒數秒數
private int tableid; //此桌編號
private String round; //局號
private int quest; //需答題數
private int questindex;//0為基底,目前答第幾題
private QuestionClientData  gamequest;
private int aianswer; //AI回答第幾題
private String sound; //AI語音mp3會暫時固定
    
}

public class FirstResult { //下注結果
    private int waitsec; //倒數秒數
    private long balance; //玩家目前贏錢後的餘額
    private int tableid; //此桌編號
    private long sn; //server序號,方便debug
    private String round; //局號
    private long totalbet;  //這次總投注
    private long totalscore; //這次總派彩
    private int quest; //需答題數
    private int questindex;//0為基底,目前答第幾題
    private int option;//答案編號
    private int correct;//答對數量
    private int score;//表示得分點數
    private int free;//表示參加費用
    private long reward;//表示獎金
    //////////////結算會更新底下資料/////////////////
    private int order;//玩家這場排名
    private int vip; //玩家VIP等級
    private int rank;//玩家品級.
    private int lv;//玩家目前等級.
    private int next;//下次升級經驗值
    private int exp;//目前經驗值.
    private int points;//玩家點數
}

public class QuestionClientData {
    private ArrayList<QtypeData> Qtype;
    private String C_Pic;
    private String B_Pic;
    private String D_Pic;
    private String A_Pic;
    private String Stype;
    private String Difficulty;
    private ArrayList<ItemData> Items;
    //private String Items;
    ///////////
    private int id;         //此題在db的id欄位,將來可以用來避免出相同圖庫
    private int resultCode; //這次取題目是否成功,1:成功,其他值失敗
    }

client收到"firstbet"表示可以下注

client送上來
command:"bet"
data:"{"option":5,"betobject":0}"

option:0~3答案四選一

object: 目前無用處,先直接給0

game server回傳

public class ResultToGame {
private int state = 0;
private long Credit = 0L;
private final String PackageVersion = "0.0.1";
private String command = null;
private String data = null;
private String jackpot = null;
private String ErrorCode = null;
private int ResultCode = 0;
}

ResultCode = 1為成功,其他都失敗,代碼再找時間定義

command = "bet"

client會收到BetResult的json格式
public class BetResult {
    private int bet; //玩家選擇哪個答案
    private long coin; //玩家目前的餘額
    private int tableid;
    private int resultcode; //這次下注結果
    private int option;//選擇哪一個答案
}
resultcode
1:下注成功
0:下注失敗(原因可能是不是下注階段或者餘額不足統稱下注失敗)


**不提供client批次下次功能**


```


```
通知client 離桌

client收到
command:kickplayer

此命令萬人桌要回到桌列表
五人桌可能要表現成觀局或者回到桌列表,再討論

public class LeaveTable {
    private long balance; //玩家身上餘額
    private int reason; //離桌原因
    private int tableid; //確認是哪一桌送來的,client要判斷目前是否同一個桌號
}

reason:
0 未投注
1:餘額不足
2:系統維護
3:正常離桌
```

```
通知client公告

client收到
command:announce

此命令是一些公告

public class Announce{
      private String announce; //公告內容,tim說都英文
    private int action;  //玩家需要動作
}

action
0:不用特別動作（用在先提醒玩家）
1:桌內玩家這回合結束就不能再下注,桌列表也不給桌子
2:有緊急狀況,server馬上要下線
```

```
通知client表演籌碼投注

client收到
command:showcoin

此命令萬人桌要表演很多人投注情況用,在投注階段大概每200ms會收到一次這個封包,所以會有點密集

public class ShowCoin{
  private ArrayList<Integer> totalbethorse;  //萬人桌目前所有馬匹累積投注人數(0~35含獨贏),配合桌內人數client自成一個比例表現
  private int tableplayer; //桌內玩家
    private int tableid; //此桌編號
    private String command;
}
```
```

通知client更新每手紀錄

client收到 
command:refreshtable

public class RefreshTable {
    private int tableid;  //桌id
    private String currency; //幣別
    private ArrayList<Integer> horserecord;// 8X6 = 48: 馬編號 /近5場名次 //
    private ArrayList<Integer> datarecord; //最近100場紀錄
    private int noghorsecount; //黃金馬未開次數
    private int noclassicrace; //經典賽未開次數
    private int tableplayer; //桌內人數
}

**只有currency與create的tableist同一個幣別才更新
```



    