Commit 42c400f5 authored by argon.sun's avatar argon.sun

recon

parent 1865f9a0
......@@ -512,8 +512,8 @@ void Game::DrawSpec() {
break;
}
case 100: {
driver->draw2DImage(imageManager.tHand[showcardcode & 0x3], position2di(615, showcarddif));
driver->draw2DImage(imageManager.tHand[(showcardcode >> 16) & 0x3], position2di(615, 540 - showcarddif));
driver->draw2DImage(imageManager.tHand[(showcardcode >> 16) & 0x3], position2di(615, showcarddif));
driver->draw2DImage(imageManager.tHand[showcardcode & 0x3], position2di(615, 540 - showcarddif));
float dy = -0.333333f * showcardp + 10;
showcardp++;
if(showcardp < 30)
......
......@@ -4,6 +4,7 @@
#include "../ocgcore/field.h"
#include "../ocgcore/duel.h"
#include "game.h"
#include "replay.h"
namespace ygo {
......@@ -54,7 +55,7 @@ void DuelClient::StopClient(bool is_exiting) {
if(!is_closing) {
}
event_base_loopexit(client_base, NULL);
event_base_loopbreak(client_base);
}
void DuelClient::ClientRead(bufferevent* bev, void* ctx) {
evbuffer* input = bufferevent_get_input(bev);
......@@ -125,11 +126,23 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
else mainGame->env->addMessageBox(L"", dataManager.GetSysString(1402));
mainGame->gMutex.Unlock();
} else {
mainGame->gMutex.Lock();
mainGame->stMessage->setText(dataManager.GetSysString(1502));
mainGame->btnCreateHost->setEnabled(true);
mainGame->btnJoinHost->setEnabled(true);
mainGame->btnJoinCancel->setEnabled(true);
mainGame->gMutex.Unlock();
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->CloseDuelWindow();
mainGame->dInfo.isStarted = false;
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->ShowElement(mainGame->wLanWindow);
}
}
}
event_base_loopexit(client_base, NULL);
event_base_loopexit(client_base, 0);
}
}
int DuelClient::ClientThread(void* param) {
......@@ -157,25 +170,31 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->btnJoinCancel->setEnabled(true);
mainGame->gMutex.Lock();
if(pkt->code == 0)
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1403));
mainGame->wMessage->setText(dataManager.GetSysString(1403));
else if(pkt->code == 1)
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1404));
mainGame->wMessage->setText(dataManager.GetSysString(1404));
else if(pkt->code == 2)
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1405));
mainGame->wMessage->setText(dataManager.GetSysString(1405));
mainGame->gMutex.Unlock();
event_base_loopexit(client_base, NULL);
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
event_base_loopbreak(client_base);
break;
}
case ERRMSG_DECKERROR: {
mainGame->gMutex.Lock();
if(pkt->code == 1)
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1406));
mainGame->wMessage->setText(dataManager.GetSysString(1406));
else {
wchar_t msgbuf[64];
myswprintf(msgbuf, dataManager.GetSysString(1407), dataManager.GetName(pkt->code));
mainGame->env->addMessageBox(L"", msgbuf);
mainGame->wMessage->setText(msgbuf);
}
mainGame->gMutex.Unlock();
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
break;
}
}
......@@ -191,7 +210,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
}
case STOC_HAND_RESULT: {
STOC_HandResult* pkt = (STOC_HandResult*)pdata;
mainGame->showcardcode = pkt->res1 + (pkt->res2 << 16);
mainGame->stHintMsg->setVisible(false);
mainGame->showcardcode = (pkt->res1 - 1) + ((pkt->res2 - 1) << 16);
mainGame->showcarddif = 50;
mainGame->showcardp = 0;
mainGame->showcard = 100;
......@@ -278,25 +298,47 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->dInfo.isStarted = true;
mainGame->wCardImg->setVisible(true);
mainGame->wInfos->setVisible(true);
mainGame->wPhase->setVisible(true);
mainGame->device->setEventReceiver(&mainGame->dField);
if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.clientname, 20);
} else {
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.clientname, 20);
}
mainGame->gMutex.Unlock();
break;
}
case STOC_DUEL_END: {
mainGame->gMutex.Lock();
mainGame->stMessage->setText(dataManager.GetSysString(1500));
mainGame->gMutex.Unlock();
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->CloseDuelWindow();
mainGame->ShowElement(mainGame->wLanWindow);
mainGame->dInfo.isStarted = false;
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->ShowElement(mainGame->wLanWindow);
event_base_loopbreak(client_base);
break;
}
case STOC_REPLAY: {
mainGame->ebRSName->setText(L"");
mainGame->PopupElement(mainGame->wReplaySave);
mainGame->localAction.Reset();
mainGame->ShowElement(mainGame->wReplaySave);
mainGame->localAction.Wait();
if(mainGame->actionParam) {
char* prep = pdata;
Replay new_replay;
memcpy(&new_replay.pheader, prep, sizeof(ReplayHeader));
prep += sizeof(ReplayHeader);
memcpy(new_replay.comp_data, prep, len - sizeof(ReplayHeader) - 1);
new_replay.comp_size = len - sizeof(ReplayHeader) - 1;
new_replay.SaveReplay(mainGame->ebRSName->getText());
}
break;
}
case STOC_HS_PLAYER_ENTER: {
......@@ -380,7 +422,9 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
break;
}
case HINT_MESSAGE: {
mainGame->gMutex.Lock();
mainGame->stMessage->setText(dataManager.GetDesc(data));
mainGame->gMutex.Unlock();
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
......
......@@ -26,8 +26,10 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case BUTTON_HAND2:
case BUTTON_HAND3: {
mainGame->HideElement(mainGame->wHand);
mainGame->stHintMsg->setText(L"");
mainGame->stHintMsg->setVisible(true);
CTOS_HandResult cshr;
cshr.res = id - BUTTON_HAND1;
cshr.res = id - BUTTON_HAND1 + 1;
DuelClient::SendPacketToServer(CTOS_HAND_RESULT, cshr);
break;
}
......
......@@ -161,10 +161,7 @@ bool Game::Initialize() {
imgCard = env->addImage(rect<s32>(9, 9, 187, 262), wCardImg);
imgCard->setUseAlphaChannel(true);
//phase
wPhase = env->addWindow(rect<s32>(475, 310, 850, 330), false, L"");
wPhase->setDraggable(false);
wPhase->getCloseButton()->setVisible(false);
wPhase->setDrawBackground(false);
wPhase = env->addStaticText(L"", rect<s32>(475, 310, 850, 330));
wPhase->setVisible(false);
btnDP = env->addButton(rect<s32>(0, 0, 50, 20), wPhase, -1, L"DP");
btnDP->setEnabled(false);
......@@ -750,8 +747,6 @@ void Game::CloseDuelWindow() {
wPhase->setVisible(false);
wPosSelect->setVisible(false);
wQuery->setVisible(false);
wSelectOption->setVisible(false);
wSelectYesNo->setVisible(false);
}
}
......@@ -236,8 +236,6 @@ public:
irr::gui::CGUIImageButton* btnPSAD;
irr::gui::CGUIImageButton* btnPSDU;
irr::gui::CGUIImageButton* btnPSDD;
irr::gui::IGUIWindow* wSelectYesNo;
irr::gui::IGUIWindow* wSelectOption;
//card selection
irr::gui::IGUIWindow* wCardSelect;
irr::gui::CGUIImageButton* btnCardSelect[5];
......@@ -270,7 +268,7 @@ public:
irr::gui::IGUIButton* btnAttack;
irr::gui::IGUIButton* btnShowList;
//phase button
irr::gui::IGUIWindow* wPhase;
irr::gui::IGUIStaticText* wPhase;
irr::gui::IGUIButton* btnDP;
irr::gui::IGUIButton* btnSP;
irr::gui::IGUIButton* btnM1;
......
......@@ -35,7 +35,7 @@ bool NetServer::StartServer(unsigned short port) {
void NetServer::StopServer() {
if(!net_evbase)
return;
event_base_loopexit(net_evbase, NULL);
event_base_loopbreak(net_evbase);
}
void NetServer::StopListen() {
evconnlistener_disable(listener);
......@@ -51,7 +51,7 @@ void NetServer::ServerAccept(evconnlistener* listener, evutil_socket_t fd, socka
bufferevent_enable(bev, EV_READ);
}
void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) {
event_base_loopexit(net_evbase, NULL);
event_base_loopbreak(net_evbase);
}
void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
evbuffer* input = bufferevent_get_input(bev);
......@@ -109,10 +109,13 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
return;
switch(pktType) {
case CTOS_RESPONSE: {
if(!dp->game || !duel_mode->pduel)
return;
duel_mode->GetResponse(dp, pdata, len > 64 ? 64 : len - 1);
break;
}
case CTOS_UPDATE_DECK: {
if(!dp->game || !duel_mode)
if(!dp->game)
return;
duel_mode->UpdateDeck(dp, pdata);
break;
......
......@@ -117,6 +117,7 @@ public:
virtual void TPResult(DuelPlayer* dp, unsigned char tp) {};
virtual void Process() {};
virtual int Analyze(char* msgbuffer, unsigned int len) {};
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {};
virtual void EndDuel() {};
public:
......
......@@ -89,7 +89,7 @@ void Replay::SaveReplay(const wchar_t* name) {
fp = _wfopen(fname, L"wb");
#else
char fname2[256];
DataManager::EncodeUTF8(fname, fname2);
BufferIO::EncodeUTF8(fname, fname2);
fp = fopen(fname2, "wb");
#endif
if(!fp)
......@@ -105,7 +105,7 @@ bool Replay::OpenReplay(const wchar_t* name) {
fp = _wfopen(fname, L"rb");
#else
char fname2[256];
DataManager::EncodeUTF8(fname, fname2);
BufferIO::EncodeUTF8(fname, fname2);
fp = fopen(fname2, "rb");
#endif
if(!fp)
......
......@@ -324,6 +324,8 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count);
set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count);
int opt = 0;
if(host_info.enable_priority)
opt |= DUEL_ENABLE_PRIORITY;
last_replay.WriteInt32(host_info.start_lp, false);
last_replay.WriteInt32(host_info.start_hand, false);
last_replay.WriteInt32(host_info.draw_count, false);
......@@ -367,6 +369,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
RefreshExtra(0);
RefreshExtra(1);
start_duel(pduel, opt);
Process();
}
void SingleDuel::Process() {
char engineBuffer[0x1000];
......@@ -430,19 +433,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
type = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, offset, pbuf - offset);
last_replay.EndRecord();
char replaybuf[0x2000], *pbuf = replaybuf;
memcpy(pbuf, &last_replay.pheader, sizeof(ReplayHeader));
pbuf += sizeof(ReplayHeader);
memcpy(pbuf, last_replay.comp_data, last_replay.comp_size);
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof(ReplayHeader) + last_replay.comp_size);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
EndDuel();
return 2;
}
case MSG_SELECT_BATTLECMD: {
......@@ -1084,9 +1075,31 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
}
return 0;
}
void SingleDuel::GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {
byte resb[64];
memcpy(resb, pdata, len);
last_replay.WriteData(resb, len);
set_responseb(pduel, resb);
players[dp->type]->state = 0xff;
Process();
}
void SingleDuel::EndDuel() {
if(pduel)
end_duel(pduel);
if(!pduel)
return;
last_replay.EndRecord();
char replaybuf[0x2000], *pbuf = replaybuf;
memcpy(pbuf, &last_replay.pheader, sizeof(ReplayHeader));
pbuf += sizeof(ReplayHeader);
memcpy(pbuf, last_replay.comp_data, last_replay.comp_size);
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof(ReplayHeader) + last_replay.comp_size);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
end_duel(pduel);
pduel = 0;
}
void SingleDuel::WaitforResponse(int playerid) {
......
......@@ -24,6 +24,7 @@ public:
virtual void TPResult(DuelPlayer* dp, unsigned char tp);
virtual void Process();
virtual int Analyze(char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void EndDuel();
void WaitforResponse(int playerid);
......
......@@ -280,6 +280,9 @@
!system 1405 主机拒绝了连接。
!system 1406 无效卡组。
!system 1407 「%ls」的数量不符合当前设定。
!system 1500 决斗结束。
!system 1501 录像结束。
!system 1502 连接已断开。
#vistory reason
!victory 0x1 LP变成0
!victory 0x2 没有卡可抽
......
......@@ -3,7 +3,7 @@
antialias = 2
nickname = Player
gamename = Game
lastdeck = gadget
lastdeck = infernity
textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911
......
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