Commit ad24b9a2 authored by mercury233's avatar mercury233

room tweaks

change room host when host leave
fix player leave when finger-guessing
parent 01fbf641
......@@ -20,6 +20,7 @@ extern unsigned short time_limit;
extern unsigned char start_hand;
extern unsigned char draw_count;
bool runasserver = true;
bool started_hand = false;
SingleDuel::SingleDuel(bool is_match) {
match_mode = is_match;
......@@ -179,11 +180,24 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
}
void SingleDuel::LeaveGame(DuelPlayer* dp) {
if(dp == host_player) {
EndDuel();
NetServer::StopServer();
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
int host_pos;
if(players[0] && dp->type != 0) {
host_pos = 0;
host_player = players[0];
} else if(players[1] && dp->type != 1) {
host_pos = 1;
host_player = players[1];
} else {
EndDuel();
NetServer::StopServer();
}
STOC_TypeChange sctc;
sctc.type = 0x10 | host_pos;
NetServer::SendPacketToPlayer(players[host_pos], STOC_TYPE_CHANGE, sctc);
}
if(dp->type == NETPLAYER_TYPE_OBSERVER) {
observers.erase(dp);
if(!pduel) {
if(!started_hand) {
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
if(players[0])
......@@ -195,7 +209,7 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
}
NetServer::DisconnectPlayer(dp);
} else {
if(!pduel && duel_count == 0) {
if(!started_hand && duel_count == 0) {
STOC_HS_PlayerChange scpc;
players[dp->type] = 0;
ready[dp->type] = false;
......@@ -208,7 +222,7 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
NetServer::DisconnectPlayer(dp);
} else {
if(!pduel) {
if(!started_hand) {
if(!ready[0])
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_START);
if(!ready[1])
......@@ -354,6 +368,7 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
(*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit);
}
started_hand = true;
NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND);
NetServer::ReSendToPlayer(players[1]);
hand_result[0] = 0;
......
......@@ -19,6 +19,7 @@ extern unsigned int start_lp;
extern unsigned short time_limit;
extern unsigned char start_hand;
extern unsigned char draw_count;
bool started_hand_tag = false;
TagDuel::TagDuel() {
for(int i = 0; i < 4; ++i) {
......@@ -151,11 +152,30 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
}
void TagDuel::LeaveGame(DuelPlayer* dp) {
if(dp == host_player) {
EndDuel();
NetServer::StopServer();
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
int host_pos;
if(players[0] && dp->type != 0) {
host_pos = 0;
host_player = players[0];
} else if(players[1] && dp->type != 1) {
host_pos = 1;
host_player = players[1];
} else if(players[2] && dp->type != 2) {
host_pos = 2;
host_player = players[2];
} else if(players[3] && dp->type != 3) {
host_pos = 3;
host_player = players[3];
} else {
EndDuel();
NetServer::StopServer();
}
STOC_TypeChange sctc;
sctc.type = 0x10 | host_pos;
NetServer::SendPacketToPlayer(players[host_pos], STOC_TYPE_CHANGE, sctc);
}
if(dp->type == NETPLAYER_TYPE_OBSERVER) {
observers.erase(dp);
if(!pduel) {
if(!started_hand_tag) {
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
for(int i = 0; i < 4; ++i)
......@@ -166,7 +186,7 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
}
NetServer::DisconnectPlayer(dp);
} else {
if(!pduel) {
if(!started_hand_tag) {
STOC_HS_PlayerChange scpc;
players[dp->type] = 0;
ready[dp->type] = false;
......@@ -306,6 +326,7 @@ void TagDuel::StartDuel(DuelPlayer* dp) {
(*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit);
}
started_hand_tag = true;
NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND);
NetServer::ReSendToPlayer(players[2]);
hand_result[0] = 0;
......
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