Commit 2791e83a authored by nanahira's avatar nanahira

2pick

parent 13eea9a1
......@@ -199,6 +199,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) {
return errorcode;
}
bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) {
/*
std::unordered_map<int, int> pcount;
std::unordered_map<int, int> ncount;
for(size_t i = 0; i < deck.main.size(); ++i)
......@@ -221,6 +222,7 @@ bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) {
if(cdit->second != pcount[cdit->first])
return false;
deck = ndeck;
*/
return true;
}
FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
......
......@@ -19,6 +19,7 @@ SingleDuel::SingleDuel(bool is_match) {
for(int i = 0; i < 2; ++i) {
players[i] = 0;
ready[i] = false;
pick_deck_saved[i] = false;
}
duel_count = 0;
memset(match_result, 0, 3);
......@@ -26,6 +27,10 @@ SingleDuel::SingleDuel(bool is_match) {
cache_recorder = 0;
replay_recorder = 0;
#endif
//2pick
int cardlist[128];
cardlist[0] = 89631139;
deckManager.LoadDeck(default_deck, cardlist, 1, 0);
}
SingleDuel::~SingleDuel() {
}
......@@ -355,7 +360,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
return;
if(is_ready) {
unsigned int deckerror = 0;
if(!host_info.no_check_deck) {
/*if(!host_info.no_check_deck) {
if(deck_error[dp->type]) {
deckerror = (DECKERROR_UNKNOWNCARD << 28) + deck_error[dp->type];
} else {
......@@ -363,7 +368,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
}
}
}*/
if(deckerror) {
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
......@@ -447,6 +452,9 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
hand_result[1] = 0;
players[0]->state = CTOS_HAND_RESULT;
players[1]->state = CTOS_HAND_RESULT;
//reset 2pick deck
pick_deck_saved[0] = false;
pick_deck_saved[1] = false;
}
void SingleDuel::HandResult(DuelPlayer* dp, unsigned char res) {
if(res > 3)
......@@ -505,8 +513,16 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
Deck d = pdeck[0];
pdeck[0] = pdeck[1];
pdeck[1] = d;
SwapPickDeck();
swapped = true;
}
//2pick deck check
for(int i = 0; i < 2; i++) {
if(pick_deck_saved[i])
pdeck[i] = pick_deck[i];
else
pdeck[i] = default_deck;
}
dp->state = CTOS_RESPONSE;
ReplayHeader rh;
rh.id = 0x31707279;
......@@ -536,8 +552,10 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
set_message_handler((message_handler)SingleDuel::MessageHandler);
rnd.reset(seed);
pduel = create_duel(rnd.rand());
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);
set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count, !pick_deck_saved[0]);
set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count, !pick_deck_saved[1]);
pick_deck_saved[0] = false;
pick_deck_saved[1] = false;
int opt = (int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE;
......@@ -648,13 +666,16 @@ void SingleDuel::DuelEndProc() {
Deck d = pdeck[0];
pdeck[0] = pdeck[1];
pdeck[1] = d;
SwapPickDeck();
}
/*
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);
#ifdef YGOPRO_SERVER_MODE
......@@ -663,6 +684,21 @@ void SingleDuel::DuelEndProc() {
if(replay_recorder)
NetServer::SendPacketToPlayer(replay_recorder, STOC_WAITING_SIDE);
#endif
//duel start
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_START);
NetServer::ReSendToPlayer(players[1]);
/*
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
#ifdef YGOPRO_SERVER_MODE
NetServer::ReSendToPlayers(cache_recorder, replay_recorder);
#endif
*/
//choose tp
NetServer::SendPacketToPlayer(players[tp_player], STOC_SELECT_TP);
players[1 - tp_player]->state = 0xff;
players[tp_player]->state = CTOS_TP_RESULT;
}
}
}
......@@ -699,6 +735,33 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
offset = pbuf;
unsigned char engType = BufferIO::ReadUInt8(pbuf);
switch (engType) {
//2pick
case MSG_SAVE_PICK_DECK: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
int cardlist[128];
int counter = 0;
Deck tdeck;
for(int i = 0; i < count; i++) {
int code = BufferIO::ReadInt32(pbuf);
cardlist[counter++] = code;
}
deckManager.LoadDeck(tdeck, cardlist, count, 0);
pick_deck[player] = tdeck;
pick_deck_saved[player] = true;
break;
}
case MSG_RESET_TIME: {
player = BufferIO::ReadInt8(pbuf);
int time = BufferIO::ReadInt8(pbuf);
if(host_info.time_limit) {
if(time)
time_limit[player] = time;
else
time_limit[player] = host_info.time_limit;
}
break;
}
case MSG_RETRY: {
WaitforResponse(last_response);
NetServer::SendBufferToPlayer(players[last_response], STOC_GAME_MSG, offset, pbuf - offset);
......@@ -1935,5 +1998,13 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
event_del(sd->etimer);
}
}
void SingleDuel::SwapPickDeck() {
Deck d = pick_deck[0];
pick_deck[0] = pick_deck[1];
pick_deck[1] = d;
bool pick_deck_saved_temp = pick_deck_saved[0];
pick_deck_saved[0] = pick_deck_saved[1];
pick_deck_saved[1] = pick_deck_saved_temp;
}
}
......@@ -40,8 +40,15 @@ public:
static int MessageHandler(long fduel, int type);
static void SingleTimer(evutil_socket_t fd, short events, void* arg);
//2pick
void SwapPickDeck();
protected:
//2pick
Deck default_deck;
Deck pick_deck[2];
bool pick_deck_saved[2];
DuelPlayer* players[2];
DuelPlayer* pplayer[2];
bool ready[2];
......
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