Commit 04c28ce0 authored by fallenstardust's avatar fallenstardust

update gframe

parent 2c456745
...@@ -232,8 +232,8 @@ const wchar_t* DataManager::GetSetName(int code) { ...@@ -232,8 +232,8 @@ const wchar_t* DataManager::GetSetName(int code) {
} }
unsigned int DataManager::GetSetCode(const wchar_t* setname) { unsigned int DataManager::GetSetCode(const wchar_t* setname) {
for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) { for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) {
auto xpos = csit->second.find_first_of(L'|');//setname|extra info auto xpos = csit->second.find_first_of(L'|');//setname|another setname or extra info
if(csit->second.compare(0, xpos, setname) == 0) if(csit->second.compare(0, xpos, setname) == 0 || csit->second.compare(xpos + 1, csit->second.length(), setname) == 0)
return csit->first; return csit->first;
} }
return 0; return 0;
......
...@@ -3876,61 +3876,28 @@ void DuelClient::BeginRefreshHost() { ...@@ -3876,61 +3876,28 @@ void DuelClient::BeginRefreshHost() {
return; return;
#endif #endif
SOCKET reply = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); SOCKET reply = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in reply_addr; BOOL opt = TRUE;
memset(&reply_addr, 0, sizeof(reply_addr)); setsockopt(reply, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
reply_addr.sin_family = AF_INET;
reply_addr.sin_port = htons(7921);
reply_addr.sin_addr.s_addr = 0;
if(bind(reply, (sockaddr*)&reply_addr, sizeof(reply_addr)) == SOCKET_ERROR) {
closesocket(reply);
return;
}
timeval timeout = {3, 0}; timeval timeout = {3, 0};
resp_event = event_new(broadev, reply, EV_TIMEOUT | EV_READ | EV_PERSIST, BroadcastReply, broadev); resp_event = event_new(broadev, reply, EV_TIMEOUT | EV_READ | EV_PERSIST, BroadcastReply, broadev);
event_add(resp_event, &timeout); event_add(resp_event, &timeout);
Thread::NewThread(RefreshThread, broadev); Thread::NewThread(RefreshThread, broadev);
//send request //send request
SOCKADDR_IN local; SOCKADDR_IN sockTo = {};
local.sin_family = AF_INET;
local.sin_port = htons(7922);
SOCKADDR_IN sockTo;
sockTo.sin_addr.s_addr = htonl(INADDR_BROADCAST);
sockTo.sin_family = AF_INET; sockTo.sin_family = AF_INET;
sockTo.sin_port = htons(7920); sockTo.sin_port = htons(7911);
HostRequest hReq; HostRequest hReq;
hReq.identifier = NETWORK_CLIENT_ID; hReq.identifier = NETWORK_CLIENT_ID;
#ifdef _IRR_ANDROID_PLATFORM_ #ifdef _IRR_ANDROID_PLATFORM_
local.sin_addr.s_addr = ipaddr; sockTo.sin_addr.s_addr = ipaddr;
SOCKET sSend = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sendto(reply, (const char*)&hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
if (sSend == INVALID_SOCKET)
return;
BOOL opt = TRUE;
setsockopt(sSend, SOL_SOCKET, SO_BROADCAST, (const char*) &opt,
sizeof(BOOL));
if (bind(sSend, (sockaddr*) &local, sizeof(sockaddr)) == SOCKET_ERROR) {
closesocket(sSend);
return;
}
sendto(sSend, (const char*) &hReq, sizeof(HostRequest), 0,
(sockaddr*) &sockTo, sizeof(sockaddr));
closesocket(sSend);
#else #else
for(int i = 0; i < 8; ++i) { for(int i = 0; i < 8; ++i) {
if(host->h_addr_list[i] == 0) if(host->h_addr_list[i] == 0)
break; break;
unsigned int local_addr = *(unsigned int*)host->h_addr_list[i]; unsigned int local_addr = *(unsigned int*)host->h_addr_list[i];
local.sin_addr.s_addr = local_addr; sockTo.sin_addr.s_addr = local_addr;
SOCKET sSend = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); sendto(reply, (const char*)&hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
if(sSend == INVALID_SOCKET)
break;
BOOL opt = TRUE;
setsockopt(sSend, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
if(bind(sSend, (sockaddr*)&local, sizeof(sockaddr)) == SOCKET_ERROR) {
closesocket(sSend);
break;
}
sendto(sSend, (const char*)&hReq, sizeof(HostRequest), 0, (sockaddr*)&sockTo, sizeof(sockaddr));
closesocket(sSend);
} }
#endif #endif
} }
......
...@@ -31,6 +31,9 @@ private: ...@@ -31,6 +31,9 @@ private:
static bool is_closing; static bool is_closing;
static int select_hint; static int select_hint;
static int select_unselect_hint; static int select_unselect_hint;
static int last_select_hint;
static char last_successful_msg[2048];
static unsigned int last_successful_msg_length;
static wchar_t event_string[256]; static wchar_t event_string[256];
static mtrandom rnd; static mtrandom rnd;
public: public:
......
...@@ -40,13 +40,11 @@ bool NetServer::StartBroadcast() { ...@@ -40,13 +40,11 @@ bool NetServer::StartBroadcast() {
if(!net_evbase) if(!net_evbase)
return false; return false;
SOCKET udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); SOCKET udp = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
BOOL opt = TRUE;
setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof(BOOL));
sockaddr_in addr; sockaddr_in addr;
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
addr.sin_port = htons(7920); addr.sin_port = htons(7911);
addr.sin_addr.s_addr = 0; addr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(udp, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) { if(bind(udp, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
closesocket(udp); closesocket(udp);
return false; return false;
...@@ -85,17 +83,13 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) { ...@@ -85,17 +83,13 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) {
return; return;
HostRequest* pHR = (HostRequest*)buf; HostRequest* pHR = (HostRequest*)buf;
if(pHR->identifier == NETWORK_CLIENT_ID) { if(pHR->identifier == NETWORK_CLIENT_ID) {
SOCKADDR_IN sockTo;
sockTo.sin_addr.s_addr = bc_addr.sin_addr.s_addr;
sockTo.sin_family = AF_INET;
sockTo.sin_port = htons(7921);
HostPacket hp; HostPacket hp;
hp.identifier = NETWORK_SERVER_ID; hp.identifier = NETWORK_SERVER_ID;
hp.port = server_port; hp.port = server_port;
hp.version = PRO_VERSION; hp.version = PRO_VERSION;
hp.host = duel_mode->host_info; hp.host = duel_mode->host_info;
BufferIO::CopyWStr(duel_mode->name, hp.name, 20); BufferIO::CopyWStr(duel_mode->name, hp.name, 20);
sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&sockTo, sizeof(sockTo)); sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&bc_addr, sz);
} }
} }
void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, sockaddr* address, int socklen, void* ctx) { void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, sockaddr* address, int socklen, void* ctx) {
......
...@@ -101,6 +101,8 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -101,6 +101,8 @@ int ReplayMode::ReplayThread(void* param) {
if(is_restarting) { if(is_restarting) {
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
is_restarting = false; is_restarting = false;
mainGame->dInfo.isReplaySkiping = true;
Restart(false);
int step = current_step - 1; int step = current_step - 1;
if(step < 0) if(step < 0)
step = 0; step = 0;
...@@ -109,10 +111,13 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -109,10 +111,13 @@ int ReplayMode::ReplayThread(void* param) {
skip_step = 0; skip_step = 0;
int len = get_message(pduel, (byte*)engineBuffer); int len = get_message(pduel, (byte*)engineBuffer);
if (len > 0) { if (len > 0) {
mainGame->gMutex.Unlock();
is_continuing = ReplayAnalyze(engineBuffer, len); is_continuing = ReplayAnalyze(engineBuffer, len);
mainGame->gMutex.Lock();
} }
} else {
ReplayRefreshDeck(0);
ReplayRefreshDeck(1);
ReplayRefreshExtra(0);
ReplayRefreshExtra(1);
} }
if(step == 0) { if(step == 0) {
Pause(true, false); Pause(true, false);
...@@ -171,14 +176,14 @@ bool ReplayMode::StartDuel() { ...@@ -171,14 +176,14 @@ bool ReplayMode::StartDuel() {
int extra = cur_replay.ReadInt32(); int extra = cur_replay.ReadInt32();
for(int i = 0; i < extra; ++i) for(int i = 0; i < extra; ++i)
new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE);
mainGame->dField.Initial(0, main, extra); mainGame->dField.Initial(mainGame->LocalPlayer(0), main, extra);
main = cur_replay.ReadInt32(); main = cur_replay.ReadInt32();
for(int i = 0; i < main; ++i) for(int i = 0; i < main; ++i)
new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE); new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, POS_FACEDOWN_DEFENSE);
extra = cur_replay.ReadInt32(); extra = cur_replay.ReadInt32();
for(int i = 0; i < extra; ++i) for(int i = 0; i < extra; ++i)
new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE);
mainGame->dField.Initial(1, main, extra); mainGame->dField.Initial(mainGame->LocalPlayer(1), main, extra);
} else { } else {
int main = cur_replay.ReadInt32(); int main = cur_replay.ReadInt32();
for(int i = 0; i < main; ++i) for(int i = 0; i < main; ++i)
...@@ -186,7 +191,7 @@ bool ReplayMode::StartDuel() { ...@@ -186,7 +191,7 @@ bool ReplayMode::StartDuel() {
int extra = cur_replay.ReadInt32(); int extra = cur_replay.ReadInt32();
for(int i = 0; i < extra; ++i) for(int i = 0; i < extra; ++i)
new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE);
mainGame->dField.Initial(0, main, extra); mainGame->dField.Initial(mainGame->LocalPlayer(0), main, extra);
main = cur_replay.ReadInt32(); main = cur_replay.ReadInt32();
for(int i = 0; i < main; ++i) for(int i = 0; i < main; ++i)
new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_DECK); new_tag_card(pduel, cur_replay.ReadInt32(), 0, LOCATION_DECK);
...@@ -199,7 +204,7 @@ bool ReplayMode::StartDuel() { ...@@ -199,7 +204,7 @@ bool ReplayMode::StartDuel() {
extra = cur_replay.ReadInt32(); extra = cur_replay.ReadInt32();
for(int i = 0; i < extra; ++i) for(int i = 0; i < extra; ++i)
new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE); new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, POS_FACEDOWN_DEFENSE);
mainGame->dField.Initial(1, main, extra); mainGame->dField.Initial(mainGame->LocalPlayer(1), main, extra);
main = cur_replay.ReadInt32(); main = cur_replay.ReadInt32();
for(int i = 0; i < main; ++i) for(int i = 0; i < main; ++i)
new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_DECK); new_tag_card(pduel, cur_replay.ReadInt32(), 1, LOCATION_DECK);
...@@ -267,13 +272,11 @@ void ReplayMode::Restart(bool refresh) { ...@@ -267,13 +272,11 @@ void ReplayMode::Restart(bool refresh) {
//mainGame->dInfo.isReplay = true; //mainGame->dInfo.isReplay = true;
} }
skip_turn = 0; skip_turn = 0;
is_restarting = true;
} }
void ReplayMode::Undo() { void ReplayMode::Undo() {
if(skip_step > 0 || current_step == 0) if(skip_step > 0 || current_step == 0)
return; return;
mainGame->dInfo.isReplaySkiping = true; is_restarting = true;
Restart(false);
Pause(false, false); Pause(false, false);
} }
bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
......
...@@ -166,13 +166,11 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -166,13 +166,11 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
mainGame->dInfo.curMsg = BufferIO::ReadUInt8(pbuf); mainGame->dInfo.curMsg = BufferIO::ReadUInt8(pbuf);
switch (mainGame->dInfo.curMsg) { switch (mainGame->dInfo.curMsg) {
case MSG_RETRY: { case MSG_RETRY: {
mainGame->gMutex.Lock(); if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->stMessage->setText(L"Error occurs."); mainGame->singleSignal.Reset();
mainGame->PopupElement(mainGame->wMessage); mainGame->singleSignal.Wait();
mainGame->gMutex.Unlock(); }
mainGame->actionSignal.Reset(); break;
mainGame->actionSignal.Wait();
return false;
} }
case MSG_HINT: { case MSG_HINT: {
/*int type = */BufferIO::ReadInt8(pbuf); /*int type = */BufferIO::ReadInt8(pbuf);
......
...@@ -434,7 +434,17 @@ ...@@ -434,7 +434,17 @@
!system 1418 额外卡组数量应不超过15张,当前卡组数量为%d张。 !system 1418 额外卡组数量应不超过15张,当前卡组数量为%d张。
!system 1419 副卡组数量应不超过15张,当前卡组数量为%d张。 !system 1419 副卡组数量应不超过15张,当前卡组数量为%d张。
!system 1420 有额外卡组卡片存在于主卡组,可能是额外卡组数量超过15张。 !system 1420 有额外卡组卡片存在于主卡组,可能是额外卡组数量超过15张。
!system 1421 宣言的卡不符合条件,不存在于本主机卡池中。 !system 1421 操作无效,请重试。
!system 1422 宣言的卡不符合条件,不存在于本主机卡池中。
!system 1423 宣言的属性不符合条件。
!system 1424 宣言的种族不符合条件
!system 1425 宣言的数字不符合条件。
!system 1426 选择的选项不符合条件
!system 1427 选择的卡片不符合条件。
!system 1428 选择的连锁不符合条件。
!system 1429 选择的位置不符合条件。
!system 1430 选择的表示形式不符合条件。
!system 1431 选择的指示物不符合条件。
!system 1450 卡包展示 !system 1450 卡包展示
!system 1451 人机卡组 !system 1451 人机卡组
!system 1452 未分类卡组 !system 1452 未分类卡组
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment