Commit 028fbb46 authored by argon.sun's avatar argon.sun

ver update

parent 84025ebf
...@@ -266,6 +266,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -266,6 +266,8 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->wDeckEdit->setVisible(false); mainGame->wDeckEdit->setVisible(false);
mainGame->wFilter->setVisible(false); mainGame->wFilter->setVisible(false);
mainGame->btnSideOK->setVisible(true); mainGame->btnSideOK->setVisible(true);
if(!mainGame->dInfo.isObserver)
mainGame->btnLeaveGame->setVisible(false);
mainGame->deckBuilder.result_string[0] = L'0'; mainGame->deckBuilder.result_string[0] = L'0';
mainGame->deckBuilder.result_string[1] = 0; mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear(); mainGame->deckBuilder.results.clear();
...@@ -381,6 +383,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -381,6 +383,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->wPhase->setVisible(true); mainGame->wPhase->setVisible(true);
mainGame->btnSideOK->setVisible(false); mainGame->btnSideOK->setVisible(false);
mainGame->device->setEventReceiver(&mainGame->dField); mainGame->device->setEventReceiver(&mainGame->dField);
if(selftype > 1) {
mainGame->dInfo.isObserver = true;
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1350));
mainGame->btnLeaveGame->setVisible(true);
}
if(selftype != 1) { if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.hostname, 20); BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.clientname, 20); BufferIO::CopyWStr(mainGame->stHostSingleDuelist[1]->getText(), mainGame->dInfo.clientname, 20);
...@@ -615,6 +622,10 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -615,6 +622,10 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
int playertype = BufferIO::ReadInt8(pbuf); int playertype = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.isFirst = (playertype & 0xf) ? false : true; mainGame->dInfo.isFirst = (playertype & 0xf) ? false : true;
mainGame->dInfo.isObserver = (playertype & 0xf0) ? true : false; mainGame->dInfo.isObserver = (playertype & 0xf0) ? true : false;
if(!mainGame->dInfo.isObserver) {
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351));
mainGame->btnLeaveGame->setVisible(true);
}
mainGame->dInfo.lp[mainGame->LocalPlayer(0)] = BufferIO::ReadInt32(pbuf); mainGame->dInfo.lp[mainGame->LocalPlayer(0)] = BufferIO::ReadInt32(pbuf);
mainGame->dInfo.lp[mainGame->LocalPlayer(1)] = BufferIO::ReadInt32(pbuf); mainGame->dInfo.lp[mainGame->LocalPlayer(1)] = BufferIO::ReadInt32(pbuf);
myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]); myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]);
...@@ -1221,7 +1232,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1221,7 +1232,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
pcard = mainGame->dField.GetCard(c, l, s); pcard = mainGame->dField.GetCard(c, l, s);
if (code != 0) if (code != 0)
pcard->SetCode(code); pcard->SetCode(code);
myswprintf(textBuffer, L"%d[%ls]", i, dataManager.GetName(code)); myswprintf(textBuffer, L"*[%ls]", dataManager.GetName(code));
mainGame->lstLog->addItem(textBuffer); mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(code); mainGame->logParam.push_back(code);
float shift = -0.15f; float shift = -0.15f;
...@@ -1254,7 +1265,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) { ...@@ -1254,7 +1265,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
pcard = mainGame->dField.GetCard(c, l, s); pcard = mainGame->dField.GetCard(c, l, s);
if (code != 0) if (code != 0)
pcard->SetCode(code); pcard->SetCode(code);
myswprintf(textBuffer, L"%d[%ls]", i, dataManager.GetName(code)); myswprintf(textBuffer, L"*[%ls]", dataManager.GetName(code));
mainGame->lstLog->addItem(textBuffer); mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(code); mainGame->logParam.push_back(code);
if (l & 0x41) { if (l & 0x41) {
...@@ -2384,7 +2395,7 @@ void DuelClient::BeginRefreshHost() { ...@@ -2384,7 +2395,7 @@ void DuelClient::BeginRefreshHost() {
return; return;
} }
timeval timeout = {5, 0}; timeval timeout = {5, 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, BroadcastReply, broadev);
event_add(resp_event, &timeout); event_add(resp_event, &timeout);
Thread::NewThread(RefreshThread, broadev); Thread::NewThread(RefreshThread, broadev);
//send request //send request
......
...@@ -90,6 +90,19 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -90,6 +90,19 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wReplaySave, true); mainGame->HideElement(mainGame->wReplaySave, true);
break; break;
} }
case BUTTON_LEAVE_GAME: {
if(mainGame->dInfo.isObserver) {
DuelClient::StopClient();
mainGame->CloseDuelWindow();
mainGame->dInfo.isStarted = false;
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->ShowElement(mainGame->wLanWindow);
} else {
DuelClient::SendPacketToServer(CTOS_SURRENDER);
mainGame->localAction.Set();
}
break;
}
case BUTTON_MSG_OK: { case BUTTON_MSG_OK: {
mainGame->HideElement(mainGame->wMessage, true); mainGame->HideElement(mainGame->wMessage, true);
break; break;
...@@ -110,7 +123,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -110,7 +123,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
} }
mainGame->HideElement(mainGame->wQuery);
break; break;
} }
case BUTTON_NO: { case BUTTON_NO: {
...@@ -138,7 +150,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -138,7 +150,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break; break;
} }
} }
mainGame->HideElement(mainGame->wQuery);
break; break;
} }
case BUTTON_POS_AU: { case BUTTON_POS_AU: {
......
...@@ -433,6 +433,9 @@ bool Game::Initialize() { ...@@ -433,6 +433,9 @@ bool Game::Initialize() {
btnReplayStep = env->addButton(rect<s32>(5, 55, 85, 75), wReplayControl, BUTTON_REPLAY_STEP, dataManager.GetSysString(1345)); btnReplayStep = env->addButton(rect<s32>(5, 55, 85, 75), wReplayControl, BUTTON_REPLAY_STEP, dataManager.GetSysString(1345));
btnReplaySwap = env->addButton(rect<s32>(5, 80, 85, 100), wReplayControl, BUTTON_REPLAY_SWAP, dataManager.GetSysString(1346)); btnReplaySwap = env->addButton(rect<s32>(5, 80, 85, 100), wReplayControl, BUTTON_REPLAY_SWAP, dataManager.GetSysString(1346));
btnReplayExit = env->addButton(rect<s32>(5, 105, 85, 125), wReplayControl, BUTTON_REPLAY_EXIT, dataManager.GetSysString(1347)); btnReplayExit = env->addButton(rect<s32>(5, 105, 85, 125), wReplayControl, BUTTON_REPLAY_EXIT, dataManager.GetSysString(1347));
//
btnLeaveGame = env->addButton(rect<s32>(205, 200, 295, 273), 0, BUTTON_LEAVE_GAME, L"");
btnLeaveGame->setVisible(false);
device->setEventReceiver(&menuHandler); device->setEventReceiver(&menuHandler);
LoadConfig(); LoadConfig();
env->getSkin()->setFont(guiFont); env->getSkin()->setFont(guiFont);
...@@ -756,6 +759,7 @@ void Game::CloseDuelWindow() { ...@@ -756,6 +759,7 @@ void Game::CloseDuelWindow() {
wReplayControl->setVisible(false); wReplayControl->setVisible(false);
stHintMsg->setVisible(false); stHintMsg->setVisible(false);
btnSideOK->setVisible(false); btnSideOK->setVisible(false);
btnLeaveGame->setVisible(false);
lstLog->clear(); lstLog->clear();
logParam.clear(); logParam.clear();
lstHostList->clear(); lstHostList->clear();
......
...@@ -306,6 +306,8 @@ public: ...@@ -306,6 +306,8 @@ public:
irr::gui::IGUIButton* btnReplayStep; irr::gui::IGUIButton* btnReplayStep;
irr::gui::IGUIButton* btnReplayExit; irr::gui::IGUIButton* btnReplayExit;
irr::gui::IGUIButton* btnReplaySwap; irr::gui::IGUIButton* btnReplaySwap;
//surrender/leave
irr::gui::IGUIButton* btnLeaveGame;
}; };
...@@ -386,6 +388,7 @@ extern Game* mainGame; ...@@ -386,6 +388,7 @@ extern Game* mainGame;
#define BUTTON_BP 260 #define BUTTON_BP 260
#define BUTTON_M2 261 #define BUTTON_M2 261
#define BUTTON_EP 262 #define BUTTON_EP 262
#define BUTTON_LEAVE_GAME 263
#define BUTTON_CLEAR_LOG 270 #define BUTTON_CLEAR_LOG 270
#define LISTBOX_LOG 271 #define LISTBOX_LOG 271
#define BUTTON_CATEGORY_OK 300 #define BUTTON_CATEGORY_OK 300
......
...@@ -56,6 +56,8 @@ bool NetServer::StartBroadcast() { ...@@ -56,6 +56,8 @@ bool NetServer::StartBroadcast() {
void NetServer::StopServer() { void NetServer::StopServer() {
if(!net_evbase) if(!net_evbase)
return; return;
if(duel_mode)
duel_mode->EndDuel();
event_base_loopexit(net_evbase, 0); event_base_loopexit(net_evbase, 0);
} }
void NetServer::StopBroadcast() { void NetServer::StopBroadcast() {
...@@ -158,6 +160,7 @@ int NetServer::ServerThread(void* param) { ...@@ -158,6 +160,7 @@ int NetServer::ServerThread(void* param) {
void NetServer::DisconnectPlayer(DuelPlayer* dp) { void NetServer::DisconnectPlayer(DuelPlayer* dp) {
auto bit = users.find(dp->bev); auto bit = users.find(dp->bev);
if(bit != users.end()) { if(bit != users.end()) {
bufferevent_flush(dp->bev, EV_WRITE, BEV_FLUSH);
bufferevent_disable(dp->bev, EV_READ); bufferevent_disable(dp->bev, EV_READ);
bufferevent_free(dp->bev); bufferevent_free(dp->bev);
users.erase(bit); users.erase(bit);
...@@ -166,7 +169,7 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) { ...@@ -166,7 +169,7 @@ void NetServer::DisconnectPlayer(DuelPlayer* dp) {
void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
char* pdata = data; char* pdata = data;
unsigned char pktType = BufferIO::ReadUInt8(pdata); unsigned char pktType = BufferIO::ReadUInt8(pdata);
if(dp->state == 0xff || (dp->state && dp->state != pktType)) if((pktType != CTOS_SURRENDER) && (dp->state == 0xff || (dp->state && dp->state != pktType)))
return; return;
switch(pktType) { switch(pktType) {
case CTOS_RESPONSE: { case CTOS_RESPONSE: {
...@@ -241,6 +244,12 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -241,6 +244,12 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode->LeaveGame(dp); duel_mode->LeaveGame(dp);
break; break;
} }
case CTOS_SURRENDER: {
if(!duel_mode)
break;
duel_mode->Surrender(dp);
break;
}
case CTOS_HS_TODUELIST: { case CTOS_HS_TODUELIST: {
if(!duel_mode || duel_mode->pduel) if(!duel_mode || duel_mode->pduel)
break; break;
......
...@@ -121,6 +121,7 @@ public: ...@@ -121,6 +121,7 @@ public:
virtual int Analyze(char* msgbuffer, unsigned int len) { virtual int Analyze(char* msgbuffer, unsigned int len) {
return 0; return 0;
} }
virtual void Surrender(DuelPlayer* dp) {}
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {} virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {}
virtual void EndDuel() {}; virtual void EndDuel() {};
...@@ -153,6 +154,7 @@ public: ...@@ -153,6 +154,7 @@ public:
#define CTOS_CREATE_GAME 0x11 #define CTOS_CREATE_GAME 0x11
#define CTOS_JOIN_GAME 0x12 #define CTOS_JOIN_GAME 0x12
#define CTOS_LEAVE_GAME 0x13 #define CTOS_LEAVE_GAME 0x13
#define CTOS_SURRENDER 0x14
#define CTOS_HS_TODUELIST 0x20 #define CTOS_HS_TODUELIST 0x20
#define CTOS_HS_TOOBSERVER 0x21 #define CTOS_HS_TOOBSERVER 0x21
#define CTOS_HS_READY 0x22 #define CTOS_HS_READY 0x22
......
...@@ -26,6 +26,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -26,6 +26,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
scem.msg = ERRMSG_JOINERROR; scem.msg = ERRMSG_JOINERROR;
scem.code = 0; scem.code = 0;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem); NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
NetServer::DisconnectPlayer(dp);
return; return;
} }
CTOS_JoinGame* pkt = (CTOS_JoinGame*)pdata; CTOS_JoinGame* pkt = (CTOS_JoinGame*)pdata;
...@@ -34,6 +35,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -34,6 +35,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
scem.msg = ERRMSG_VERERROR; scem.msg = ERRMSG_VERERROR;
scem.code = PRO_VERSION; scem.code = PRO_VERSION;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem); NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
NetServer::DisconnectPlayer(dp);
return; return;
} }
wchar_t jpass[20]; wchar_t jpass[20];
...@@ -129,20 +131,33 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) { ...@@ -129,20 +131,33 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
} }
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
} else { } else {
STOC_HS_PlayerChange scpc; if(!pduel) {
players[dp->type] = 0; STOC_HS_PlayerChange scpc;
ready[dp->type] = false; players[dp->type] = 0;
scpc.status = (dp->type << 4) | PLAYERCHANGE_LEAVE; ready[dp->type] = false;
if(players[0] && dp->type != 0) scpc.status = (dp->type << 4) | PLAYERCHANGE_LEAVE;
NetServer::SendPacketToPlayer(players[0], STOC_HS_PLAYER_CHANGE, scpc); if(players[0] && dp->type != 0)
if(players[1] && dp->type != 1) NetServer::SendPacketToPlayer(players[0], STOC_HS_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc); if(players[1] && dp->type != 1)
for(auto pit = observers.begin(); pit != observers.end(); ++pit) NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc);
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); for(auto pit = observers.begin(); pit != observers.end(); ++pit)
if(pduel) NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
NetServer::StopServer();
else {
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
} else {
unsigned char wbuf[3];
wbuf[0] = MSG_WIN;
wbuf[1] = 1 - dp->type;
wbuf[2] = 0;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
EndDuel();
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} }
} }
} }
...@@ -428,57 +443,81 @@ void SingleDuel::Process() { ...@@ -428,57 +443,81 @@ void SingleDuel::Process() {
stop = Analyze(engineBuffer, engLen); stop = Analyze(engineBuffer, engLen);
} }
} }
if(stop == 2) { if(stop == 2)
if(!match_mode) { DuelEndProc();
}
void SingleDuel::DuelEndProc() {
if(!match_mode) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else {
int winc[3] = {0, 0, 0};
for(int i = 0; i < duel_count; ++i)
winc[match_result[i]]++;
if(winc[0] == 2 || (winc[0] == 1 && winc[2] == 2)) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else if(winc[1] == 2 || (winc[1] == 1 && winc[2] == 2)) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else if(winc[2] == 3 || (winc[0] == 1 && winc[1] == 1 && winc[2] == 1)) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END); NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]); NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
NetServer::StopServer(); NetServer::StopServer();
} else { } else {
int winc[3] = {0, 0, 0}; if(players[0] != pplayer[0]) {
for(int i = 0; i < duel_count; ++i) players[0] = pplayer[0];
winc[match_result[i]]++; players[1] = pplayer[1];
if(winc[0] == 2 || (winc[0] == 1 && winc[2] == 2)) { players[0]->type = 0;
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END); players[1]->type = 1;
NetServer::ReSendToPlayer(players[1]); Deck d = pdeck[0];
for(auto oit = observers.begin(); oit != observers.end(); ++oit) pdeck[0] = pdeck[1];
NetServer::ReSendToPlayer(*oit); pdeck[1] = d;
NetServer::StopServer();
} else if(winc[1] == 2 || (winc[1] == 1 && winc[2] == 2)) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else if(winc[2] == 3 || (winc[0] == 1 && winc[1] == 1 && winc[2] == 1)) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else {
if(players[0] != pplayer[0]) {
players[0] = pplayer[0];
players[1] = pplayer[1];
players[0]->type = 0;
players[1]->type = 1;
Deck d = pdeck[0];
pdeck[0] = pdeck[1];
pdeck[1] = d;
}
ready[0] = false;
ready[1] = false;
players[0]->state = CTOS_UPDATE_DECK;
players[1]->state = CTOS_UPDATE_DECK;
NetServer::SendPacketToPlayer(players[0], STOC_CHANGE_SIDE);
NetServer::SendPacketToPlayer(players[1], STOC_CHANGE_SIDE);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE);
} }
ready[0] = false;
ready[1] = false;
players[0]->state = CTOS_UPDATE_DECK;
players[1]->state = CTOS_UPDATE_DECK;
NetServer::SendPacketToPlayer(players[0], STOC_CHANGE_SIDE);
NetServer::SendPacketToPlayer(players[1], STOC_CHANGE_SIDE);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE);
} }
} }
} }
void SingleDuel::Surrender(DuelPlayer* dp) {
if(dp->type > 1 || !pduel)
return;
unsigned char wbuf[3];
uint32 player = dp->type;
wbuf[0] = MSG_WIN;
wbuf[1] = 1 - player;
wbuf[2] = 0;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, wbuf, 3);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(players[player] == pplayer[player]) {
match_result[duel_count++] = player;
tp_player = 1 - player;
} else {
match_result[duel_count++] = 1 - player;
tp_player = player;
}
EndDuel();
DuelEndProc();
}
int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
char* offset, *pbufw, *pbuf = msgbuffer; char* offset, *pbufw, *pbuf = msgbuffer;
int player, count, type; int player, count, type;
......
...@@ -22,10 +22,12 @@ public: ...@@ -22,10 +22,12 @@ public:
virtual void HandResult(DuelPlayer* dp, unsigned char res); virtual void HandResult(DuelPlayer* dp, unsigned char res);
virtual void TPResult(DuelPlayer* dp, unsigned char tp); virtual void TPResult(DuelPlayer* dp, unsigned char tp);
virtual void Process(); virtual void Process();
virtual void Surrender(DuelPlayer* dp);
virtual int Analyze(char* msgbuffer, unsigned int len); virtual int Analyze(char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len); virtual void GetResponse(DuelPlayer* dp, void* pdata, unsigned int len);
virtual void EndDuel(); virtual void EndDuel();
void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
void RefreshMzone(int player, int flag = 0x181fff, int use_cache = 1); void RefreshMzone(int player, int flag = 0x181fff, int use_cache = 1);
void RefreshSzone(int player, int flag = 0x181fff, int use_cache = 1); void RefreshSzone(int player, int flag = 0x181fff, int use_cache = 1);
......
/*
* libdebug.cpp
*
* Created on: 2012-2-8
* Author: Argon
*/
#include "scriptlib.h"
#include "duel.h"
#include "field.h"
#include "card.h"
#include "effect.h"
#include "ocgapi.h"
int32 scriptlib::debug_message(lua_State *L) {
duel* pduel = interpreter::get_duel_info(L);
lua_getglobal(L, "tostring");
lua_pushvalue(L, -2);
lua_pcall(L, 1, 1, 0);
sprintf(pduel->strbuffer, "%s", lua_tostring(L, -1));
handle_message(pduel, 2);
return 0;
}
int32 scriptlib::debug_add_card(lua_State *L) {
check_param_count(L, 6);
duel* pduel = interpreter::get_duel_info(L);
int32 code = lua_tointeger(L, 1);
int32 owner = lua_tointeger(L, 2);
int32 playerid = lua_tointeger(L, 3);
int32 location = lua_tointeger(L, 4);
int32 sequence = lua_tointeger(L, 5);
int32 position = lua_tointeger(L, 6);
int32 proc = lua_toboolean(L, 7);
if(owner != 0 && owner != 1)
return 0;
if(playerid != 0 && playerid != 1)
return 0;
if(pduel->game_field->is_location_useable(playerid, location, sequence)) {
card* pcard = pduel->new_card(code);
pcard->owner = owner;
pduel->game_field->add_card(playerid, pcard, location, sequence);
pcard->current.position = position;
if(!(location & LOCATION_ONFIELD) || (position & POS_FACEUP)) {
pcard->enable_field_effect(TRUE);
pduel->game_field->adjust_instant();
}
if(proc)
pcard->set_status(STATUS_PROC_COMPLETE, TRUE);
interpreter::card2value(L, pcard);
return 1;
}
return 0;
}
int32 scriptlib::debug_set_player_info(lua_State *L) {
check_param_count(L, 4);
duel* pduel = interpreter::get_duel_info(L);
uint32 playerid = lua_tointeger(L, 1);
uint32 lp = lua_tointeger(L, 2);
uint32 startcount = lua_tointeger(L, 3);
uint32 drawcount = lua_tointeger(L, 4);
duel* pd = (duel*)pduel;
if(playerid != 0 && playerid != 1)
return 0;
pd->game_field->player[playerid].lp = lp;
pd->game_field->player[playerid].start_count = startcount;
pd->game_field->player[playerid].draw_count = drawcount;
return 0;
}
...@@ -32,7 +32,7 @@ function c38679204.initial_effect(c) ...@@ -32,7 +32,7 @@ function c38679204.initial_effect(c)
c:RegisterEffect(e3) c:RegisterEffect(e3)
end end
function c38679204.eqcon(e,tp,eg,ep,ev,re,r,rp) function c38679204.eqcon(e,tp,eg,ep,ev,re,r,rp)
return c:IsPreviousLocation(LOCATION_MZONE) return e:GetHandler():IsPreviousLocation(LOCATION_MZONE)
end end
function c38679204.eqcost(e,tp,eg,ep,ev,re,r,rp,chk) function c38679204.eqcost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.CheckLPCost(tp,500) end if chk==0 then return Duel.CheckLPCost(tp,500) end
...@@ -59,7 +59,7 @@ function c38679204.descon(e,tp,eg,ep,ev,re,r,rp) ...@@ -59,7 +59,7 @@ function c38679204.descon(e,tp,eg,ep,ev,re,r,rp)
local ec=e:GetHandler():GetEquipTarget() local ec=e:GetHandler():GetEquipTarget()
local dt=nil local dt=nil
if ec==Duel.GetAttacker() then dt=Duel.GetAttackTarget() if ec==Duel.GetAttacker() then dt=Duel.GetAttackTarget()
elseif ec==Duel.GetAttackTarget() then di=Duel.GetAttacker() end elseif ec==Duel.GetAttackTarget() then dt=Duel.GetAttacker() end
e:SetLabelObject(dt) e:SetLabelObject(dt)
return dt and dt:IsRelateToBattle() return dt and dt:IsRelateToBattle()
end end
......
...@@ -20,13 +20,13 @@ function c46668237.initial_effect(c) ...@@ -20,13 +20,13 @@ function c46668237.initial_effect(c)
e2:SetOperation(c46668237.operation) e2:SetOperation(c46668237.operation)
c:RegisterEffect(e2) c:RegisterEffect(e2)
end end
function c46668237.filter(c) function c46668237.filter(c,tp)
return c:IsLocation(LOCATION_MZONE) and c:IsFaceup() and c:IsRace(RACE_BEAST) return c:IsLocation(LOCATION_MZONE) and c:IsFaceup() and c:IsControler(tp) and c:IsRace(RACE_BEAST)
end end
function c46668237.adjop(e,tp,eg,ep,ev,re,r,rp) function c46668237.adjop(e,tp,eg,ep,ev,re,r,rp)
local pg=e:GetLabelObject() local pg=e:GetLabelObject()
if pg then pg:DeleteGroup() end if pg then pg:DeleteGroup() end
local dg=eg:Filter(c46668237.filter,nil) local dg=eg:Filter(c46668237.filter,nil,tp)
e:SetLabelObject(dg) e:SetLabelObject(dg)
dg:KeepAlive() dg:KeepAlive()
end end
......
...@@ -44,6 +44,14 @@ function c67030233.initial_effect(c) ...@@ -44,6 +44,14 @@ function c67030233.initial_effect(c)
e4:SetTarget(c67030233.sptg) e4:SetTarget(c67030233.sptg)
e4:SetOperation(c67030233.spop) e4:SetOperation(c67030233.spop)
c:RegisterEffect(e4) c:RegisterEffect(e4)
--
local e5=Effect.CreateEffect(c)
e5:SetType(EFFECT_TYPE_SINGLE)
e5:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
e5:SetRange(LOCATION_MZONE)
e5:SetCode(EFFECT_INDESTRUCTABLE_EFFECT)
e5:SetValue(1)
c:RegisterEffect(e5)
end end
function c67030233.matfilter(c,syncard) function c67030233.matfilter(c,syncard)
return c:IsFaceup() and c:IsCanBeSynchroMaterial(syncard) return c:IsFaceup() and c:IsCanBeSynchroMaterial(syncard)
......
...@@ -14,11 +14,11 @@ function c74191942.target(e,tp,eg,ep,ev,re,r,rp,chk) ...@@ -14,11 +14,11 @@ function c74191942.target(e,tp,eg,ep,ev,re,r,rp,chk)
Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK) Duel.SetOperationInfo(0,CATEGORY_TOHAND,nil,1,tp,LOCATION_DECK)
end end
function c74191942.activate(e,tp,eg,ep,ev,re,r,rp) function c74191942.activate(e,tp,eg,ep,ev,re,r,rp)
Duel.Hint(HINT_SELECTMSG,tp,Stringid(74191942,0)) Duel.Hint(HINT_SELECTMSG,tp,aux.Stringid(74191942,0))
local g=Duel.SelectMatchingCard(tp,Card.IsAbleToHand,tp,LOCATION_DECK,0,5,5,nil) local g=Duel.SelectMatchingCard(tp,Card.IsAbleToHand,tp,LOCATION_DECK,0,5,5,nil)
if g:GetCount()<5 then return end if g:GetCount()<5 then return end
Duel.ConfirmCards(1-tp,g) Duel.ConfirmCards(1-tp,g)
Duel.Hint(HINT_SELECTMSG,tp,Stringid(74191942,1)) Duel.Hint(HINT_SELECTMSG,1-tp,aux.Stringid(74191942,1))
local sg=g:Select(1-tp,1,1,nil) local sg=g:Select(1-tp,1,1,nil)
Duel.SendtoHand(sg,nil,REASON_EFFECT) Duel.SendtoHand(sg,nil,REASON_EFFECT)
g:Sub(sg) g:Sub(sg)
......
...@@ -31,7 +31,7 @@ function c79229522.splimit(e,se,sp,st) ...@@ -31,7 +31,7 @@ function c79229522.splimit(e,se,sp,st)
return e:GetHandler():GetLocation()~=LOCATION_EXTRA return e:GetHandler():GetLocation()~=LOCATION_EXTRA
end end
function c79229522.spfilter1(c,tp) function c79229522.spfilter1(c,tp)
return c:IsCode(70095154) and c:IsAbleToGraveAsCost() and c:IsCanBeFusionMaterial() and (c:IsControler(tp) or c:IsFaceup()) return c:IsCode(70095154) and c:IsAbleToGraveAsCost() and (c:IsControler(tp) or c:IsFaceup())
and Duel.IsExistingMatchingCard(c79229522.spfilter2,tp,LOCATION_MZONE,LOCATION_MZONE,1,c,tp) and Duel.IsExistingMatchingCard(c79229522.spfilter2,tp,LOCATION_MZONE,LOCATION_MZONE,1,c,tp)
end end
function c79229522.spfilter2(c,tp) function c79229522.spfilter2(c,tp)
......
...@@ -295,6 +295,8 @@ ...@@ -295,6 +295,8 @@
!system 1347 退出 !system 1347 退出
!system 1348 载入录像 !system 1348 载入录像
!system 1349 录像信息: !system 1349 录像信息:
!system 1350 离开
!system 1351 投降
!system 1390 等待对方行动中... !system 1390 等待对方行动中...
!system 1391 等待对方行动中.... !system 1391 等待对方行动中....
!system 1392 等待对方行动中..... !system 1392 等待对方行动中.....
...@@ -342,6 +344,7 @@ ...@@ -342,6 +344,7 @@
!system 1623 投掷硬币结果: !system 1623 投掷硬币结果:
!system 1624 投掷骰子结果: !system 1624 投掷骰子结果:
#vistory reason #vistory reason
!victory 0x0 投降
!victory 0x1 LP变成0 !victory 0x1 LP变成0
!victory 0x2 没有卡可抽 !victory 0x2 没有卡可抽
!victory 0x3 被封印的埃及使者 !victory 0x3 被封印的埃及使者
......
...@@ -3,9 +3,9 @@ ...@@ -3,9 +3,9 @@
antialias = 2 antialias = 2
nickname = Player nickname = Player
gamename = Game gamename = Game
lastdeck = chaosls lastdeck = test
textfont = c:/windows/fonts/simsun.ttc textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911 serverport = 7911
lastip = 10.110.5.251 lastip = 192.168.3.235
lastport = 7911 lastport = 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