Commit c7d75f7d authored by wind2009's avatar wind2009

Merge branch 'server' into server-develop

parents 43ac628c daeffdb4
......@@ -1548,10 +1548,10 @@ void ClientField::UpdateDeclarableList() {
}
mainGame->lstANCard->clear();
ancard.clear();
for(auto cit = dataManager.strings_begin; cit != dataManager.strings_end; ++cit) {
for(auto cit = dataManager.strings_begin(); cit != dataManager.strings_end(); ++cit) {
if(cit->second.name.find(pname) != std::wstring::npos) {
auto cp = dataManager.GetCodePointer(cit->first);
if (cp == dataManager.datas_end)
if (cp == dataManager.datas_end())
continue;
//datas.alias can be double card names or alias
if(is_declarable(cp->second, declare_opcodes)) {
......
#include "data_manager.h"
#include "game.h"
#include <stdio.h>
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
#include "spmemvfs/spmemvfs.h"
#endif
namespace ygo {
......@@ -11,52 +14,18 @@ IFileSystem* DataManager::FileSystem;
#endif
DataManager dataManager;
DataManager::DataManager() : _datas(16384), _strings(16384) {
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
DataManager::DataManager() : _datas(32768), _strings(32768) {
extra_setcode = { {8512558u, {0x8f, 0x54, 0x59, 0x82, 0x13a}}, };
}
bool DataManager::LoadDB(const wchar_t* wfile) {
char file[256];
BufferIO::EncodeUTF8(wfile, file);
#if defined(YGOPRO_SERVER_MODE) && !defined(SERVER_ZIP_SUPPORT)
sqlite3* pDB;
if(sqlite3_open_v2(file, &pDB, SQLITE_OPEN_READONLY, 0) != SQLITE_OK)
return Error(pDB);
#else
#ifdef _WIN32
IReadFile* reader = FileSystem->createAndOpenFile(wfile);
#else
IReadFile* reader = FileSystem->createAndOpenFile(file);
#endif
if(reader == NULL)
return false;
spmemvfs_db_t db;
spmembuffer_t* mem = (spmembuffer_t*)calloc(sizeof(spmembuffer_t), 1);
spmemvfs_env_init();
mem->total = mem->used = reader->getSize();
mem->data = (char*)malloc(mem->total + 1);
reader->read(mem->data, mem->total);
reader->drop();
(mem->data)[mem->total] = '\0';
if(spmemvfs_open_db(&db, file, mem) != SQLITE_OK)
return Error(&db);
sqlite3* pDB = db.handle;
#endif //YGOPRO_SERVER_MODE
sqlite3_stmt* pStmt;
bool DataManager::ReadDB(sqlite3* pDB) {
sqlite3_stmt* pStmt{};
#ifdef YGOPRO_SERVER_MODE
const char* sql = "select * from datas";
#else
const char* sql = "select * from datas,texts where datas.id=texts.id";
#endif
if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
#if defined(YGOPRO_SERVER_MODE) && !defined(SERVER_ZIP_SUPPORT)
if (sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
return Error(pDB);
#else
return Error(&db);
#endif
#ifndef YGOPRO_SERVER_MODE
wchar_t strBuffer[4096];
#endif
......@@ -65,13 +34,9 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
CardDataC cd;
CardString cs;
step = sqlite3_step(pStmt);
if(step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE)
#if defined(YGOPRO_SERVER_MODE) && !defined(SERVER_ZIP_SUPPORT)
if (step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE)
return Error(pDB, pStmt);
#else
return Error(&db, pStmt);
#endif
else if(step == SQLITE_ROW) {
else if (step == SQLITE_ROW) {
cd.code = sqlite3_column_int(pStmt, 0);
cd.ot = sqlite3_column_int(pStmt, 1);
cd.alias = sqlite3_column_int(pStmt, 2);
......@@ -91,10 +56,11 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
cd.type = sqlite3_column_int(pStmt, 4);
cd.attack = sqlite3_column_int(pStmt, 5);
cd.defense = sqlite3_column_int(pStmt, 6);
if(cd.type & TYPE_LINK) {
if (cd.type & TYPE_LINK) {
cd.link_marker = cd.defense;
cd.defense = 0;
} else
}
else
cd.link_marker = 0;
unsigned int level = sqlite3_column_int(pStmt, 7);
cd.level = level & 0xff;
......@@ -105,16 +71,16 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
cd.category = sqlite3_column_int(pStmt, 10);
_datas[cd.code] = cd;
#ifndef YGOPRO_SERVER_MODE
if(const char* text = (const char*)sqlite3_column_text(pStmt, 12)) {
if (const char* text = (const char*)sqlite3_column_text(pStmt, 12)) {
BufferIO::DecodeUTF8(text, strBuffer);
cs.name = strBuffer;
}
if(const char* text = (const char*)sqlite3_column_text(pStmt, 13)) {
if (const char* text = (const char*)sqlite3_column_text(pStmt, 13)) {
BufferIO::DecodeUTF8(text, strBuffer);
cs.text = strBuffer;
}
for(int i = 0; i < 16; ++i) {
if(const char* text = (const char*)sqlite3_column_text(pStmt, i + 14)) {
for (int i = 0; i < 16; ++i) {
if (const char* text = (const char*)sqlite3_column_text(pStmt, i + 14)) {
BufferIO::DecodeUTF8(text, strBuffer);
cs.desc[i] = strBuffer;
}
......@@ -122,19 +88,46 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
_strings[cd.code] = cs;
#endif //YGOPRO_SERVER_MODE
}
} while(step != SQLITE_DONE);
} while (step != SQLITE_DONE);
sqlite3_finalize(pStmt);
#ifdef YGOPRO_SERVER_MODE
return true;
}
bool DataManager::LoadDB(const wchar_t* wfile) {
char file[256];
BufferIO::EncodeUTF8(wfile, file);
#if defined(YGOPRO_SERVER_MODE) && !defined(SERVER_ZIP_SUPPORT)
bool ret{};
sqlite3* pDB{};
if (sqlite3_open_v2(file, &pDB, SQLITE_OPEN_READONLY, 0) != SQLITE_OK)
ret = Error(pDB);
else
ret = ReadDB(pDB);
sqlite3_close(pDB);
#else
#ifdef _WIN32
IReadFile* reader = FileSystem->createAndOpenFile(wfile);
#else
IReadFile* reader = FileSystem->createAndOpenFile(file);
#endif
if(reader == NULL)
return false;
spmemvfs_db_t db;
spmembuffer_t* mem = (spmembuffer_t*)calloc(sizeof(spmembuffer_t), 1);
spmemvfs_env_init();
mem->total = mem->used = reader->getSize();
mem->data = (char*)malloc(mem->total + 1);
reader->read(mem->data, mem->total);
reader->drop();
(mem->data)[mem->total] = '\0';
bool ret{};
if (spmemvfs_open_db(&db, file, mem) != SQLITE_OK)
ret = Error(db.handle);
else
ret = ReadDB(db.handle);
spmemvfs_close_db(&db);
spmemvfs_env_fini();
#endif
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
return true;
#endif //YGOPRO_SERVER_MODE
return ret;
}
bool DataManager::LoadStrings(const char* file) {
FILE* fp = fopen(file, "r");
......@@ -197,26 +190,31 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
_setnameStrings[value] = strBuffer;
}
}
#if defined(YGOPRO_SERVER_MODE) && !defined(SERVER_ZIP_SUPPORT)
bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
wchar_t strBuffer[4096];
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB), strBuffer);
errmsg[0] = '\0';
std::strncat(errmsg, sqlite3_errmsg(pDB), sizeof errmsg - 1);
if(pStmt)
sqlite3_finalize(pStmt);
sqlite3_close(pDB);
return false;
}
#else
bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) {
wchar_t strBuffer[4096];
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB->handle), strBuffer);
if(pStmt)
sqlite3_finalize(pStmt);
spmemvfs_close_db(pDB);
spmemvfs_env_fini();
return false;
code_pointer DataManager::GetCodePointer(unsigned int code) const {
return _datas.find(code);
}
string_pointer DataManager::GetStringPointer(unsigned int code) const {
return _strings.find(code);
}
code_pointer DataManager::datas_begin() {
return _datas.cbegin();
}
code_pointer DataManager::datas_end() {
return _datas.cend();
}
string_pointer DataManager::strings_begin() {
return _strings.cbegin();
}
string_pointer DataManager::strings_end() {
return _strings.cend();
}
#endif //YGOPRO_SERVER_MODE
bool DataManager::GetData(unsigned int code, CardData* pData) const {
auto cdit = _datas.find(code);
if(cdit == _datas.end())
......@@ -226,12 +224,6 @@ bool DataManager::GetData(unsigned int code, CardData* pData) const {
}
return true;
}
code_pointer DataManager::GetCodePointer(unsigned int code) const {
return _datas.find(code);
}
string_pointer DataManager::GetStringPointer(unsigned int code) const {
return _strings.find(code);
}
bool DataManager::GetString(unsigned int code, CardString* pStr) const {
auto csit = _strings.find(code);
if(csit == _strings.end()) {
......@@ -443,12 +435,12 @@ uint32 DataManager::CardReader(uint32 code, card_data* pData) {
byte* DataManager::ScriptReaderEx(const char* script_name, int* slen) {
// default script name: ./script/c%d.lua
#ifdef YGOPRO_SERVER_MODE
char first[256];
char second[256];
char third[256];
sprintf(first, "specials/%s", script_name + 9);
sprintf(second, "expansions/%s", script_name + 2);
sprintf(third, "%s", script_name + 2);
char first[256]{};
char second[256]{};
char third[256]{};
snprintf(first, sizeof first, "specials/%s", script_name + 9);
snprintf(second, sizeof second, "expansions/%s", script_name + 2);
snprintf(third, sizeof third, "%s", script_name + 2);
if(ScriptReader(first, slen))
return scriptBuffer;
else if(ScriptReader(second, slen))
......
......@@ -2,12 +2,9 @@
#define DATAMANAGER_H
#include "config.h"
#include "sqlite3.h"
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
#include "spmemvfs/spmemvfs.h"
#endif
#include "client_card.h"
#include <unordered_map>
#include <sqlite3.h>
#include "client_card.h"
namespace ygo {
constexpr int MAX_STRING_ID = 0x7ff;
......@@ -16,20 +13,22 @@ namespace ygo {
class DataManager {
public:
DataManager();
bool ReadDB(sqlite3* pDB);
bool LoadDB(const wchar_t* wfile);
bool LoadStrings(const char* file);
#ifndef YGOPRO_SERVER_MODE
bool LoadStrings(IReadFile* reader);
#endif
void ReadStringConfLine(const char* linebuf);
#if !defined(YGOPRO_SERVER_MODE) || defined(SERVER_ZIP_SUPPORT)
bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0);
#else
bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = 0);
#endif //YGOPRO_SERVER_MODE
bool GetData(unsigned int code, CardData* pData) const;
bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = nullptr);
code_pointer GetCodePointer(unsigned int code) const;
string_pointer GetStringPointer(unsigned int code) const;
code_pointer datas_begin();
code_pointer datas_end();
string_pointer strings_begin();
string_pointer strings_end();
bool GetData(unsigned int code, CardData* pData) const;
bool GetString(unsigned int code, CardString* pStr) const;
const wchar_t* GetName(unsigned int code) const;
const wchar_t* GetText(unsigned int code) const;
......@@ -51,10 +50,7 @@ public:
std::unordered_map<unsigned int, std::wstring> _victoryStrings;
std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings;
code_pointer datas_begin;
code_pointer datas_end;
string_pointer strings_begin;
string_pointer strings_end;
char errmsg[512]{};
wchar_t numStrings[301][4]{};
wchar_t numBuffer[6]{};
......
......@@ -1015,7 +1015,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
dragx = event.MouseInput.X;
dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code);
if(draging_pointer == dataManager.datas_end)
if(draging_pointer == dataManager.datas_end())
break;
if(hovered_pos == 4) {
if(!check_limit(draging_pointer))
......@@ -1069,7 +1069,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(hovered_pos == 0 || hovered_seq == -1)
break;
auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end)
if(pointer == dataManager.datas_end())
break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP);
if(hovered_pos == 1) {
......@@ -1104,7 +1104,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
pop_side(hovered_seq);
} else {
auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end)
if(pointer == dataManager.datas_end())
break;
if(!check_limit(pointer))
break;
......@@ -1139,7 +1139,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if (is_draging)
break;
auto pointer = dataManager.GetCodePointer(hovered_code);
if (pointer == dataManager.datas_end)
if (pointer == dataManager.datas_end())
break;
if(!check_limit(pointer))
break;
......@@ -1409,10 +1409,10 @@ void DeckBuilder::FilterCards() {
query_elements.push_back(element);
}
}
for(code_pointer ptr = dataManager.datas_begin; ptr != dataManager.datas_end; ++ptr) {
for(code_pointer ptr = dataManager.datas_begin(); ptr != dataManager.datas_end(); ++ptr) {
const CardDataC& data = ptr->second;
auto strpointer = dataManager.GetStringPointer(ptr->first);
if (strpointer == dataManager.strings_end)
if (strpointer == dataManager.strings_end())
continue;
const CardString& text = strpointer->second;
if(data.type & TYPE_TOKEN)
......
......@@ -2480,11 +2480,14 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e
}
}
void ClientField::SetResponseSelectedCards() const {
unsigned char respbuf[SIZE_RETURN_VALUE];
respbuf[0] = selected_cards.size();
for (size_t i = 0; i < selected_cards.size(); ++i)
unsigned char respbuf[SIZE_RETURN_VALUE]{};
int len = (int)selected_cards.size();
if (len > UINT8_MAX)
len = UINT8_MAX;
respbuf[0] = (unsigned char)len;
for (int i = 0; i < len; ++i)
respbuf[i + 1] = selected_cards[i]->select_seq;
DuelClient::SetResponseB(respbuf, selected_cards.size() + 1);
DuelClient::SetResponseB(respbuf, len + 1);
}
void ClientField::SetResponseSelectedOption() const {
if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) {
......
......@@ -1628,7 +1628,7 @@ void Game::ShowCardInfo(int code, bool resize) {
return;
wchar_t formatBuffer[256];
auto cit = dataManager.GetCodePointer(code);
bool is_valid = (cit != dataManager.datas_end);
bool is_valid = (cit != dataManager.datas_end());
imgCard->setImage(imageManager.GetTexture(code, true));
if (is_valid) {
auto& cd = cit->second;
......@@ -1645,7 +1645,7 @@ void Game::ShowCardInfo(int code, bool resize) {
if (is_valid && !gameConf.hide_setname) {
auto& cd = cit->second;
auto target = cit;
if (cd.alias && dataManager.GetCodePointer(cd.alias) != dataManager.datas_end) {
if (cd.alias && dataManager.GetCodePointer(cd.alias) != dataManager.datas_end()) {
target = dataManager.GetCodePointer(cd.alias);
}
if (target->second.setcode[0]) {
......
......@@ -208,29 +208,28 @@ inline unsigned int GetPosition(unsigned char* qbuf, int offset) {
class DuelMode {
public:
virtual ~DuelMode() {}
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len) {}
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {}
virtual void LeaveGame(DuelPlayer* dp) {}
virtual void ToDuelist(DuelPlayer* dp) {}
virtual void ToObserver(DuelPlayer* dp) {}
virtual void PlayerReady(DuelPlayer* dp, bool is_ready) {}
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) {}
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {}
virtual void StartDuel(DuelPlayer* dp) {}
virtual void HandResult(DuelPlayer* dp, unsigned char res) {}
virtual void TPResult(DuelPlayer* dp, unsigned char tp) {}
virtual void Process() {}
virtual int Analyze(char* msgbuffer, unsigned int len) {
return 0;
}
virtual void Surrender(DuelPlayer* dp) {}
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) {}
virtual void TimeConfirm(DuelPlayer* dp) {}
DuelMode() = default;
virtual ~DuelMode() = default;
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len) = 0;
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) = 0;
virtual void LeaveGame(DuelPlayer* dp) = 0;
virtual void ToDuelist(DuelPlayer* dp) = 0;
virtual void ToObserver(DuelPlayer* dp) = 0;
virtual void PlayerReady(DuelPlayer* dp, bool is_ready) = 0;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) = 0;
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) = 0;
virtual void StartDuel(DuelPlayer* dp) = 0;
virtual void HandResult(DuelPlayer* dp, unsigned char res) = 0;
virtual void TPResult(DuelPlayer* dp, unsigned char tp) = 0;
virtual void Process() = 0;
virtual int Analyze(unsigned char* msgbuffer, unsigned int len) = 0;
virtual void Surrender(DuelPlayer* dp) = 0;
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) = 0;
virtual void TimeConfirm(DuelPlayer* dp) = 0;
#ifdef YGOPRO_SERVER_MODE
virtual void RequestField(DuelPlayer* dp) {}
virtual void RequestField(DuelPlayer* dp) = 0;
#endif
virtual void EndDuel() {}
virtual void EndDuel() = 0;
public:
event* etimer { nullptr };
......
......@@ -234,7 +234,7 @@ bool ReplayMode::StartDuel() {
}
cur_replay.ReadData(filename, slen);
filename[slen] = 0;
if(!preload_script(pduel, filename, 0)) {
if(!preload_script(pduel, filename)) {
return false;
}
}
......
......@@ -575,7 +575,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
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);
#ifdef YGOPRO_SERVER_MODE
preload_script(pduel, "./script/special.lua", 0);
preload_script(pduel, "./script/special.lua");
#endif
unsigned int opt = (unsigned int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck)
......
......@@ -10,27 +10,27 @@ namespace ygo {
class SingleDuel: public DuelMode {
public:
SingleDuel(bool is_match);
virtual ~SingleDuel();
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len);
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater);
virtual void LeaveGame(DuelPlayer* dp);
virtual void ToDuelist(DuelPlayer* dp);
virtual void ToObserver(DuelPlayer* dp);
virtual void PlayerReady(DuelPlayer* dp, bool ready);
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos);
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len);
virtual void StartDuel(DuelPlayer* dp);
virtual void HandResult(DuelPlayer* dp, unsigned char res);
virtual void TPResult(DuelPlayer* dp, unsigned char tp);
virtual void Process();
virtual void Surrender(DuelPlayer* dp);
virtual int Analyze(unsigned char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len);
virtual void TimeConfirm(DuelPlayer* dp);
~SingleDuel() override;
void Chat(DuelPlayer* dp, unsigned char* pdata, int len) override;
void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) override;
void LeaveGame(DuelPlayer* dp) override;
void ToDuelist(DuelPlayer* dp) override;
void ToObserver(DuelPlayer* dp) override;
void PlayerReady(DuelPlayer* dp, bool ready) override;
void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
void StartDuel(DuelPlayer* dp) override;
void HandResult(DuelPlayer* dp, unsigned char res) override;
void TPResult(DuelPlayer* dp, unsigned char tp) override;
void Process() override;
void Surrender(DuelPlayer* dp) override;
int Analyze(unsigned char* msgbuffer, unsigned int len) override;
void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
void TimeConfirm(DuelPlayer* dp) override;
#ifdef YGOPRO_SERVER_MODE
virtual void RequestField(DuelPlayer* dp);
void RequestField(DuelPlayer* dp) override;
#endif
virtual void EndDuel();
void EndDuel() override;
void DuelEndProc();
void WaitforResponse(int playerid);
......
......@@ -60,11 +60,11 @@ int SingleMode::SinglePlayThread() {
if(open_file) {
open_file = false;
slen = BufferIO::EncodeUTF8(open_file_name, filename);
if(!preload_script(pduel, filename, 0)) {
if(!preload_script(pduel, filename)) {
wchar_t fname[256];
myswprintf(fname, L"./single/%ls", open_file_name);
slen = BufferIO::EncodeUTF8(fname, filename);
if(!preload_script(pduel, filename, 0))
if(!preload_script(pduel, filename))
slen = 0;
}
} else {
......@@ -72,7 +72,7 @@ int SingleMode::SinglePlayThread() {
wchar_t fname[256];
myswprintf(fname, L"./single/%ls", name);
slen = BufferIO::EncodeUTF8(fname, filename);
if(!preload_script(pduel, filename, 0))
if(!preload_script(pduel, filename))
slen = 0;
}
if(slen == 0) {
......
......@@ -553,7 +553,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
set_message_handler(TagDuel::MessageHandler);
pduel = create_duel(duel_seed);
#ifdef YGOPRO_SERVER_MODE
preload_script(pduel, "./script/special.lua", 0);
preload_script(pduel, "./script/special.lua");
#endif
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);
......
......@@ -10,27 +10,27 @@ namespace ygo {
class TagDuel: public DuelMode {
public:
TagDuel();
virtual ~TagDuel();
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len);
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater);
virtual void LeaveGame(DuelPlayer* dp);
virtual void ToDuelist(DuelPlayer* dp);
virtual void ToObserver(DuelPlayer* dp);
virtual void PlayerReady(DuelPlayer* dp, bool ready);
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos);
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len);
virtual void StartDuel(DuelPlayer* dp);
virtual void HandResult(DuelPlayer* dp, unsigned char res);
virtual void TPResult(DuelPlayer* dp, unsigned char tp);
virtual void Process();
virtual void Surrender(DuelPlayer* dp);
virtual int Analyze(unsigned char* msgbuffer, unsigned int len);
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len);
virtual void TimeConfirm(DuelPlayer* dp);
~TagDuel() override;
void Chat(DuelPlayer* dp, unsigned char* pdata, int len) override;
void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) override;
void LeaveGame(DuelPlayer* dp) override;
void ToDuelist(DuelPlayer* dp) override;
void ToObserver(DuelPlayer* dp) override;
void PlayerReady(DuelPlayer* dp, bool ready) override;
void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
void StartDuel(DuelPlayer* dp) override;
void HandResult(DuelPlayer* dp, unsigned char res) override;
void TPResult(DuelPlayer* dp, unsigned char tp) override;
void Process() override;
void Surrender(DuelPlayer* dp) override;
int Analyze(unsigned char* msgbuffer, unsigned int len) override;
void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
void TimeConfirm(DuelPlayer* dp) override;
#ifdef YGOPRO_SERVER_MODE
virtual void RequestField(DuelPlayer* dp);
void RequestField(DuelPlayer* dp) override;
#endif
virtual void EndDuel();
void EndDuel() override;
void DuelEndProc();
void WaitforResponse(int playerid);
......
Subproject commit 1701452d060a740c9d9cb796b2711550f5fb517e
Subproject commit eb36d391ec450960e526032698e97b95376b4a32
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