Commit 09ded696 authored by mercury233's avatar mercury233

merge

parent c6c9201d
/expansions
/specials
/obj
/bin
/build
/event
/lua
/sqlite3
/replay
/deck
/.vscode
/gframe/ygopro.ico
/gframe/ygopro.rc
/gframe/ygopro.aps
/gframe/dirent.h
ygopro
premake5.exe
[submodule "ocgcore"]
path = ocgcore
url = https://github.com/Fluorohydride/ygopro-core.git
url = https://github.com/mycard/ygopro-core
[submodule "script"]
path = script
url = https://github.com/Fluorohydride/ygopro-scripts.git
url = https://github.com/mycard/ygopro-scripts
## ygopro(server)
一个linux版的ygopro服务端。
一个linux版的ygopro服务端,基于mycard代码修改。
现用于[YGOPRO 233服](http://mercury233.me/ygosrv233/)
###编译
* 需要以下组件
* 需要以下组件或工具
* gcc
* premake4
* libevent
* sqlite3
* lua5.2
* gcc
* 可参考 https://github.com/mercury233/ygopro-server/wiki 中的脚本
###运行
* 使用[ygopro-server-lite](https://github.com/mercury233/ygopro-server)运行
* 手动运行的参数是
* ./ygopro 0 0 0 1 F F F 8000 5 1 180
* ./ygopro 0 0 0 1 F F F 8000 5 1 180 0
* 端口(0为随机)
* 禁卡表编号
* 卡片允许
......@@ -25,3 +27,4 @@
* 初始手牌数
* 每回合抽卡
* 每回合时间
* 录像保存模式
version: '{build}'
install:
- git submodule update --init --recursive
# environment and system dependency
- appveyor DownloadFile https://github.com/premake/premake-core/releases/download/v5.0.0-alpha10/premake-5.0.0-alpha10-windows.zip
- 7z x premake-5.0.0-alpha10-windows.zip
- appveyor DownloadFile https://github.com/libevent/libevent/releases/download/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz
- tar xf libevent-2.0.22-stable.tar.gz
- move libevent-2.0.22-stable event
- xcopy /E event\WIN32-Code event\include
- appveyor DownloadFile https://www.lua.org/ftp/lua-5.2.4.tar.gz
- tar xf lua-5.2.4.tar.gz
- move lua-5.2.4\src lua
- appveyor DownloadFile https://www.sqlite.org/2016/sqlite-amalgamation-3150200.zip
- 7z x sqlite-amalgamation-3150200.zip
- move sqlite-amalgamation-3150200 sqlite3
- appveyor DownloadFile https://github.com/tronkko/dirent/raw/master/include/dirent.h
- move dirent.h gframe\
# let premake happy
- xcopy /E premake\* .
# premake
- premake5 vs2015
configuration: Release
build:
project: build/ygo.sln
parallel: true
after_build:
- ps: move bin\release\ygopro.exe .
artifacts:
- path: ygopro.exe
name: ygopro(server)
No preview for this file type
......@@ -9,6 +9,11 @@
#include "netserver.h"
//#include "single_mode.h"
#ifdef _WIN32
#define strcasecmp _stricmp
#include "dirent.h"
#endif // _WIN32
#ifndef _WIN32
#include <sys/types.h>
#include <dirent.h>
......@@ -30,6 +35,7 @@ bool no_check_deck;
bool no_shuffle_deck;
unsigned int start_lp;
unsigned short time_limit;
unsigned short replay_mode;
unsigned char start_hand;
unsigned char draw_count;
......@@ -1204,6 +1210,7 @@ int Game::LocalPlayer(int player) {
const wchar_t* Game::LocalName(int local_player) {
return local_player == 0 ? dInfo.hostname : dInfo.clientname;
}
/*
void Game::SetWindowsIcon() {
#ifdef _WIN32
HINSTANCE hInstance = (HINSTANCE)GetModuleHandleW(NULL);
......@@ -1224,5 +1231,6 @@ void Game::FlashWindow() {
FlashWindowEx(&fi);
#endif
}
*/
}
......@@ -116,10 +116,10 @@ public:
//irr::gui::IGUIElement* focus = env->getFocus();
return focus && focus->hasType(type);
}
void SetWindowsIcon();
void SetWindowsIcon();
void FlashWindow();
*/
*/
Mutex gMutex;
Mutex gBuffer;
......@@ -423,6 +423,7 @@ extern bool no_check_deck;
extern bool no_shuffle_deck;
extern unsigned int start_lp;
extern unsigned short time_limit;
extern unsigned short replay_mode;
extern unsigned char start_hand;
extern unsigned char draw_count;
......
......@@ -3,7 +3,7 @@
#include "data_manager.h"
#include <event2/thread.h>
int enable_log = 0;
int enable_log = 1;
bool exit_on_return = false;
bool runasserver = true;
......@@ -23,6 +23,7 @@ int main(int argc, char* argv[]) {
ygo::aServerPort=atoi(argv[1]);
ygo::lflist=atoi(argv[2]);
ygo::start_hand=0;
ygo::replay_mode=0;
if (argc>2) {
ygo::rule=atoi(argv[3]);
ygo::mode=atoi(argv[4]);
......@@ -42,6 +43,8 @@ int main(int argc, char* argv[]) {
ygo::start_hand=atoi(argv[9]);
ygo::draw_count=atoi(argv[10]);
ygo::time_limit=atoi(argv[11]);
if (argc>12)
ygo::replay_mode=atoi(argv[12]);
}
ygo::mainGame = &_game;
ygo::mainGame->MainServerLoop(ygo::mode, ygo::lflist);
......
......@@ -22,6 +22,7 @@ struct HostInfo {
unsigned char start_hand;
unsigned char draw_count;
unsigned short time_limit;
unsigned short replay_mode;
};
struct HostPacket {
unsigned short identifier;
......
......@@ -12,13 +12,16 @@ project "ygopro"
"single_duel.cpp", "single_duel.h",
"tag_duel.cpp", "tag_duel.h",
"**.cc", "**.c"}
excludes "lzma/**"
includedirs { "../ocgcore" }
links { "ocgcore", "clzma", "sqlite3", "lua" , "event"}
configuration "windows"
files "ygopro.rc"
includedirs { "../event/include", "../sqlite3" }
links { "ws2_32" }
configuration "not vs*"
buildoptions { "-std=gnu++0x", "-fno-rtti" }
configuration "not windows"
includedirs { "/usr/include/lua", "/usr/include/lua5.2", "/usr/include/lua/5.2" }
excludes { "COSOperator.*" }
links { "event_pthreads", "dl", "pthread" }
......@@ -8,6 +8,7 @@
namespace ygo {
extern unsigned short aServerPort;
extern unsigned short replay_mode;
Replay::Replay() {
is_recording = false;
......@@ -42,115 +43,135 @@ std::wstring SA2W(std::string& strA)
void Replay::BeginRecord() {
if (ygo::replay_mode>0) {
#ifdef _WIN32
if(is_recording)
CloseHandle(recording_fp);
std::stringstream ss;
ss<<ygo::aServerPort;
std::string ssss;
ssss=ss.str();
if(is_recording)
CloseHandle(recording_fp);
std::stringstream ss;
ss<<ygo::aServerPort;
std::string ssss;
ssss=ss.str();
std::wstring comPrefix = L"./replay/";
std::wstring comPrefix = L"./replay/";
std::wstring comID =comPrefix+ SA2W(ssss)+L"Replay.yrp" ;
std::wstring comID =comPrefix+ SA2W(ssss)+L"Replay.yrp" ;
recording_fp = CreateFileW(comID.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
if(recording_fp == INVALID_HANDLE_VALUE)
return;
recording_fp = CreateFileW(comID.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, NULL);
if(recording_fp == INVALID_HANDLE_VALUE)
return;
#else
if(is_recording)
fclose(fp);
char path[20];
sprintf(path, "./replay/%u.yrp", ygo::aServerPort);
fp = fopen(path, "wb");
if(!fp)
return;
if(is_recording)
fclose(fp);
time_t nowtime = time(NULL);
struct tm *localedtime = localtime(&nowtime);
char tmppath[40];
strftime(tmppath, 40, "./replay/%Y-%m-%d %H-%M-%S %%u.yrp", localedtime);
char path[40];
sprintf(path, tmppath, ygo::aServerPort);
fp = fopen(path, "wb");
if(!fp)
return;
#endif
}
pdata = replay_data;
is_recording = true;
}
void Replay::WriteHeader(ReplayHeader& header) {
pheader = header;
if (ygo::replay_mode>0) {
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &header, sizeof(header), &size, NULL);
DWORD size;
WriteFile(recording_fp, &header, sizeof(header), &size, NULL);
#else
fwrite(&header, sizeof(header), 1, fp);
fflush(fp);
fwrite(&header, sizeof(header), 1, fp);
fflush(fp);
#endif
}
}
void Replay::WriteData(const void* data, unsigned int length, bool flush) {
if(!is_recording)
return;
memcpy(pdata, data, length);
pdata += length;
if (ygo::replay_mode>0) {
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, data, length, &size, NULL);
DWORD size;
WriteFile(recording_fp, data, length, &size, NULL);
#else
fwrite(data, length, 1, fp);
if(flush)
fflush(fp);
fwrite(data, length, 1, fp);
if(flush)
fflush(fp);
#endif
}
}
void Replay::WriteInt32(int data, bool flush) {
if(!is_recording)
return;
*((int*)(pdata)) = data;
pdata += 4;
if (ygo::replay_mode>0) {
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(int), &size, NULL);
DWORD size;
WriteFile(recording_fp, &data, sizeof(int), &size, NULL);
#else
fwrite(&data, sizeof(int), 1, fp);
if(flush)
fflush(fp);
fwrite(&data, sizeof(int), 1, fp);
if(flush)
fflush(fp);
#endif
}
}
void Replay::WriteInt16(short data, bool flush) {
if(!is_recording)
return;
*((short*)(pdata)) = data;
pdata += 2;
if (ygo::replay_mode>0) {
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(short), &size, NULL);
DWORD size;
WriteFile(recording_fp, &data, sizeof(short), &size, NULL);
#else
fwrite(&data, sizeof(short), 1, fp);
if(flush)
fflush(fp);
fwrite(&data, sizeof(short), 1, fp);
if(flush)
fflush(fp);
#endif
}
}
void Replay::WriteInt8(char data, bool flush) {
if(!is_recording)
return;
*pdata = data;
pdata++;
if (ygo::replay_mode>0) {
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(char), &size, NULL);
DWORD size;
WriteFile(recording_fp, &data, sizeof(char), &size, NULL);
#else
fwrite(&data, sizeof(char), 1, fp);
if(flush)
fflush(fp);
fwrite(&data, sizeof(char), 1, fp);
if(flush)
fflush(fp);
#endif
}
}
void Replay::Flush() {
if(!is_recording)
return;
if (ygo::replay_mode>0) {
#ifdef _WIN32
#else
fflush(fp);
fflush(fp);
#endif
}
}
void Replay::EndRecord() {
if(!is_recording)
return;
if (ygo::replay_mode>0) {
#ifdef _WIN32
CloseHandle(recording_fp);
CloseHandle(recording_fp);
#else
fclose(fp);
fclose(fp);
#endif
}
pheader.datasize = pdata - replay_data;
pheader.flag |= REPLAY_COMPRESSED;
size_t propsize = 5;
......
......@@ -17,6 +17,7 @@ extern bool no_check_deck;
extern bool no_shuffle_deck;
extern unsigned int start_lp;
extern unsigned short time_limit;
extern unsigned short replay_mode;
extern unsigned char start_hand;
extern unsigned char draw_count;
bool runasserver = true;
......@@ -45,10 +46,15 @@ void SingleDuel::Chat(DuelPlayer* dp, void* pdata, int len) {
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
if((*pit) != dp)
NetServer::ReSendToPlayer(*pit);
/*for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
if((*pit) != dp)
NetServer::ReSendToPlayer(*pit);*/
} else {
NetServer::SendBufferToPlayer(players[1 - dp->type], STOC_CHAT, &scc, 4 + msglen * 2);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
/*for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);*/
}
}
void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
......@@ -81,6 +87,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
host_info.enable_priority=false;
host_info.rule=0;
host_info.time_limit=180;
host_info.replay_mode=0;
if (ygo::start_hand !=0 ){
host_info.start_hand=ygo::start_hand;
......@@ -92,6 +99,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
host_info.enable_priority=ygo::enable_priority;
host_info.rule=ygo::rule;
host_info.time_limit=ygo::time_limit;
host_info.replay_mode=ygo::replay_mode;
}
}else
{
......@@ -126,6 +134,8 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
}
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
if(!players[0]) {
players[0] = dp;
dp->type = NETPLAYER_TYPE_PLAYER1;
......@@ -147,6 +157,8 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg);
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -206,6 +218,8 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
NetServer::DisconnectPlayer(dp);
} else {
......@@ -220,6 +234,8 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
NetServer::DisconnectPlayer(dp);
} else {
if(!game_started) {
......@@ -236,11 +252,15 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.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);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
}
}
......@@ -274,6 +294,10 @@ void SingleDuel::ToDuelist(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -289,10 +313,15 @@ void SingleDuel::ToObserver(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
players[dp->type] = 0;
ready[dp->type] = false;
dp->type = NETPLAYER_TYPE_OBSERVER;
observers.insert(dp);
if (recorders.size()==0 && dp->name[0] == 77)
recorders.insert(dp);
else
observers.insert(dp);
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -324,6 +353,8 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
}
void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
if(pos > 1 || dp != host_player || dp == players[pos] || !players[pos])
......@@ -369,6 +400,10 @@ void SingleDuel::StartDuel(DuelPlayer* dp) {
(*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit);
}
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) {
(*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit);
}
NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND);
NetServer::ReSendToPlayer(players[1]);
hand_result[0] = 0;
......@@ -389,6 +424,8 @@ void SingleDuel::HandResult(DuelPlayer* dp, unsigned char res) {
NetServer::SendPacketToPlayer(players[0], STOC_HAND_RESULT, schr);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
schr.res1 = hand_result[1];
schr.res2 = hand_result[0];
NetServer::SendPacketToPlayer(players[1], STOC_HAND_RESULT, schr);
......@@ -511,6 +548,8 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
else startbuf[1] = 0x11;
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18);
RefreshExtra(0);
RefreshExtra(1);
start_duel(pduel, opt);
......@@ -540,6 +579,8 @@ void SingleDuel::DuelEndProc() {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else {
int winc[3] = {0, 0, 0};
......@@ -553,6 +594,8 @@ void SingleDuel::DuelEndProc() {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else {
if(players[0] != pplayer[0]) {
......@@ -572,6 +615,8 @@ void SingleDuel::DuelEndProc() {
NetServer::SendPacketToPlayer(players[1], STOC_CHANGE_SIDE);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE);
}
}
}
......@@ -587,6 +632,8 @@ void SingleDuel::Surrender(DuelPlayer* dp) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(players[player] == pplayer[player]) {
match_result[duel_count++] = 1 - player;
tp_player = player;
......@@ -630,6 +677,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case 10: {
......@@ -637,6 +686,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
}
......@@ -649,6 +700,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(player > 1) {
match_result[duel_count++] = 2;
tp_player = 1 - tp_player;
......@@ -804,6 +857,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CONFIRM_CARDS: {
......@@ -815,6 +870,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1 - player]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
} else {
pbuf += count * 7;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
......@@ -827,12 +884,16 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SHUFFLE_HAND: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, (pbuf - offset) + count * 4);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(int i = 0; i < count; ++i)
BufferIO::WriteInt32(pbuf, 0);
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset);
......@@ -847,6 +908,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SWAP_GRAVE_DECK: {
......@@ -855,6 +918,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshGrave(player);
break;
}
......@@ -863,6 +928,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_DECK_TOP: {
......@@ -871,6 +938,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SHUFFLE_SET_CARD: {
......@@ -880,6 +949,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0, 0x181fff, 0);
RefreshMzone(1, 0x181fff, 0);
break;
......@@ -898,6 +969,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_NEW_PHASE: {
......@@ -906,6 +979,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -931,6 +1006,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[1 - cc], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc))
RefreshSingle(cc, cl, cs);
break;
......@@ -946,6 +1023,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if((pp & POS_FACEDOWN) && (cp & POS_FACEUP))
RefreshSingle(cc, cl, cs);
break;
......@@ -957,6 +1036,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SWAP: {
......@@ -971,6 +1052,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshSingle(c1, l1, s1);
RefreshSingle(c2, l2, s2);
break;
......@@ -981,6 +1064,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SUMMONING: {
......@@ -989,6 +1074,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SUMMONED: {
......@@ -996,6 +1083,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1008,6 +1097,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SPSUMMONED: {
......@@ -1015,6 +1106,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1028,6 +1121,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_FLIPSUMMONED: {
......@@ -1035,6 +1130,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1047,6 +1144,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CHAINED: {
......@@ -1055,6 +1154,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1069,6 +1170,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CHAIN_SOLVED: {
......@@ -1077,6 +1180,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1090,6 +1195,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1104,6 +1211,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CHAIN_DISABLED: {
......@@ -1112,6 +1221,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CARD_SELECTED: {
......@@ -1128,6 +1239,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_BECOME_TARGET: {
......@@ -1137,6 +1250,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_DRAW: {
......@@ -1145,6 +1260,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
pbufw = pbuf;
pbuf += count * 4;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for (int i = 0; i < count; ++i) {
if(!(pbufw[3] & 0x80))
BufferIO::WriteInt32(pbufw, 0);
......@@ -1162,6 +1279,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_RECOVER: {
......@@ -1170,6 +1289,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_EQUIP: {
......@@ -1178,6 +1299,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_LPUPDATE: {
......@@ -1186,6 +1309,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_UNEQUIP: {
......@@ -1194,6 +1319,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CARD_TARGET: {
......@@ -1202,6 +1329,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CANCEL_TARGET: {
......@@ -1210,6 +1339,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_PAY_LPCOST: {
......@@ -1218,6 +1349,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ADD_COUNTER: {
......@@ -1226,6 +1359,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_REMOVE_COUNTER: {
......@@ -1234,6 +1369,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ATTACK: {
......@@ -1242,6 +1379,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_BATTLE: {
......@@ -1250,6 +1389,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ATTACK_DISABLED: {
......@@ -1257,6 +1398,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_DAMAGE_STEP_START: {
......@@ -1264,6 +1407,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
break;
......@@ -1273,6 +1418,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
break;
......@@ -1291,6 +1438,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_TOSS_DICE: {
......@@ -1301,6 +1450,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ANNOUNCE_RACE: {
......@@ -1339,6 +1490,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_PLAYER_HINT: {
......@@ -1357,6 +1510,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
}
break;
}
......@@ -1389,8 +1544,12 @@ void SingleDuel::EndDuel() {
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);
if (host_info.replay_mode == 0) {
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
}
end_duel(pduel);
pduel = 0;
}
......@@ -1426,6 +1585,8 @@ void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_MZONE);
int len = query_field_card(pduel, player, LOCATION_MZONE, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
for (int i = 0; i < 5; ++i) {
int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4)
......@@ -1446,6 +1607,8 @@ void SingleDuel::RefreshSzone(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_SZONE);
int len = query_field_card(pduel, player, LOCATION_SZONE, flag, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
for (int i = 0; i < 8; ++i) {
int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4)
......@@ -1466,6 +1629,8 @@ void SingleDuel::RefreshHand(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_HAND);
int len = query_field_card(pduel, player, LOCATION_HAND, flag | QUERY_IS_PUBLIC, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
int qlen = 0, slen;
while(qlen < len) {
slen = BufferIO::ReadInt32(qbuf);
......@@ -1520,6 +1685,8 @@ void SingleDuel::RefreshSingle(int player, int location, int sequence, int flag)
NetServer::ReSendToPlayer(players[1 - player]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
}
}
int SingleDuel::MessageHandler(long fduel, int type) {
......@@ -1527,17 +1694,7 @@ int SingleDuel::MessageHandler(long fduel, int type) {
return 0;
char msgbuf[1024];
get_log_message(fduel, (byte*)msgbuf);
if(enable_log == 1) {
wchar_t wbuf[1024];
BufferIO::DecodeUTF8(msgbuf, wbuf);
//mainGame->AddChatMsg(wbuf, 9);
} else if(enable_log == 2) {
FILE* fp = fopen("error.log", "at");
if(!fp)
return 0;
fprintf(fp, "[Script error:] %s\n", msgbuf);
fclose(fp);
}
fprintf(stderr, "%s\n", msgbuf);
return 0;
}
void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
......@@ -1553,6 +1710,8 @@ void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
NetServer::ReSendToPlayer(sd->players[1]);
for(auto oit = sd->observers.begin(); oit != sd->observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = sd->recorders.begin(); oit != sd->recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(sd->players[player] == sd->pplayer[player]) {
sd->match_result[sd->duel_count++] = 1 - player;
sd->tp_player = player;
......
......@@ -49,6 +49,7 @@ protected:
unsigned char hand_result[2];
unsigned char last_response;
std::set<DuelPlayer*> observers;
std::set<DuelPlayer*> recorders;
Replay last_replay;
bool match_mode;
int match_kill;
......
......@@ -17,6 +17,7 @@ extern bool no_check_deck;
extern bool no_shuffle_deck;
extern unsigned int start_lp;
extern unsigned short time_limit;
extern unsigned short replay_mode;
extern unsigned char start_hand;
extern unsigned char draw_count;
......@@ -67,6 +68,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
host_info.enable_priority=false;
host_info.rule=0;
host_info.time_limit=180;
host_info.replay_mode=0;
if (ygo::start_hand !=0 ){
host_info.start_hand=ygo::start_hand;
......@@ -78,6 +80,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
host_info.enable_priority=ygo::enable_priority;
host_info.rule=ygo::rule;
host_info.time_limit=ygo::time_limit;
host_info.replay_mode=ygo::replay_mode;
}
}else
{
......@@ -115,6 +118,8 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_ENTER, scpe);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
players[scpe.pos] = dp;
dp->type = scpe.pos;
sctc.type |= scpe.pos;
......@@ -129,6 +134,8 @@ void TagDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg);
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -183,6 +190,8 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
NetServer::DisconnectPlayer(dp);
} else {
......@@ -196,6 +205,8 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
NetServer::DisconnectPlayer(dp);
} else {
EndDuel();
......@@ -231,6 +242,10 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -247,6 +262,8 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dptype;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -265,10 +282,15 @@ void TagDuel::ToObserver(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
players[dp->type] = 0;
ready[dp->type] = false;
dp->type = NETPLAYER_TYPE_OBSERVER;
observers.insert(dp);
if (recorders.size()==0 && dp->name[0] == 77)
recorders.insert(dp);
else
observers.insert(dp);
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
......@@ -299,6 +321,8 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
}
void TagDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
if(pos > 3 || dp != host_player || dp == players[pos] || !players[pos])
......@@ -327,6 +351,10 @@ void TagDuel::StartDuel(DuelPlayer* dp) {
(*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit);
}
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit) {
(*oit)->state = CTOS_LEAVE_GAME;
NetServer::ReSendToPlayer(*oit);
}
NetServer::SendPacketToPlayer(players[0], STOC_SELECT_HAND);
NetServer::ReSendToPlayer(players[2]);
hand_result[0] = 0;
......@@ -349,6 +377,8 @@ void TagDuel::HandResult(DuelPlayer* dp, unsigned char res) {
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
schr.res1 = hand_result[1];
schr.res2 = hand_result[0];
NetServer::SendPacketToPlayer(players[2], STOC_HAND_RESULT, schr);
......@@ -512,6 +542,8 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
else startbuf[1] = 0x11;
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18);
RefreshExtra(0);
RefreshExtra(1);
start_duel(pduel, opt);
......@@ -542,6 +574,8 @@ void TagDuel::DuelEndProc() {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
}
void TagDuel::Surrender(DuelPlayer* dp) {
......@@ -582,6 +616,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
}
......@@ -596,6 +632,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
EndDuel();
return 2;
}
......@@ -743,6 +781,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CONFIRM_CARDS: {
......@@ -756,6 +796,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
} else {
pbuf += count * 7;
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
......@@ -770,12 +812,16 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SHUFFLE_HAND: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, (pbuf - offset) + count * 4);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(int i = 0; i < count; ++i)
BufferIO::WriteInt32(pbuf, 0);
for(int i = 0; i < 4; ++i)
......@@ -794,6 +840,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SWAP_GRAVE_DECK: {
......@@ -804,6 +852,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshGrave(player);
break;
}
......@@ -814,6 +864,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_DECK_TOP: {
......@@ -824,6 +876,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SHUFFLE_SET_CARD: {
......@@ -835,6 +889,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0, 0x181fff, 0);
RefreshMzone(1, 0x181fff, 0);
break;
......@@ -849,6 +905,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if(turn_count > 0) {
if(turn_count % 2 == 0) {
if(cur_player[0] == players[0])
......@@ -873,6 +931,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -900,6 +960,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if (cl != 0 && (cl & 0x80) == 0 && (cl != pl || pc != cc))
RefreshSingle(cc, cl, cs);
break;
......@@ -917,6 +979,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if((pp & POS_FACEDOWN) && (cp & POS_FACEUP))
RefreshSingle(cc, cl, cs);
break;
......@@ -930,6 +994,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SWAP: {
......@@ -946,6 +1012,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshSingle(c1, l1, s1);
RefreshSingle(c2, l2, s2);
break;
......@@ -958,6 +1026,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SUMMONING: {
......@@ -968,6 +1038,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SUMMONED: {
......@@ -977,6 +1049,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -991,6 +1065,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_SPSUMMONED: {
......@@ -1000,6 +1076,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1015,6 +1093,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_FLIPSUMMONED: {
......@@ -1024,6 +1104,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1038,6 +1120,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CHAINED: {
......@@ -1048,6 +1132,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1064,6 +1150,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CHAIN_SOLVED: {
......@@ -1074,6 +1162,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1089,6 +1179,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
RefreshSzone(0);
......@@ -1105,6 +1197,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CHAIN_DISABLED: {
......@@ -1115,6 +1209,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CARD_SELECTED: {
......@@ -1133,6 +1229,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_BECOME_TARGET: {
......@@ -1144,6 +1242,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_DRAW: {
......@@ -1152,6 +1252,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
pbufw = pbuf;
pbuf += count * 4;
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for (int i = 0; i < count; ++i) {
if(!(pbufw[3] & 0x80))
BufferIO::WriteInt32(pbufw, 0);
......@@ -1173,6 +1275,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_RECOVER: {
......@@ -1183,6 +1287,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_EQUIP: {
......@@ -1193,6 +1299,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_LPUPDATE: {
......@@ -1203,6 +1311,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_UNEQUIP: {
......@@ -1213,6 +1323,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CARD_TARGET: {
......@@ -1223,6 +1335,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_CANCEL_TARGET: {
......@@ -1233,6 +1347,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_PAY_LPCOST: {
......@@ -1243,6 +1359,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ADD_COUNTER: {
......@@ -1253,6 +1371,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_REMOVE_COUNTER: {
......@@ -1263,6 +1383,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ATTACK: {
......@@ -1273,6 +1395,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_BATTLE: {
......@@ -1283,6 +1407,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ATTACK_DISABLED: {
......@@ -1292,6 +1418,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_DAMAGE_STEP_START: {
......@@ -1301,6 +1429,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
break;
......@@ -1312,6 +1442,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshMzone(0);
RefreshMzone(1);
break;
......@@ -1332,6 +1464,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_TOSS_DICE: {
......@@ -1344,6 +1478,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ANNOUNCE_RACE: {
......@@ -1384,6 +1520,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_PLAYER_HINT: {
......@@ -1422,6 +1560,8 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshExtra(player);
RefreshMzone(0, 0x81fff, 0);
RefreshMzone(1, 0x81fff, 0);
......@@ -1467,8 +1607,12 @@ void TagDuel::EndDuel() {
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
if (host_info.replay_mode == 0) {
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
for(auto oit = recorders.begin(); oit != recorders.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
}
end_duel(pduel);
pduel = 0;
}
......@@ -1510,6 +1654,8 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) {
int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
for (int i = 0; i < 5; ++i) {
int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4)
......@@ -1534,6 +1680,8 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 3);
NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
for (int i = 0; i < 8; ++i) {
int clen = BufferIO::ReadInt32(qbuf);
if (clen == 4)
......@@ -1556,6 +1704,8 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) {
BufferIO::WriteInt8(qbuf, LOCATION_HAND);
int len = query_field_card(pduel, player, LOCATION_HAND, flag | QUERY_IS_PUBLIC, (unsigned char*)qbuf, use_cache);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, query_buffer, len + 3);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
int qlen = 0, slen;
while(qlen < len) {
slen = BufferIO::ReadInt32(qbuf);
......@@ -1589,6 +1739,8 @@ void TagDuel::RefreshGrave(int player, int flag, int use_cache) {
NetServer::ReSendToPlayer(players[3]);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
}
void TagDuel::RefreshExtra(int player, int flag, int use_cache) {
char query_buffer[0x2000];
......@@ -1611,6 +1763,8 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) {
int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4);
NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
if(qbuf[15] & POS_FACEUP) {
pid = 2 - pid;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4);
......@@ -1622,6 +1776,8 @@ void TagDuel::RefreshSingle(int player, int location, int sequence, int flag) {
int pid = (player == 0) ? 0 : 2;
NetServer::SendBufferToPlayer(players[pid], STOC_GAME_MSG, query_buffer, len + 4);
NetServer::ReSendToPlayer(players[pid + 1]);
for(auto pit = recorders.begin(); pit != recorders.end(); ++pit)
NetServer::ReSendToPlayer(*pit);
if(location == LOCATION_REMOVED && (qbuf[15] & POS_FACEDOWN))
return;
if (location & 0x90) {
......@@ -1638,17 +1794,7 @@ int TagDuel::MessageHandler(long fduel, int type) {
return 0;
char msgbuf[1024];
get_log_message(fduel, (byte*)msgbuf);
if(enable_log == 1) {
wchar_t wbuf[1024];
BufferIO::DecodeUTF8(msgbuf, wbuf);
//mainGame->AddChatMsg(wbuf, 9);
} else if(enable_log == 2) {
FILE* fp = fopen("error.log", "at");
if(!fp)
return 0;
fprintf(fp, "[Script error:] %s\n", msgbuf);
fclose(fp);
}
fprintf(stderr, "%s\n", msgbuf);
return 0;
}
void TagDuel::TagTimer(evutil_socket_t fd, short events, void* arg) {
......
......@@ -46,6 +46,7 @@ protected:
DuelPlayer* pplayer[4];
DuelPlayer* cur_player[2];
std::set<DuelPlayer*> observers;
std::set<DuelPlayer*> recorders;
bool ready[4];
Deck pdeck[4];
unsigned char hand_result[2];
......
Subproject commit 96bbbedb6e828f4a227cf5405ed8e284b0def2cc
Subproject commit dd4bbf6b6330c492196bafea43d38a04e9e4cbc5
solution "ygo"
location "build"
language "C++"
objdir "obj"
configurations { "Debug", "Release" }
configuration "windows"
defines { "WIN32", "_WIN32" }
configuration "bsd"
defines { "LUA_USE_POSIX" }
includedirs { "/usr/local/include" }
libdirs { "/usr/local/lib" }
configuration "macosx"
defines { "LUA_USE_MACOSX" }
includedirs { "/usr/local/include/*" }
libdirs { "/usr/local/lib", "/usr/X11/lib" }
buildoptions { "-stdlib=libc++" }
links {"OpenGL.framework","Cocoa.framework","IOKit.framework"}
configuration "linux"
defines { "LUA_USE_LINUX" }
configuration "Release"
flags { "OptimizeSpeed" }
targetdir "bin/release"
configuration "Debug"
symbols "On"
defines "_DEBUG"
targetdir "bin/debug"
configuration { "Release", "vs*" }
flags { "StaticRuntime", "LinkTimeOptimization" }
disablewarnings { "4244", "4267", "4838", "4577", "4819", "4018", "4996", "4477" }
configuration { "Release", "not vs*" }
symbols "On"
defines "NDEBUG"
buildoptions "-march=native"
configuration { "Debug", "vs*" }
defines { "_ITERATOR_DEBUG_LEVEL=0" }
configuration "vs*"
flags "EnableSSE2"
defines { "_CRT_SECURE_NO_WARNINGS" }
configuration "not vs*"
buildoptions { "-fno-strict-aliasing", "-Wno-multichar" }
configuration {"not vs*", "windows"}
buildoptions { "-static-libgcc" }
startproject "ygopro"
include "ocgcore"
include "gframe"
if os.is("windows") then
include "event"
include "lua"
include "sqlite3"
end
Subproject commit 5485784eac297306878f20f2c6cd4a0a51698653
Subproject commit 6a65f1ba96072e53a6c57efca4817ae6f716f9a3
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