Commit 155a92fb authored by argon.sun's avatar argon.sun

time limit

parent 6dcb7a3f
......@@ -294,6 +294,12 @@ void Game::DrawMisc() {
lpcFont->draw(lpcstring, recti(400, 162, 922, 210), lpccolor, true, false, 0);
}
}
if(!dInfo.isReplay && !dInfo.isObserver && dInfo.time_limit) {
driver->draw2DRectangle(recti(525, 34, 525 + dInfo.time_left[0] * 100 / dInfo.time_limit, 44), 0xa0e0e0e0, 0xa0e0e0e0, 0xa0c0c0c0, 0xa0c0c0c0);
driver->draw2DRectangleOutline(recti(525, 34, 625, 44), 0xffffffff);
driver->draw2DRectangle(recti(795 - dInfo.time_left[1] * 100 / dInfo.time_limit, 34, 795, 44), 0xa0e0e0e0, 0xa0e0e0e0, 0xa0c0c0c0, 0xa0c0c0c0);
driver->draw2DRectangleOutline(recti(695, 34, 795, 44), 0xffffffff);
}
numFont->draw(dInfo.strLP[0], recti(330, 11, 629, 30), 0xff000000, true, false, 0);
numFont->draw(dInfo.strLP[0], recti(330, 12, 631, 30), 0xffffff00, true, false, 0);
numFont->draw(dInfo.strLP[1], recti(691, 11, 990, 30), 0xff000000, true, false, 0);
......@@ -600,6 +606,11 @@ void Game::DrawSpec() {
} else if(showcardp < showcarddif) {
lpcFont->draw(lstr, recti(671 - pos.Width / 2, 271, 970, 350), 0xff000000);
lpcFont->draw(lstr, recti(670 - pos.Width / 2, 270, 970, 350), 0xffffffff);
if(dInfo.vic_string && (showcardcode == 1 || showcardcode == 2)) {
driver->draw2DRectangle(0xa0000000, recti(540, 320, 800, 340));
guiFont->draw(dInfo.vic_string, recti(502, 321, 840, 340), 0xff000000, true, true);
guiFont->draw(dInfo.vic_string, recti(500, 320, 840, 340), 0xffffffff, true, true);
}
} else if(showcardp < showcarddif + 10) {
int alpha = ((showcarddif + 10 - showcardp) * 25) << 24;
lpcFont->draw(lstr, recti(671 - pos.Width / 2 + (showcardp - showcarddif) * 40, 271, 970, 350), alpha);
......
......@@ -111,6 +111,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
cscg.info.start_hand = _wtoi(mainGame->ebStartHand->getText());
cscg.info.start_lp = _wtoi(mainGame->ebStartLP->getText());
cscg.info.draw_count = _wtoi(mainGame->ebDrawCount->getText());
cscg.info.time_limit = _wtoi(mainGame->ebTimeLimit->getText());
cscg.info.lflist = mainGame->cbLFlist->getItemData(mainGame->cbLFlist->getSelected());
cscg.info.enable_priority = mainGame->chkEnablePriority->isChecked();
cscg.info.no_check_deck = mainGame->chkNoCheckDeck->isChecked();
......@@ -297,6 +298,10 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf);
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1227), dataManager.GetSysString(1244 + pkt->info.mode));
str.append(msgbuf);
if(pkt->info.time_limit) {
myswprintf(msgbuf, L"%ls%d\n", dataManager.GetSysString(1237), pkt->info.time_limit);
str.append(msgbuf);
}
str.append(L"==========\n");
myswprintf(msgbuf, L"%ls%d\n", dataManager.GetSysString(1231), pkt->info.start_lp);
str.append(msgbuf);
......@@ -317,6 +322,9 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf);
}
mainGame->gMutex.Lock();
mainGame->dInfo.time_limit = pkt->info.time_limit;
mainGame->dInfo.time_left[0] = 0;
mainGame->dInfo.time_left[1] = 0;
mainGame->deckBuilder.filterList = 0;
for(auto lit = deckManager._lfList.begin(); lit != deckManager._lfList.end(); ++lit)
if(lit->hash == pkt->info.lflist)
......@@ -375,6 +383,9 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->dInfo.strLP[0][0] = 0;
mainGame->dInfo.strLP[1][0] = 0;
mainGame->dInfo.turn = 0;
mainGame->dInfo.time_left[0] = 0;
mainGame->dInfo.time_left[1] = 0;
mainGame->dInfo.time_player = 2;
mainGame->is_building = false;
mainGame->wCardImg->setVisible(true);
mainGame->wInfos->setVisible(true);
......@@ -433,6 +444,15 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
}
break;
}
case STOC_TIME_LIMIT: {
STOC_TimeLimit* pkt = (STOC_TimeLimit*)pdata;
int lplayer = mainGame->LocalPlayer(pkt->player);
if(lplayer == 0)
DuelClient::SendPacketToServer(CTOS_TIME_CONFIRM);
mainGame->dInfo.time_player = lplayer;
mainGame->dInfo.time_left[lplayer] = pkt->left_time;
break;
}
case STOC_HS_PLAYER_ENTER: {
STOC_HS_PlayerEnter* pkt = (STOC_HS_PlayerEnter*)pdata;
if(pkt->pos > 1)
......@@ -496,6 +516,8 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->WaitFrameSignal(11);
}
}
if(mainGame->dInfo.time_player == 1)
mainGame->dInfo.time_player = 2;
switch(mainGame->dInfo.curMsg) {
case MSG_RETRY: {
mainGame->gMutex.Lock();
......@@ -605,16 +627,30 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
int player = BufferIO::ReadInt8(pbuf);
int type = BufferIO::ReadInt8(pbuf);
mainGame->showcarddif = 110;
mainGame->showcard = 101;
mainGame->showcardp = 0;
mainGame->dInfo.vic_string = 0;
wchar_t vic_buf[256];
if(player == 2)
mainGame->showcardcode = 3;
else if(mainGame->LocalPlayer(player) == 0) {
mainGame->showcardcode = 1;
if(type < 0x10)
myswprintf(vic_buf, L"[%ls] %ls", mainGame->dInfo.clientname, dataManager.GetVictoryString(type));
else
myswprintf(vic_buf, L"%ls", dataManager.GetVictoryString(type));
mainGame->dInfo.vic_string = vic_buf;
} else {
mainGame->showcardcode = 2;
if(type < 0x10)
myswprintf(vic_buf, L"[%ls] %ls", mainGame->dInfo.hostname, dataManager.GetVictoryString(type));
else
myswprintf(vic_buf, L"%ls", dataManager.GetVictoryString(type));
mainGame->dInfo.vic_string = vic_buf;
}
mainGame->showcard = 101;
mainGame->WaitFrameSignal(120);
mainGame->dInfo.vic_string = 0;
mainGame->showcard = 0;
break;
}
case MSG_WAITING: {
......@@ -2377,6 +2413,7 @@ void DuelClient::SendResponse() {
break;
}
}
mainGame->dInfo.time_player = 2;
SendBufferToServer(CTOS_RESPONSE, response_buf, response_len);
}
void DuelClient::BeginRefreshHost() {
......
......@@ -106,21 +106,25 @@ bool Game::Initialize() {
cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost);
cbMatchMode->addItem(dataManager.GetSysString(1244));
cbMatchMode->addItem(dataManager.GetSysString(1245));
chkEnablePriority = env->addCheckBox(false, rect<s32>(20, 150, 360, 170), wCreateHost, -1, dataManager.GetSysString(1236));
env->addStaticText(dataManager.GetSysString(1228), rect<s32>(20, 120, 320, 140), false, false, wCreateHost);
chkNoCheckDeck = env->addCheckBox(false, rect<s32>(20, 180, 170, 200), wCreateHost, -1, dataManager.GetSysString(1229));
chkNoShuffleDeck = env->addCheckBox(false, rect<s32>(180, 180, 360, 200), wCreateHost, -1, dataManager.GetSysString(1230));
env->addStaticText(dataManager.GetSysString(1231), rect<s32>(20, 210, 320, 230), false, false, wCreateHost);
env->addStaticText(dataManager.GetSysString(1237), rect<s32>(20, 120, 320, 140), false, false, wCreateHost);
myswprintf(strbuf, L"%d", 180);
ebTimeLimit = env->addEditBox(strbuf, rect<s32>(140, 115, 220, 140), true, wCreateHost);
ebTimeLimit->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1228), rect<s32>(20, 150, 320, 170), false, false, wCreateHost);
chkEnablePriority = env->addCheckBox(false, rect<s32>(20, 180, 360, 200), wCreateHost, -1, dataManager.GetSysString(1236));
chkNoCheckDeck = env->addCheckBox(false, rect<s32>(20, 210, 170, 230), wCreateHost, -1, dataManager.GetSysString(1229));
chkNoShuffleDeck = env->addCheckBox(false, rect<s32>(180, 210, 360, 230), wCreateHost, -1, dataManager.GetSysString(1230));
env->addStaticText(dataManager.GetSysString(1231), rect<s32>(20, 240, 320, 260), false, false, wCreateHost);
myswprintf(strbuf, L"%d", 8000);
ebStartLP = env->addEditBox(strbuf, rect<s32>(140, 210, 220, 230), true, wCreateHost);
ebStartLP = env->addEditBox(strbuf, rect<s32>(140, 235, 220, 260), true, wCreateHost);
ebStartLP->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1232), rect<s32>(20, 240, 320, 260), false, false, wCreateHost);
env->addStaticText(dataManager.GetSysString(1232), rect<s32>(20, 270, 320, 290), false, false, wCreateHost);
myswprintf(strbuf, L"%d", 5);
ebStartHand = env->addEditBox(strbuf, rect<s32>(140, 240, 220, 260), true, wCreateHost);
ebStartHand = env->addEditBox(strbuf, rect<s32>(140, 265, 220, 290), true, wCreateHost);
ebStartHand->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1233), rect<s32>(20, 270, 320, 290), false, false, wCreateHost);
env->addStaticText(dataManager.GetSysString(1233), rect<s32>(20, 300, 320, 320), false, false, wCreateHost);
myswprintf(strbuf, L"%d", 1);
ebDrawCount = env->addEditBox(strbuf, rect<s32>(140, 270, 220, 290), true, wCreateHost);
ebDrawCount = env->addEditBox(strbuf, rect<s32>(140, 295, 220, 320), true, wCreateHost);
ebDrawCount->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1234), rect<s32>(10, 360, 220, 380), false, false, wCreateHost);
ebServerName = env->addEditBox(gameConf.gamename, rect<s32>(110, 355, 250, 380), true, wCreateHost);
......@@ -511,9 +515,17 @@ void Game::MainLoop() {
fps = 0;
cur_time -= 1000;
timer->setTime(0);
if(dInfo.time_player == 0 || dInfo.time_player == 1)
if(dInfo.time_left[dInfo.time_player])
dInfo.time_left[dInfo.time_player]--;
}
}
DuelClient::StopClient(true);
#ifdef _WIN32
Sleep(500);
#else
usleep(500000);
#endif
SaveConfig();
device->drop();
}
......
......@@ -36,6 +36,10 @@ struct DuelInfo {
wchar_t clientname[20];
wchar_t strLP[2][16];
wchar_t strTurn[8];
wchar_t* vic_string;
unsigned char time_player;
unsigned short time_limit;
unsigned short time_left[2];
};
struct FadingUnit {
......@@ -173,6 +177,7 @@ public:
irr::gui::IGUIComboBox* cbLFlist;
irr::gui::IGUIComboBox* cbMatchMode;
irr::gui::IGUIComboBox* cbRule;
irr::gui::IGUIEditBox* ebTimeLimit;
irr::gui::IGUIEditBox* ebStartLP;
irr::gui::IGUIEditBox* ebStartHand;
irr::gui::IGUIEditBox* ebDrawCount;
......
......@@ -142,6 +142,7 @@ int NetServer::ServerThread(void* param) {
}
users.clear();
evconnlistener_free(listener);
listener = 0;
if(broadcast_ev) {
evutil_socket_t fd;
event_get_assignment(broadcast_ev, 0, &fd, 0, 0, 0);
......@@ -149,12 +150,13 @@ int NetServer::ServerThread(void* param) {
event_free(broadcast_ev);
broadcast_ev = 0;
}
event_base_free(net_evbase);
listener = 0;
net_evbase = 0;
if(duel_mode)
if(duel_mode) {
event_free(duel_mode->etimer);
delete duel_mode;
}
duel_mode = 0;
event_base_free(net_evbase);
net_evbase = 0;
return 0;
}
void NetServer::DisconnectPlayer(DuelPlayer* dp) {
......@@ -215,11 +217,11 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
CTOS_CreateGame* pkt = (CTOS_CreateGame*)pdata;
if(pkt->info.mode == MODE_SINGLE) {
duel_mode = new SingleDuel(false);
duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, SingleDuel::SingleTimer, duel_mode);
} else if(pkt->info.mode == MODE_MATCH) {
duel_mode = new SingleDuel(true);
duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, SingleDuel::SingleTimer, duel_mode);
}
timeval timeout = {1, 0};
duel_mode->etimer = event_new(net_evbase, 0, EV_PERSIST, SingleDuel::SingleTimer, duel_mode);
if(pkt->info.rule > 3)
pkt->info.rule = 0;
if(pkt->info.mode > 1)
......
......@@ -21,6 +21,7 @@ struct HostInfo {
unsigned int start_lp;
unsigned char start_hand;
unsigned char draw_count;
unsigned short time_limit;
};
struct HostPacket {
unsigned short identifier;
......
......@@ -119,7 +119,6 @@ void Replay::EndRecord() {
pheader.flag |= REPLAY_COMPRESSED;
size_t propsize = 5;
comp_size = 0x1000;
printf("%x\n",comp_data);
LzmaCompress(comp_data, &comp_size, replay_data, pdata - replay_data, pheader.props, &propsize, 5, 1 << 24, 3, 0, 2, 32, 1);
is_recording = false;
}
......
......@@ -371,6 +371,8 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
pdeck[1].main[swap] = tmp;
}
}
time_limit[0] = host_info.time_limit;
time_limit[1] = host_info.time_limit;
set_card_reader((card_reader)DataManager::CardReader);
set_message_handler((message_handler)SingleDuel::MessageHandler);
rnd.reset(seed);
......@@ -526,8 +528,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
unsigned char engType = BufferIO::ReadUInt8(pbuf);
switch (engType) {
case MSG_RETRY: {
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[last_response], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(last_response);
return 1;
}
case MSG_HINT: {
......@@ -588,8 +590,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
RefreshSzone(1);
RefreshHand(0);
RefreshHand(1);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_IDLECMD: {
......@@ -612,30 +614,30 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
RefreshSzone(1);
RefreshHand(0);
RefreshHand(1);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_EFFECTYN: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 8;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_YESNO: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 4;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_OPTION: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 4;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_CARD:
......@@ -653,31 +655,31 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
ss = BufferIO::ReadInt8(pbuf);
if (c != player) BufferIO::WriteInt32(pbufw, 0);
}
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_CHAIN: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += 9 + count * 11;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_PLACE:
case MSG_SELECT_DISFIELD: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_POSITION: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_COUNTER: {
......@@ -685,8 +687,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 3;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 8;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SELECT_SUM: {
......@@ -695,8 +697,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
pbuf += 5;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_SORT_CARD:
......@@ -704,8 +706,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_CONFIRM_DECKTOP: {
......@@ -787,6 +789,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
RefreshSzone(0);
RefreshSzone(1);
pbuf++;
time_limit[0] = host_info.time_limit;
time_limit[1] = host_info.time_limit;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
......@@ -1191,29 +1195,29 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_ANNOUNCE_ATTRIB: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_ANNOUNCE_CARD: {
player = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_ANNOUNCE_NUMBER: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += 4 * count;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_CARD_HINT: {
......@@ -1235,6 +1239,12 @@ void SingleDuel::GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {
last_replay.WriteData(resb, len);
set_responseb(pduel, resb);
players[dp->type]->state = 0xff;
if(host_info.time_limit) {
if(time_limit[dp->type] >= time_elapsed)
time_limit[dp->type] -= time_elapsed;
else time_limit[dp->type] = 0;
event_del(etimer);
}
Process();
}
void SingleDuel::EndDuel() {
......@@ -1254,12 +1264,27 @@ void SingleDuel::EndDuel() {
}
void SingleDuel::WaitforResponse(int playerid) {
last_response = playerid;
players[playerid]->state = CTOS_RESPONSE;
unsigned char msg = MSG_WAITING;
NetServer::SendPacketToPlayer(players[1 - playerid], STOC_GAME_MSG, msg);
if(host_info.time_limit) {
STOC_TimeLimit sctl;
sctl.player = playerid;
sctl.left_time = time_limit[playerid];
NetServer::SendPacketToPlayer(players[0], STOC_TIME_LIMIT, sctl);
NetServer::SendPacketToPlayer(players[1], STOC_TIME_LIMIT, sctl);
players[playerid]->state = CTOS_TIME_CONFIRM;
} else
players[playerid]->state = CTOS_RESPONSE;
}
void SingleDuel::TimeConfirm(DuelPlayer* dp) {
if(host_info.time_limit == 0)
return;
if(dp->type != last_response)
return;
players[last_response]->state = CTOS_RESPONSE;
time_elapsed = 0;
timeval timeout = {1, 0};
event_add(etimer, &timeout);
}
void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
char query_buffer[0x1000];
......@@ -1363,6 +1388,28 @@ int SingleDuel::MessageHandler(long fduel, int type) {
}
void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
SingleDuel* sd = static_cast<SingleDuel*>(arg);
sd->time_elapsed++;
if(sd->time_elapsed >= sd->time_limit[sd->last_response]) {
unsigned char wbuf[3];
uint32 player = sd->last_response;
wbuf[0] = MSG_WIN;
wbuf[1] = 1 - player;
wbuf[2] = 0x3;
NetServer::SendBufferToPlayer(sd->players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(sd->players[1]);
for(auto oit = sd->observers.begin(); oit != sd->observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(sd->players[player] == sd->pplayer[player]) {
sd->match_result[sd->duel_count++] = 1 - player;
sd->tp_player = player;
} else {
sd->match_result[sd->duel_count++] = player;
sd->tp_player = 1 - player;
}
sd->EndDuel();
sd->DuelEndProc();
event_del(sd->etimer);
}
}
}
......@@ -53,6 +53,8 @@ protected:
unsigned char duel_count;
unsigned char tp_player;
unsigned char match_result[3];
unsigned short time_limit[2];
unsigned short time_elapsed;
};
}
......
......@@ -26,7 +26,7 @@ function c11975962.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
end
function c11975962.activate(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if tc and tc:IsFaceup() and tc:IsRelateToEffect(e) then
if tc and tc:IsRelateToEffect(e) then
Duel.Remove(tc,POS_FACEUP,REASON_EFFECT)
end
end
......@@ -17,7 +17,7 @@ function c5037726.cost(e,tp,eg,ep,ev,re,r,rp,chk)
Duel.Release(g,REASON_COST)
end
function c5037726.filter(c,e,tp)
return c:IsCanBeSpecialSummoned(e,0,tp,false,false)
return c:IsFaceup() and c:IsCanBeSpecialSummoned(e,0,tp,false,false)
end
function c5037726.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsLocation(LOCATION_REMOVED) and c5037726.filter(chkc,e,tp) end
......
......@@ -17,7 +17,7 @@ function c78156759.initial_effect(c)
e2:SetCategory(CATEGORY_DESTROY)
e2:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_F)
e2:SetCode(EVENT_PHASE+PHASE_END)
e2:SetProperty(EFFECT_FLAG_CARD_TARGET+EFFECT_FLAG_REPEAT)
e2:SetProperty(EFFECT_FLAG_CARD_TARGET)
e2:SetRange(LOCATION_MZONE)
e2:SetCountLimit(1)
e2:SetCondition(c78156759.descon)
......
......@@ -22,12 +22,13 @@ function c85562745.con(e,tp,eg,ep,ev,re,r,rp)
return ep~=tp and bit.band(r,REASON_BATTLE)==0 and re:GetHandler():GetCode()~=85562745
end
function c85562745.tg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
if chk==0 then return e:GetHandler():IsRelateToEffect(e) end
Duel.SetTargetPlayer(1-tp)
Duel.SetTargetParam(300)
Duel.SetOperationInfo(0,CATEGORY_DAMAGE,nil,0,1-tp,300)
end
function c85562745.op(e,tp,eg,ep,ev,re,r,rp)
if not e:GetHandler():IsRelateToEffect(e) then return end
local p,d=Duel.GetChainInfo(0,CHAININFO_TARGET_PLAYER,CHAININFO_TARGET_PARAM)
Duel.Damage(p,d,REASON_EFFECT)
end
......@@ -236,6 +236,7 @@
!system 1234 主机名称:
!system 1235 主机密码:
!system 1236 允许启动效果优先权
!system 1237 每回合时间:
!system 1240 OCG
!system 1241 TCG
!system 1242 OCG&TCG
......
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