Files
2026-06-12 22:37:02 +08:00

402 lines
11 KiB
C++

//---------------------------------------------------------------------------
#ifndef GameUnitH
#define GameUnitH
//---------------------------------------------------------------------------
#include <system.hpp>
#include <vector>
#include "PolicyUnit.h"
#include "SimpleMutex.h"
#include "GameSettings.h"
#define EXCODE_SERVERWAIT 0x01
#define EXCODE_OPCOMPLETE 0x010
#define EXCODE_USERCANCEL 0x1000
#define EXCODE_INSUFFICIENT 0x1001
#define EXCODE_REACHWINLIMIT 0x1003
#define EXCODE_REACHLOSLIMIT 0x1004
#define EXCODE_WEBSITEERROR 0x1005
#define EXCODE_GAMEOVER 0x1006
#define EXCODE_USERINVALID 0x1007
#define EXCODE_USEREXPIRE 0x1008
#define EXCODE_USERLOGOUT 0x1009
#define EXCODE_NOBETWAY 0x100A
#define EXCODE_REACHLIMIT 0x100B
#define EXCODE_SERVERDOWN 0x100C
#define EXCODE_RESPONSEERR 0x100D
#define EXCODE_CANTSETPAGE 0x100E
#define EXCODE_UNKNOWN 0x1100
#define UM_TAB_UPDATE WM_USER+0x2000
#define UM_LOG_UPDATE WM_USER+0x2001
#define UM_CHART_UPDATE WM_USER+0x2002
#define UM_RUN_TIME WM_USER+0x2003
#define UM_STATE_UPDATE WM_USER+0x2004
#define UM_CHANGE_ROAD WM_USER+0x2005
#define UM_MANUAL_SET WM_USER+0x2006
#define UM_ENTER_TABLE WM_USER+0x2007
#define UM_FLOAT_BET WM_USER+0x2008
#define UM_FLOAT_DEAD WM_USER+0x2009
#define UM_GLOBAL_BET WM_USER+0x200A
#define UM_GLOBAL_DEAD WM_USER+0x200B
#define UPDATE_ROAD 0
#define UPDATE_STATUS 1
#define UPDATE_TIME 2
#define UPDATE_MANBET 3
#define UPDATE_MANRES 4
#define UPDATE_RESET 5 //重置数据
#define UPDATE_IP 6 //重置独立策略
#define STATE_AMOUNT 0
#define STATE_BET_R 1
#define STATE_PEAK 2
#define STATE_COUNT 3
#define STATE_MISC 4
#define STATE_MAN 5
#define STATE_REAL 6
#define STATE_BALANCE 7
#define STATE_LIMIT 8
#define STATE_ALL 0x10
#define LOGEVT_START 0
#define LOGEVT_BET 1
#define LOGEVT_RES 2
#define LOGEVT_ROUND 3
#define LOGEVT_DEAD 4
#define LOGEVT_STOPWIN 5
#define LOGEVT_STOPLOS 6
#define LOGEVT_END 7
#define LOGEVT_RESET 8
#define LOGEVT_SWITCH 9
#define LOGEVT_QUASH 10
#define ST_INIT 0
#define ST_NOBET 1
#define ST_BETSET 2
#define ST_BETTING 3
#define ST_BETTED 4
#define ST_EXPIRED 5
#define ST_PAID 6
#define ST_CANCELED 7
#define ST_FAILED 8
#define ST_QUASH 9 //注单撤销
#define ST_ROUND 10
#define ST_SHUFFLE 11
#define TAB_WAIT -1
#define TAB_NOWAY -2
//---------------------------------------------------------------------------
using namespace std;
//图表数据
typedef struct tagDot{
int val; //数值
int ts; //时间
tagDot(){ memset( this, 0, sizeof(tagDot)); };
tagDot(int v, int t){ val=v,ts=t; };
}TDot;
//挂机日志
typedef struct tagBetLog{
int ts; //时间
int num; //数值
char tno[14];//台桌名
char ev; //事件
char op; //选项
tagBetLog(){memset( this, 0, sizeof(tagBetLog));};
}TBetLog;
// 挂机数据
typedef struct tagBetData{
double profits[8]; //总赢利/总赢利峰值/总赢利谷值/当期赢利/实打总赢利/手工总赢利/当期模拟赢利/当期实打赢利
int amounts[3], //总流水/实打流水/手工流水
counts[4], //赢计数/输计数/最大连赢/连输计数
maxChip, //最大注额
dead; //爆缆次数
tagBetData(){Reset();};
void Reset(){memset( this, 0, sizeof(tagBetData));};
}TBetData;
//手工下注
typedef struct tagManBet{
int chips[3]; //注码 0=庄 1=闲 2=平
int state; //状态 ST_INIT/ST_BETTING/ST_BETTED
tagManBet(){memset( this, 0, sizeof(tagManBet));};
}TManBet;
//阶梯注码
class TRankChip{
protected:
int iType, //注码类型
iRank, //注码层数
nRnkChip; //当层注码
bool bWait; //等待结算
TChipPolicy* pPolicy; //注码方案
public:
TRankChip();
bool __fastcall IsTypeOf(int type){return type==iType;};
void __fastcall SetPolicy(TChipPolicy* pCP);
virtual int __fastcall GetChip(){return bWait || iRank<0 ? -1 : nRnkChip;};
virtual void __fastcall Reset() = 0;
virtual int __fastcall HandleResult(int res, double wl) = 0;
};
//层级注码
class TTierChip : public TRankChip{
int nWLDiff, //本层赢输差
nAccChip, //累加注码
nLos, //当层输额
nCount; //当层下注计数
public:
TTierChip();
virtual void __fastcall Reset();
// virtual int __fastcall GetChip(){return nCurrChip;};
virtual int __fastcall HandleResult(int res, double wl);
};
//阶梯注码
class TLevelChip : public TRankChip{
protected:
bool bGlobal; //总体计算
double fWLDiff; //本层输赢金额
public:
TLevelChip(bool bG=false);
virtual void __fastcall Reset();
virtual void __fastcall CalcChip();
virtual void __fastcall CalcLevelChip(bool bLevel, int res);
virtual int __fastcall HandleResult(int res, double wl);
};
//组合阶梯注码
class TComboChip : public TLevelChip{
int iRnkSeq; //当层注码步骤
int nRnkMul; //当层倍数
TChipPolicy* pRnkPolicy; //当层注码方案
public:
TComboChip(bool bG=false);
virtual void __fastcall Reset();
virtual void __fastcall CalcChip();
virtual void __fastcall CalcLevelChip(bool bLevel, int res);
int __fastcall GetRankSeq(int res, int iRnk, int iSeq);
int __fastcall GetComboChip(int& iRnk, int& iSeq);
};
//赢输次差注码
class TWLDiffChip : public TRankChip{
protected:
bool bGlobal; //总体计算
int nWLDiff; //输赢次差
public:
TWLDiffChip(bool bG=false);
virtual void __fastcall Reset();
virtual void __fastcall CalcChip();
virtual int __fastcall HandleResult(int res, double wl);
};
//路珠图
class TRoadmap{
public:
vector<char*> aCols;
int iCol, iRow, iRoot;
bool bBend;
TRoadmap();
void __fastcall DrawMap(char curr, char last);
void __fastcall Clear();
void __fastcall CheckColumn();
};
//台桌
class TTableFrame;
class TGame
{
public:
int iGame; //gameId
//台桌相关
String vid; //房间号
String gmcode;
int gmstatus; //0=结算 1=下注 2=开牌 11=洗牌 12=维护
int timeout;
int countdown; //固定倒计时
char winCount[3]; //庄闲计数 [0]庄 [1]闲 [2]平
String bcard; //庄牌 2-3张 0-9 0,5,2
String pcard; //闲牌 3,4,_
bool bRun, //运行
bRev, //反打
bPause, //暂停
bReset, //是否重置打法注码
bBreak; //是否等待新局
int iRoad;
bool bIndPolicy; //是否独立策略
int iBetPolicy, iChipPolicy, nChipMul; //独立策略
//下注相关
int iState; //INIT/BETTING/BETTED
int iBet; //下注项
int nChip; //下注金额
int iBetSeq; //下注手数+打法
int iChipSeq; //注码步骤
// bool bGlobalChip; //是否全局注码
bool bReal; //模拟/实打 0=模拟 1=实打
vector<char> aBets; //剩余连续下注项
vector<TManBet> aManBets; //手工下注
TRankChip * pRankChip; //层级注码
//统计相关
double profit; //当前赢利
int seqCount[2]; //连赢/连输计数
HWND hTable; //台桌句柄,通过消息操作UI
CSema* pSema;
//路单数据
vector<char> aRes; //历史结果
vector<char> aRoad[4]; //大路/大眼路/小路/小强路
char lastRoad[4];
TRoadmap aMap[4]; //路珠图
TGame(int iG);
~TGame();
void __fastcall HandleResult(int op=0); //op =0正常处理 =1数据异常 =2结算超时 =3维护注销
void __fastcall AutoBetOn(bool bReset=false);
void __fastcall AutoBetOff(bool bBreak=false);
void __fastcall ManualBetOn(int chips[]);
void __fastcall ManualBetOff();
void __fastcall BetResp(bool bSuc);
void __fastcall Shuffle();
void __fastcall CalcBet();
void __fastcall CalcChip();
int __fastcall CalcResult(int op);
void __fastcall Reset();
void __fastcall ResetBet();
void __fastcall ClearBets();
int __fastcall ParseCard(int c);
void __fastcall ClearResults();
void __fastcall BuildRoadmap(char wt);
bool __fastcall CanBet();
TBetLog* __fastcall NewBetLog();
void __fastcall GameOn();
void __fastcall GameOff();
void __fastcall BetResp(int state, int chips[]=NULL); //state 下注状态 0=成功 10=低于限红 11=高于限红 25=已停止下注 26=余额不足 其它=未知
void __fastcall Pause(bool bP){bPause = bP;};
int __fastcall Color2Bet(TBetPolicy* pBP, char clr); //下三路下注 clr=红蓝 返回庄闲
void __fastcall ClearRankChip();
TRankChip* __fastcall GetRankChip(int type);
void __fastcall ResetIP();
};
class TGameArray : public vector<TGame*>
{
public:
CSema* pSema;
vector<TGame*> aGames;
TBetData betData; //总输赢状态及计数
//游台相关
bool bFloat, //是否游台
bSwitchable; //可否换台
int iFloatGame; //下注台号
//全局注码
int iChipSeq, //全局注码步骤
seqCount[2]; //连赢/连输计数
TRankChip * pRankChip; //层级注码
int runTime, //挂机时长
nBetted[3]; //待结算的下注 模拟/实打/全局计算
double fCurrProfitPeak; //最大当期赢利
TGameArray();
~TGameArray();
void __fastcall Init(String sRooms);
TGame* __fastcall NewGame(int iG, String vid, int ind);
TGame* __fastcall GetGame(int iG);
int __fastcall FindGame(int iG, TGame*& pGame);
void __fastcall ClearAllGames();
void __fastcall CalcBet();
void __fastcall Reset();
void __fastcall ResetFloat();
void __fastcall SetSwitchable(bool bS, int iG);
bool __fastcall CanFloatBet(int iG);
void __fastcall GameOn();
void __fastcall GameOff();
void __fastcall AllBetOff();
void __fastcall ClearRankChip();
void __fastcall ResetRankChip();
TRankChip* __fastcall GetRankChip(int type);
void __fastcall SetCountDown(String s);
void __fastcall ResetRankSeq();
};
class TIPGame
{
public:
String vid; //gameId
int iBetPolicy, iChipPolicy, nChipMul; //独立策略
TGame* pGame;
TIPGame(String v, int b, int c, int m){pGame=NULL, vid=v,
iBetPolicy=b, iChipPolicy=c, nChipMul=m;};
TIPGame(TGame* pG){pGame = pG, vid=pG->vid, iBetPolicy=pG->iBetPolicy,
iChipPolicy=pG->iChipPolicy, nChipMul=pG->nChipMul;};
};
class TIPGameArray : public vector<TIPGame*>
{
public:
int iPlatform;
int __fastcall FindGame(String vid, TIPGame*& pIG);
void __fastcall ClearAll();
void __fastcall AddGame(TGame* pG);
void __fastcall DelGame(TGame* pG);
void __fastcall AddIPGame(String v, int b, int c, int m);
TIPGameArray(){iPlatform==0;};
~TIPGameArray();
};
//---------------------------------------------------------------------------
int __fastcall Vid2Gid(String vid);
extern TSettings g_settings; //基本设置
extern TGameArray g_aGames;
extern double g_fBalance; //账户余额
extern int g_iRoad; //全局路珠类型 0=六珠路 1=大路 2=大眼路 3=小路 4=小强路
extern bool g_bSimulate, //模拟/实打
g_bGameOn, //开始挂机
g_bShowSetting, //开始挂机时显示设置页面
g_bDeadPause, //全局爆缆暂停
g_bBetPause; //总体止赢止损暂停
extern int g_MinOnBet, //最小注码
g_MaxOnBet; //最大注码
extern int g_nRBReport; //实打流水上报
extern vector<TDot> g_aDots[4]; //资金图表数据 总赢利/模拟本金/账户余额/总输赢差
extern TIPGameArray g_aIPGames; //独立策略台桌
#endif