4354 lines
111 KiB
C++
4354 lines
111 KiB
C++
//---------------------------------------------------------------------------
|
|
|
|
#include <vcl.h>
|
|
#include <mmsystem.h>
|
|
#include <Tlhelp32.h>
|
|
#pragma hdrstop
|
|
|
|
#include "RBmasterMain.h"
|
|
#include "CommonV8Handler.h"
|
|
#include "HttpThread.h"
|
|
#include "GlobalUnit.h"
|
|
#include "BacABThread.h"
|
|
#include "BacDPThread.h"
|
|
#include "BacJSThread.h"
|
|
#include "GameUnit.h"
|
|
#include "UtilityUnit.h"
|
|
#include "HookJS.h"
|
|
#include "LoginUnit.h"
|
|
#include "PolicyEditFormUnit.h"
|
|
#include "TableSet.h"
|
|
#include "BetLogFormUnit.h"
|
|
#include "ChartFormUnit.h"
|
|
#include "SettingFormUnit.h"
|
|
#include "ResetFormUnit.h"
|
|
#include "ChipsFormUnit.h"
|
|
#include "ActCodeFormUnit.h"
|
|
|
|
#define USER_VAR_FILE "rbmvrf"
|
|
#define USER_VAR_VERSION 0x02
|
|
#define USER_WEB_FILE "rbmwbf"
|
|
#define USER_WEB_VERSION 0x01
|
|
|
|
#define USER_GAME_FILE "rbmgmf"
|
|
#define USER_GAME_VERSION 0x0F
|
|
//0x0C 增加清空台桌下注记录/开局X手后... v3.2.0
|
|
//0x0D 调整游台换台策略 v3.2.1
|
|
//0x0E 增加连续下注忽略和 v3.8.2
|
|
|
|
#define UR_LOGIN 0x10
|
|
#define UR_REPORT 0x100
|
|
#define UR_LOGOUT 0x101
|
|
|
|
//---------------------------------------------------------------------------
|
|
#pragma package(smart_init)
|
|
#pragma comment(lib, "winmm")
|
|
#pragma link "TableUnit"
|
|
#pragma link "InfoFrameUnit"
|
|
#pragma resource "*.dfm"
|
|
TMainForm *MainForm;
|
|
|
|
typedef struct tUVFHeader{
|
|
char head[4];
|
|
|
|
tUVFHeader(){
|
|
head[0] = 'U';
|
|
head[1] = 'V';
|
|
head[2] = 'F';
|
|
head[3] = USER_VAR_VERSION;
|
|
}
|
|
} TUVFHEADER;
|
|
|
|
typedef struct tUGFHeader{
|
|
char head[4];
|
|
|
|
tUGFHeader(){
|
|
head[0] = 'U';
|
|
head[1] = 'G';
|
|
head[2] = 'F';
|
|
head[3] = USER_GAME_VERSION;
|
|
}
|
|
} TUGFHEADER;
|
|
|
|
typedef struct tUWFHeader{
|
|
char head[4];
|
|
|
|
tUWFHeader(){
|
|
head[0] = 'U';
|
|
head[1] = 'W';
|
|
head[2] = 'F';
|
|
head[3] = USER_WEB_VERSION;
|
|
}
|
|
} TUWFHEADER;
|
|
|
|
typedef struct tUWFData{
|
|
char id[32];
|
|
char li[16];
|
|
char gt[16];
|
|
char un[32];
|
|
char dm[64];
|
|
char fw[512];
|
|
char url[2048];
|
|
|
|
tUWFData(){memset(this, 0, sizeof(this));};
|
|
} TUWFDATA;
|
|
|
|
#define MAX_STR_LEN 256
|
|
#define WSNUM 9
|
|
char* websites[WSNUM] = { "gci.dsn20102022.co",
|
|
"gci.jnhui0032.com",
|
|
"gci.bnm8585.com",
|
|
"gci.bcasiaintegration.com",
|
|
"gci.gnroi.club",
|
|
"gci.wy168y.com",
|
|
"gci.71xfky6dmujm0i5.com",
|
|
"gci.4kh1mb8gkpb5.com",
|
|
"gci.myf7f3bx.com"
|
|
};
|
|
char* urServer = "23.236.66.46:88"; //"127.0.0.1:10800"; //
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
int UTF8ToGBK( const char *pcUtf8, AnsiString& strGBK )
|
|
{
|
|
int nUnicodeLen = MultiByteToWideChar(CP_UTF8, 0, pcUtf8, -1, NULL, 0);
|
|
|
|
wchar_t * pcUnicode = new wchar_t[nUnicodeLen+1];
|
|
memset(pcUnicode, 0, nUnicodeLen * 2 + 2);
|
|
|
|
//utf8 to unicode
|
|
MultiByteToWideChar(CP_UTF8, 0, pcUtf8, -1, pcUnicode, nUnicodeLen);
|
|
|
|
//unicode to GBK
|
|
int nGBKLen = WideCharToMultiByte(CP_ACP, 0, pcUnicode, -1, NULL, 0, NULL, NULL);
|
|
|
|
char *pcGBK=new char[nGBKLen + 1];
|
|
memset(pcGBK, 0, nGBKLen + 1);
|
|
|
|
WideCharToMultiByte(CP_ACP, 0, pcUnicode, -1, pcGBK, nGBKLen, NULL, NULL);
|
|
|
|
strGBK=pcGBK;
|
|
delete[] pcGBK;
|
|
delete[] pcUnicode;
|
|
|
|
return 0;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
__fastcall TMainForm::TMainForm(TComponent* Owner)
|
|
: TForm(Owner)
|
|
{
|
|
m_vlThread = m_jsThread = m_dpThread = m_urThread = NULL;
|
|
m_bClosing = false;
|
|
m_bWebLogon = m_bManual = false;
|
|
m_chrm = NULL;
|
|
m_pDPTimer = m_pUtilTimer = NULL;
|
|
m_nTabCols = m_nTabGap = 0;
|
|
m_nTabShow = 15;
|
|
m_nTabRun = 0;
|
|
m_tmBetPause = m_tmDeadPause = m_tmWebFocus = m_tmChart = m_tmCount = m_tmLogon = 0;
|
|
|
|
m_hV8Sema = CreateSemaphore( NULL, 1, 1, NULL );
|
|
m_hV8ValueSema = CreateSemaphore( NULL, 0, 1, NULL );
|
|
m_v8Values = new TStringList;
|
|
|
|
m_iWindowState = wsNormal;
|
|
|
|
m_iWSVelo = m_iWS = -1;
|
|
m_idDevice = m_tExpire = 0;
|
|
|
|
m_bDragReady = m_bDraging = false;
|
|
m_pDragTimer = NULL;
|
|
m_iLastSel = -1;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormCreate(TObject *Sender)
|
|
{
|
|
m_hPMDll = LoadLibrary(L"Paramencode.dll");
|
|
if( !m_hPMDll || !(PM_ParamEncode=(PM_PARAMENCODE)GetProcAddress(m_hPMDll, "ParamEncode")) ){
|
|
Tag = -1;
|
|
return;
|
|
}
|
|
|
|
// 执行文件版本信息
|
|
DWORD dwHandle;
|
|
DWORD dwVerLen = GetFileVersionInfoSize(Application->ExeName.c_str(), &dwHandle);
|
|
if (dwVerLen) {
|
|
TCHAR *lpData = new TCHAR[dwVerLen];
|
|
if (GetFileVersionInfo(Application->ExeName.c_str(), 0, dwVerLen, lpData)) {
|
|
PVSFixedFileInfo lpffi;
|
|
UINT uLen;
|
|
if (VerQueryValue(lpData, TEXT("\\"), (void **)&lpffi, &uLen)) {
|
|
m_version[0] = HIWORD(lpffi->dwFileVersionMS);
|
|
m_version[1] = LOWORD(lpffi->dwFileVersionMS);
|
|
m_version[2] = HIWORD(lpffi->dwFileVersionLS);
|
|
m_version[3] = LOWORD(lpffi->dwFileVersionLS);
|
|
}
|
|
}
|
|
delete[]lpData;
|
|
}
|
|
|
|
Caption = APPNAME;
|
|
Caption = Caption + " " + IntToStr(m_version[0]) + "." + IntToStr(m_version[1]);
|
|
|
|
if( g_bTesting )
|
|
Caption = Caption + " -测试模式";
|
|
|
|
Tag = InitGlobalVars();
|
|
if( Tag<0 || Tag==2 )
|
|
return;
|
|
|
|
// 获取DPI
|
|
HDC hdc = GetDC(NULL);
|
|
if (hdc != NULL) {
|
|
g_xDpi = GetDeviceCaps(hdc, LOGPIXELSX);
|
|
g_yDpi = GetDeviceCaps(hdc, LOGPIXELSY);
|
|
ReleaseDC(NULL, hdc);
|
|
}
|
|
|
|
m_pDPTimer = new TTimer(NULL);
|
|
m_pDPTimer->OnTimer = DPTimerProc;
|
|
m_pDPTimer->Interval = 1000;
|
|
m_pDPTimer->Enabled = false;
|
|
|
|
Randomize();
|
|
GetDeviceId();
|
|
|
|
int tmRand = Random(30); //10-30秒随机间隔避免并发请求
|
|
m_tmDailyLogin = 300 + tmRand; //00:05:00 - 00:05:30 请求用户信息
|
|
m_tmDailyReport = 86400 - tmRand - 15; //23:59:15 - 23:59:45 上报实打流水
|
|
|
|
LoadPolicies();
|
|
FileUserVars();
|
|
FileGame();
|
|
|
|
for(int i=0; i<g_aBetPolicies.size(); i++){
|
|
TBasePolicy* pPolicy = g_aBetPolicies[i];
|
|
m_cbBetWays->AddItem(pPolicy->name,NULL);
|
|
}
|
|
if(g_iBetPolicy<g_aBetPolicies.size())
|
|
m_cbBetWays->ItemIndex = g_iBetPolicy;
|
|
else
|
|
g_iBetPolicy = -1;
|
|
|
|
for(int i=0; i<g_aChipPolicies.size(); i++){
|
|
TBasePolicy* pPolicy = g_aChipPolicies[i];
|
|
m_cbBetChips->AddItem(pPolicy->name,NULL);
|
|
}
|
|
if(g_iChipPolicy>=0 && g_iChipPolicy<g_aChipPolicies.size())
|
|
m_cbBetChips->ItemIndex = g_iChipPolicy;
|
|
else{
|
|
g_iChipPolicy = -1;
|
|
g_nChipMul = 0;
|
|
}
|
|
if(g_nChipMul>0){
|
|
m_leChipMul->Text = g_nChipMul;
|
|
m_leChipMul->Enabled = true;
|
|
}
|
|
|
|
if(g_iPlatform > m_pmLogin->Items->Count)
|
|
g_iPlatform = 0;
|
|
else if(g_iPlatform>0)
|
|
m_pmLogin->Items->Items[g_iPlatform-1]->Checked = true;
|
|
|
|
AppendMenu(GetSystemMenu(Handle,false),MF_SEPARATOR,0,L"");
|
|
AppendMenu(GetSystemMenu(Handle,false),MF_STRING,200,L"软件操作说明(&D)");
|
|
AppendMenu(GetSystemMenu(Handle,false),MF_STRING,201,L"授权验证(&A)...");
|
|
|
|
if(g_iPlatform==PF_PA && m_iWS<0)
|
|
WebsiteVelocity();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::CreateParams(TCreateParams &Params)
|
|
{
|
|
TForm::CreateParams(Params);
|
|
|
|
String strFullName = TPath::GetFullPath(Application->ExeName);
|
|
wcscpy(Params.WinClassName, (LPCTSTR)strFullName.c_str());
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormShow(TObject *Sender)
|
|
{
|
|
if(!m_dpThread){
|
|
m_dpThread = new TDataParseThread();
|
|
m_dpThread->Start();
|
|
}
|
|
|
|
m_pUtilTimer = new TTimer(NULL);
|
|
m_pUtilTimer->Tag = -1;
|
|
m_pUtilTimer->OnTimer = UtilTimerProc;
|
|
m_pUtilTimer->Interval = 500;
|
|
m_pUtilTimer->Enabled = true; //false; //
|
|
|
|
m_cbBetWays->SelLength = 0;
|
|
m_cbBetChips->SelLength = 0;
|
|
|
|
m_tsMode->State = g_bSimulate ? tssOff : tssOn;
|
|
|
|
///////////////////////////////////////////
|
|
//test
|
|
// for(int i=0; i<75; i++){
|
|
// TGame* pG = new TGame(100+i);
|
|
// pG->vid = pG->iGame;
|
|
// pG->iState = ST_BETTING;
|
|
// g_aGames.push_back(pG);
|
|
//
|
|
// TTableFrame* pT = new TTableFrame(NULL);
|
|
// pT->Parent = m_panWeb;
|
|
// pT->SetGame(pG);
|
|
//
|
|
// m_aTables.push_back(pT);
|
|
// }
|
|
// ResetTableGrid();
|
|
// int ts = DateTimeToUnix(Now(), false);
|
|
// for(int i=0; i<100; i++){
|
|
// PostMessage(m_aTables[0]->Handle, UM_LOG_UPDATE, ST_ROUND, 0);
|
|
// TBetLog* pLog = new TBetLog;
|
|
// pLog->ts = ts++;
|
|
// pLog->ev = LOGEVT_START;
|
|
// SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
// }
|
|
// PostMessage(m_aTables[0]->Handle, UM_LOG_UPDATE, ST_FAILED, 25);
|
|
|
|
|
|
///////////////////////////////////////////
|
|
}
|
|
//--------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormCloseQuery(TObject *Sender, bool &CanClose)
|
|
{
|
|
if( !m_bClosing ){
|
|
if(g_bGameOn){
|
|
int mrRet = MessageBox(Handle, L"正在挂机中,是否确定退出程序?", L"退出",
|
|
MB_ICONQUESTION | MB_OKCANCEL);
|
|
|
|
if( mrRet==mrCancel ){
|
|
CanClose = false;
|
|
return;
|
|
}
|
|
else{
|
|
GameOff();
|
|
}
|
|
}
|
|
else{
|
|
RBReport();
|
|
}
|
|
|
|
if(g_aGames.nBetted[0] || g_aGames.nBetted[1]){
|
|
int mrRet = MessageBox(Handle, L"尚有结算未完成,是否确定退出程序?", L"退出",
|
|
MB_ICONQUESTION | MB_OKCANCEL);
|
|
|
|
if( mrRet==mrCancel ){
|
|
CanClose = false;
|
|
return;
|
|
}
|
|
}
|
|
|
|
Logout();
|
|
}
|
|
|
|
ClearVLThread();
|
|
ClearJSThread();
|
|
ClearABThread();
|
|
ClearDPThread();
|
|
|
|
if( m_pDPTimer ){
|
|
delete m_pDPTimer;
|
|
m_pDPTimer = NULL;
|
|
}
|
|
|
|
ClearUtilTimer();
|
|
|
|
if( m_hV8Sema ){
|
|
CloseHandle( m_hV8Sema );
|
|
m_hV8Sema = NULL;
|
|
}
|
|
|
|
if( m_hV8ValueSema ){
|
|
CloseHandle( m_hV8ValueSema );
|
|
m_hV8ValueSema = NULL;
|
|
}
|
|
|
|
if( m_v8Values ){
|
|
delete m_v8Values;
|
|
m_v8Values = NULL;
|
|
}
|
|
|
|
if( !m_bClosing && m_chrm ){
|
|
m_bClosing = true;
|
|
m_chrm->CloseBrowser(true);
|
|
CanClose = false;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
|
|
{
|
|
if(m_urThread){
|
|
Sleep(500);
|
|
ClearURThread();
|
|
}
|
|
|
|
if( m_hPMDll )
|
|
FreeLibrary( m_hPMDll );
|
|
|
|
if( m_chrm ){
|
|
delete m_chrm;
|
|
m_chrm = NULL;
|
|
}
|
|
|
|
ClearGames();
|
|
|
|
FileGame( true );
|
|
FileUserVars( true );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormActivate(TObject *Sender)
|
|
{
|
|
if(ChartForm && ChartForm->WindowState==wsMaximized){
|
|
FormStyle = fsStayOnTop;
|
|
Application->BringToFront();
|
|
FormStyle = fsNormal;
|
|
}
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormResize(TObject *Sender)
|
|
{
|
|
ResetIdle();
|
|
|
|
if(m_iWindowState==wsMaximized && WindowState==wsNormal){ //恢复
|
|
SetBounds(m_nLeft, m_nTop, m_nWidth, m_nHeight);
|
|
}
|
|
|
|
if(m_iWindowState!=wsMinimized && WindowState!=wsMinimized){
|
|
if(m_frmInfo->Width < ClientWidth)
|
|
m_frmInfo->Left = (ClientWidth - m_frmInfo->Width) / 2;
|
|
else
|
|
m_frmInfo->Left = 0;
|
|
|
|
m_panTopBar->Left = (ClientWidth - m_panTopBar->Width) / 2;
|
|
|
|
//是否自动调整高度
|
|
int hPan = ClientHeight - m_panTopBar->Top - m_panTopBar->Height - 2,
|
|
nRem = hPan % TFHEIGHT;
|
|
if(nRem < DPIY(12))
|
|
ClientHeight -= nRem;
|
|
else if(TFHEIGHT-nRem < DPIY(12))
|
|
ClientHeight += TFHEIGHT-nRem;
|
|
|
|
m_panWeb->Height = ClientHeight - m_panTopBar->Top - m_panTopBar->Height;
|
|
|
|
m_lblTips->Left = (m_panWeb->Width - m_lblTips->Width) / 2;
|
|
m_lblAnnonce->Top = m_panWeb->Height - DPIY(50);
|
|
|
|
bool bResetGrid = false;
|
|
int nWidth = m_panWeb->Width-DPIX(20);//留出滚动条位置
|
|
int nTabCols = nWidth / TFWIDTH;
|
|
int nTabGap = (nWidth % TFWIDTH) / (nTabCols-1);
|
|
if(m_nTabCols!=nTabCols){ //列数改变
|
|
m_nTabCols = nTabCols;
|
|
m_panWeb->VertScrollBar->Position = 0; //滚动条复位
|
|
bResetGrid = true;
|
|
}
|
|
if(m_nTabGap != nTabGap){
|
|
m_nTabGap = nTabGap;
|
|
bResetGrid = true;
|
|
}
|
|
if(bResetGrid)
|
|
ResetTableGrid();
|
|
|
|
int dpi5 = DPIX(5), dpi60 = DPIX(60);
|
|
if(ChipsForm && ChipsForm->Width < dpi60){
|
|
int x = Left > dpi60 ? ChipsForm->Width - dpi5 : -dpi5; //放置到窗口内外
|
|
TPoint pt = TPoint(x, m_panWeb->Top);
|
|
pt = ClientToScreen(pt);
|
|
ChipsForm->Left = pt.x;
|
|
ChipsForm->Top = pt.y;
|
|
ChipsForm->BringToFront();
|
|
}
|
|
}
|
|
|
|
if(m_iWindowState==wsNormal && WindowState==wsNormal){
|
|
m_nWidth = Width, m_nHeight = Height;
|
|
}
|
|
|
|
m_iWindowState = WindowState;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormMove(TWMMove &msg)
|
|
{
|
|
if(Visible && WindowState!=wsMaximized)
|
|
m_nLeft = Left, m_nTop = Top;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
|
|
{
|
|
ResetIdle();
|
|
|
|
if(ActiveControl && (ActiveControl->ClassNameIs(TComboBox::ClassName())
|
|
|| ActiveControl->ClassNameIs(TLabeledEdit::ClassName())))
|
|
return;
|
|
|
|
if(!m_aTables.empty()){
|
|
if(Key==VK_UP){
|
|
m_panWeb->Perform(WM_VSCROLL,SB_LINEUP,0);
|
|
}
|
|
else if(Key==VK_DOWN){
|
|
m_panWeb->Perform(WM_VSCROLL,SB_LINEDOWN,0);
|
|
}
|
|
else if(Key==VK_PRIOR){ //pageup
|
|
m_panWeb->Perform(WM_VSCROLL,SB_PAGEUP,0);
|
|
}
|
|
else if(Key==VK_NEXT){ //pagedown
|
|
m_panWeb->Perform(WM_VSCROLL,SB_PAGEDOWN,0);
|
|
}
|
|
else if(Key==VK_HOME){
|
|
m_panWeb->Perform(WM_VSCROLL,SB_TOP,0);
|
|
}
|
|
else if(Key==VK_END){
|
|
m_panWeb->Perform(WM_VSCROLL,SB_BOTTOM,0);
|
|
}
|
|
else if(Key=='A' && Shift.Contains( ssCtrl )){
|
|
if(!m_bManual){
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
m_aTables[i]->SetSel(true);
|
|
m_aSelTabs.insert(i);
|
|
}
|
|
LockWindowUpdate(0);
|
|
}
|
|
}
|
|
else if(Key==VK_ESCAPE){
|
|
ClearSelect();
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
|
|
{
|
|
ResetIdle();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::SystemMenuCommand(TWMMenuSelect &Msg)
|
|
{
|
|
TForm::Dispatch(&Msg);
|
|
if(Msg.IDItem==200){
|
|
PostMessage(Handle, UM_OPENMAUAL, 0, 0);
|
|
}
|
|
else if(Msg.IDItem==201){
|
|
PostMessage(Handle, UM_SUBFORMSHOWN, 0, 0);
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearUtilTimer()
|
|
{
|
|
if(m_pUtilTimer){
|
|
delete m_pUtilTimer;
|
|
m_pUtilTimer = NULL;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearVLThread()
|
|
{
|
|
if( m_vlThread ){
|
|
((TVeloThread*)m_vlThread)->Cancel();
|
|
m_vlThread->WaitFor();
|
|
|
|
delete m_vlThread;
|
|
m_vlThread = NULL;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearJSThread()
|
|
{
|
|
if( m_jsThread ){
|
|
((TJSHandleThread*)m_jsThread)->Cancel();
|
|
m_jsThread->WaitFor();
|
|
|
|
delete m_jsThread;
|
|
m_jsThread = NULL;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearURThread()
|
|
{
|
|
if( m_urThread ){
|
|
((TAsynHttpThread*)m_urThread)->Cancel();
|
|
m_urThread->WaitFor();
|
|
|
|
delete m_urThread;
|
|
m_urThread = NULL;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearDPThread()
|
|
{
|
|
if( m_dpThread ){
|
|
((TDataParseThread*)m_dpThread)->Cancel();
|
|
m_dpThread->WaitFor();
|
|
|
|
delete m_dpThread;
|
|
m_dpThread = NULL;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearABThread(int hThread)
|
|
{
|
|
vector<TThread*>::iterator itTh = m_aABThreads.begin();
|
|
|
|
while( itTh!=m_aABThreads.end() ){
|
|
if( hThread==0 || (*itTh)->Handle==hThread ){
|
|
((TBaseThread*)(*itTh))->Cancel();
|
|
(*itTh)->WaitFor();
|
|
delete (*itTh);
|
|
|
|
itTh = m_aABThreads.erase(itTh);
|
|
|
|
if( hThread!=0 )
|
|
break;
|
|
}
|
|
else
|
|
itTh++;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall TMainForm::InitGlobalVars()
|
|
{
|
|
char szBuffer[2048] = "",
|
|
szFile[256];
|
|
bool bSave = false;
|
|
int iUpdate = 0;
|
|
FILE* fp = NULL;
|
|
|
|
//读取文件配置
|
|
sprintf( szFile, "%s\\%s", g_AppPath, GLOBAL_VAR_FILE );
|
|
fp = fopen( szFile, "rb" );
|
|
if( fp ){
|
|
TGVFHEADER header;
|
|
int ret = fread( (void*)szBuffer, 1, sizeof(header), fp );
|
|
|
|
if( ret==sizeof(header) && !memcmp(szBuffer, header.head, sizeof(header.head)) ){
|
|
if( ((TGVFHEADER*)szBuffer)->iUpdate > 0 ){ //需要完成更新
|
|
ret = TryUpdate(); //尝试更新
|
|
if( ret==0 )
|
|
bSave = true; //需更改标志
|
|
else if( ret==1 )
|
|
iUpdate = 1;
|
|
else if( ret==3 ){
|
|
fclose( fp );
|
|
|
|
return ret;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
bSave = true;
|
|
|
|
fclose( fp );
|
|
}
|
|
else
|
|
bSave = true;
|
|
|
|
DebugPrint( "server: %s", urServer );
|
|
|
|
//获取版本信息
|
|
int num = 3, str_len;
|
|
char arrMap[3][2][MAX_STR_LEN] = { {"op", "getInfo"},
|
|
{"sid", ""},
|
|
{"ver", ""}};
|
|
|
|
sprintf( arrMap[1][1], "%d", SOFTWARE_ID );
|
|
sprintf( arrMap[2][1], "%d", m_version[0]*10000 + m_version[1]*100 + m_version[2] );
|
|
|
|
char strEncode[256];
|
|
int enc = PM_ParamEncode( strEncode, &str_len, arrMap, num );
|
|
|
|
DebugPrint( "ret=%d, str=%s", enc, strEncode );
|
|
|
|
char szReturn[2048];
|
|
int len = 2048;
|
|
int ret = 0;
|
|
|
|
THttpParam param;
|
|
strcpy( param.server, urServer );
|
|
param.sizeIn = str_len;
|
|
param.dataIn = strEncode;
|
|
param.sizeOut = len;
|
|
param.dataOut = szReturn;
|
|
strcpy( param.api, "Api" );
|
|
|
|
DWORD id;
|
|
HANDLE hThread = CreateThread( NULL, 0, HttpProc, ¶m, 0, &id );
|
|
if( hThread ){
|
|
DWORD dwRet = WaitForSingleObject( hThread, 10000 );
|
|
if( param.hRequest )
|
|
InternetCloseHandle( param.hRequest );
|
|
if( param.hConnect )
|
|
InternetCloseHandle( param.hConnect );
|
|
if( param.hSession )
|
|
InternetCloseHandle( param.hSession );
|
|
|
|
param.hSession = param.hConnect = param.hRequest = NULL;
|
|
|
|
WaitForSingleObject( hThread, 200 );
|
|
CloseHandle( hThread );
|
|
|
|
if( dwRet==WAIT_OBJECT_0 && param.errCode==0 ){ //线程正常退出
|
|
DebugPrint( "infoReturn %s", szReturn );
|
|
if(szReturn[0]=='\"' && szReturn[param.sizeOut-1]=='\"')
|
|
szReturn[param.sizeOut-1] = 0;
|
|
|
|
char* pos;
|
|
if( pos = strstr( szReturn, "err:" ) ){
|
|
int err;
|
|
sscanf( pos+4, "%d", &err );
|
|
ret = -4;
|
|
}
|
|
else if(strstr( szReturn, "flg" )){
|
|
char *tokenPtr=strtok(szReturn,"|");
|
|
while( tokenPtr ){
|
|
if( pos = strstr(tokenPtr, "flg") ){
|
|
int flg;
|
|
sscanf( pos+4, "%d", &flg );
|
|
|
|
if(flg==0)
|
|
return 2;
|
|
}
|
|
else if( pos = strstr(tokenPtr, "ver") ){
|
|
int ver;
|
|
sscanf( pos+4, "%d", &ver );
|
|
|
|
WORD major = ver / 10000,
|
|
minor = (ver % 10000) / 100,
|
|
release = ver % 100;
|
|
|
|
if(major>m_version[0] || major==m_version[0] && minor>m_version[1])
|
|
ret = 4;
|
|
else if(major==m_version[0] && minor==m_version[1] && release>m_version[2])
|
|
ret = 1;
|
|
}
|
|
tokenPtr=strtok(NULL,"|");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
ret = -3;
|
|
}
|
|
else
|
|
ret = -3;
|
|
|
|
//写入配置文件
|
|
if( bSave ){
|
|
fp = fopen( szFile, "wb" );
|
|
if( fp ){
|
|
szBuffer[0] = 0;
|
|
|
|
TGVFHEADER header;
|
|
header.iUpdate = iUpdate;
|
|
fwrite( (void*)&header, sizeof(header), 1, fp );
|
|
|
|
sprintf(szBuffer, "srv=%s", urServer);
|
|
fwrite( szBuffer, 1, strlen(szBuffer)+1, fp );
|
|
fclose( fp );
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall TMainForm::TryUpdate()
|
|
{
|
|
//处理只更新Upgrade.exe的情况
|
|
TSearchRec sr;
|
|
int iAttr = 0;
|
|
|
|
int ret = 0;
|
|
String strPath = g_AppPath;
|
|
strPath += L"upgrade\\";
|
|
|
|
if( FindFirst(strPath + L"*.*", iAttr, sr)==0 ){
|
|
do{
|
|
if( !(iAttr & faDirectory) && sr.Name.CompareIC(UPDATE_APP_NAME)
|
|
&& sr.Name.CompareIC(MD5_FILE_NAME) ){
|
|
ret = 3;
|
|
break;
|
|
}
|
|
}
|
|
while( FindNext(sr)==0 );
|
|
|
|
FindClose(sr);
|
|
}
|
|
|
|
String fOld = strPath + UPDATE_APP_NAME;
|
|
if( FileExists( fOld, false ) ){
|
|
//等待进程关闭
|
|
HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0 ); //获取进程快照
|
|
if( hSnapshot ){
|
|
DWORD idProcess = 0;
|
|
PROCESSENTRY32 pe32;
|
|
Process32First( hSnapshot, &pe32 ); //指向第一个进程
|
|
do{
|
|
if( lstrcmpi( pe32.szExeFile, _TEXT(UPDATE_APP_NAME) )==0 ){ //查找进程
|
|
idProcess = pe32.th32ProcessID;
|
|
break;
|
|
}
|
|
}
|
|
while( Process32Next(hSnapshot, &pe32) ); // 循环直到取不到进程
|
|
|
|
if( idProcess ){
|
|
HANDLE hApp= OpenProcess( PROCESS_ALL_ACCESS, FALSE, idProcess ); //根据进程ID获取程序的句柄
|
|
if( hApp ){
|
|
if( WaitForSingleObject( hApp, 2000 )==WAIT_TIMEOUT )// 等待程序关闭2秒
|
|
TerminateProcess( hApp, 0 );
|
|
|
|
CloseHandle( hApp );
|
|
}
|
|
}
|
|
|
|
CloseHandle( hSnapshot );
|
|
}
|
|
|
|
String fNew = (String)g_AppPath + UPDATE_APP_NAME;
|
|
if( !MoveFileEx( fOld.c_str(), fNew.c_str(), MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH ) )
|
|
ret = 1;
|
|
}
|
|
|
|
fOld = strPath + MD5_FILE_NAME;
|
|
if( FileExists( fOld, false ) ){
|
|
String fNew = (String)g_AppPath + MD5_FILE_NAME;
|
|
if( !MoveFileEx( fOld.c_str(), fNew.c_str(), MOVEFILE_REPLACE_EXISTING|MOVEFILE_WRITE_THROUGH ) )
|
|
ret = 1;
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::DPTimerProc(TObject* Sender)
|
|
{
|
|
if(!m_bWebLogon || !m_dpThread)
|
|
return;
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TGame* pG = m_aTables[i]->m_pGame;
|
|
if(pG->gmstatus==1 && pG->timeout>0){
|
|
pG->timeout--;
|
|
if(pG->hTable) PostMessage(pG->hTable, UM_TAB_UPDATE, UPDATE_TIME, 0);
|
|
}
|
|
else if(pG->gmstatus==2 && pG->timeout<0){ //已下注开牌中
|
|
if(--pG->timeout<-60){ //开牌结算超时60s
|
|
DebugPrint("%s 超时", ((AnsiString)pG->vid).c_str());
|
|
pG->HandleResult( 2 );
|
|
}
|
|
}
|
|
}
|
|
|
|
if(g_bGameOn){
|
|
g_aGames.runTime++;
|
|
|
|
if(ChartForm)
|
|
PostMessage(ChartForm->Handle, UM_RUN_TIME, 0, 0);
|
|
}
|
|
|
|
bool bCheckDead = false;
|
|
if(m_tmDeadPause>0){
|
|
m_tmDeadPause--;
|
|
|
|
if(!m_tmDeadPause){
|
|
if(g_aGames.nBetted[2]>0){ //强制超时
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TGame* pG = m_aTables[i]->m_pGame;
|
|
if(pG->iState==ST_BETTED && !pG->bIndPolicy)
|
|
pG->HandleResult( 2 );
|
|
}
|
|
}
|
|
|
|
if(g_aGames.pRankChip && !g_aGames.bFloat) //全局计算注码爆缆重启
|
|
g_aGames.ResetRankChip();
|
|
|
|
g_bDeadPause = false;
|
|
bCheckDead = true;
|
|
}
|
|
}
|
|
|
|
bool bCheckBet = false;
|
|
if(m_tmBetPause>0){
|
|
m_tmBetPause--;
|
|
|
|
bool bBetted = g_aGames.nBetted[0]>0 || g_aGames.nBetted[1]>0;
|
|
if(!m_tmBetPause && bBetted){ //强制超时
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TGame* pG = m_aTables[i]->m_pGame;
|
|
if(pG->iState==ST_BETTED)
|
|
pG->HandleResult( 2 );
|
|
}
|
|
|
|
bBetted = false;
|
|
}
|
|
|
|
if(!bBetted && (g_aGames.betData.profits[3]!=0 //结算完成,重置当期赢利
|
|
|| g_aGames.fCurrProfitPeak!=0)){ //双重判定,避免当期赢利恰好为0的情况
|
|
g_aGames.betData.profits[3] = g_aGames.fCurrProfitPeak = 0;
|
|
m_frmInfo->m_lblCurProfit->Caption = "0";
|
|
m_frmInfo->m_lblCurProfit->Font->Color = clLime;
|
|
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_RESET;
|
|
pLog->op = 0;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
if(g_aGames.pRankChip && !g_aGames.bFloat) //全局计算注码止停重启
|
|
g_aGames.ResetRankChip();
|
|
}
|
|
|
|
if(!m_tmBetPause){
|
|
g_bBetPause = false;
|
|
bCheckBet = true;
|
|
}
|
|
}
|
|
|
|
if(bCheckDead && g_bGameOn && !m_tmBetPause){
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
|
|
if(pG->bRun && !pG->bIndPolicy)
|
|
pG->AutoBetOn(true);
|
|
}
|
|
}
|
|
|
|
if(bCheckBet && g_bGameOn){
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
|
|
if(!m_tmDeadPause && !bCheckDead || pG->bIndPolicy)
|
|
pG->AutoBetOn(true);
|
|
}
|
|
}
|
|
|
|
m_tmWebFocus++;
|
|
if(m_tmWebFocus==590){ //9分50秒设为前台10秒,保活
|
|
m_chrm->WasHidden(false);
|
|
m_chrm->SetFocus(true);
|
|
}
|
|
else if(m_tmWebFocus==600){
|
|
m_tmWebFocus = 0;
|
|
m_chrm->SetFocus(false);
|
|
m_chrm->WasHidden(true);
|
|
}
|
|
|
|
if(g_iPlatform!=PF_AB){
|
|
if(g_tmIdle<600){ //软件10分钟无操作,以此判断是否待机状态
|
|
g_tmIdle++;
|
|
|
|
if(g_tmIdle==600)
|
|
m_chrm->ExecuteJavaScript("tmRetry=300;console.log('tmRetry:',tmRetry);", "", 0);
|
|
}
|
|
|
|
m_chrm->ExecuteJavaScript("chkSockets();", "", 0); //检查网络状态
|
|
}
|
|
|
|
m_tmCount++;
|
|
if((m_tmCount % 3600)==0){ //每小时修正计时
|
|
m_tmCount = GetTimeCount();
|
|
}
|
|
else if(m_tmCount==m_tmDailyReport){ //每日结算上报
|
|
RBReport();
|
|
}
|
|
else if(m_tmCount==m_tmDailyLogin){ //每日登录获取授权信息
|
|
PostMessage(Handle, UM_USERCONFIRM, UR_LOGIN, 0 );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UtilTimerProc(TObject* Sender)
|
|
{
|
|
TTimer* pT = m_pUtilTimer;
|
|
pT->Enabled = false;
|
|
|
|
if(pT->Tag==-1){
|
|
ClearUtilTimer();
|
|
PostMessage( Handle, UM_CHECKCEF, 0, 0 );
|
|
}
|
|
else if(pT->Tag==0){
|
|
m_tmWebFocus = 0;
|
|
m_chrm->ExecuteJavaScript(goLinkJS_PA, "", 0);//尝试进多台
|
|
pT->Enabled = true;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnWSConnectError()
|
|
{
|
|
GameOff();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::GameOn()
|
|
{
|
|
if(!g_bGameOn){
|
|
m_btnStart->Enabled = false;
|
|
m_btnStart->Caption = "停止挂机";
|
|
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_START;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
g_bGameOn = true;
|
|
g_bBetPause = false;
|
|
g_bDeadPause = false;
|
|
m_tmBetPause = 0;
|
|
m_tmDeadPause = 0;
|
|
|
|
//初始化图表数据
|
|
TDot dot;
|
|
if(g_aDots[0].empty()){
|
|
double pro = g_aGames.betData.profits[0];
|
|
dot.val = pro<0 ? pro - 0.5 : pro + 0.5;
|
|
g_aDots[0].push_back(dot);
|
|
}
|
|
if(g_aDots[1].empty()){
|
|
dot.val = g_settings.fSimAcc + 0.5;
|
|
g_aDots[1].push_back(dot);
|
|
}
|
|
if(g_aDots[2].empty()){
|
|
dot.val = g_fBalance + 0.5;
|
|
g_aDots[2].push_back(dot);
|
|
}
|
|
if(g_aDots[3].empty()){
|
|
dot.val = g_aGames.betData.counts[0] - g_aGames.betData.counts[1];
|
|
g_aDots[3].push_back(dot);
|
|
}
|
|
|
|
if(g_settings.bInitCurProfitByStart){//重置当期赢利
|
|
m_frmInfo->m_lblCurProfit->Caption = "0";
|
|
m_frmInfo->m_lblCurProfit->Font->Color = clLime;
|
|
m_frmInfo->m_lblSRProfit->Caption = "0";
|
|
m_frmInfo->m_lblSRProfit->Font->Color = clYellow;
|
|
}
|
|
|
|
g_aGames.GameOn();
|
|
|
|
StartJSThread( JS_OP_GAMEON );
|
|
|
|
m_btnStart->Enabled = true;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::GameOff(int iReason)
|
|
{
|
|
if( g_bGameOn ){
|
|
m_btnStart->Enabled = false;
|
|
|
|
g_bGameOn = false;
|
|
|
|
ClearJSThread();
|
|
ClearABThread();
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
pT->m_pGame->GameOff();
|
|
}
|
|
|
|
g_aGames.GameOff();
|
|
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_END;
|
|
pLog->op = iReason;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
m_btnStart->Caption = "开始挂机";
|
|
m_btnStart->Enabled = true;
|
|
|
|
if(iReason>0){
|
|
String msg;
|
|
if(iReason==1)
|
|
msg = "总体止赢";
|
|
else if(iReason==2)
|
|
msg = "总体止损";
|
|
else if(iReason==3)
|
|
msg = "模拟本金低于限红";
|
|
else if(iReason==4)
|
|
msg = "游台爆缆";
|
|
else if(iReason==5)
|
|
msg = "账户止赢";
|
|
else if(iReason==6)
|
|
msg = "账户止损";
|
|
else if(iReason==7)
|
|
msg = "动态止损";
|
|
else if(iReason==8)
|
|
msg = "总体阶梯爆缆";
|
|
|
|
msg += ",停止挂机!";
|
|
ShowMessage(msg);
|
|
}
|
|
|
|
RBReport();
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FileUserWeb( bool bSave )
|
|
{
|
|
char szFile[256];
|
|
sprintf( szFile, "%suser\\%s", g_AppPath, USER_WEB_FILE );
|
|
FILE* fp = bSave ? fopen( szFile, "wb" ) : fopen( szFile, "rb" );
|
|
|
|
if( fp ){
|
|
TUWFHEADER header, rHeader;
|
|
TUWFDATA data;
|
|
int len;
|
|
|
|
if( bSave ){
|
|
fwrite( &header, sizeof(header), 1, fp );
|
|
|
|
if(g_iPlatform==PF_PA || g_iPlatform==PF_DB)
|
|
sprintf(data.id, ((AnsiString)m_loginValues[0]).c_str() );
|
|
|
|
if(g_iPlatform==PF_PA){
|
|
sprintf(data.li, ((AnsiString)m_loginValues[1]).c_str() );
|
|
sprintf(data.gt, ((AnsiString)m_loginValues[2]).c_str() );
|
|
sprintf(data.un, ((AnsiString)m_loginValues[3]).c_str() );
|
|
sprintf(data.dm, ((AnsiString)m_loginValues[4]).c_str() );
|
|
sprintf(data.fw, ((AnsiString)m_loginValues[5]).c_str() );
|
|
}
|
|
|
|
sprintf(data.url, ((AnsiString)m_url).c_str() );
|
|
|
|
fwrite( &data, sizeof(data), 1, fp );
|
|
}
|
|
else{
|
|
int ret = fread( (void*)&rHeader, 1, sizeof(header), fp );
|
|
if( ret==sizeof(header) && !memcmp(&rHeader, header.head, sizeof(header.head)) ){
|
|
fread( &data, sizeof(TUWFDATA), 1, fp );
|
|
|
|
m_loginValues[0] = data.id;
|
|
m_loginValues[1] = data.li;
|
|
m_loginValues[2] = data.gt;
|
|
m_loginValues[3] = data.un;
|
|
m_loginValues[4] = data.dm;
|
|
m_loginValues[5] = data.fw;
|
|
m_url = data.url;
|
|
}
|
|
}
|
|
|
|
fclose( fp );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FileUserVars( bool bSave )
|
|
{
|
|
char szBuffer[2048] = "",
|
|
szFile[256];
|
|
|
|
sprintf( szFile, "%suser\\%s", g_AppPath, USER_VAR_FILE );
|
|
FILE* fp;
|
|
|
|
if( bSave )
|
|
fp = fopen( szFile, "wb" );
|
|
else
|
|
fp = fopen( szFile, "rb" );
|
|
|
|
if( fp ){
|
|
TUVFHEADER header;
|
|
int val;
|
|
|
|
if( bSave ){
|
|
fwrite( (void*)&header, sizeof(header), 1, fp );
|
|
|
|
szBuffer[0] = 0;
|
|
|
|
char temp[64];
|
|
|
|
sprintf( temp, "%d", g_bAutoLogin );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_iRoad );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_iBetPolicy );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_iChipPolicy );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_nChipMul );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", m_nTabShow );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", m_nTabRun );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_bSimulate );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_bShowSetting );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d-%d", g_RandomChip.minChip, g_RandomChip.maxChip);
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_BPAskBet.bet[0] | (g_BPAskBet.bet[1]<<8));
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d %s %s", g_BPDiffBet.diff[0] | (g_BPDiffBet.diff[1]<<8),
|
|
g_BPDiffBet.bets[0], g_BPDiffBet.bets[1]);
|
|
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", m_iWSVelo );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", g_iPlatform );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d", WindowState==wsMinimized ? wsNormal : WindowState );
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%d %d %d %d", m_nLeft, m_nTop, m_nWidth, m_nHeight);
|
|
strcat( szBuffer, temp );
|
|
|
|
sprintf( temp, "\n%s", ((AnsiString)m_sActCode).c_str());
|
|
strcat( szBuffer, temp);
|
|
|
|
fwrite( szBuffer, 1, strlen(szBuffer), fp );
|
|
}
|
|
else{
|
|
char buf[16];
|
|
int ret = fread( (void*)buf, 1, sizeof(header), fp );
|
|
|
|
if( ret==sizeof(header) && !memcmp(buf, &header, 3) ){
|
|
fseek( fp, 0, SEEK_END );
|
|
int size = ftell( fp ) - sizeof(header);
|
|
if( size>2048 )
|
|
size = 2048;
|
|
|
|
fseek( fp, sizeof(header), SEEK_SET );
|
|
fread( szBuffer, 1, size, fp );
|
|
|
|
int nVal = 0;
|
|
char *token=strtok(szBuffer,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
g_bAutoLogin = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
m_cbRoad->ItemIndex = g_iRoad = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
g_iBetPolicy = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
g_iChipPolicy = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
g_nChipMul = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
m_nTabShow = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
m_nTabRun = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
g_bSimulate = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
g_bShowSetting = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
int mi, ma;
|
|
sscanf( token, "%d-%d", &mi, &ma );
|
|
g_RandomChip.minChip = mi;
|
|
g_RandomChip.maxChip = ma;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
int bets;
|
|
sscanf( token, "%d", &bets );
|
|
g_BPAskBet.bet[0] = bets & 0xFF;
|
|
g_BPAskBet.bet[1] = (bets & 0xFF00) >> 8;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
if(buf[3]<2){
|
|
int data;
|
|
sscanf( token, "%d", &data );
|
|
g_BPDiffBet.diff[0] = data & 0xFF;
|
|
g_BPDiffBet.diff[1] = (data & 0xFF00) >> 8;
|
|
|
|
int bet[2] = { (data & 0xFF0000) >> 16, (data & 0xFF000000) >> 24};
|
|
for(int i=0; i<2; i++)
|
|
strcpy(g_BPDiffBet.bets[i], bet[i]==1 ? "a" : "s");
|
|
}
|
|
else{
|
|
int cond;
|
|
sscanf( token, "%d %s %s", &cond, g_BPDiffBet.bets[0], g_BPDiffBet.bets[1] );
|
|
g_BPDiffBet.diff[0] = cond & 0xFF;
|
|
g_BPDiffBet.diff[1] = (cond & 0xFF00) >> 8;
|
|
}
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
m_iWS = m_iWSVelo = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
g_iPlatform = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d", &val );
|
|
WindowState = val;
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
sscanf( token, "%d %d %d %d", &m_nLeft, &m_nTop, &m_nWidth, &m_nHeight );
|
|
Position = poDesigned;
|
|
SetBounds(m_nLeft, m_nTop, m_nWidth, m_nHeight);
|
|
}
|
|
|
|
token=strtok(NULL,"\n");
|
|
if( token ){
|
|
char temp[64];
|
|
sscanf( token, "%s", temp );
|
|
m_sActCode = temp;
|
|
}
|
|
}
|
|
}
|
|
|
|
fclose( fp );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::FileGame( bool bSave )
|
|
{
|
|
char szFile[256];
|
|
sprintf( szFile, "%suser\\%s", g_AppPath, USER_GAME_FILE );
|
|
FILE* fp = NULL;
|
|
|
|
if( bSave )
|
|
fp = fopen( szFile, "wb" );
|
|
else
|
|
fp = fopen( szFile, "rb" );
|
|
|
|
if( fp ){
|
|
TUGFHEADER header;
|
|
|
|
if( bSave ){
|
|
fseek( fp, 0, SEEK_SET );
|
|
fwrite( (void*)&header, sizeof(header), 1, fp );
|
|
|
|
fwrite( &g_settings, sizeof(TSettings), 1, fp );
|
|
fwrite( &g_aGames.betData, sizeof(TBetData), 1, fp);
|
|
int sz = g_aIPGames.size();
|
|
fwrite( &sz, sizeof(int), 1, fp);
|
|
if(sz>0){
|
|
char vid[8];
|
|
for(int i=0; i<sz; i++){
|
|
TIPGame* pIG = g_aIPGames[i];
|
|
strcpy(vid, ((AnsiString)pIG->vid).c_str());
|
|
fwrite(vid, sizeof(vid), 1, fp);
|
|
fwrite(&pIG->iBetPolicy, sizeof(int), 1, fp);
|
|
fwrite(&pIG->iChipPolicy, sizeof(int), 1, fp);
|
|
fwrite(&pIG->nChipMul, sizeof(int), 1, fp);
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
char buf[16];
|
|
int ret = fread( (void*)buf, 1, sizeof(header), fp );
|
|
|
|
if( ret==sizeof(header) && !memcmp(buf, &header, 3)){
|
|
TUGFHEADER* fHeader = (TUGFHEADER*)buf;
|
|
|
|
if(fHeader->head[3]>=0x0E){
|
|
fread( &g_settings, sizeof(TSettings), 1, fp );
|
|
}
|
|
else if(fHeader->head[3]>=0x0C){ //最低支持ver0C
|
|
TSettingsD d;
|
|
fread( &d, sizeof(TSettingsD), 1, fp );
|
|
|
|
if(fHeader->head[3]==0x0C){
|
|
if(d.iFloatMode==3)
|
|
d.iFloatMode = 4;
|
|
}
|
|
|
|
if(d.bFloat){
|
|
if(d.iFloatMode)
|
|
d.iFloatMode <<= 1;
|
|
else
|
|
d.iFloatMode = 1;
|
|
}
|
|
|
|
g_settings.FromVersionD(d);
|
|
}
|
|
else
|
|
goto FILEGAME_EXIT_LINE;
|
|
|
|
fread( &g_aGames.betData, sizeof(TBetData), 1, fp);
|
|
|
|
if(fHeader->head[3]>=0x0F){
|
|
int sz;
|
|
fread(&sz, sizeof(int), 1, fp);
|
|
if(sz>0){
|
|
char vid[8];
|
|
for(int i=0; i<sz; i++){
|
|
int iB, iC, nM;
|
|
fread(vid, sizeof(vid), 1, fp);
|
|
fread(&iB, sizeof(int), 1, fp);
|
|
fread(&iC, sizeof(int), 1, fp);
|
|
fread(&nM, sizeof(int), 1, fp);
|
|
|
|
if(iB<g_aBetPolicies.size() && iC<g_aChipPolicies.size())
|
|
g_aIPGames.AddIPGame(vid, iB, iC, nM);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
FILEGAME_EXIT_LINE:
|
|
fclose( fp );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ChangeWebsite()
|
|
{
|
|
m_chrm->StopLoad();
|
|
m_chrm->LoadURL("about:blank");
|
|
|
|
m_iWS = (m_iWS+1) % WSNUM;
|
|
if(m_iWS==m_iWSVelo){
|
|
PostMessage( Handle, UM_WEBDEAD, -3, 0 );
|
|
}
|
|
else{
|
|
DebugPrint( "Change website: %s", websites[m_iWS] );
|
|
m_chrm->LoadURL(websites[m_iWS]);
|
|
}
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// DCEF3
|
|
void __fastcall TMainForm::WebAfterCreated(TObject *Sender, const _di_ICefBrowser browser)
|
|
{
|
|
if( m_bClosing )
|
|
return;
|
|
|
|
if(g_bAutoLogin && (g_iPlatform==PF_AB && !m_url.IsEmpty()
|
|
|| g_iPlatform==PF_DB && !m_url.IsEmpty() && !m_loginValues[0].IsEmpty()
|
|
|| g_iPlatform==PF_PA && m_iWS>=0 && !m_loginValues[1].IsEmpty())){
|
|
LoadUrl();
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebBeforeClose(TObject* Sender, const _di_ICefBrowser browser)
|
|
{
|
|
if( m_bClosing )
|
|
PostMessage( Handle, WM_CLOSE, 0, 0 );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebBeforeContextMenu(TObject* Sender, const _di_ICefBrowser browser,
|
|
const _di_ICefFrame frame, const _di_ICefContextMenuParams params,
|
|
const _di_ICefMenuModel model)
|
|
{
|
|
model->Clear();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebBeforePopup(TObject* Sender, const _di_ICefBrowser browser, const _di_ICefFrame frame,
|
|
int popup_id, const ustring targetUrl, const ustring targetFrameName,
|
|
TCefWindowOpenDisposition targetDisposition, bool userGesture, const TCefPopupFeatures &popupFeatures,
|
|
TCefWindowInfo &windowInfo, _di_ICefClient &client, TCefBrowserSettings &settings,
|
|
_di_ICefDictionaryValue &extra_info, bool &noJavascriptAccess, bool &Result)
|
|
{
|
|
Result = true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebLoadError(TObject* Sender, const _di_ICefBrowser browser, const _di_ICefFrame frame,
|
|
TCefErrorCode errorCode, const ustring errorText, const ustring failedUrl)
|
|
{
|
|
if( m_bClosing )
|
|
return;
|
|
|
|
if( !m_bWebLogon ){
|
|
if(g_iPlatform==PF_PA && failedUrl.Pos(websites[m_iWS])>0 && failedUrl.Length()-strlen(websites[m_iWS]) <= 9){
|
|
ChangeWebsite();
|
|
}
|
|
else if(g_iPlatform==PF_AB){
|
|
DebugPrint("load error %s (%s[%d])", ((AnsiString)failedUrl).c_str(), ((AnsiString)errorText).c_str(), errorCode);
|
|
if(failedUrl.Pos(m_url)>0){
|
|
PostMessage( Handle, UM_WEBDEAD, 3, 0 );
|
|
m_lblTips->Visible = false;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebLoadEnd(TObject* Sender, const _di_ICefBrowser browser,
|
|
const _di_ICefFrame frame, int httpStatusCode)
|
|
{
|
|
if( m_bClosing )
|
|
return;
|
|
|
|
if( httpStatusCode==200 ){
|
|
String url = frame->GetUrl();
|
|
if(g_iPlatform==PF_PA && m_iWS>=0 && url.Pos(websites[m_iWS]) && url.Length()-strlen(websites[m_iWS]) <= 9 ){
|
|
if(m_loginValues[0].Length()>0){
|
|
m_lblTips->Caption = "正在登录网站...";
|
|
m_lblTips->Visible = true;
|
|
|
|
String strJS = Format(loginJS_PA, ARRAYOFCONST((m_loginValues[0],m_loginValues[1],m_loginValues[2],
|
|
m_loginValues[3],m_loginValues[4],m_loginValues[5])));
|
|
m_chrm->ExecuteJavaScript(strJS, "", 0);
|
|
}
|
|
}
|
|
else if(url.Pos(m_url)){
|
|
m_lblTips->Caption = "正在连接网站...";
|
|
m_lblTips->Visible = true;
|
|
|
|
if(g_iPlatform==PF_DB){
|
|
StartJSThread( JS_OP_WSHANDLE0 );
|
|
|
|
if(m_loginValues[0].Length()>0){
|
|
String strJS = Format(loginJS_DB, ARRAYOFCONST((m_loginValues[0])));
|
|
m_chrm->ExecuteJavaScript(strJS, "", 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebJsdialog(TObject* Sender, const _di_ICefBrowser browser, const ustring originUrl,
|
|
TCefJsDialogType dialogType, const ustring messageText, const ustring defaultPromptText,
|
|
_di_ICefJsDialogCallback callback, bool &suppressMessage, bool &Result)
|
|
{
|
|
if(g_iPlatform==PF_AB && dialogType==JSDIALOGTYPE_ALERT){
|
|
DebugPrint("Alert %s - %s", ((AnsiString)messageText).c_str(), ((AnsiString)originUrl).c_str());
|
|
PostMessage( Handle, UM_WEBDEAD, 3, 0 );
|
|
m_lblTips->Visible = false;
|
|
|
|
suppressMessage = true;
|
|
}
|
|
|
|
Result = false;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebResourceLoadComplete(TObject* Sender, const _di_ICefBrowser browser,
|
|
const _di_ICefFrame frame, const _di_ICefRequest request, const _di_ICefResponse response,
|
|
TCefUrlRequestStatus status, __int64 receivedContentLength)
|
|
{
|
|
if( m_bClosing )
|
|
return;
|
|
|
|
String url = request->GetUrl();
|
|
TCefResourceType type = request->GetResourceType();
|
|
DebugPrint("load %s", ((AnsiString)url).c_str());
|
|
if( type==RT_XHR && status==UR_SUCCESS ){
|
|
// DebugPrint("load %s", ((AnsiString)url).c_str());
|
|
if( g_iPlatform==PF_PA ){
|
|
if( url.Pos("module.config") ){
|
|
m_lblTips->Caption = "加载网站资源...";
|
|
}
|
|
else if(url.Pos("main_") && url.Pos(".min.js")){
|
|
m_lblTips->Caption = "加载主程序...";
|
|
StartJSThread( JS_OP_WSHANDLE0 );
|
|
}
|
|
else if( url.Pos("GameCommon_v") || url.Pos("PCPlaza_v") ){
|
|
m_lblTips->Caption = "加载游戏资源...";
|
|
StartJSThread( JS_OP_WSHANDLE1 );
|
|
}
|
|
else if( url.Pos("PCPlaza_hans") || url.Pos("PCEvent_hans") ){
|
|
m_lblTips->Caption = "加载基础数据...";
|
|
StartJSThread( JS_OP_WSHANDLE2 );
|
|
}
|
|
}
|
|
else if( g_iPlatform==PF_AB ){
|
|
if( url.Pos("loadConfig.json") ){
|
|
StartJSThread( JS_OP_WSHANDLE0 );
|
|
}
|
|
else if(url.Pos("netGame.ab") || url.Pos("system-a") && url.Pos("-v9.json")){
|
|
m_lblTips->Caption = "加载网站资源...";
|
|
if(!m_bWebLogon)
|
|
StartJSThread( JS_OP_WSHANDLE1 );
|
|
|
|
m_chrm->ExecuteJavaScript(msgJS_AB, "", 0 );
|
|
}
|
|
else if( url.Pos("lang.json") || url.Pos("sideHall.atlas") ){
|
|
m_lblTips->Caption = "正在登录游戏...";
|
|
if(!m_bWebLogon)
|
|
StartJSThread( JS_OP_WSHANDLE2 );
|
|
}
|
|
}
|
|
else if( g_iPlatform==PF_DB ){
|
|
if( url.Pos("loadConfig/list?") ){
|
|
m_lblTips->Caption = "加载网站资源...";
|
|
// StartJSThread( JS_OP_WSHANDLE1 );
|
|
}
|
|
else if( url.Pos("player/getPlayerInitConfig") ){
|
|
m_lblTips->Caption = "正在登录游戏...";
|
|
StartJSThread( JS_OP_WSHANDLE2 );
|
|
|
|
m_chrm->ExecuteJavaScript( userJS_DB, "", 0 );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebBeforeResourceLoad(TObject* Sender, const _di_ICefBrowser browser, const _di_ICefFrame frame,
|
|
const _di_ICefRequest request, const _di_ICefCallback callback, /* out */ TCefReturnValue &Result)
|
|
{
|
|
if( m_bClosing )
|
|
return;
|
|
|
|
if( g_iPlatform==PF_PA ){
|
|
String url = request->GetUrl();
|
|
if((url.Pos("region.html") || url.Pos("ipwho.is")) && url.Pos(websites[m_iWS])){
|
|
ChangeWebsite();
|
|
Result = RV_CANCEL;
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebProcessMessageReceived(TObject* Sender, const _di_ICefBrowser browser,
|
|
const _di_ICefFrame frame, TCefProcessId sourceProcess, const _di_ICefProcessMessage message,
|
|
/* out */ bool &Result)
|
|
{
|
|
if( m_bClosing )
|
|
return;
|
|
|
|
if( message->Name=="ReturnJQValue" ){
|
|
_di_ICefListValue argList = message->GetArgumentList();
|
|
|
|
for( int i=0; i<argList->GetSize(); i++ ){
|
|
m_v8Values->Append( argList->GetString(i) );
|
|
}
|
|
|
|
ReleaseV8ValueSema();
|
|
Result = true;
|
|
}
|
|
else if( message->Name=="GetUserInfo" ){
|
|
_di_ICefListValue argList = message->GetArgumentList();
|
|
|
|
if( argList->GetSize()==5 ){
|
|
String un = argList->GetString(0).Trim();
|
|
String balance = argList->GetString(1).Trim();
|
|
String currency = argList->GetString(2).Trim();
|
|
String betMin = argList->GetString(3).Trim();
|
|
String betMax = argList->GetString(4).Trim();
|
|
|
|
m_frmInfo->m_lblAccName->Caption = un;
|
|
|
|
m_tmCount = GetTimeCount();
|
|
|
|
if( g_iPlatform==PF_AB || g_iPlatform==PF_DB ){
|
|
ClearJSThread();
|
|
m_bWebLogon = true;
|
|
m_tmLogon = 0;
|
|
m_lblTips->Caption = "加载台桌数据...";
|
|
|
|
FileUserWeb( true );
|
|
|
|
if(g_iPlatform==PF_DB){
|
|
m_chrm->ExecuteJavaScript( msgJS_DB, "", 0 );
|
|
}
|
|
}
|
|
|
|
if(!g_uid){
|
|
PostMessage(Handle, UM_USERCONFIRM, UR_LOGIN, 0 );
|
|
}
|
|
else{
|
|
SetExpireJS();
|
|
}
|
|
|
|
double fBalance = balance.ToDouble();
|
|
if(!(g_bTesting && g_settings.bSimAccOn) && fBalance!=g_fBalance){
|
|
g_fBalance = fBalance;
|
|
|
|
PostMessage(Handle, UM_STATE_UPDATE, STATE_BALANCE, 0);
|
|
PostMessage(Application->MainFormHandle, UM_CHART_UPDATE, 2, 1); //重置余额图表
|
|
}
|
|
|
|
int minBet, maxBet;
|
|
if(TryStrToInt(betMin, minBet) && TryStrToInt(betMax, maxBet)){
|
|
if(minBet!=g_MinOnBet || maxBet!=g_MaxOnBet){
|
|
g_MinOnBet = minBet;
|
|
g_MaxOnBet = maxBet;
|
|
}
|
|
}
|
|
PostMessage(Handle, UM_STATE_UPDATE, STATE_LIMIT, 0);
|
|
}
|
|
Result = true;
|
|
}
|
|
else if( message->Name=="OnJSMessage" ){
|
|
_di_ICefListValue argList = message->GetArgumentList();
|
|
if( argList->GetSize()==1 ){
|
|
String sData = argList->GetString(0);
|
|
|
|
if(sData=="0"){
|
|
PostMessage( Handle, UM_WEBDEAD, -3, 0 );
|
|
m_lblTips->Visible = false;
|
|
}
|
|
else if( m_bWebLogon && m_dpThread ){
|
|
((TDataParseThread*)m_dpThread)->ParseData(sData);
|
|
}
|
|
}
|
|
|
|
Result = true;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ReleaseV8ValueSema()
|
|
{
|
|
if(!ReleaseSemaphore( m_hV8ValueSema, 1, NULL)){
|
|
DebugPrint("V8ValueSema error: %d", GetLastError());
|
|
CloseHandle( m_hV8ValueSema );
|
|
m_hV8ValueSema = CreateSemaphore( NULL, 0, 1, NULL );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
//调用该函数的JS语句各分支必须返回ReturnJQValue,且确保延迟不大于1秒
|
|
TStringList* __fastcall TMainForm::GetJQValue( String& str, _di_ICefFrame frame )
|
|
{
|
|
WaitForSingleObject( m_hV8Sema, INFINITE );//60000 );
|
|
|
|
m_v8Values->Clear();
|
|
frame->ExecuteJavaScript( str, "", 0 );
|
|
DWORD dwRet = WaitForSingleObject( m_hV8ValueSema, 2000 );
|
|
|
|
TStringList* values = NULL;
|
|
if( dwRet==WAIT_OBJECT_0 ){
|
|
values = new TStringList;
|
|
for( int i=0; i<m_v8Values->Count; i++ ){
|
|
values->Append( m_v8Values->Strings[i] );
|
|
}
|
|
m_v8Values->Clear();
|
|
}
|
|
else if(dwRet==WAIT_TIMEOUT){
|
|
ReleaseV8ValueSema();
|
|
}
|
|
|
|
ReleaseSemaphore( m_hV8Sema, 1, NULL );
|
|
|
|
return values;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ResetTableGrid()
|
|
{
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
|
|
int oldPos = m_panWeb->VertScrollBar->Position;
|
|
|
|
//对齐台桌顶部
|
|
if(oldPos>0){
|
|
int nRem = oldPos % TFHEIGHT;
|
|
if(nRem>0){
|
|
if(nRem < DPIY(12))
|
|
oldPos -= nRem;
|
|
else if(TFHEIGHT-nRem < DPIY(12))
|
|
oldPos += TFHEIGHT-nRem;
|
|
}
|
|
}
|
|
|
|
m_panWeb->VertScrollBar->Position = 0; //Position复位,才从顶部开始显示
|
|
int row = 0, col = 0;
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
pT->Left = col * (TFWIDTH + m_nTabGap);
|
|
pT->Top = row * TFHEIGHT;
|
|
pT->Visible = true;
|
|
|
|
if(++col==m_nTabCols && i<m_aTables.size()-1){
|
|
col = 0;
|
|
row++;
|
|
}
|
|
}
|
|
|
|
if(m_aTables.empty()){
|
|
m_panWeb->VertScrollBar->Range = 0;
|
|
}
|
|
else{
|
|
int minRange = m_panWeb->Height-3;
|
|
int range = TFHEIGHT * (row+1);
|
|
int maxPos = range - minRange;
|
|
m_panWeb->VertScrollBar->Range = max(range, minRange);
|
|
|
|
if(oldPos>0){
|
|
m_panWeb->VertScrollBar->Position = oldPos<=maxPos ? oldPos //原始位置
|
|
: range - m_panWeb->Height + m_panWeb->Height % TFHEIGHT; //底部位置
|
|
}
|
|
}
|
|
|
|
LockWindowUpdate( 0 );
|
|
|
|
if(BetLogForm)
|
|
BetLogForm->BringToFront();
|
|
|
|
m_iLastSel = -1;
|
|
SetTableFocus();
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
bool __fastcall TMainForm::StopWebLoad()
|
|
{
|
|
if( g_iPlatform==PF_AB && m_url.IsEmpty()
|
|
|| g_iPlatform==PF_DB && m_url.IsEmpty() && m_loginValues[0].IsEmpty()
|
|
|| g_iPlatform==PF_PA && m_loginValues[1].IsEmpty())
|
|
return false;
|
|
|
|
m_pDPTimer->Enabled = false;
|
|
m_tsMode->Enabled = false;
|
|
m_btnStart->Enabled = false;
|
|
m_btnTables->Enabled = false;
|
|
m_btnManual->Enabled = false;
|
|
|
|
ClearJSThread();
|
|
ManualOff();
|
|
GameOff();
|
|
ClearGames();
|
|
|
|
m_chrm->StopLoad();
|
|
m_chrm->LoadURL("about:blank");
|
|
|
|
m_bWebLogon = false;
|
|
|
|
if(!m_sActCode.Length())
|
|
g_uid = 0;
|
|
|
|
if( g_iPlatform==PF_PA ){
|
|
m_loginValues[0] = m_loginValues[1] = m_loginValues[2]
|
|
= m_loginValues[3] = m_loginValues[4] = m_loginValues[5] = "";
|
|
}
|
|
else{
|
|
m_url = "";
|
|
|
|
if(g_iPlatform==PF_DB)
|
|
m_loginValues[0] = "";
|
|
}
|
|
|
|
m_lblTips->Caption = "请登录游戏";
|
|
m_lblTips->Show();
|
|
|
|
return true;
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMRestoreWindow(TMessage &msg)
|
|
{
|
|
if (WindowState == wsMinimized) {
|
|
WindowState = wsNormal;
|
|
}
|
|
|
|
FormStyle = fsStayOnTop;
|
|
Application->BringToFront();
|
|
FormStyle = fsNormal;
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMWebDead(TMessage &msg)
|
|
{
|
|
if(!StopWebLoad())
|
|
return;
|
|
|
|
bool bActCode = false;
|
|
|
|
int reason = msg.WParam;
|
|
if(reason==0){
|
|
MessageBox(Handle, L"账号被重复登入,请重新登录", L"登录", MB_ICONERROR | MB_OK);
|
|
}
|
|
// else if(reason==2){
|
|
// MessageBox(Handle, L"网站资源加载失败,请重新登录", L"登录", MB_ICONERROR | MB_OK);
|
|
// }
|
|
else if(reason==3){
|
|
MessageBox(Handle, L"网站连接异常,请重新登录", L"登录", MB_ICONERROR | MB_OK);
|
|
}
|
|
else if(reason==-2){ //-2=授权验证已过期
|
|
if(m_sActCode.Length()){
|
|
MessageBox(Handle, L"授权码已过期,请延期或更换", L"授权", MB_ICONERROR | MB_OK);
|
|
bActCode = true;
|
|
}
|
|
else{
|
|
MessageBox(Handle, L"未授权账号或授权已过期,请重新登录", L"登录", MB_ICONERROR | MB_OK);
|
|
g_bAutoLogin = false;
|
|
}
|
|
}
|
|
else if(reason==-3){ //网络异常中断 -1=登录失败 3=连接关闭 4=连接失效
|
|
MessageBox(Handle, L"登录失败,请重新登录", L"登录", MB_ICONERROR | MB_OK);
|
|
}
|
|
else if(reason==-4){
|
|
if(m_sActCode.Length()){
|
|
MessageBox(Handle, L"授权码验证异常,请稍后重试", L"授权", MB_ICONERROR | MB_OK);
|
|
bActCode = true;
|
|
}
|
|
else
|
|
MessageBox(Handle, L"账号授权验证异常,请稍后重新登录", L"登录", MB_ICONERROR | MB_OK);
|
|
}
|
|
else{
|
|
MessageBox(Handle, L"网站登录超时,请重新登录", L"登录", MB_ICONERROR | MB_OK);
|
|
}
|
|
|
|
if(bActCode)
|
|
PostMessage( Handle, UM_SUBFORMSHOWN, 0, 0 );
|
|
else
|
|
PostMessage( Handle, UM_WEBLOGIN, g_iPlatform, 0 );
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMVelocity(TMessage &msg)
|
|
{
|
|
Screen->Cursor = crDefault;
|
|
|
|
ClearVLThread();
|
|
|
|
m_lblTips->Visible = false;
|
|
|
|
if((int)msg.WParam<0){
|
|
// m_iWSVelo = m_iWS = -1;
|
|
|
|
ShowMessage("网站无法连接,请检查网络状态");
|
|
return;
|
|
}
|
|
|
|
if(m_iWSVelo>=0)
|
|
m_iWS = m_iWSVelo;
|
|
else
|
|
m_iWS = m_iWSVelo = msg.WParam;
|
|
|
|
DebugPrint( "Current website: %s", websites[m_iWS] );
|
|
|
|
if(g_iPlatform==PF_PA && g_bAutoLogin && !m_loginValues[1].IsEmpty()
|
|
&& m_chrm && m_chrm->Initialized ){
|
|
LoadUrl();
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMCheckCEF(TMessage &msg)
|
|
{
|
|
StartJSThread( JS_OP_CHECKCEF );
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMStatus(TMessage &msg)
|
|
{
|
|
// m_sbar->SimpleText = m_strStatus;
|
|
// m_strStatus = "";
|
|
//
|
|
// if( msg.WParam >= 1 && msg.WParam <= 6 ){
|
|
// //保存当前下注及注码状态
|
|
// if( msg.WParam==1 || msg.WParam>=5 ){
|
|
// FileGame( true );
|
|
// }
|
|
//
|
|
// if( m_btnSound->Tag==0 || msg.WParam==4 ){ //播放提示音
|
|
// TCHAR snd[256];
|
|
// wsprintf( snd, L"%ssnd%d", ((String)g_AppPath).c_str(), msg.WParam );
|
|
//
|
|
// PlaySound( NULL, NULL, SND_NODEFAULT );
|
|
// PlaySound( snd, NULL, SND_ASYNC|SND_FILENAME|SND_NODEFAULT );
|
|
// }
|
|
// }
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMAutoBetEnd(TMessage &msg)
|
|
{
|
|
int hThread = msg.LParam;
|
|
ClearABThread(hThread);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMJsHandled(TMessage &msg)
|
|
{
|
|
if( !m_jsThread )
|
|
return;
|
|
|
|
int iOp = msg.WParam,
|
|
ret = msg.LParam;
|
|
String sRet = ((TJSHandleThread*)m_jsThread)->m_sRet;
|
|
|
|
ClearJSThread();
|
|
|
|
if( iOp==JS_OP_CHECKCEF ){
|
|
if( ret>=0 ){
|
|
FileUserWeb();
|
|
InitBrowser();
|
|
m_lblTips->Caption = "请登录游戏";
|
|
|
|
if(m_sActCode.Length())
|
|
PostMessage(Handle, UM_USERCONFIRM, UR_LOGIN, 0 );
|
|
}
|
|
}
|
|
else if( iOp>=JS_OP_WSHANDLE0 && iOp<=JS_OP_WSHANDLE3 ){
|
|
if( ret==1 ){
|
|
DebugPrint( "Got ws update data" );
|
|
|
|
if( g_iPlatform==PF_PA ){
|
|
m_bWebLogon = true;
|
|
m_iWSVelo = m_iWS;
|
|
|
|
m_lblTips->Caption = "加载台桌数据...";
|
|
m_lblTips->Visible = true;
|
|
|
|
m_chrm->ExecuteJavaScript( baseJS_PA, "", 0 );
|
|
m_chrm->ExecuteJavaScript( enterJS_PA, "", 0 );
|
|
m_chrm->ExecuteJavaScript( linkJS_PA, "", 0 );
|
|
|
|
FileUserWeb( true );
|
|
}
|
|
}
|
|
else{
|
|
PostMessage( Handle, UM_WEBDEAD, ret, 0 );
|
|
m_lblTips->Visible = false;
|
|
}
|
|
}
|
|
else if( iOp==JS_OP_GAMEON ){
|
|
// m_btnStart->Enabled = true;
|
|
DebugPrint("Game complete on");
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMSetBet(TMessage &msg)
|
|
{
|
|
if( g_bGameOn || m_bManual){
|
|
int iGame = msg.WParam;
|
|
TAutoBetThread* pThread = new TAutoBetThread(iGame);
|
|
m_aABThreads.push_back(pThread);
|
|
pThread->Start();
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMAddTable(TMessage &msg)
|
|
{
|
|
if(m_bClosing)
|
|
return;
|
|
|
|
int ind = msg.WParam;
|
|
TGame* pG = (TGame*)msg.LParam;
|
|
if(pG){//单个台桌
|
|
int nTab = m_aTables.size();
|
|
if(m_nTabShow<0 || nTab < m_nTabShow){
|
|
TTableFrame* pT = new TTableFrame(NULL);
|
|
pT->Parent = m_panWeb;
|
|
pT->SetGame(pG);
|
|
m_aTables.insert( m_aTables.begin()+ind, pT );
|
|
|
|
if(m_nTabRun<0 || nTab<m_nTabRun)
|
|
pT->SetRun(true);
|
|
|
|
DebugPrint("AddTable %s", ((AnsiString)pG->vid).c_str());
|
|
}
|
|
}
|
|
else{//全部台桌
|
|
//先清空台桌
|
|
m_aSelTabs.clear();
|
|
for(int i=0; i<m_aTables.size(); i++)
|
|
delete m_aTables[i];
|
|
m_aTables.clear();
|
|
|
|
int nGame = g_aGames.size();
|
|
int nShow = (m_nTabShow<0 || m_nTabShow>nGame) ? nGame : m_nTabShow;
|
|
|
|
for(int i=0; i<nShow; i++){
|
|
TGame* pG = g_aGames[i];
|
|
TTableFrame* pT = new TTableFrame(NULL);
|
|
pT->Parent = m_panWeb;
|
|
pT->SetGame(pG);
|
|
m_aTables.push_back(pT);
|
|
|
|
if(m_nTabRun<0 || i<m_nTabRun)
|
|
pT->SetRun(true);
|
|
}
|
|
|
|
// m_imgBack->Visible = false;
|
|
m_lblAnnonce->Visible = false;
|
|
m_lblTips->Visible = false;
|
|
|
|
m_btnLogin->Caption = "重新登录";
|
|
m_btnStart->Enabled = true;
|
|
m_btnTables->Enabled = true;
|
|
m_btnManual->Enabled = true;
|
|
m_tsMode->Enabled = true;
|
|
m_pDPTimer->Enabled = true;
|
|
// m_tmWebTimeout = 0;
|
|
|
|
PostMessage(Handle, UM_STATE_UPDATE, STATE_ALL, 0);
|
|
|
|
if( g_iPlatform==PF_PA ){
|
|
//获取用户信息
|
|
m_chrm->ExecuteJavaScript( userJS_PA, "", 0 );
|
|
|
|
ClearUtilTimer();
|
|
|
|
m_pUtilTimer = new TTimer(NULL);
|
|
m_pUtilTimer->Tag = 0;
|
|
m_pUtilTimer->OnTimer = UtilTimerProc;
|
|
m_pUtilTimer->Interval = 1000;
|
|
m_pUtilTimer->Enabled = true;
|
|
}
|
|
}
|
|
|
|
ResetTableGrid();
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMPolicyChanged(TMessage &msg)
|
|
{
|
|
int op = msg.WParam>>16, //操作类型 0=修改 1=添加 2=删除
|
|
iType = msg.WParam & 0xFFFF, //策略类型
|
|
iPolicy = msg.LParam; //策略序号
|
|
TComboBox* pCB = iType==TYPE_P_BET ? m_cbBetWays : m_cbBetChips;
|
|
|
|
if(op==0){ //选择
|
|
pCB->ItemIndex = iPolicy;
|
|
OnPolicyChange(pCB);
|
|
}
|
|
else if(op==1){ //添加
|
|
vector<TBasePolicy*>& aPolicies = iType==TYPE_P_BET ? g_aBetPolicies : g_aChipPolicies;
|
|
TBasePolicy* pPolicy = aPolicies.back();
|
|
pCB->AddItem(pPolicy->name, NULL);
|
|
}
|
|
else if(op==2){ //删除
|
|
pCB->Items->Delete(iPolicy);
|
|
|
|
if(pCB->ItemIndex<0)
|
|
pCB->Text = pCB->Hint;
|
|
|
|
int& gPolicy = iType==TYPE_P_BET ? g_iBetPolicy : g_iChipPolicy;
|
|
gPolicy = pCB->ItemIndex;
|
|
|
|
//独立策略修改
|
|
for(int i=g_aIPGames.size()-1; i>=0; i--){
|
|
TIPGame* pIG = g_aIPGames[i];
|
|
int& rIGP = iType==TYPE_P_BET ? pIG->iBetPolicy : pIG->iChipPolicy;
|
|
if(rIGP>iPolicy){
|
|
rIGP--;
|
|
|
|
if(pIG->pGame){
|
|
int& rGP = iType==TYPE_P_BET ? pIG->pGame->iBetPolicy : pIG->pGame->iChipPolicy;
|
|
rGP = rIGP;
|
|
}
|
|
}
|
|
else if(rIGP==iPolicy){ //删除独立策略
|
|
if(pIG->pGame){
|
|
pIG->pGame->ResetIP();
|
|
}
|
|
|
|
g_aIPGames.erase(g_aIPGames.begin()+i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMLogUpdate(TMessage &msg)
|
|
{
|
|
TBetLog* pLog = (TBetLog*)msg.LParam;
|
|
if(pLog){ //添加
|
|
g_aBetLogs.push_back(pLog);
|
|
}
|
|
else{ //清空
|
|
for(int i=0; i<g_aBetLogs.size(); i++)
|
|
delete g_aBetLogs[i];
|
|
g_aBetLogs.clear();
|
|
}
|
|
|
|
if(BetLogForm)
|
|
PostMessage(BetLogForm->Handle, UM_LOG_UPDATE, 0, 0);
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMShowActCode(TMessage &msg)
|
|
{
|
|
if(ActCodeForm)
|
|
return;
|
|
|
|
ActCodeForm = new TActCodeForm(this, m_sActCode, m_tExpire);
|
|
ActCodeForm->ShowModal();
|
|
delete ActCodeForm;
|
|
ActCodeForm = NULL;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMOpenManual(TMessage &msg)
|
|
{
|
|
int op = msg.WParam;
|
|
|
|
String fn = String(g_AppPath) + "软件操作说明.doc";
|
|
if((DWORD)ShellExecute(Handle, L"Open", fn.c_str(), NULL, NULL, SW_SHOWNORMAL)<=32){
|
|
fn = String(g_AppPath);
|
|
if(op==1)
|
|
fn += "打法注码编辑说明.txt";
|
|
else
|
|
fn += "软件操作说明.txt";
|
|
ShellExecute(Handle, L"Open", fn.c_str(), NULL, NULL, SW_SHOWNORMAL);
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMUserConfirm(TMessage &msg)
|
|
{
|
|
ClearURThread();
|
|
|
|
int op = msg.WParam;
|
|
if(op==UR_RESET){
|
|
m_sActCode = "";
|
|
return;
|
|
}
|
|
|
|
bool bVerify = op<UR_LOGIN;
|
|
if(bVerify && !ActCodeForm)
|
|
return;
|
|
|
|
char arrMap[6][2][MAX_STR_LEN] = {
|
|
{"op", "userLogin"},
|
|
{"un", ""},
|
|
{"web", ""},
|
|
{"sid", ""},
|
|
{"ver", ""},
|
|
{"did", ""}
|
|
};
|
|
int num = 6, str_len;
|
|
if(bVerify || m_sActCode.Length()){
|
|
String sCode = bVerify ? ActCodeForm->m_sCode : m_sActCode;
|
|
|
|
strcpy( arrMap[1][1], ((AnsiString)sCode).c_str() );
|
|
strcpy( arrMap[2][1], "FS");
|
|
}
|
|
else{
|
|
strcpy( arrMap[1][1], ((AnsiString)m_frmInfo->m_lblAccName->Caption).c_str() );
|
|
strcpy( arrMap[2][1], g_iPlatform==PF_AB ? "ABG" : g_iPlatform==PF_DB ? "DB" : "AG");
|
|
}
|
|
sprintf( arrMap[3][1], "%d", SOFTWARE_ID );
|
|
sprintf( arrMap[4][1], "%d", m_version[0]*10000 + m_version[1]*100 + m_version[2] );
|
|
sprintf( arrMap[5][1], "%u", m_idDevice );
|
|
|
|
char strEncode[256];
|
|
int ret = PM_ParamEncode( strEncode, &str_len, arrMap, num );
|
|
|
|
DebugPrint( "ret=%d, str=%s", ret, strEncode );
|
|
|
|
m_urThread = new TAsynHttpThread( Handle, urServer, "Api", strEncode, str_len, op );
|
|
m_urThread->Start();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMHttpReturn(TMessage &msg)
|
|
{
|
|
if( !m_urThread )
|
|
return;
|
|
|
|
int errCode = msg.WParam;
|
|
int op = msg.LParam;
|
|
TAsynHttpThread* urThread = (TAsynHttpThread*)m_urThread;
|
|
|
|
String mbText, mbTitle;
|
|
int mbFlag = 0;
|
|
|
|
if( op==UR_REPORT ){
|
|
if( errCode==0 ){
|
|
g_nRBReport = 0;
|
|
|
|
char *szReturn = urThread->m_dataOut;
|
|
DebugPrint( "rbReportResult %s", szReturn );
|
|
}
|
|
}
|
|
else if( op==UR_LOGOUT ){
|
|
if( errCode==0 ){
|
|
char *szReturn = urThread->m_dataOut;
|
|
DebugPrint( "rbLogoutResult %s", szReturn );
|
|
}
|
|
}
|
|
else{
|
|
bool bVerify = op<UR_LOGIN;
|
|
int uid = 0,
|
|
extm = 0,
|
|
repeat = bVerify ? op : (op - UR_LOGIN),
|
|
errRes = 0;
|
|
|
|
if( errCode==0 ){
|
|
int len = urThread->m_sizeOut;
|
|
char *szReturn = urThread->m_dataOut;
|
|
if(szReturn[0]=='\"' && szReturn[len-1]=='\"')
|
|
szReturn[len-1] = 0;
|
|
|
|
DebugPrint( "userLoginResult %s", szReturn );
|
|
|
|
char* pos;
|
|
if( pos = strstr( szReturn, "err:" ) ){
|
|
sscanf( pos+4, "%d", &errRes );
|
|
}
|
|
else if(strstr( szReturn, "uid:" )){
|
|
char *tokenPtr=strtok(szReturn,"|");
|
|
while( tokenPtr ){
|
|
if( pos = strstr(tokenPtr, "uid:") ){
|
|
sscanf( pos+4, "%d", &uid );
|
|
}
|
|
else if( pos = strstr(tokenPtr, "exp:") ){
|
|
sscanf( pos+4, "%d", &extm );
|
|
}
|
|
tokenPtr=strtok(NULL,"|");
|
|
}
|
|
}
|
|
}
|
|
|
|
if(errRes){
|
|
m_tExpire = 0;
|
|
|
|
if(bVerify){
|
|
if(ActCodeForm)
|
|
PostMessage(ActCodeForm->Handle, UM_USERCONFIRM, errRes, 0);
|
|
}
|
|
else if(m_sActCode.Length()){
|
|
StopWebLoad();
|
|
|
|
if(errRes==102)
|
|
m_sActCode = "";
|
|
|
|
mbText = errRes==102 ? "无效的授权码"
|
|
: errRes==106 ? "该授权码正在其它设备上使用"
|
|
: "授权验证异常";
|
|
mbTitle = "授权";
|
|
mbFlag = MB_ICONERROR;
|
|
}
|
|
}
|
|
else if(errCode && !uid){
|
|
if(repeat<2){ //重试2次
|
|
PostMessage(Handle, UM_USERCONFIRM, op+1, 0 );
|
|
}
|
|
else if(bVerify){
|
|
if(ActCodeForm)
|
|
PostMessage(ActCodeForm->Handle, UM_USERCONFIRM, 100, 0);
|
|
}
|
|
else{
|
|
PostMessage(Handle, UM_WEBDEAD, -4, 0 );
|
|
}
|
|
}
|
|
else if(g_uid==0 || uid>0){
|
|
g_uid = uid;
|
|
m_tExpire = extm;
|
|
|
|
extm = m_tExpire - time(NULL);
|
|
|
|
bool bExpired = extm <= 0;
|
|
|
|
if(bExpired){
|
|
if(bVerify)
|
|
StopWebLoad();
|
|
else
|
|
PostMessage(Handle, UM_WEBDEAD, -2, 0 );
|
|
}
|
|
else{
|
|
SetExpireJS();
|
|
}
|
|
|
|
if(bVerify){
|
|
if(ActCodeForm){
|
|
m_sActCode = ActCodeForm->m_sCode;
|
|
PostMessage(ActCodeForm->Handle, UM_USERCONFIRM, 0, m_tExpire);
|
|
}
|
|
}
|
|
else if(!bExpired && !g_bGameOn && g_tmIdle<600){ //非无人值守挂机状态
|
|
for(int i=1; i<=7; i++){
|
|
if(extm < i * 86400){
|
|
mbText = "您的";
|
|
mbText += m_sActCode.Length() ? "授权码" : "账号授权";
|
|
mbText += "将在 " + IntToStr(i) + " 天内到期";
|
|
mbTitle = "注意";
|
|
mbFlag = MB_ICONWARNING;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
delete m_urThread;
|
|
m_urThread = NULL;
|
|
|
|
if(mbFlag){
|
|
MessageBox(Handle, (wchar_t*)mbText.c_str(), (wchar_t*)mbTitle.c_str(), MB_OK | mbFlag);
|
|
if(mbFlag==MB_ICONERROR)
|
|
PostMessage(Handle, UM_SUBFORMSHOWN, 0, 0 );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMWebLogin(TMessage &msg)
|
|
{
|
|
if(ActCodeForm)
|
|
return;
|
|
|
|
ClearJSThread();
|
|
|
|
if(!m_bWebLogon && m_chrm && m_chrm->Initialized){
|
|
m_chrm->StopLoad();
|
|
m_chrm->LoadURL("about:blank");
|
|
}
|
|
|
|
int iPF = msg.WParam;
|
|
|
|
if(iPF==PF_PA && m_iWS<0 && !m_vlThread)
|
|
WebsiteVelocity();
|
|
|
|
TLoginForm * pForm = new TLoginForm(this, iPF);
|
|
if (pForm->ShowModal() == mrOk) {
|
|
m_pDPTimer->Enabled = false;
|
|
m_tsMode->Enabled = false;
|
|
m_btnStart->Enabled = false;
|
|
m_btnTables->Enabled = false;
|
|
m_btnManual->Enabled = false;
|
|
|
|
if(m_chrm && m_chrm->Initialized){
|
|
m_chrm->StopLoad();
|
|
m_chrm->LoadURL("about:blank");
|
|
}
|
|
|
|
ManualOff();
|
|
g_bGameOn ? GameOff() : RBReport();
|
|
ClearGames();
|
|
|
|
|
|
m_bWebLogon = false;
|
|
if(!m_sActCode.Length())
|
|
g_uid = 0;
|
|
|
|
g_MinOnBet = 20; //缺省限红
|
|
g_MaxOnBet = 50000;
|
|
|
|
g_iPlatform = iPF;//pForm->m_iPlatform;
|
|
m_pmLogin->Items->Items[g_iPlatform-1]->Checked = true;
|
|
|
|
m_tmWebFocus = 0;
|
|
m_chrm->WasHidden(false);
|
|
m_chrm->SetFocus(true); //设为前台运行,否则无法加载
|
|
|
|
if( g_iPlatform==PF_PA ){
|
|
for(int i=0; i<6; i++ )
|
|
m_loginValues[i] = pForm->m_values[i];
|
|
|
|
if(m_chrm && m_chrm->Initialized && m_iWS>=0){
|
|
LoadUrl();
|
|
}
|
|
}
|
|
else{
|
|
m_url = pForm->m_url;
|
|
|
|
if(g_iPlatform==PF_DB)
|
|
m_loginValues[0] = pForm->m_values[0];
|
|
|
|
if(m_chrm && m_chrm->Initialized){
|
|
LoadUrl();
|
|
}
|
|
}
|
|
|
|
m_frmInfo->m_lblAccName->Caption = "";
|
|
m_frmInfo->m_lblLimits->Caption = "";
|
|
|
|
if(!g_settings.bSimAccOn || !g_bSimulate)
|
|
m_frmInfo->m_lblAccount->Caption = "";
|
|
|
|
m_lblTips->Caption = "正在连接网站...";
|
|
m_lblAnnonce->Visible = true;
|
|
m_lblTips->Visible = true;
|
|
}
|
|
// else{
|
|
// m_lblTips->Caption = "请登录游戏";
|
|
// }
|
|
|
|
delete pForm;
|
|
|
|
SetTableFocus();
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMStateUpdate(TMessage &msg)
|
|
{
|
|
int type = msg.WParam;
|
|
|
|
if(type==STATE_ALL){
|
|
if(g_aGames.betData.amounts[0]>0){
|
|
m_frmInfo->m_lblAmount->Caption = g_aGames.betData.amounts[0];
|
|
m_frmInfo->m_lblTotProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[0]);
|
|
m_frmInfo->m_lblTotProfit->Font->Color = g_aGames.betData.profits[0]<0 ? clFuchsia : clYellow;
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblAmount->Caption = "";
|
|
m_frmInfo->m_lblTotProfit->Caption = "";
|
|
}
|
|
|
|
if(g_aGames.betData.amounts[1]>0){
|
|
m_frmInfo->m_lblRealAmount->Caption = g_aGames.betData.amounts[1];
|
|
m_frmInfo->m_lblRealProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[4]);
|
|
m_frmInfo->m_lblRealProfit->Font->Color = g_aGames.betData.profits[4]<0 ? clFuchsia : clYellow;
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblRealAmount->Caption = "";
|
|
m_frmInfo->m_lblRealProfit->Caption = "";
|
|
}
|
|
|
|
if(g_aGames.betData.amounts[2]>0){
|
|
m_frmInfo->m_lblManAmount->Caption = g_aGames.betData.amounts[2];
|
|
m_frmInfo->m_lblManProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[5]);
|
|
m_frmInfo->m_lblManProfit->Font->Color = g_aGames.betData.profits[5]<0 ? clFuchsia : clYellow;
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblManAmount->Caption = "";
|
|
m_frmInfo->m_lblManProfit->Caption = "";
|
|
}
|
|
|
|
if(g_aGames.betData.profits[1]>0 || g_aGames.betData.profits[2]<0){
|
|
m_frmInfo->m_lblPeakU->Caption = FormatFloat("0.##",g_aGames.betData.profits[1]);
|
|
m_frmInfo->m_lblPeakL->Caption = FormatFloat("0.##",g_aGames.betData.profits[2]);
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblPeakU->Caption = "";
|
|
m_frmInfo->m_lblPeakL->Caption = "";
|
|
}
|
|
|
|
m_frmInfo->m_lblCurProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[3]);
|
|
m_frmInfo->m_lblCurProfit->Font->Color = g_aGames.betData.profits[3]<0 ? clFuchsia : clLime;
|
|
|
|
m_frmInfo->m_lblSRTitle->Caption = g_bSimulate ? "当前模拟:" : "当前实打:";
|
|
double srProf = g_bSimulate ? g_aGames.betData.profits[6] : g_aGames.betData.profits[7];
|
|
m_frmInfo->m_lblSRProfit->Caption = FormatFloat("0.##", srProf);
|
|
m_frmInfo->m_lblSRProfit->Font->Color = srProf<0 ? clFuchsia : clYellow;
|
|
|
|
if(g_aGames.betData.counts[0]>0)
|
|
m_frmInfo->m_lblWinCount->Caption = g_aGames.betData.counts[0];
|
|
else
|
|
m_frmInfo->m_lblWinCount->Caption = "";
|
|
|
|
if(g_aGames.betData.counts[1]>0)
|
|
m_frmInfo->m_lblLosCount->Caption = g_aGames.betData.counts[1];
|
|
else
|
|
m_frmInfo->m_lblLosCount->Caption = "";
|
|
|
|
if(g_aGames.betData.counts[2]>0)
|
|
m_frmInfo->m_lblSWin->Caption = g_aGames.betData.counts[2];
|
|
else
|
|
m_frmInfo->m_lblSWin->Caption = "";
|
|
|
|
if(g_aGames.betData.counts[3]>0)
|
|
m_frmInfo->m_lblSLos->Caption = g_aGames.betData.counts[3];
|
|
else
|
|
m_frmInfo->m_lblSLos->Caption = "";
|
|
|
|
if(g_aGames.betData.dead>0)
|
|
m_frmInfo->m_lblDead->Caption = g_aGames.betData.dead;
|
|
else
|
|
m_frmInfo->m_lblDead->Caption = "";
|
|
|
|
if(g_aGames.betData.maxChip>0)
|
|
m_frmInfo->m_lblMaxChip->Caption = g_aGames.betData.maxChip;
|
|
else
|
|
m_frmInfo->m_lblMaxChip->Caption = "";
|
|
|
|
if(g_settings.bSimAccOn && g_bSimulate){
|
|
m_frmInfo->m_lblAccountTitle->Caption = "本金:";
|
|
m_frmInfo->m_lblAccount->Caption = FormatFloat("0.##",g_settings.fSimAcc);
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblAccountTitle->Caption = "余额:";
|
|
m_frmInfo->m_lblAccount->Caption = FormatFloat("0.##",g_fBalance);
|
|
}
|
|
}
|
|
else if(type==STATE_BALANCE){
|
|
double fBalance;
|
|
if(g_settings.bSimAccOn && g_bSimulate){
|
|
if(msg.LParam)
|
|
m_frmInfo->m_lblAccountTitle->Caption = "本金:";
|
|
m_frmInfo->m_lblAccount->Caption = FormatFloat("0.##",g_settings.fSimAcc);
|
|
fBalance = g_settings.fSimAcc;
|
|
}
|
|
else{
|
|
if(msg.LParam)
|
|
m_frmInfo->m_lblAccountTitle->Caption = "余额:";
|
|
m_frmInfo->m_lblAccount->Caption = FormatFloat("0.##",g_fBalance);
|
|
fBalance = g_fBalance;
|
|
}
|
|
|
|
if(!g_aDots[1].empty()){
|
|
int nSim = g_settings.fSimAcc + 0.5;
|
|
if(nSim != g_aDots[1].back().val){
|
|
g_aDots[1].push_back(TDot(nSim, time(NULL)));
|
|
if(ChartForm)
|
|
PostMessage(ChartForm->Handle, UM_CHART_UPDATE, 1, 0);
|
|
}
|
|
}
|
|
if(!g_aDots[2].empty()){
|
|
int nBalance = g_fBalance + 0.5;
|
|
if(nBalance != g_aDots[2].back().val){
|
|
g_aDots[2].push_back(TDot(nBalance, time(NULL)));
|
|
if(ChartForm)
|
|
PostMessage(ChartForm->Handle, UM_CHART_UPDATE, 2, 0);
|
|
}
|
|
}
|
|
|
|
int stopAcc = 0;
|
|
if(g_settings.bAccStopWin && fBalance>=g_settings.nAccStopWin)
|
|
stopAcc = 5;
|
|
else if(g_settings.bAccStopLos && fBalance<=g_settings.nAccStopLos)
|
|
stopAcc = 6;
|
|
|
|
if(stopAcc)
|
|
GameOff(stopAcc);
|
|
}
|
|
else if(type==STATE_AMOUNT){
|
|
if(g_aGames.betData.amounts[0]>0){
|
|
m_frmInfo->m_lblAmount->Caption = g_aGames.betData.amounts[0];
|
|
m_frmInfo->m_lblTotProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[0]);
|
|
m_frmInfo->m_lblTotProfit->Font->Color = g_aGames.betData.profits[0]<0 ? clFuchsia : clYellow;
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblAmount->Caption = "";
|
|
m_frmInfo->m_lblTotProfit->Caption = "";
|
|
}
|
|
|
|
if(g_aGames.betData.amounts[1]>0){
|
|
m_frmInfo->m_lblRealAmount->Caption = g_aGames.betData.amounts[1];
|
|
m_frmInfo->m_lblRealProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[4]);
|
|
m_frmInfo->m_lblRealProfit->Font->Color = g_aGames.betData.profits[4]<0 ? clFuchsia : clYellow;
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblRealAmount->Caption = "";
|
|
m_frmInfo->m_lblRealProfit->Caption = "";
|
|
}
|
|
}
|
|
else if(type==STATE_LIMIT){
|
|
m_frmInfo->m_lblLimits->Caption = IntToStr(g_MinOnBet) + " - " + IntToStr(g_MaxOnBet);
|
|
|
|
if(g_iChipPolicy>=0 && g_aChipPolicies[g_iChipPolicy]->kind!=KIND_CHIP_COM)
|
|
RecalcMultiRate();
|
|
}
|
|
else if(type==STATE_BET_R){
|
|
int wl = msg.LParam;
|
|
if(g_aGames.betData.amounts[0]>0){
|
|
m_frmInfo->m_lblTotProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[0]);
|
|
m_frmInfo->m_lblTotProfit->Font->Color = g_aGames.betData.profits[0]<0 ? clFuchsia : clYellow;
|
|
|
|
if(!g_aDots[0].empty()){
|
|
double pro = g_aGames.betData.profits[0];
|
|
int nProfit = pro<0 ? pro - 0.5 : pro + 0.5;
|
|
if(nProfit != g_aDots[0].back().val){
|
|
g_aDots[0].push_back(TDot(nProfit, time(NULL)));
|
|
if(ChartForm)
|
|
PostMessage(ChartForm->Handle, UM_CHART_UPDATE, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(g_aGames.betData.amounts[1]>0){
|
|
m_frmInfo->m_lblRealProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[4]);
|
|
m_frmInfo->m_lblRealProfit->Font->Color = g_aGames.betData.profits[4]<0 ? clFuchsia : clYellow;
|
|
}
|
|
|
|
m_frmInfo->m_lblCurProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[3]);
|
|
m_frmInfo->m_lblCurProfit->Font->Color = g_aGames.betData.profits[3]<0 ? clFuchsia : clLime;
|
|
m_frmInfo->m_lblSRTitle->Caption = g_bSimulate ? "当前模拟:" : "当前实打:";
|
|
double srProf = g_bSimulate ? g_aGames.betData.profits[6] : g_aGames.betData.profits[7];
|
|
m_frmInfo->m_lblSRProfit->Caption = FormatFloat("0.##", srProf);
|
|
m_frmInfo->m_lblSRProfit->Font->Color = srProf<0 ? clFuchsia : clYellow;
|
|
|
|
int iStop = 0;
|
|
bool bSwitch = false;
|
|
if(wl==0){
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_RESET;
|
|
pLog->op = 0;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
}
|
|
else if(wl==1){
|
|
// m_frmInfo->m_lblWinCount->Caption = g_aGames.betData.counts[0];
|
|
|
|
if(g_bGameOn){
|
|
if(g_settings.bTotalStopWin && g_aGames.betData.profits[3]>=g_settings.nTotalStopWin) //总体止赢
|
|
iStop = 1;
|
|
|
|
if(g_bSimulate && g_settings.bS2RWin && g_settings.nS2RWin<=g_aGames.betData.profits[6]
|
|
|| !g_bSimulate && g_settings.bR2SWin && g_settings.nR2SWin<=g_aGames.betData.profits[7]) //模实切换
|
|
bSwitch = true;
|
|
}
|
|
}
|
|
else if(wl==2){
|
|
// m_frmInfo->m_lblLosCount->Caption = g_aGames.betData.counts[1];
|
|
|
|
if(g_bGameOn){
|
|
if(g_settings.bTotalStopLos && g_aGames.betData.profits[3]<=-g_settings.nTotalStopLos)//总体止损
|
|
iStop = 2;
|
|
|
|
if(g_settings.bU2DStop && (!g_settings.bU2DMinPeak || g_aGames.fCurrProfitPeak >= g_settings.nU2DMinPeak)
|
|
&& g_aGames.betData.profits[3] <= g_aGames.fCurrProfitPeak - g_settings.nU2DStop ){
|
|
if(!iStop || !g_settings.bU2DPause || g_settings.iTotalLosOp==2
|
|
&& g_settings.nTotalLosPause < g_settings.nU2DPause )
|
|
iStop = 7;
|
|
}
|
|
|
|
if(g_bSimulate && g_settings.bS2RLos && -g_settings.nS2RLos>=g_aGames.betData.profits[6]
|
|
|| !g_bSimulate && g_settings.bR2SLos && -g_settings.nR2SLos>=g_aGames.betData.profits[7]) //模实切换
|
|
bSwitch = true;
|
|
|
|
if(g_settings.bSimAccOn && g_settings.bStopLow && g_settings.fSimAcc<g_MinOnBet){
|
|
//检查是否还有待结算
|
|
bool bBetted = g_aGames.nBetted[0] || g_settings.bSyncReal && g_aGames.nBetted[1];
|
|
if(!bBetted){
|
|
GameOff(3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(g_bGameOn && iStop){
|
|
if(iStop==1 && g_settings.iTotalWinOp==0 || iStop==2 && g_settings.iTotalLosOp==0
|
|
|| iStop==7 && !g_settings.bU2DPause ){ //停止挂机
|
|
GameOff(iStop);
|
|
}
|
|
else if(!g_bBetPause){ //下局重置/暂停重置
|
|
ClearABThread();
|
|
bool bBreak = iStop==1 && g_settings.iTotalWinOp==1
|
|
|| iStop==2 && g_settings.iTotalLosOp==1; //下局重置
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
if(pT->m_pGame->bRun)
|
|
pT->m_pGame->AutoBetOff(bBreak);
|
|
}
|
|
|
|
if(g_aGames.bFloat) //游台无须等待结算
|
|
g_aGames.ResetFloat();
|
|
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_RESET;
|
|
pLog->op = iStop;
|
|
pLog->num = bBreak;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
int sec = (iStop==7 && g_settings.bU2DPause ? g_settings.nU2DPause
|
|
: iStop==1 && g_settings.iTotalWinOp==2 ? g_settings.nTotalWinPause
|
|
: iStop==2 && g_settings.iTotalLosOp==2 ? g_settings.nTotalLosPause
|
|
: 0 ) * 60;
|
|
|
|
if(sec==0 && g_aGames.pRankChip){ //立即重置
|
|
g_aGames.ResetRankChip();
|
|
}
|
|
else if(m_tmBetPause<sec){ //暂停重启
|
|
m_tmBetPause = sec;
|
|
g_bBetPause = true; //暂停下注
|
|
}
|
|
}
|
|
}
|
|
|
|
if(bSwitch && g_bGameOn){
|
|
m_tsMode->State = !m_tsMode->State;
|
|
}
|
|
}
|
|
else if(type==STATE_PEAK){
|
|
int ul = msg.LParam;
|
|
if(ul==1){
|
|
m_frmInfo->m_lblPeakU->Caption = FormatFloat("0.##",g_aGames.betData.profits[1]);
|
|
}
|
|
else if(ul==2){
|
|
m_frmInfo->m_lblPeakL->Caption = FormatFloat("0.##",g_aGames.betData.profits[2]);
|
|
}
|
|
else if(g_aGames.betData.profits[1]>0 || g_aGames.betData.profits[2]<0){
|
|
m_frmInfo->m_lblPeakU->Caption = FormatFloat("0.##",g_aGames.betData.profits[1]);
|
|
m_frmInfo->m_lblPeakL->Caption = FormatFloat("0.##",g_aGames.betData.profits[2]);
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblPeakU->Caption = "";
|
|
m_frmInfo->m_lblPeakL->Caption = "";
|
|
}
|
|
}
|
|
else if(type==STATE_COUNT){
|
|
int ind = msg.LParam;
|
|
bool bUpdChart = false;
|
|
if(ind==0){
|
|
if(g_aGames.betData.counts[0]>0){
|
|
m_frmInfo->m_lblWinCount->Caption = g_aGames.betData.counts[0];
|
|
bUpdChart = true;
|
|
}
|
|
else
|
|
m_frmInfo->m_lblWinCount->Caption = "";
|
|
}
|
|
else if(ind==1){
|
|
if(g_aGames.betData.counts[1]>0){
|
|
m_frmInfo->m_lblLosCount->Caption = g_aGames.betData.counts[1];
|
|
bUpdChart = true;
|
|
}
|
|
else
|
|
m_frmInfo->m_lblLosCount->Caption = "";
|
|
}
|
|
else if(ind==2){
|
|
if(g_aGames.betData.counts[2]>0)
|
|
m_frmInfo->m_lblSWin->Caption = g_aGames.betData.counts[2];
|
|
else
|
|
m_frmInfo->m_lblSWin->Caption = "";
|
|
}
|
|
else{
|
|
if(g_aGames.betData.counts[3]>0)
|
|
m_frmInfo->m_lblSLos->Caption = g_aGames.betData.counts[3];
|
|
else
|
|
m_frmInfo->m_lblSLos->Caption = "";
|
|
}
|
|
|
|
if(bUpdChart && !g_aDots[3].empty()){
|
|
int nWL = g_aGames.betData.counts[0] - g_aGames.betData.counts[1];
|
|
if(nWL != g_aDots[3].back().val){
|
|
g_aDots[3].push_back(TDot(nWL, time(NULL)));
|
|
if(ChartForm)
|
|
PostMessage(ChartForm->Handle, UM_CHART_UPDATE, 3, 0);
|
|
}
|
|
}
|
|
}
|
|
else if(type==STATE_MISC){
|
|
if(g_aGames.betData.maxChip>0)
|
|
m_frmInfo->m_lblMaxChip->Caption = g_aGames.betData.maxChip;
|
|
else
|
|
m_frmInfo->m_lblMaxChip->Caption = "";
|
|
|
|
if(g_aGames.betData.dead>0)
|
|
m_frmInfo->m_lblDead->Caption = g_aGames.betData.dead;
|
|
else
|
|
m_frmInfo->m_lblDead->Caption = "";
|
|
}
|
|
else if(type==STATE_REAL){
|
|
if(msg.LParam){
|
|
if(g_aGames.betData.amounts[1]>0){
|
|
m_frmInfo->m_lblRealAmount->Caption = g_aGames.betData.amounts[1];
|
|
m_frmInfo->m_lblRealProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[4]);
|
|
m_frmInfo->m_lblRealProfit->Font->Color = g_aGames.betData.profits[4]<0 ? clFuchsia : clYellow;
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblRealAmount->Caption = "";
|
|
m_frmInfo->m_lblRealProfit->Caption = "";
|
|
}
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblRealProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[4]);
|
|
m_frmInfo->m_lblRealProfit->Font->Color = g_aGames.betData.profits[4]<0 ? clFuchsia : clYellow;
|
|
}
|
|
}
|
|
else if(type==STATE_MAN){
|
|
if(msg.LParam){
|
|
if(g_aGames.betData.amounts[2]>0){
|
|
m_frmInfo->m_lblManAmount->Caption = g_aGames.betData.amounts[2];
|
|
m_frmInfo->m_lblManProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[5]);
|
|
m_frmInfo->m_lblManProfit->Font->Color = g_aGames.betData.profits[5]<0 ? clFuchsia : clYellow;
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblManAmount->Caption = "";
|
|
m_frmInfo->m_lblManProfit->Caption = "";
|
|
}
|
|
}
|
|
else{
|
|
m_frmInfo->m_lblManProfit->Caption = FormatFloat("0.##",g_aGames.betData.profits[5]);
|
|
m_frmInfo->m_lblManProfit->Font->Color = g_aGames.betData.profits[5]<0 ? clFuchsia : clYellow;
|
|
}
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMEnterTable(TMessage &msg)
|
|
{
|
|
if(m_pUtilTimer && m_pUtilTimer->Tag==0)
|
|
ClearUtilTimer();
|
|
|
|
int tab = msg.WParam;
|
|
|
|
m_chrm->WasHidden(false);
|
|
m_chrm->SetFocus(true); //设为前台,否则无法加载
|
|
|
|
if(tab==1){ //进入多台
|
|
m_tmWebFocus = 590; //保活10秒,以加载完成
|
|
}
|
|
else{
|
|
if( g_iPlatform==PF_PA ){
|
|
if(tab==0)
|
|
m_chrm->ExecuteJavaScript(goLinkJS_PA, "", 0); //进入多台
|
|
else
|
|
m_chrm->ExecuteJavaScript(goLobbyJS_PA, "", 0); //先回大厅
|
|
}
|
|
else if( g_iPlatform==PF_AB ){
|
|
m_chrm->ExecuteJavaScript(goLinkJS_AB, "", 0); //进入多台
|
|
}
|
|
|
|
m_tmWebFocus = 0;
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMChartUpdate(TMessage &msg)
|
|
{
|
|
int mod = msg.WParam,
|
|
op = msg.LParam;
|
|
if( op ){ //清除图表数据
|
|
g_aDots[mod].clear();
|
|
|
|
bool bAllClear = true;
|
|
for(int i=0; i<4; i++){
|
|
if(g_aDots[i].size()>1){
|
|
bAllClear = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if(bAllClear)
|
|
g_aGames.runTime = 0; //重置挂机时间
|
|
|
|
if(g_bGameOn){
|
|
TDot dot;
|
|
if(mod==0){
|
|
double pro = g_aGames.betData.profits[0];
|
|
dot.val = pro<0 ? pro - 0.5 : pro + 0.5;
|
|
g_aDots[0].push_back(dot);
|
|
}
|
|
else if(mod==1){
|
|
dot.val = g_settings.fSimAcc + 0.5;
|
|
g_aDots[1].push_back(dot);
|
|
}
|
|
else if(mod==2){
|
|
dot.val = g_fBalance + 0.5;
|
|
g_aDots[2].push_back(dot);
|
|
}
|
|
else if(mod==3){
|
|
dot.val = g_aGames.betData.counts[0] - g_aGames.betData.counts[1];
|
|
g_aDots[3].push_back(dot);
|
|
}
|
|
}
|
|
}
|
|
|
|
if(ChartForm)
|
|
PostMessage(ChartForm->Handle, UM_CHART_UPDATE, mod, op);
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMFloatBet(TMessage &msg)
|
|
{
|
|
// TGame* pGLast = g_aGames.GetGame(g_aGames.iFloatGame);
|
|
vector<TGame*> games;
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
|
|
if(pG->bRun && !pG->bIndPolicy && pG->timeout>3
|
|
&& pG->iGame!=g_aGames.iFloatGame)
|
|
games.push_back(pG);
|
|
}
|
|
|
|
int iStart = Random(games.size());
|
|
for(int i=iStart; i<games.size(); i++)
|
|
games[i]->AutoBetOn();
|
|
for(int i=iStart-1; i>=0; i--)
|
|
games[i]->AutoBetOn();
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMFloatDead(TMessage &msg)
|
|
{
|
|
int dead = msg.WParam;
|
|
int pause = msg.LParam;
|
|
|
|
g_aGames.ResetFloat();
|
|
|
|
if(dead==0){ //立即停止
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_END;
|
|
pLog->op = 4;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
if(pG->bRun && !pG->bIndPolicy)
|
|
pT->SetRun(false);
|
|
}
|
|
|
|
// GameOff(4);
|
|
}
|
|
else{
|
|
TBetLog* pLog = new TBetLog;
|
|
strcpy(pLog->tno, "游台");
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_DEAD;
|
|
pLog->op = dead;
|
|
pLog->num = pause;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
if(g_bGameOn){
|
|
if(dead==1){ //新局重启
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
if(pG->bRun && !pG->bIndPolicy)
|
|
pG->AutoBetOff(true);
|
|
}
|
|
}
|
|
else{ //暂停重启
|
|
if(pause==0){ //立即重启
|
|
if(!g_bBetPause) //当前没有暂停
|
|
PostMessage(Handle, UM_FLOAT_BET, 0, 0);
|
|
}
|
|
else{
|
|
int sec = pause * 60;
|
|
if(m_tmDeadPause < sec){ //可能止赢止损暂停中
|
|
m_tmDeadPause = sec;
|
|
g_bDeadPause = true; //爆缆暂停
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMGlobalBet(TMessage &msg)
|
|
{
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
|
|
if(pG->bRun && !pG->bIndPolicy && pG->timeout>3)
|
|
pG->AutoBetOn();
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::UMGlobalDead(TMessage &msg)
|
|
{
|
|
int dead = msg.WParam;
|
|
int pause = msg.LParam;
|
|
|
|
g_aGames.ResetRankChip();
|
|
|
|
if(dead==0){ //立即停止
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_END;
|
|
pLog->op = 8;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
if(pG->bRun && !pG->bIndPolicy)
|
|
pT->SetRun(false);
|
|
}
|
|
// GameOff(8);
|
|
}
|
|
else{
|
|
TBetLog* pLog = new TBetLog;
|
|
strcpy(pLog->tno, "总体");
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_DEAD;
|
|
pLog->op = dead;
|
|
pLog->num = pause;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
|
|
if(g_bGameOn && (dead==1 || dead==2 && pause!=0)){ //dead==1新局重启
|
|
if(dead==2){
|
|
int sec = pause * 60;
|
|
if(m_tmDeadPause < sec){ //可能止赢止损暂停中
|
|
m_tmDeadPause = sec;
|
|
g_bDeadPause = true; //爆缆暂停
|
|
}
|
|
}
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
if(pG->bRun && !pG->bIndPolicy)
|
|
pG->AutoBetOff(dead==1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::StartJSThread(int iOp)
|
|
{
|
|
if( m_jsThread ){
|
|
if(((TJSHandleThread*)m_jsThread)->m_op >= iOp)
|
|
return;
|
|
|
|
ClearJSThread();
|
|
}
|
|
|
|
m_jsThread = new TJSHandleThread( iOp );
|
|
m_jsThread->Start();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::GetDeviceId()
|
|
{
|
|
HKEY hKey;
|
|
DWORD dwDisposition;
|
|
long lResult;
|
|
lResult = RegCreateKeyEx(HKEY_CURRENT_USER, L"SOFTWARE\\RnB\\RBmaster", 0,
|
|
NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey,
|
|
&dwDisposition);
|
|
|
|
if (lResult == ERROR_SUCCESS) {
|
|
if (dwDisposition == REG_OPENED_EXISTING_KEY) {
|
|
UINT nValue;
|
|
DWORD dwSize = sizeof(int), dwType;
|
|
|
|
long lRes = RegQueryValueEx(hKey, L"deviceId", NULL, &dwType,
|
|
(LPBYTE) & nValue, &dwSize);
|
|
if (lRes == ERROR_SUCCESS && dwSize > 0) {
|
|
m_idDevice = nValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(!m_idDevice){
|
|
m_idDevice = time(NULL) % (int)1e9 + Random(4) * (int)1e9;
|
|
|
|
if(lResult == ERROR_SUCCESS) {
|
|
RegSetValueEx(hKey, L"deviceId", 0, REG_DWORD,
|
|
(LPBYTE) &m_idDevice, sizeof(DWORD));
|
|
}
|
|
}
|
|
|
|
if(lResult == ERROR_SUCCESS) {
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
DebugPrint("idDevice: %u", m_idDevice);
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ResetGame()
|
|
{
|
|
// g_betSet.nBaseChip = m_leChip->Text.ToInt();
|
|
// g_betSet.fSum = 0;
|
|
// g_betSet.nWinCounts = g_betSet.nLosCounts = 0;
|
|
// g_betSet.fWinSum = g_betSet.fLosSum = 0;
|
|
UpdateStatistics();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearGames()
|
|
{
|
|
m_aSelTabs.clear();
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
delete m_aTables[i];
|
|
}
|
|
m_aTables.clear();
|
|
|
|
g_aGames.ClearAllGames();
|
|
|
|
ResetTableGrid();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ManualOn()
|
|
{
|
|
if(!m_bManual){
|
|
m_bManual = true;
|
|
m_btnManual->Caption = "关闭手工";
|
|
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
//清除台桌选择
|
|
ClearSelect();
|
|
|
|
//显示筹码
|
|
ChipsForm = new TChipsForm(this);
|
|
int x = Left>DPIX(60) ? - DPIX(50) : -DPIX(5); //放置到窗口外
|
|
TPoint pt = TPoint(x, m_panWeb->Top);
|
|
pt = ClientToScreen(pt);
|
|
ChipsForm->Left = pt.x;
|
|
ChipsForm->Top = pt.y;
|
|
ChipsForm->Show();
|
|
|
|
//开启手工
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
PostMessage(m_aTables[i]->Handle, UM_MANUAL_SET, true, 0);
|
|
}
|
|
LockWindowUpdate( 0 );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ManualOff()
|
|
{
|
|
if(m_bManual){
|
|
m_bManual = false;
|
|
m_btnManual->Caption = "开启手工";
|
|
|
|
ChipsForm->Hide();
|
|
delete ChipsForm;
|
|
ChipsForm = NULL;
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
PostMessage(m_aTables[i]->Handle, UM_MANUAL_SET, false, 0);
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::InitBrowser()
|
|
{
|
|
m_chrm = new TChromium(NULL);
|
|
m_chrm->OnProcessMessageReceived = WebProcessMessageReceived;
|
|
m_chrm->OnBeforeContextMenu = WebBeforeContextMenu;
|
|
m_chrm->OnBeforePopup = WebBeforePopup;
|
|
m_chrm->OnLoadEnd = WebLoadEnd;
|
|
m_chrm->OnResourceLoadComplete = WebResourceLoadComplete;
|
|
// m_chrm->OnAddressChange = WebAddressChange;
|
|
m_chrm->OnJsdialog = WebJsdialog;
|
|
m_chrm->OnLoadError = WebLoadError;
|
|
m_chrm->OnBeforeResourceLoad = WebBeforeResourceLoad;
|
|
|
|
m_chrm->OnAfterCreated = WebAfterCreated;
|
|
m_chrm->OnBeforeClose = WebBeforeClose;
|
|
|
|
m_chrm->CreateBrowser();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
_di_ICefFrame __fastcall TMainForm::GetCefFrame( int type )
|
|
{
|
|
if( m_chrm ){
|
|
if( type==MAIN_FRAME )
|
|
return m_chrm->Browser->MainFrame;// >GetFrameByident( m_idMainFrm );
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
bool __fastcall TMainForm::WebsiteVelocity()
|
|
{
|
|
Screen->Cursor = crHourGlass;
|
|
m_vlThread = new TVeloThread( Handle, WSNUM, websites );
|
|
// ((TVeloThread*)m_vlThread)->m_sWebsite = m_sWebsite;
|
|
m_vlThread->Start();
|
|
|
|
return true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnStartClick(TObject *Sender)
|
|
{
|
|
if( !g_bGameOn ){
|
|
if(g_iBetPolicy<0){
|
|
ShowMessage( "请先选择打法" );
|
|
goto Start_Click_Exit;
|
|
}
|
|
|
|
if(g_iChipPolicy<0){
|
|
ShowMessage( "请先选择注码" );
|
|
goto Start_Click_Exit;
|
|
}
|
|
|
|
if(g_aGames.nBetted[0] || g_aGames.nBetted[1]){
|
|
int mrRet = MessageBox(Handle, L"上次结算尚未完成,是否开始挂机?", L"挂机",
|
|
MB_ICONQUESTION | MB_OKCANCEL);
|
|
|
|
if( mrRet==mrCancel )
|
|
goto Start_Click_Exit;
|
|
}
|
|
|
|
if(g_bShowSetting && ShowSettingForm()==mrCancel)
|
|
goto Start_Click_Exit;
|
|
|
|
GameOn();
|
|
}
|
|
else{
|
|
GameOff();
|
|
}
|
|
|
|
Start_Click_Exit:
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebMouseWheelDown(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled)
|
|
{
|
|
m_panWeb->Perform(WM_VSCROLL,SB_LINEDOWN,0);
|
|
Handled = true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebMouseWheelUp(TObject *Sender, TShiftState Shift, TPoint &MousePos, bool &Handled)
|
|
{
|
|
m_panWeb->Perform(WM_VSCROLL,SB_LINEUP,0);
|
|
Handled = true;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnRoadChange(TObject *Sender)
|
|
{
|
|
TComboBox* combo = (TComboBox*)Sender;
|
|
|
|
int iRoad = combo->ItemIndex;
|
|
if( iRoad!=g_iRoad ){
|
|
g_iRoad = iRoad;
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
if(pG && pG->iRoad<0)
|
|
PostMessage(pT->Handle, UM_CHANGE_ROAD, 0, 0);
|
|
}
|
|
}
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnTablesClick(TObject *Sender)
|
|
{
|
|
TButton* pB = (TButton*)Sender;
|
|
|
|
TTabSetForm* pForm = new TTabSetForm(this, g_aGames.size(), m_nTabShow, m_nTabRun);
|
|
|
|
TPoint pt = TPoint(m_panTopBar->Left + pB->Left, m_panTopBar->Top + pB->Top);
|
|
pt = ClientToScreen(pt);
|
|
pForm->Top = pt.y + pB->Height + 2;
|
|
pForm->Left = pt.x - (pForm->Width - pB->Width)/2;
|
|
|
|
if(mrOk == pForm->ShowModal()){
|
|
ClearSelect();
|
|
|
|
m_nTabShow = pForm->m_nShow;
|
|
m_nTabRun = pForm->m_nRun;
|
|
|
|
int nTab = m_aTables.size();
|
|
if(m_nTabShow<0 || nTab<m_nTabShow){ //显示台桌增加
|
|
int nGame = g_aGames.size();
|
|
int nShow = (m_nTabShow<0 || m_nTabShow>nGame) ? nGame : m_nTabShow;
|
|
for(int i=nTab; i<nShow; i++){
|
|
TGame* pG = g_aGames[i];
|
|
TTableFrame* pT = new TTableFrame(NULL);
|
|
pT->Parent = m_panWeb;
|
|
pT->SetGame(pG);
|
|
m_aTables.push_back(pT);
|
|
|
|
if(m_bManual)
|
|
PostMessage(pT->Handle, UM_MANUAL_SET, true, 0);
|
|
}
|
|
|
|
ResetTableGrid();
|
|
}
|
|
else if(nTab > m_nTabShow){ //显示台桌减少
|
|
for(int i=nTab-1; i>=m_nTabShow; i--){
|
|
TTableFrame* pT = m_aTables[i];
|
|
pT->SetRun(false);
|
|
pT->SetGame(NULL);
|
|
delete pT;
|
|
m_aTables.pop_back();
|
|
}
|
|
ResetTableGrid();
|
|
}
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
pT->SetRun(m_nTabRun<0 || i<m_nTabRun);
|
|
}
|
|
}
|
|
|
|
delete pForm;
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnPolicyEditClick(TObject *Sender)
|
|
{
|
|
int iType = Sender==m_lblBetChipEdit;
|
|
TComboBox* pCB = iType ? m_cbBetChips : m_cbBetWays;
|
|
|
|
TPolicyEditForm* pForm = new TPolicyEditForm(this, iType);
|
|
|
|
if(pForm->ShowModal()==mrOk){
|
|
}
|
|
|
|
delete pForm;
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnPolicyChange(TObject *Sender)
|
|
{
|
|
TComboBox* combo = (TComboBox*)Sender;
|
|
int& iPolicy = Sender==m_cbBetWays ? g_iBetPolicy : g_iChipPolicy;
|
|
|
|
int ind = combo->ItemIndex;
|
|
if( ind!=iPolicy ){
|
|
iPolicy = ind;
|
|
|
|
if(ind<0){
|
|
combo->Text = combo->Hint;
|
|
|
|
if(combo==m_cbBetChips){
|
|
g_nChipMul = 0;
|
|
m_leChipMul->Text = "";
|
|
m_leChipMul->Enabled = false;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if(combo==m_cbBetChips){ //根据最小注码调整倍数
|
|
if(g_aChipPolicies[ind]->kind==KIND_CHIP_COM){
|
|
g_nChipMul = 0;
|
|
m_leChipMul->Text = "";
|
|
m_leChipMul->Enabled = false;
|
|
}
|
|
else{
|
|
RecalcMultiRate();
|
|
}
|
|
}
|
|
else{ //根据打法改变路珠显示
|
|
m_cbRoad->ItemIndex = ((TBetPolicy*)g_aBetPolicies[ind])->road;
|
|
OnRoadChange(m_cbRoad);
|
|
}
|
|
|
|
if(g_bGameOn){
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
TGame* pG = pT->m_pGame;
|
|
if(pG && pG->bRun && !pG->bIndPolicy){
|
|
pG->AutoBetOff();
|
|
pG->AutoBetOn();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::RecalcMultiRate()
|
|
{
|
|
int minChip = MinChipOfPolicy(g_iChipPolicy);
|
|
if(minChip>0){
|
|
int multi = g_MinOnBet / minChip;
|
|
if(g_MinOnBet % minChip) multi++;
|
|
|
|
if(g_nChipMul<multi){
|
|
g_nChipMul = multi;
|
|
m_leChipMul->Text = IntToStr(multi);
|
|
m_leChipMul->Enabled = true;
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall TMainForm::IsPolicyInUse(int type, int iPolicy)
|
|
{
|
|
int& rgP = type==TYPE_P_BET ? g_iBetPolicy : g_iChipPolicy;
|
|
if(g_bGameOn && rgP==iPolicy)
|
|
return 1;
|
|
|
|
for(int i=0; i<m_aTables.size(); i++){
|
|
TTableFrame* pT = m_aTables[i];
|
|
int& rP = type==TYPE_P_BET ? pT->m_pGame->iBetPolicy
|
|
: pT->m_pGame->iChipPolicy;
|
|
if(rP==iPolicy)
|
|
return 2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
Int8 __fastcall TMainForm::ShowSettingForm()
|
|
{
|
|
SettingForm = new TSettingForm(NULL);
|
|
TPoint pt = TPoint(m_panTopBar->Left + m_btnSetting->Left
|
|
+ m_btnSetting->Width - SettingForm->Width, m_panWeb->Top);
|
|
pt = ClientToScreen(pt);
|
|
SettingForm->Top = pt.y;
|
|
SettingForm->Left = pt.x;
|
|
|
|
Int8 ret = SettingForm->ShowModal();
|
|
|
|
delete SettingForm;
|
|
SettingForm = NULL;
|
|
|
|
SetTableFocus();
|
|
|
|
return ret;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnLoginClick(TObject *Sender)
|
|
{
|
|
if(g_bGameOn){
|
|
int mrRet = MessageBox(Handle, L"正在挂机中,是否确定重新登录?", L"登录",
|
|
MB_ICONQUESTION | MB_OKCANCEL);
|
|
|
|
if( mrRet==mrCancel ){
|
|
goto LoginExit;
|
|
}
|
|
else{
|
|
GameOff();
|
|
}
|
|
}
|
|
|
|
if(g_aGames.nBetted[0] || g_aGames.nBetted[1]){
|
|
int mrRet = MessageBox(Handle, L"尚有结算未完成,是否确定重新登录?", L"登录",
|
|
MB_ICONQUESTION | MB_OKCANCEL);
|
|
|
|
if( mrRet==mrCancel ){
|
|
goto LoginExit;
|
|
}
|
|
}
|
|
|
|
TPoint pt = TPoint(m_panTopBar->Left + m_btnLogin->Left,
|
|
m_panTopBar->Top + m_btnLogin->Top + m_btnLogin->Height);
|
|
pt = ClientToScreen(pt);
|
|
m_pmLogin->Popup( pt.x, pt.y );
|
|
|
|
LoginExit:
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnLoginMenuClick(TObject *Sender)
|
|
{
|
|
TMenuItem* pMI = (TMenuItem*)Sender;
|
|
// SetTableFocus();
|
|
PostMessage( Handle, UM_WEBLOGIN, pMI->Tag, 0 );
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnAccountClick(TObject *Sender)
|
|
{
|
|
if(!m_frmInfo->m_lblAccName->Caption.IsEmpty()){
|
|
Clipboard()->AsText = m_frmInfo->m_lblAccName->Caption;
|
|
ShowMessage("账号已复制到剪切板");
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnChipMulExit(TObject *Sender)
|
|
{
|
|
int minChip = MinChipOfPolicy(g_iChipPolicy);
|
|
int mul = m_leChipMul->Text.ToInt();
|
|
if(minChip * mul < g_MinOnBet){
|
|
int multi = g_MinOnBet / minChip;
|
|
if(g_MinOnBet % minChip) multi++;
|
|
|
|
m_leChipMul->Text = IntToStr(multi);
|
|
|
|
ShowMessage("请输入适当的投注倍数\n(最小值:" + IntToStr(multi) + ")");
|
|
|
|
m_leChipMul->SetFocus();
|
|
}
|
|
else
|
|
g_nChipMul = mul;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnLogsClick(TObject *Sender)
|
|
{
|
|
if(!BetLogForm){
|
|
BetLogForm = new TBetLogForm(this);
|
|
|
|
TPoint pt = TPoint(ClientWidth - BetLogForm->Width, m_panWeb->Top);
|
|
pt = ClientToScreen(pt);
|
|
BetLogForm->Left = pt.x;
|
|
BetLogForm->Top = pt.y;
|
|
|
|
BetLogForm->Show();
|
|
}
|
|
else{
|
|
BetLogForm->BringToFront();
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnChartClick(TObject *Sender)
|
|
{
|
|
if(!ChartForm){
|
|
//初始化图表数据
|
|
TDot dot;
|
|
if(g_aDots[0].empty()){
|
|
double pro = g_aGames.betData.profits[0];
|
|
dot.val = pro<0 ? pro - 0.5 : pro + 0.5;
|
|
g_aDots[0].push_back(dot);
|
|
}
|
|
if(g_aDots[1].empty()){
|
|
dot.val = g_settings.fSimAcc + 0.5;
|
|
g_aDots[1].push_back(dot);
|
|
}
|
|
if(g_aDots[2].empty()){
|
|
dot.val = g_fBalance + 0.5;
|
|
g_aDots[2].push_back(dot);
|
|
}
|
|
if(g_aDots[3].empty()){
|
|
dot.val = g_aGames.betData.counts[0] - g_aGames.betData.counts[1];
|
|
g_aDots[3].push_back(dot);
|
|
}
|
|
|
|
ChartForm = new TChartForm(this);
|
|
|
|
TPoint pt = TPoint(0, ClientHeight - ChartForm->Height - DPIY(4));
|
|
pt = ClientToScreen(pt);
|
|
ChartForm->Left = pt.x;
|
|
ChartForm->Top = pt.y;
|
|
ChartForm->Show();
|
|
}
|
|
else{
|
|
if(ChartForm->WindowState==wsMinimized)
|
|
ChartForm->WindowState = wsNormal;
|
|
|
|
ChartForm->BringToFront();
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnSettingClick(TObject *Sender)
|
|
{
|
|
ShowSettingForm();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnResetClick(TObject *Sender)
|
|
{
|
|
ResetForm = new TResetForm(NULL);
|
|
TPoint pt = TPoint( m_panTopBar->Left + m_btnReset->Left
|
|
+ (m_btnReset->Width - ResetForm->Width)/ 2
|
|
, m_panWeb->Top);
|
|
pt = ClientToScreen(pt);
|
|
ResetForm->Left = pt.x;
|
|
ResetForm->Top = pt.y;
|
|
|
|
ResetForm->ShowModal();
|
|
|
|
delete ResetForm;
|
|
ResetForm = NULL;
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnModeClick(TObject *Sender)
|
|
{
|
|
g_bSimulate = m_tsMode->State==tssOff;
|
|
if(g_bSimulate){
|
|
if(g_bGameOn)
|
|
g_aGames.betData.profits[6] = 0;
|
|
|
|
if(g_settings.bSimAccOn){
|
|
m_frmInfo->m_lblAccountTitle->Caption = "本金";
|
|
m_frmInfo->m_lblAccount->Caption = FormatFloat("0.##",g_settings.fSimAcc);
|
|
}
|
|
}
|
|
else{
|
|
if(g_bGameOn)
|
|
g_aGames.betData.profits[7] = 0;
|
|
|
|
if(g_settings.bSimAccOn){
|
|
m_frmInfo->m_lblAccountTitle->Caption = "余额";
|
|
m_frmInfo->m_lblAccount->Caption = FormatFloat("0.##",g_fBalance);
|
|
}
|
|
}
|
|
m_frmInfo->m_lblSRTitle->Caption = g_bSimulate ? "当前模拟:" : "当前实打:";
|
|
m_frmInfo->m_lblSRProfit->Caption = "";
|
|
|
|
if(g_bGameOn){
|
|
TBetLog* pLog = new TBetLog;
|
|
pLog->ts = DateTimeToUnix(Now(), false);
|
|
pLog->ev = LOGEVT_SWITCH;
|
|
pLog->op = g_bSimulate;
|
|
SendMessage(Handle, UM_LOG_UPDATE, 0, (long)pLog);
|
|
}
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnManualClick(TObject *Sender)
|
|
{
|
|
if(!m_bManual){
|
|
ManualOn();
|
|
}
|
|
else{
|
|
ManualOff();
|
|
}
|
|
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnChipMulKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
|
|
{
|
|
if( Key==13 )
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::RBReport()
|
|
{
|
|
if(!g_uid || !g_nRBReport || m_sActCode.Length() || g_bTesting)
|
|
return;
|
|
|
|
ClearURThread();
|
|
|
|
char arrMap[3][2][MAX_STR_LEN] = {
|
|
{"op", "rbReport"},
|
|
{"uid", ""},
|
|
{"amo", ""}
|
|
};
|
|
sprintf( arrMap[1][1], "%d", g_uid );
|
|
sprintf( arrMap[2][1], "%d", g_nRBReport );
|
|
|
|
int num = 3, str_len;
|
|
char strEncode[256];
|
|
int ret = PM_ParamEncode( strEncode, &str_len, arrMap, num );
|
|
|
|
m_urThread = new TAsynHttpThread( Handle, urServer, "Api", strEncode, str_len, UR_REPORT );
|
|
m_urThread->Start();
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::Logout()
|
|
{
|
|
if(!g_uid || !m_idDevice || !m_sActCode.Length())
|
|
return;
|
|
|
|
ClearURThread();
|
|
|
|
char arrMap[3][2][MAX_STR_LEN] = {
|
|
{"op", "rbLogout"},
|
|
{"uid", ""},
|
|
{"did", ""}
|
|
};
|
|
sprintf( arrMap[1][1], "%u", g_uid );
|
|
sprintf( arrMap[2][1], "%u", m_idDevice );
|
|
|
|
int num = 3, str_len;
|
|
char strEncode[256];
|
|
int ret = PM_ParamEncode( strEncode, &str_len, arrMap, num );
|
|
|
|
m_urThread = new TAsynHttpThread( Handle, urServer, "Api", strEncode, str_len, UR_LOGOUT );
|
|
m_urThread->Start();
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::SetExpireJS()
|
|
{
|
|
if(m_bWebLogon){
|
|
String strJS = Format(g_iPlatform==PF_PA ? expireJS_PA
|
|
: g_iPlatform==PF_AB ? expireJS_AB
|
|
: expireJS_DB,
|
|
ARRAYOFCONST((g_uid, m_tExpire)));
|
|
m_chrm->ExecuteJavaScript( strJS, "", 0 );
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall TMainForm::GetTimeCount()
|
|
{
|
|
time_t t;
|
|
struct tm *tm;
|
|
time(&t);
|
|
tm = localtime(&t);
|
|
|
|
return tm->tm_hour * 60 * 60 + tm->tm_min * 60 + tm->tm_sec;
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
void __fastcall TMainForm::LoadUrl()
|
|
{
|
|
m_chrm->LoadURL(g_iPlatform==PF_PA ? (String)websites[m_iWS] : m_url);
|
|
m_lblTips->Caption = "正在连接网站...";
|
|
|
|
//修改title
|
|
String platform = g_iPlatform==PF_DB ? "多宝(DB)"
|
|
: g_iPlatform==PF_AB ? "欧博(ABG)"
|
|
: "PA视讯(AG)";
|
|
String title = Caption;
|
|
int pos = title.Pos("当前游戏:");
|
|
if(pos>0){
|
|
title = title.SubString(1, pos+4);
|
|
title += platform;
|
|
}
|
|
else{
|
|
title += " 当前游戏:" + platform;
|
|
}
|
|
|
|
Caption = title;
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::SetTableFocus()
|
|
{
|
|
if(!m_aTables.empty()){
|
|
TWinControl* pCtrl = ActiveControl;
|
|
if(!pCtrl || !pCtrl->ClassNameIs(TDrawGrid::ClassName())
|
|
&& !pCtrl->ClassNameIs(TStringGrid::ClassName())){
|
|
int sp = m_panWeb->VertScrollBar->Position,
|
|
r = sp / TFHEIGHT;
|
|
if(sp % TFHEIGHT > DPIY(20)) r++;
|
|
|
|
m_aTables[r * m_nTabCols]->m_dgRoad->SetFocus();
|
|
DebugPrint("Set focus on table row: %d", r);
|
|
}
|
|
}
|
|
else if(m_panWeb->Showing){
|
|
m_panWeb->SetFocus();
|
|
}
|
|
}
|
|
// ---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnComboCloseUp(TObject *Sender)
|
|
{
|
|
SetTableFocus();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
int __fastcall TMainForm::GetTableByPos(int x, int y)
|
|
{
|
|
int row = (m_panWeb->VertScrollBar->Position + y) / TFHEIGHT,
|
|
col = x / (TFWIDTH + m_nTabGap);
|
|
|
|
if( x % (TFWIDTH + m_nTabGap) > TFWIDTH)
|
|
return -1;
|
|
|
|
int n = row * m_nTabCols + col;
|
|
if(n < m_aTables.size())
|
|
return n;
|
|
|
|
return -1;
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
TForm *fmMask = NULL;
|
|
int xDown, yDown, xMove, yMove;
|
|
int spDown, spMove; //滚动条位置(起始/上次)
|
|
int mode; //集合运算 0=none单集(b) 1=shift并集(a+b) 2=ctrl对称差集(a+b-a^b)
|
|
set<int> setSel, setUns;
|
|
|
|
void __fastcall TMainForm::WebMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
|
|
{
|
|
if(m_aTables.empty() || m_bManual) //开启手工不进行台桌选择
|
|
return;
|
|
|
|
setSel.clear();
|
|
setUns.clear();
|
|
|
|
if( Button==mbRight ){
|
|
if(Sender!=m_panWeb){
|
|
TPoint pt = ((TControl*)Sender)->ClientToParent(TPoint(X,Y), m_panWeb);
|
|
X = pt.x;
|
|
Y = pt.y;
|
|
}
|
|
|
|
int iSel = GetTableByPos(X, Y);
|
|
set<int>::iterator it = m_aSelTabs.find(iSel);
|
|
if(it==m_aSelTabs.end()){ //未点击选中项
|
|
for(it=m_aSelTabs.begin(); it!=m_aSelTabs.end(); it++){
|
|
m_aTables[*it]->SetSel(false);
|
|
}
|
|
m_aSelTabs.clear();
|
|
m_iLastSel = -1;
|
|
}
|
|
}
|
|
else if( Button==mbLeft ){
|
|
if(Sender!=m_panWeb){
|
|
TPoint pt = ((TControl*)Sender)->ClientToParent(TPoint(X,Y), m_panWeb);
|
|
X = pt.x;
|
|
Y = pt.y;
|
|
}
|
|
|
|
int iSel = GetTableByPos(X, Y);
|
|
|
|
if(Shift.Contains(ssShift)){
|
|
if(iSel>=0){
|
|
if(m_iLastSel<0){
|
|
m_aTables[iSel]->SetSel(true);
|
|
m_aSelTabs.insert(iSel);
|
|
m_iLastSel = iSel;
|
|
}
|
|
else{
|
|
int iF = iSel < m_iLastSel ? iSel : m_iLastSel,
|
|
iL = iF==iSel ? m_iLastSel : iSel;
|
|
|
|
set<int>::iterator it = m_aSelTabs.begin();
|
|
while(it!=m_aSelTabs.end()){ //先删
|
|
if(*it < iF || *it > iL){
|
|
m_aTables[*it]->SetSel(false);
|
|
it = m_aSelTabs.erase(it);
|
|
}
|
|
else
|
|
it++;
|
|
}
|
|
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
for(int i=iF; i<=iL; i++){ //后加
|
|
it = m_aSelTabs.find(i);
|
|
if(it==m_aSelTabs.end()){
|
|
m_aTables[i]->SetSel(true);
|
|
m_aSelTabs.insert(i);
|
|
}
|
|
}
|
|
LockWindowUpdate( 0 );
|
|
}
|
|
}
|
|
|
|
mode = 1;
|
|
}
|
|
else if(Shift.Contains(ssCtrl)){
|
|
if(iSel>=0){
|
|
set<int>::iterator it = m_aSelTabs.find(iSel);
|
|
if(it==m_aSelTabs.end()){
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
m_aTables[iSel]->SetSel(true);
|
|
setSel.insert(iSel);
|
|
LockWindowUpdate( 0 );
|
|
}
|
|
else{
|
|
m_aTables[iSel]->SetSel(false);
|
|
setUns.insert(iSel);
|
|
}
|
|
|
|
m_iLastSel = iSel;
|
|
}
|
|
|
|
mode = 2;
|
|
}
|
|
else{
|
|
set<int>::iterator it = m_aSelTabs.begin();
|
|
while(it!=m_aSelTabs.end()){
|
|
if(*it!=iSel){
|
|
m_aTables[*it]->SetSel(false);
|
|
it = m_aSelTabs.erase(it);
|
|
}
|
|
else
|
|
it++;
|
|
}
|
|
|
|
if(iSel>=0){
|
|
if(m_aSelTabs.empty()){
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
m_aTables[iSel]->SetSel(true);
|
|
m_aSelTabs.insert(iSel);
|
|
LockWindowUpdate( 0 );
|
|
}
|
|
}
|
|
|
|
m_iLastSel = iSel;
|
|
mode = 0;
|
|
}
|
|
|
|
spDown = m_panWeb->VertScrollBar->Position;
|
|
xDown = X, yDown = Y;
|
|
m_bDragReady = true;
|
|
SetCapture( m_panWeb->Handle );
|
|
// DebugPrint("Captured");
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
|
|
{
|
|
if(m_bDragReady){
|
|
if( abs(X-xDown)>=5
|
|
|| abs(Y-yDown)>=5 ){ //开始拖动
|
|
m_bDragReady = false;
|
|
m_bDraging = true;
|
|
// DebugPrint("beging draging");
|
|
|
|
int l = xDown<X ? xDown : X,
|
|
t = yDown<Y ? yDown : Y,
|
|
w = abs(X - xDown),
|
|
h = abs(Y - yDown);
|
|
xMove = X, yMove = Y;
|
|
spMove = m_panWeb->VertScrollBar->Position;
|
|
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
if(!fmMask){
|
|
fmMask = new TForm((HWND)NULL);
|
|
fmMask->Visible = false;
|
|
fmMask->Parent = m_panWeb;
|
|
fmMask->Position = poDesigned;
|
|
// fmMask->FormStyle = fsStayOnTop;
|
|
fmMask->BorderStyle = bsNone;
|
|
fmMask->AlphaBlend = true;
|
|
fmMask->AlphaBlendValue = 60;
|
|
fmMask->Color = clBlack;
|
|
fmMask->DoubleBuffered = true;
|
|
fmMask->ParentDoubleBuffered = false;
|
|
}
|
|
|
|
fmMask->SetBounds(l, t, w, h);
|
|
fmMask->Show();
|
|
LockWindowUpdate( 0 );
|
|
}
|
|
}
|
|
else if(m_bDraging){
|
|
if(spMove==m_panWeb->VertScrollBar->Position && xMove==X && yMove==Y) //位置未改变
|
|
return;
|
|
|
|
if(fmMask){
|
|
xMove = X, yMove = Y;
|
|
spMove = m_panWeb->VertScrollBar->Position;
|
|
|
|
int dY = spMove - spDown;
|
|
int x0 = xDown,
|
|
y0 = dY ? Min(Max(yDown - dY, 2), m_panWeb->Height - 4 ) : yDown,
|
|
x1 = Min( Max(X, 2), m_panWeb->Width - DPIX(22) ),
|
|
y1 = Min( Max(Y, 2), m_panWeb->Height - 4 );
|
|
int l = x0<x1 ? x0 : x1,
|
|
t = y0<y1 ? y0 : y1,
|
|
w = abs(x1 - x0),
|
|
h = abs(y1 - y0);
|
|
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
fmMask->SetBounds(l, t, w, h);
|
|
SelectTables(xDown, yDown + spDown, x1, y1 + spMove);
|
|
LockWindowUpdate(0);
|
|
}
|
|
|
|
SetScrollTimer(Y);
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::WebMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
|
|
{
|
|
if(m_aTables.empty())
|
|
return;
|
|
|
|
if( Button==mbRight && Shift.Empty() ){
|
|
if(!m_aSelTabs.empty()){
|
|
TPoint pt = ((TControl*)Sender)->ClientToScreen(TPoint(X,Y));
|
|
m_pmRight->Popup( pt.x, pt.y );
|
|
}
|
|
}
|
|
else if( Button==mbLeft ){
|
|
if(m_bDragReady || m_bDraging){
|
|
if(!setSel.empty()){
|
|
m_aSelTabs.insert(setSel.begin(), setSel.end());
|
|
setSel.clear();
|
|
}
|
|
if(!setUns.empty()){
|
|
for(set<int>::iterator it=setUns.begin(); it!=setUns.end(); it++)
|
|
m_aSelTabs.erase(*it);
|
|
setUns.clear();
|
|
}
|
|
|
|
if(fmMask){
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
delete fmMask;
|
|
fmMask = NULL;
|
|
LockWindowUpdate(0);
|
|
}
|
|
|
|
m_bDragReady = m_bDraging = false;
|
|
ReleaseCapture();
|
|
// DebugPrint("Release capture");
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::SetScrollTimer(int y)
|
|
{
|
|
int maxY = m_panWeb->VertScrollBar->Range - m_panWeb->Height;
|
|
if( maxY > 0 ){
|
|
short iDirect = 0;
|
|
if( y > m_panWeb->Height && m_panWeb->VertScrollBar->Position < maxY )
|
|
iDirect = 1;
|
|
else if( y < 0 && m_panWeb->VertScrollBar->Position > 0 )
|
|
iDirect = -1;
|
|
|
|
if( iDirect!=0 ){
|
|
if( !m_pDragTimer ){
|
|
m_pDragTimer = new TTimer(this);
|
|
m_pDragTimer->OnTimer = ScrollTimerProc;
|
|
m_pDragTimer->Tag = iDirect;
|
|
m_pDragTimer->Interval = 500;
|
|
m_pDragTimer->Enabled = true;
|
|
}
|
|
}
|
|
else if( m_pDragTimer ){
|
|
delete m_pDragTimer;
|
|
m_pDragTimer = NULL;
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ScrollTimerProc(TObject* Sender)
|
|
{
|
|
if( m_bDraging ){
|
|
// DebugPrint( "On timer." );
|
|
|
|
if( m_pDragTimer->Tag!=0 ){
|
|
int iDirect = m_pDragTimer->Tag;
|
|
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
m_panWeb->Perform(WM_VSCROLL, iDirect>0 ? SB_LINEDOWN : SB_LINEUP, 0);
|
|
|
|
spMove = m_panWeb->VertScrollBar->Position;
|
|
int dY = spMove - spDown;
|
|
int x0 = xDown,
|
|
y0 = Min(Max(yDown - dY, 2), m_panWeb->Height - 4 ),
|
|
x1 = Min( Max(xMove, 2), m_panWeb->Width - DPIX(22) ),
|
|
y1 = Min( Max(yMove, 2), m_panWeb->Height - 4 );
|
|
int l = x0<x1 ? x0 : x1,
|
|
t = y0<y1 ? y0 : y1,
|
|
w = abs(x1 - x0),
|
|
h = abs(y1 - y0);
|
|
|
|
fmMask->SetBounds(l, t, w, h);
|
|
SelectTables(xDown, yDown + spDown, x1, y1 + spMove);
|
|
LockWindowUpdate(0);
|
|
|
|
int maxY = m_panWeb->VertScrollBar->Range - m_panWeb->Height;
|
|
if( spMove<=0 || spMove>=maxY ){
|
|
delete m_pDragTimer;
|
|
m_pDragTimer = NULL;
|
|
}
|
|
else if( m_pDragTimer->Interval>200 ){
|
|
m_pDragTimer->Interval = 200;
|
|
}
|
|
}
|
|
}
|
|
else if( m_pDragTimer ){
|
|
delete m_pDragTimer;
|
|
m_pDragTimer = NULL;
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
set<int> aLastSel;
|
|
void __fastcall TMainForm::SelectTables(int x1, int y1, int x2, int y2)
|
|
{
|
|
set<int> aSel;
|
|
|
|
int r1 = (y1) / TFHEIGHT,
|
|
c1 = x1 / (TFWIDTH + m_nTabGap),
|
|
r2 = (y2) / TFHEIGHT,
|
|
c2 = x2 / (TFWIDTH + m_nTabGap);
|
|
bool g1 = x1 % (TFWIDTH + m_nTabGap) > TFWIDTH,
|
|
g2 = x2 % (TFWIDTH + m_nTabGap) > TFWIDTH;
|
|
|
|
if( c1<c2 && g1)
|
|
c1++;
|
|
else if(c1>c2 && g2)
|
|
c2++;
|
|
else if(c1==c2 && g1 && g2)
|
|
c1 = c2 = -1;
|
|
|
|
if(c1>=0){
|
|
int sr = r1<r2 ? r1 : r2,
|
|
er = sr==r1 ? r2 : r1,
|
|
sc = c1<c2 ? c1 : c2,
|
|
ec = sc==c1 ? c2 : c1;
|
|
|
|
for(int r=sr; r<=er; r++){
|
|
for(int c=sc; c<=ec; c++){
|
|
int n = r * m_nTabCols + c;
|
|
if(n < m_aTables.size())
|
|
aSel.insert(n);
|
|
else
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if(aSel==aLastSel)
|
|
return;
|
|
|
|
aLastSel = aSel;
|
|
|
|
set<int> sel, uns;
|
|
if(mode==0){
|
|
set_difference(m_aSelTabs.begin(), m_aSelTabs.end(), aSel.begin(), aSel.end(), inserter(uns, uns.begin()));
|
|
set_difference(aSel.begin(), aSel.end(), m_aSelTabs.begin(), m_aSelTabs.end(), inserter(sel, sel.begin()));
|
|
|
|
set<int> tmpSel, tmpUns;
|
|
set_difference(setUns.begin(), setUns.end(), uns.begin(), uns.end(), inserter(tmpSel, tmpSel.begin()));
|
|
set_difference(setSel.begin(), setSel.end(), sel.begin(), sel.end(), inserter(tmpUns, tmpUns.begin()));
|
|
setSel = sel;
|
|
setUns = uns;
|
|
|
|
sel.insert(tmpSel.begin(), tmpSel.end());
|
|
uns.insert(tmpUns.begin(), tmpUns.end());
|
|
|
|
set<int>::iterator it = uns.begin();
|
|
while(it!=uns.end()){
|
|
m_aTables[*it]->SetSel(false);
|
|
it++;
|
|
}
|
|
|
|
it = sel.begin();
|
|
while(it!=sel.end()){
|
|
m_aTables[*it]->SetSel(true);
|
|
it++;
|
|
}
|
|
}
|
|
else if(mode==1){
|
|
set_difference(setSel.begin(), setSel.end(), aSel.begin(), aSel.end(), inserter(uns, uns.begin()));
|
|
set_difference(aSel.begin(), aSel.end(), m_aSelTabs.begin(), m_aSelTabs.end(), inserter(sel, sel.begin()));
|
|
|
|
set<int>::iterator it = uns.begin();
|
|
while(it!=uns.end()){
|
|
m_aTables[*it]->SetSel(false);
|
|
it++;
|
|
}
|
|
|
|
it = sel.begin();
|
|
while(it!=sel.end()){
|
|
m_aTables[*it]->SetSel(true);
|
|
it++;
|
|
}
|
|
|
|
setSel = sel;
|
|
}
|
|
else if(mode==2){
|
|
set_intersection(m_aSelTabs.begin(), m_aSelTabs.end(), aSel.begin(), aSel.end(), inserter(uns, uns.begin()));
|
|
set_difference(aSel.begin(), aSel.end(), uns.begin(), uns.end(), inserter(sel, sel.begin()));
|
|
|
|
set<int> tmpSel, tmpUns;
|
|
set_difference(setUns.begin(), setUns.end(), uns.begin(), uns.end(), inserter(tmpSel, tmpSel.begin()));
|
|
set_difference(setSel.begin(), setSel.end(), sel.begin(), sel.end(), inserter(tmpUns, tmpUns.begin()));
|
|
setSel = sel;
|
|
setUns = uns;
|
|
|
|
sel.insert(tmpSel.begin(), tmpSel.end());
|
|
uns.insert(tmpUns.begin(), tmpUns.end());
|
|
|
|
set<int>::iterator it = uns.begin();
|
|
while(it!=uns.end()){
|
|
m_aTables[*it]->SetSel(false);
|
|
it++;
|
|
}
|
|
|
|
it = sel.begin();
|
|
while(it!=sel.end()){
|
|
m_aTables[*it]->SetSel(true);
|
|
it++;
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::ClearSelect()
|
|
{
|
|
if(m_aSelTabs.empty())
|
|
return;
|
|
|
|
for(set<int>::iterator it = m_aSelTabs.begin(); it!=m_aSelTabs.end(); it++)
|
|
m_aTables[*it]->SetSel(false);
|
|
|
|
m_aSelTabs.clear();
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|
|
void __fastcall TMainForm::OnPMRightClick(TObject *Sender)
|
|
{
|
|
if(Sender==m_miUnselect){
|
|
ClearSelect();
|
|
}
|
|
else if(Sender==m_miSpec){
|
|
PostMessage(Handle, UM_OPENMAUAL, 0, 0);
|
|
}
|
|
else{
|
|
if(Sender==m_miRunOnly || Sender==m_miStopOthers){
|
|
set<int> all, uns;
|
|
for(int i=0; i<m_aTables.size(); i++)
|
|
all.insert(i);
|
|
|
|
set_difference(all.begin(), all.end(), m_aSelTabs.begin(), m_aSelTabs.end(), inserter(uns, uns.begin()));
|
|
|
|
for(set<int>::iterator it = uns.begin(); it!=uns.end(); it++)
|
|
m_aTables[*it]->SetRun(false);
|
|
}
|
|
|
|
if(Sender!=m_miStopOthers){
|
|
LockWindowUpdate( m_panWeb->Handle );
|
|
bool bR = Sender==m_miRun || Sender==m_miRunOnly;
|
|
for(set<int>::iterator it = m_aSelTabs.begin(); it!=m_aSelTabs.end(); it++)
|
|
m_aTables[*it]->SetRun( bR );
|
|
LockWindowUpdate( 0 );
|
|
}
|
|
}
|
|
}
|
|
//---------------------------------------------------------------------------
|
|
|