Commit 0af9cbef authored by wind2009's avatar wind2009

Merge remote-tracking branch 'upstream/master' into server-develop

parents 8748b322 a8ccdbb1
...@@ -6,30 +6,30 @@ ...@@ -6,30 +6,30 @@
class BufferIO { class BufferIO {
public: public:
inline static int ReadInt32(unsigned char*& p) { static int ReadInt32(unsigned char*& p) {
return buffer_read<int32_t>(p); return buffer_read<int32_t>(p);
} }
inline static short ReadInt16(unsigned char*& p) { static short ReadInt16(unsigned char*& p) {
return buffer_read<int16_t>(p); return buffer_read<int16_t>(p);
} }
inline static char ReadInt8(unsigned char*& p) { static char ReadInt8(unsigned char*& p) {
return buffer_read<char>(p); return buffer_read<char>(p);
} }
inline static unsigned char ReadUInt8(unsigned char*& p) { static unsigned char ReadUInt8(unsigned char*& p) {
return buffer_read<unsigned char>(p); return buffer_read<unsigned char>(p);
} }
inline static void WriteInt32(unsigned char*& p, int val) { static void WriteInt32(unsigned char*& p, int val) {
buffer_write<int32_t>(p, val); buffer_write<int32_t>(p, val);
} }
inline static void WriteInt16(unsigned char*& p, short val) { static void WriteInt16(unsigned char*& p, short val) {
buffer_write<int16_t>(p, val); buffer_write<int16_t>(p, val);
} }
inline static void WriteInt8(unsigned char*& p, char val) { static void WriteInt8(unsigned char*& p, char val) {
buffer_write<char>(p, val); buffer_write<char>(p, val);
} }
// return: string length // return: string length
template<typename T1, typename T2> template<typename T1, typename T2>
inline static int CopyWStr(const T1* src, T2* pstr, int bufsize) { static int CopyWStr(const T1* src, T2* pstr, int bufsize) {
int l = 0; int l = 0;
while(src[l] && l < bufsize - 1) { while(src[l] && l < bufsize - 1) {
pstr[l] = (T2)src[l]; pstr[l] = (T2)src[l];
...@@ -39,7 +39,7 @@ public: ...@@ -39,7 +39,7 @@ public:
return l; return l;
} }
template<typename T1, typename T2> template<typename T1, typename T2>
inline static int CopyWStrRef(const T1* src, T2*& pstr, int bufsize) { static int CopyWStrRef(const T1* src, T2*& pstr, int bufsize) {
int l = 0; int l = 0;
while(src[l] && l < bufsize - 1) { while(src[l] && l < bufsize - 1) {
pstr[l] = (T2)src[l]; pstr[l] = (T2)src[l];
...@@ -49,22 +49,117 @@ public: ...@@ -49,22 +49,117 @@ public:
*pstr = 0; *pstr = 0;
return l; return l;
} }
template<typename T>
static bool CheckUTF8Byte(const T* str, int len) {
for (int i = 1; i < len; ++i) {
if ((str[i] & 0xc0U) != 0x80U)
return false;
}
return true;
}
static unsigned int ConvertUTF8(const char*& p) {
unsigned int cur = 0;
if ((p[0] & 0x80U) == 0) {
cur = p[0] & 0xffU;
p++;
}
else if ((p[0] & 0xe0U) == 0xc0U) {
if (!CheckUTF8Byte(p, 2)) {
p++;
return UINT32_MAX;
}
cur = ((p[0] & 0x1fU) << 6) | (p[1] & 0x3fU);
p += 2;
if(cur < 0x80U)
return UINT32_MAX;
}
else if ((p[0] & 0xf0U) == 0xe0U) {
if (!CheckUTF8Byte(p, 3)) {
p++;
return UINT32_MAX;
}
cur = ((p[0] & 0xfU) << 12) | ((p[1] & 0x3fU) << 6) | (p[2] & 0x3fU);
p += 3;
if (cur < 0x800U)
return UINT32_MAX;
}
else if ((p[0] & 0xf8U) == 0xf0U) {
if (!CheckUTF8Byte(p, 4)) {
p++;
return UINT32_MAX;
}
cur = ((p[0] & 0x7U) << 18) | ((p[1] & 0x3fU) << 12) | ((p[2] & 0x3fU) << 6) | (p[3] & 0x3fU);
p += 4;
if (cur < 0x10000U)
return UINT32_MAX;
}
else {
p++;
return UINT32_MAX;
}
return cur;
}
static bool IsHighSurrogate(unsigned int c) {
return (c >= 0xd800U && c <= 0xdbffU);
}
static bool IsLowSurrogate(unsigned int c) {
return (c >= 0xdc00U && c <= 0xdfffU);
}
static bool IsUnicodeChar(unsigned int c) {
if(IsHighSurrogate(c))
return false;
if (IsLowSurrogate(c))
return false;
if (c > 0x10ffffU)
return false;
return true;
}
// UTF-16/UTF-32 to UTF-8 // UTF-16/UTF-32 to UTF-8
// return: string length // return: string length
static int EncodeUTF8String(const wchar_t* wsrc, char* str, int size) { static int EncodeUTF8String(const wchar_t* wsrc, char* str, int size) {
char* pstr = str; auto pw = wsrc;
while (*wsrc != 0) { auto pstr = str;
unsigned cur = *wsrc; while (*pw != 0) {
unsigned cur = 0;
int codepoint_size = 0; int codepoint_size = 0;
if (sizeof(wchar_t) == 2) {
if (IsHighSurrogate(pw[0])) {
if (pw[1] == 0)
break;
if (IsLowSurrogate(pw[1])) {
cur = ((pw[0] & 0x3ffU) << 10) | (pw[1] & 0x3ffU);
cur += 0x10000;
pw += 2;
}
else {
pw++;
continue;
}
}
else if (IsLowSurrogate(pw[0])) {
pw++;
continue;
}
else {
cur = *pw;
pw++;
}
}
else {
cur = *pw;
pw++;
}
if (!IsUnicodeChar(cur))
continue;
if (cur < 0x80U) if (cur < 0x80U)
codepoint_size = 1; codepoint_size = 1;
else if (cur < 0x800U) else if (cur < 0x800U)
codepoint_size = 2; codepoint_size = 2;
else if (cur < 0x10000U && (cur < 0xd800U || cur > 0xdfffU)) else if (cur < 0x10000U)
codepoint_size = 3; codepoint_size = 3;
else else
codepoint_size = 4; codepoint_size = 4;
if (pstr - str + codepoint_size > size - 1) if ((int)(pstr - str) + codepoint_size > size - 1)
break; break;
switch (codepoint_size) { switch (codepoint_size) {
case 1: case 1:
...@@ -80,13 +175,6 @@ public: ...@@ -80,13 +175,6 @@ public:
pstr[2] = (cur & 0x3f) | 0x80; pstr[2] = (cur & 0x3f) | 0x80;
break; break;
case 4: case 4:
if (sizeof(wchar_t) == 2) {
cur = 0;
cur |= (*wsrc & 0x3ffU) << 10;
++wsrc;
cur |= *wsrc & 0x3ffU;
cur += 0x10000;
}
pstr[0] = ((cur >> 18) & 0x7) | 0xf0; pstr[0] = ((cur >> 18) & 0x7) | 0xf0;
pstr[1] = ((cur >> 12) & 0x3f) | 0x80; pstr[1] = ((cur >> 12) & 0x3f) | 0x80;
pstr[2] = ((cur >> 6) & 0x3f) | 0x80; pstr[2] = ((cur >> 6) & 0x3f) | 0x80;
...@@ -96,10 +184,9 @@ public: ...@@ -96,10 +184,9 @@ public:
break; break;
} }
pstr += codepoint_size; pstr += codepoint_size;
wsrc++;
} }
*pstr = 0; *pstr = 0;
return pstr - str; return (int)(pstr - str);
} }
// UTF-8 to UTF-16/UTF-32 // UTF-8 to UTF-16/UTF-32
// return: string length // return: string length
...@@ -107,9 +194,11 @@ public: ...@@ -107,9 +194,11 @@ public:
const char* p = src; const char* p = src;
wchar_t* wp = wstr; wchar_t* wp = wstr;
while(*p != 0) { while(*p != 0) {
const unsigned cur = *p & 0xffU; unsigned int cur = ConvertUTF8(p);
int codepoint_size = 0; int codepoint_size = 0;
if ((cur & 0xf8) == 0xf0) { if (!IsUnicodeChar(cur))
continue;
if (cur >= 0x10000) {
if (sizeof(wchar_t) == 2) if (sizeof(wchar_t) == 2)
codepoint_size = 2; codepoint_size = 2;
else else
...@@ -117,30 +206,18 @@ public: ...@@ -117,30 +206,18 @@ public:
} }
else else
codepoint_size = 1; codepoint_size = 1;
if (wp - wstr + codepoint_size > size - 1) if ((int)(wp - wstr) + codepoint_size > size - 1)
break; break;
if((cur & 0x80) == 0) { if (codepoint_size == 1) {
*wp = *p; wp[0] = cur;
p++; wp++;
} else if((cur & 0xe0) == 0xc0) { }
*wp = ((p[0] & 0x1fU) << 6) | (p[1] & 0x3fU); else {
p += 2; cur -= 0x10000U;
} else if((cur & 0xf0) == 0xe0) { wp[0] = (cur >> 10) | 0xd800;
*wp = ((p[0] & 0xfU) << 12) | ((p[1] & 0x3fU) << 6) | (p[2] & 0x3fU); wp[1] = (cur & 0x3ff) | 0xdc00;
p += 3; wp += 2;
} else if((cur & 0xf8) == 0xf0) { }
if (sizeof(wchar_t) == 2) {
unsigned unicode = ((p[0] & 0x7U) << 18) | ((p[1] & 0x3fU) << 12) | ((p[2] & 0x3fU) << 6) | (p[3] & 0x3fU);
unicode -= 0x10000;
*wp++ = (unicode >> 10) | 0xd800;
*wp = (unicode & 0x3ff) | 0xdc00;
} else {
*wp = ((p[0] & 0x7U) << 18) | ((p[1] & 0x3fU) << 12) | ((p[2] & 0x3fU) << 6) | (p[3] & 0x3fU);
}
p += 4;
} else
p++;
wp++;
} }
*wp = 0; *wp = 0;
return wp - wstr; return wp - wstr;
......
...@@ -58,6 +58,20 @@ inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) { ...@@ -58,6 +58,20 @@ inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) {
#include "../ocgcore/ocgapi.h" #include "../ocgcore/ocgapi.h"
#include "../ocgcore/common.h" #include "../ocgcore/common.h"
inline FILE* myfopen(const char* filename, const char* mode) {
FILE* fp{};
#ifdef _WIN32
wchar_t wname[256]{};
wchar_t wmode[20]{};
BufferIO::DecodeUTF8(filename, wname);
BufferIO::CopyWStr(mode, wmode, sizeof wmode / sizeof wmode[0]);
fp = _wfopen(wname, wmode);
#else
fp = fopen(filename, mode);
#endif
return fp;
}
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
#include <irrlicht.h> #include <irrlicht.h>
using namespace irr; using namespace irr;
......
...@@ -273,15 +273,9 @@ void DeckManager::GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory, ...@@ -273,15 +273,9 @@ void DeckManager::GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory,
} }
} }
FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) { FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
#ifdef WIN32 char fullname[256]{};
wchar_t wmode[20]{}; BufferIO::EncodeUTF8(file, fullname);
BufferIO::CopyWStr(mode, wmode, sizeof wmode / sizeof wmode[0]); FILE* fp = myfopen(fullname, mode);
FILE* fp = _wfopen(file, wmode);
#else
char file2[256];
BufferIO::EncodeUTF8(file, file2);
FILE* fp = fopen(file2, mode);
#endif
return fp; return fp;
} }
IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) { IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) {
......
...@@ -100,7 +100,7 @@ void DuelClient::StopClient(bool is_exiting) { ...@@ -100,7 +100,7 @@ void DuelClient::StopClient(bool is_exiting) {
void DuelClient::ClientRead(bufferevent* bev, void* ctx) { void DuelClient::ClientRead(bufferevent* bev, void* ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
unsigned char* duel_client_read = new unsigned char[std::min(len, SIZE_NETWORK_BUFFER)]; unsigned char* duel_client_read = new unsigned char[SIZE_NETWORK_BUFFER];
unsigned short packet_len; unsigned short packet_len;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
......
...@@ -570,14 +570,9 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -570,14 +570,9 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
const wchar_t* name = mainGame->lstSinglePlayList->getListItem(sel); const wchar_t* name = mainGame->lstSinglePlayList->getListItem(sel);
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./single/%ls", name); myswprintf(fname, L"./single/%ls", name);
FILE *fp; char fullname[256]{};
#ifdef _WIN32 BufferIO::EncodeUTF8(fname, fullname);
fp = _wfopen(fname, L"rb"); FILE* fp = myfopen(fullname, "rb");
#else
char filename[256];
BufferIO::EncodeUTF8(fname, filename);
fp = fopen(filename, "rb");
#endif
if(!fp) { if(!fp) {
mainGame->stSinglePlayInfo->setText(L""); mainGame->stSinglePlayInfo->setText(L"");
break; break;
......
...@@ -206,7 +206,7 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) { ...@@ -206,7 +206,7 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) {
void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) { void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
unsigned char* net_server_read = new unsigned char[std::min(len, SIZE_NETWORK_BUFFER)]; unsigned char* net_server_read = new unsigned char[SIZE_NETWORK_BUFFER];
unsigned short packet_len; unsigned short packet_len;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
......
...@@ -58,7 +58,7 @@ void Replay::BeginRecord() { ...@@ -58,7 +58,7 @@ void Replay::BeginRecord() {
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
} }
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
pdata = replay_data; pwrite = replay_data;
replay_size = 0; replay_size = 0;
comp_size = 0; comp_size = 0;
is_replaying = false; is_replaying = false;
...@@ -80,10 +80,10 @@ void Replay::WriteHeader(ReplayHeader& header) { ...@@ -80,10 +80,10 @@ void Replay::WriteHeader(ReplayHeader& header) {
void Replay::WriteData(const void* data, int length, bool flush) { void Replay::WriteData(const void* data, int length, bool flush) {
if(!is_recording) if(!is_recording)
return; return;
if (length < 0 || (pdata - replay_data) + length > MAX_REPLAY_SIZE) if (length < 0 || (int)(pwrite - replay_data) + length > MAX_REPLAY_SIZE)
return; return;
std::memcpy(pdata, data, length); std::memcpy(pwrite, data, length);
pdata += length; pwrite += length;
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
if(!(replay_mode & REPLAY_MODE_SAVE_IN_SERVER)) return; if(!(replay_mode & REPLAY_MODE_SAVE_IN_SERVER)) return;
#endif #endif
...@@ -97,58 +97,13 @@ void Replay::WriteData(const void* data, int length, bool flush) { ...@@ -97,58 +97,13 @@ void Replay::WriteData(const void* data, int length, bool flush) {
#endif #endif
} }
void Replay::WriteInt32(int data, bool flush) { void Replay::WriteInt32(int data, bool flush) {
if(!is_recording) WriteData(&data, sizeof data, flush);
return;
if ((pdata - replay_data) + 4 > MAX_REPLAY_SIZE)
return;
BufferIO::WriteInt32(pdata, data);
#ifdef YGOPRO_SERVER_MODE
if(!(replay_mode & REPLAY_MODE_SAVE_IN_SERVER)) return;
#endif
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(int), &size, NULL);
#else
fwrite(&data, sizeof(int), 1, fp);
if(flush)
fflush(fp);
#endif
} }
void Replay::WriteInt16(short data, bool flush) { void Replay::WriteInt16(short data, bool flush) {
if(!is_recording) WriteData(&data, sizeof data, flush);
return;
if ((pdata - replay_data) + 2 > MAX_REPLAY_SIZE)
return;
BufferIO::WriteInt16(pdata, data);
#ifdef YGOPRO_SERVER_MODE
if(!(replay_mode & REPLAY_MODE_SAVE_IN_SERVER)) return;
#endif
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(short), &size, NULL);
#else
fwrite(&data, sizeof(short), 1, fp);
if(flush)
fflush(fp);
#endif
} }
void Replay::WriteInt8(char data, bool flush) { void Replay::WriteInt8(char data, bool flush) {
if(!is_recording) WriteData(&data, sizeof data, flush);
return;
if ((pdata - replay_data) + 1 > MAX_REPLAY_SIZE)
return;
BufferIO::WriteInt8(pdata, data);
#ifdef YGOPRO_SERVER_MODE
if(!(replay_mode & REPLAY_MODE_SAVE_IN_SERVER)) return;
#endif
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(char), &size, NULL);
#else
fwrite(&data, sizeof(char), 1, fp);
if(flush)
fflush(fp);
#endif
} }
void Replay::Flush() { void Replay::Flush() {
if(!is_recording) if(!is_recording)
...@@ -175,10 +130,7 @@ void Replay::EndRecord() { ...@@ -175,10 +130,7 @@ void Replay::EndRecord() {
#ifdef YGOPRO_SERVER_MODE #ifdef YGOPRO_SERVER_MODE
} }
#endif #endif
if(pdata - replay_data > 0 && pdata - replay_data <= MAX_REPLAY_SIZE) replay_size = pwrite - replay_data;
replay_size = pdata - replay_data;
else
replay_size = 0;
pheader.datasize = replay_size; pheader.datasize = replay_size;
pheader.flag |= REPLAY_COMPRESSED; pheader.flag |= REPLAY_COMPRESSED;
size_t propsize = 5; size_t propsize = 5;
...@@ -195,39 +147,26 @@ void Replay::SaveReplay(const wchar_t* name) { ...@@ -195,39 +147,26 @@ void Replay::SaveReplay(const wchar_t* name) {
return; return;
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./replay/%ls.yrp", name); myswprintf(fname, L"./replay/%ls.yrp", name);
#ifdef WIN32 char fullname[256]{};
fp = _wfopen(fname, L"wb"); BufferIO::EncodeUTF8(fname, fullname);
#else FILE* rfp = myfopen(fullname, "wb");
char fname2[256]; if(!rfp)
BufferIO::EncodeUTF8(fname, fname2);
fp = fopen(fname2, "wb");
#endif
if(!fp)
return; return;
fwrite(&pheader, sizeof(pheader), 1, fp); fwrite(&pheader, sizeof pheader, 1, rfp);
fwrite(comp_data, comp_size, 1, fp); fwrite(comp_data, comp_size, 1, rfp);
fclose(fp); fclose(rfp);
} }
bool Replay::OpenReplay(const wchar_t* name) { bool Replay::OpenReplay(const wchar_t* name) {
#ifdef WIN32 char fullname[256]{};
fp = _wfopen(name, L"rb"); BufferIO::EncodeUTF8(name, fullname);
#else FILE* rfp = myfopen(fullname, "rb");
char name2[256]; if(!rfp) {
BufferIO::EncodeUTF8(name, name2);
fp = fopen(name2, "rb");
#endif
if(!fp) {
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./replay/%ls", name); myswprintf(fname, L"./replay/%ls", name);
#ifdef WIN32 BufferIO::EncodeUTF8(fname, fullname);
fp = _wfopen(fname, L"rb"); rfp = myfopen(fullname, "rb");
#else
char fname2[256];
BufferIO::EncodeUTF8(fname, fname2);
fp = fopen(fname2, "rb");
#endif
} }
if(!fp) if(!rfp)
return false; return false;
pdata = replay_data; pdata = replay_data;
...@@ -235,13 +174,13 @@ bool Replay::OpenReplay(const wchar_t* name) { ...@@ -235,13 +174,13 @@ bool Replay::OpenReplay(const wchar_t* name) {
is_replaying = false; is_replaying = false;
replay_size = 0; replay_size = 0;
comp_size = 0; comp_size = 0;
if(fread(&pheader, sizeof(pheader), 1, fp) < 1) { if(fread(&pheader, sizeof pheader, 1, rfp) < 1) {
fclose(fp); fclose(rfp);
return false; return false;
} }
if(pheader.flag & REPLAY_COMPRESSED) { if(pheader.flag & REPLAY_COMPRESSED) {
comp_size = fread(comp_data, 1, MAX_COMP_SIZE, fp); comp_size = fread(comp_data, 1, MAX_COMP_SIZE, rfp);
fclose(fp); fclose(rfp);
if ((int)pheader.datasize < 0 && (int)pheader.datasize > MAX_REPLAY_SIZE) if ((int)pheader.datasize < 0 && (int)pheader.datasize > MAX_REPLAY_SIZE)
return false; return false;
replay_size = pheader.datasize; replay_size = pheader.datasize;
...@@ -252,8 +191,8 @@ bool Replay::OpenReplay(const wchar_t* name) { ...@@ -252,8 +191,8 @@ bool Replay::OpenReplay(const wchar_t* name) {
return false; return false;
} }
} else { } else {
replay_size = fread(replay_data, 1, MAX_REPLAY_SIZE, fp); replay_size = fread(replay_data, 1, MAX_REPLAY_SIZE, rfp);
fclose(fp); fclose(rfp);
comp_size = 0; comp_size = 0;
} }
is_replaying = true; is_replaying = true;
...@@ -262,24 +201,20 @@ bool Replay::OpenReplay(const wchar_t* name) { ...@@ -262,24 +201,20 @@ bool Replay::OpenReplay(const wchar_t* name) {
bool Replay::CheckReplay(const wchar_t* name) { bool Replay::CheckReplay(const wchar_t* name) {
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./replay/%ls", name); myswprintf(fname, L"./replay/%ls", name);
#ifdef WIN32 char fullname[256]{};
FILE* rfp = _wfopen(fname, L"rb"); BufferIO::EncodeUTF8(fname, fullname);
#else FILE* rfp = myfopen(fullname, "rb");
char fname2[256];
BufferIO::EncodeUTF8(fname, fname2);
FILE* rfp = fopen(fname2, "rb");
#endif
if(!rfp) if(!rfp)
return false; return false;
ReplayHeader rheader; ReplayHeader rheader;
size_t count = fread(&rheader, sizeof(ReplayHeader), 1, rfp); size_t count = fread(&rheader, sizeof rheader, 1, rfp);
fclose(rfp); fclose(rfp);
return count == 1 && rheader.id == 0x31707279 && rheader.version >= 0x12d0u && (rheader.version < 0x1353u || (rheader.flag & REPLAY_UNIFORM)); return count == 1 && rheader.id == 0x31707279 && rheader.version >= 0x12d0u && (rheader.version < 0x1353u || (rheader.flag & REPLAY_UNIFORM));
} }
bool Replay::DeleteReplay(const wchar_t* name) { bool Replay::DeleteReplay(const wchar_t* name) {
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./replay/%ls", name); myswprintf(fname, L"./replay/%ls", name);
#ifdef WIN32 #ifdef _WIN32
BOOL result = DeleteFileW(fname); BOOL result = DeleteFileW(fname);
return !!result; return !!result;
#else #else
...@@ -294,7 +229,7 @@ bool Replay::RenameReplay(const wchar_t* oldname, const wchar_t* newname) { ...@@ -294,7 +229,7 @@ bool Replay::RenameReplay(const wchar_t* oldname, const wchar_t* newname) {
wchar_t newfname[256]; wchar_t newfname[256];
myswprintf(oldfname, L"./replay/%ls", oldname); myswprintf(oldfname, L"./replay/%ls", oldname);
myswprintf(newfname, L"./replay/%ls", newname); myswprintf(newfname, L"./replay/%ls", newname);
#ifdef WIN32 #ifdef _WIN32
BOOL result = MoveFileW(oldfname, newfname); BOOL result = MoveFileW(oldfname, newfname);
return !!result; return !!result;
#else #else
...@@ -307,45 +242,53 @@ bool Replay::RenameReplay(const wchar_t* oldname, const wchar_t* newname) { ...@@ -307,45 +242,53 @@ bool Replay::RenameReplay(const wchar_t* oldname, const wchar_t* newname) {
#endif #endif
} }
bool Replay::ReadNextResponse(unsigned char resp[]) { bool Replay::ReadNextResponse(unsigned char resp[]) {
if(pdata - replay_data >= (int)replay_size) unsigned char len{};
if (!ReadData(&len, sizeof len))
return false;
if (len > SIZE_RETURN_VALUE) {
is_replaying = false;
return false; return false;
int len = *pdata++; }
if(len > SIZE_RETURN_VALUE) if (!ReadData(resp, len))
return false; return false;
std::memcpy(resp, pdata, len);
pdata += len;
return true; return true;
} }
void Replay::ReadName(wchar_t* data) { void Replay::ReadName(wchar_t* data) {
if(!is_replaying) uint16_t buffer[20]{};
if (!ReadData(buffer, sizeof buffer)) {
data[0] = 0;
return; return;
unsigned short buffer[20]; }
ReadData(buffer, 40);
BufferIO::CopyWStr(buffer, data, 20); BufferIO::CopyWStr(buffer, data, 20);
} }
void Replay::ReadData(void* data, int length) { bool Replay::ReadData(void* data, int length) {
if(!is_replaying) if(!is_replaying)
return; return false;
if (length < 0)
return false;
if ((int)(pdata - replay_data) + length > (int)replay_size) {
is_replaying = false;
return false;
}
std::memcpy(data, pdata, length); std::memcpy(data, pdata, length);
pdata += length; pdata += length;
return true;
} }
int Replay::ReadInt32() { template<typename T>
if(!is_replaying) T Replay::ReadValue() {
T ret{};
if (!ReadData(&ret, sizeof ret))
return -1; return -1;
int ret = BufferIO::ReadInt32(pdata);
return ret; return ret;
} }
int Replay::ReadInt32() {
return ReadValue<int32_t>();
}
short Replay::ReadInt16() { short Replay::ReadInt16() {
if(!is_replaying) return ReadValue<int16_t>();
return -1;
short ret = BufferIO::ReadInt16(pdata);
return ret;
} }
char Replay::ReadInt8() { char Replay::ReadInt8() {
if(!is_replaying) return ReadValue<char>();
return -1;
char ret= BufferIO::ReadInt8(pdata);
return ret;
} }
void Replay::Rewind() { void Replay::Rewind() {
pdata = replay_data; pdata = replay_data;
......
...@@ -56,7 +56,9 @@ public: ...@@ -56,7 +56,9 @@ public:
bool ReadNextResponse(unsigned char resp[]); bool ReadNextResponse(unsigned char resp[]);
void ReadName(wchar_t* data); void ReadName(wchar_t* data);
//void ReadHeader(ReplayHeader& header); //void ReadHeader(ReplayHeader& header);
void ReadData(void* data, int length); bool ReadData(void* data, int length);
template<typename T>
T ReadValue();
int ReadInt32(); int ReadInt32();
short ReadInt16(); short ReadInt16();
char ReadInt8(); char ReadInt8();
...@@ -68,13 +70,14 @@ public: ...@@ -68,13 +70,14 @@ public:
#endif #endif
ReplayHeader pheader; ReplayHeader pheader;
unsigned char* replay_data;
unsigned char* comp_data; unsigned char* comp_data;
size_t replay_size{};
size_t comp_size{}; size_t comp_size{};
private: private:
unsigned char* pdata{ nullptr }; unsigned char* replay_data;
size_t replay_size{};
unsigned char* pwrite{};
unsigned char* pdata{};
bool is_recording{}; bool is_recording{};
bool is_replaying{}; bool is_replaying{};
}; };
......
#[2024.7][2024.4 TCG][2024.4][2024.1][2023.10][2023.7][2023.4][2023.1][2022.10][2022.7][2022.4][2022.1][2021.10][2021.7][2021.4][2021.1][2020.10][2020.7][2020.4][2020.1][2019.10][2019.7][2019.4][2019.1][2018.10][2018.7][2018.4][2018.1][2017.10][2017.7][2017.4][2017.1][2016.10][2016.7][2016.4][2016.1][2015.10][2015.4][2015.1][2014.10][2014.7][2014.4][2014.2][2013.9][2024.1 TCG][2023.9 TCG][2023.6 TCG][2023.2 TCG][2022.12 TCG][2022.10 TCG][2022.5 TCG][2022.2 TCG][2021.10 TCG][2021.7 TCG][2021.3 TCG][2020.12 TCG][2020.9 TCG][2020.6 TCG][2020.4 TCG][2020.1 TCG][2019.10 TCG][2019.7 TCG][2019.4 TCG][2019.1 TCG][2018.12 TCG][2018.9 TCG][2018.5 TCG][2018.2 TCG][2017.11 TCG][2017.9 TCG][2017.6 TCG][2017.3 TCG][2016.8 TCG][2016.4 TCG][2015.11 TCG][2015.7 TCG][2015.4 TCG][2015.1 TCG][2014.10 TCG][2014.7 TCG][2014.4 TCG][2014.1.1 TCG][2013.10.11 TCG][2013.3.1][2012.9.1][2012.3.1][2011.9.1]
#[2024.7][2024.9 TCG][2024.4][2024.1][2023.10][2023.7][2023.4][2023.1][2022.10][2022.7][2022.4][2022.1][2021.10][2021.7][2021.4][2021.1][2020.10][2020.7][2020.4][2020.1][2019.10][2019.7][2019.4][2019.1][2018.10][2018.7][2018.4][2018.1][2017.10][2017.7][2017.4][2017.1][2016.10][2016.7][2016.4][2016.1][2015.10][2015.4][2015.1][2014.10][2014.7][2014.4][2014.2][2013.9][2024.4 TCG][2024.1 TCG][2023.9 TCG][2023.6 TCG][2023.2 TCG][2022.12 TCG][2022.10 TCG][2022.5 TCG][2022.2 TCG][2021.10 TCG][2021.7 TCG][2021.3 TCG][2020.12 TCG][2020.9 TCG][2020.6 TCG][2020.4 TCG][2020.1 TCG][2019.10 TCG][2019.7 TCG][2019.4 TCG][2019.1 TCG][2018.12 TCG][2018.9 TCG][2018.5 TCG][2018.2 TCG][2017.11 TCG][2017.9 TCG][2017.6 TCG][2017.3 TCG][2016.8 TCG][2016.4 TCG][2015.11 TCG][2015.7 TCG][2015.4 TCG][2015.1 TCG][2014.10 TCG][2014.7 TCG][2014.4 TCG][2014.1.1 TCG][2013.10.11 TCG][2013.3.1][2012.9.1][2012.3.1][2011.9.1]
!2024.7 !2024.7
#forbidden #forbidden
91869203 0 --アマゾネスの射手 91869203 0 --アマゾネスの射手
...@@ -195,10 +196,9 @@ ...@@ -195,10 +196,9 @@
14532163 2 --ライトニング・ストーム 14532163 2 --ライトニング・ストーム
92714517 2 --ビッグウェルカム・ラビュリンス 92714517 2 --ビッグウェルカム・ラビュリンス
!2024.1 TCG !2024.9 TCG
#forbidden #forbidden
62320425 0 --Agido the Ancient Sentinel 62320425 0 --Agido the Ancient Sentinel
06728559 0 --Archnemeses Protos
20292186 0 --Artifact Scythe 20292186 0 --Artifact Scythe
73356503 0 --Barrier Statue of the Stormwinds 73356503 0 --Barrier Statue of the Stormwinds
09929398 0 --Blackwing - Gofu the Vague Shadow 09929398 0 --Blackwing - Gofu the Vague Shadow
...@@ -207,7 +207,6 @@ ...@@ -207,7 +207,6 @@
15341821 0 --Dandylion 15341821 0 --Dandylion
08903700 0 --Djinn Releaser of Rituals 08903700 0 --Djinn Releaser of Rituals
51858306 0 --Eclipse Wyvern 51858306 0 --Eclipse Wyvern
40177746 0 --Eva
55623480 0 --Fairy Tail - Snow 55623480 0 --Fairy Tail - Snow
78706415 0 --Fiber Jar 78706415 0 --Fiber Jar
93369354 0 --Fishborg Blaster 93369354 0 --Fishborg Blaster
...@@ -216,22 +215,20 @@ ...@@ -216,22 +215,20 @@
25926710 0 --Kelbek the Ancient Vanguard 25926710 0 --Kelbek the Ancient Vanguard
57421866 0 --Level Eater 57421866 0 --Level Eater
34206604 0 --Magical Scientist 34206604 0 --Magical Scientist
31178212 0 --Majespecter Unicorn - Kirin
21377582 0 --Master Peace, the True Dracoslaying King 21377582 0 --Master Peace, the True Dracoslaying King
36521307 0 --Mathmech Circular 36521307 0 --Mathmech Circular
23434538 0 --Maxx "C" 23434538 0 --Maxx "C"
96782886 0 --Mind Master 96782886 0 --Mind Master
07563579 0 --Performage Plushfire
23558733 0 --Phoenixian Cluster Amaryllis 23558733 0 --Phoenixian Cluster Amaryllis
01357146 0 --Ronintoadin 01357146 0 --Ronintoadin
91258852 0 --SPYRAL Master Plan 91258852 0 --SPYRAL Master Plan
88071625 0 --The Tyrant Neptune 88071625 0 --The Tyrant Neptune
26400609 0 --Tidal, Dragon Ruler of Waterfalls
44910027 0 --Victory Dragon 44910027 0 --Victory Dragon
17412721 0 --Elder Entity Norden 17412721 0 --Elder Entity Norden
46640168 0 --Fiendsmith's Lacrima
43387895 0 --Supreme King Dragon Starving Venom 43387895 0 --Supreme King Dragon Starving Venom
92731385 0 --Tearlaments Kitkallos 92731385 0 --Tearlaments Kitkallos
15291624 0 --Thunder Dragon Colossus 04280258 0 --Apollousa, Bow of the Goddess
50588353 0 --Crystron Halqifibrax 50588353 0 --Crystron Halqifibrax
98095162 0 --Curious, the Lightsworn Dominion 98095162 0 --Curious, the Lightsworn Dominion
59537380 0 --Guardragon Agarpain 59537380 0 --Guardragon Agarpain
...@@ -241,6 +238,7 @@ ...@@ -241,6 +238,7 @@
39064822 0 --Knightmare Goblin 39064822 0 --Knightmare Goblin
03679218 0 --Knightmare Mermaid 03679218 0 --Knightmare Mermaid
85243784 0 --Linkross 85243784 0 --Linkross
41999284 0 --Linkuriboh
44097050 0 --Mecha Phantom Beast Auroradon 44097050 0 --Mecha Phantom Beast Auroradon
25725326 0 --Prank-Kids Meow-Meow-Mu 25725326 0 --Prank-Kids Meow-Meow-Mu
70369116 0 --Predaplant Verte Anaconda 70369116 0 --Predaplant Verte Anaconda
...@@ -250,8 +248,12 @@ ...@@ -250,8 +248,12 @@
33918636 0 --Superheavy Samurai Scarecrow 33918636 0 --Superheavy Samurai Scarecrow
22593417 0 --Topologic Gumblar Dragon 22593417 0 --Topologic Gumblar Dragon
83152482 0 --Union Carrier 83152482 0 --Union Carrier
84815190 0 --Baronne de Fleur
27548199 0 --Borreload Savage Dragon
03040496 0 --Chaos Ruler, the Chaotic Magical Dragon 03040496 0 --Chaos Ruler, the Chaotic Magical Dragon
62242678 0 --Hot Red Dragon Archfiend King Calamity
63101919 0 --Tempest Magician 63101919 0 --Tempest Magician
27552504 0 --Beatrice, Lady of the Eternal
48626373 0 --Kashtira Arise-Heart 48626373 0 --Kashtira Arise-Heart
34086406 0 --Lavalval Chain 34086406 0 --Lavalval Chain
04423206 0 --M-X-Saber Invoker 04423206 0 --M-X-Saber Invoker
...@@ -269,7 +271,6 @@ ...@@ -269,7 +271,6 @@
07394770 0 --Brilliant Fusion 07394770 0 --Brilliant Fusion
69243953 0 --Butterfly Dagger - Elma 69243953 0 --Butterfly Dagger - Elma
57953380 0 --Card of Safe Return 57953380 0 --Card of Safe Return
67616300 0 --Chicken Game
60682203 0 --Cold Wave 60682203 0 --Cold Wave
17375316 0 --Confiscation 17375316 0 --Confiscation
44763025 0 --Delinquent Duo 44763025 0 --Delinquent Duo
...@@ -288,7 +289,6 @@ ...@@ -288,7 +289,6 @@
70828912 0 --Premature Burial 70828912 0 --Premature Burial
63789924 0 --Smoke Grenade of the Thief 63789924 0 --Smoke Grenade of the Thief
54447022 0 --Soul Charge 54447022 0 --Soul Charge
11110587 0 --That Grass Looks Greener
42829885 0 --The Forceful Sentry 42829885 0 --The Forceful Sentry
46060017 0 --Zoodiac Barrage 46060017 0 --Zoodiac Barrage
43262273 0 --Appointer of the Red Lotus 43262273 0 --Appointer of the Red Lotus
...@@ -300,6 +300,7 @@ ...@@ -300,6 +300,7 @@
93016201 0 --Royal Oppression 93016201 0 --Royal Oppression
57585212 0 --Self-Destruct Button 57585212 0 --Self-Destruct Button
03280747 0 --Sixth Sense 03280747 0 --Sixth Sense
23516703 0 --Summon Limit
64697231 0 --Trap Dustshoot 64697231 0 --Trap Dustshoot
80604091 0 --Ultimate Offering 80604091 0 --Ultimate Offering
05851097 0 --Vanity's Emptiness 05851097 0 --Vanity's Emptiness
...@@ -308,33 +309,30 @@ ...@@ -308,33 +309,30 @@
44519536 1 --Left Leg of the Forbidden One 44519536 1 --Left Leg of the Forbidden One
70903634 1 --Right Arm of the Forbidden One 70903634 1 --Right Arm of the Forbidden One
08124921 1 --Right Leg of the Forbidden One 08124921 1 --Right Leg of the Forbidden One
28985331 1 --Armageddon Knight 06728559 1 --Archnemeses Protos
76794549 1 --Astrograph Sorcerer 76794549 1 --Astrograph Sorcerer
61901281 1 --Black Dragon Collapserpent 61901281 1 --Black Dragon Collapserpent
53804307 1 --Blaster, Dragon Ruler of Infernos
33854624 1 --Bystial Magnamhut 33854624 1 --Bystial Magnamhut
34124316 1 --Cyber Jar 34124316 1 --Cyber Jar
43694650 1 --Danger!? Jackalope? 43694650 1 --Danger!? Jackalope?
99745551 1 --Danger!? Tsuchinoko? 99745551 1 --Danger!? Tsuchinoko?
14536035 1 --Dark Grepher 14536035 1 --Dark Grepher
40177746 1 --Eva
33396948 1 --Exodia the Forbidden One 33396948 1 --Exodia the Forbidden One
63542003 1 --Keldo the Sacred Protector 63542003 1 --Keldo the Sacred Protector
83190280 1 --Lunalight Tiger
38572779 1 --Miscellaneousaurus 38572779 1 --Miscellaneousaurus
33508719 1 --Morphing Jar 33508719 1 --Morphing Jar
99937011 1 --Mudora the Sword Oracle 99937011 1 --Mudora the Sword Oracle
57835716 1 --Orcust Harp Horror
17330916 1 --Performapal Monkeyboard 17330916 1 --Performapal Monkeyboard
12958919 1 --Phantom Skyblaster 12958919 1 --Phantom Skyblaster
38814750 1 --PSY-Framegear Gamma 38814750 1 --PSY-Framegear Gamma
26118970 1 --Red Rose Dragon
90411554 1 --Redox, Dragon Ruler of Boulders
65734501 1 --Rescue-ACE Air Lifter 65734501 1 --Rescue-ACE Air Lifter
09674034 1 --Snake-Eye Ash
90241276 1 --Snake-Eyes Poplar
20663556 1 --Substitoad 20663556 1 --Substitoad
37961969 1 --Tearlaments Havnis 37961969 1 --Tearlaments Havnis
74078255 1 --Tearlaments Merrli 74078255 1 --Tearlaments Merrli
00572850 1 --Tearlaments Scheiren 00572850 1 --Tearlaments Scheiren
89399912 1 --Tempest, Dragon Ruler of Storms
41165831 1 --Unchained Soul of Sharvara 41165831 1 --Unchained Soul of Sharvara
99234526 1 --White Dragon Wyverburster 99234526 1 --White Dragon Wyverburster
78872731 1 --Zoodiac Ratpier 78872731 1 --Zoodiac Ratpier
...@@ -342,19 +340,19 @@ ...@@ -342,19 +340,19 @@
73539069 1 --Striker Dragon 73539069 1 --Striker Dragon
93896655 1 --Sunavalon Dryas 93896655 1 --Sunavalon Dryas
65563871 1 --Sunvine Healer 65563871 1 --Sunvine Healer
25862681 1 --Ancient Fairy Dragon
65536818 1 --Denglong, First of the Yang Zing
94677445 1 --Ib the World Chalice Justiciar
74586817 1 --PSY-Framelord Omega 74586817 1 --PSY-Framelord Omega
90953320 1 --T.G. Hyper Librarian 90953320 1 --T.G. Hyper Librarian
27552504 1 --Beatrice, Lady of the Eternal
00581014 1 --Daigusto Emeral 00581014 1 --Daigusto Emeral
75433814 1 --Number 40: Gimmick Puppet of Strings
69170557 1 --Number C40: Gimmick Puppet of Dark Strings
44362883 1 --Branded Fusion
24224830 1 --Called by the Grave 24224830 1 --Called by the Grave
72892473 1 --Card Destruction 72892473 1 --Card Destruction
59750328 1 --Card of Demise 59750328 1 --Card of Demise
91623717 1 --Chain Strike 91623717 1 --Chain Strike
04031928 1 --Change of Heart 04031928 1 --Change of Heart
99266988 1 --Chaos Space 99266988 1 --Chaos Space
67616300 1 --Chicken Game
15854426 1 --Divine Wind of Mist Valley 15854426 1 --Divine Wind of Mist Valley
13035077 1 --Dragonic Diagram 13035077 1 --Dragonic Diagram
95308449 1 --Final Countdown 95308449 1 --Final Countdown
...@@ -370,29 +368,38 @@ ...@@ -370,29 +368,38 @@
83764718 1 --Monster Reborn 83764718 1 --Monster Reborn
33782437 1 --One Day of Peace 33782437 1 --One Day of Peace
02295440 1 --One for One 02295440 1 --One for One
55584558 1 --Purrely Delicious Memory 80312545 1 --Opening of the Spirit Gates
84211599 1 --Pot of Prosperity
58577036 1 --Reasoning 58577036 1 --Reasoning
32807846 1 --Reinforcement of the Army 32807846 1 --Reinforcement of the Army
30336082 1 --Sangen Summoning
24940422 1 --Sekka's Light 24940422 1 --Sekka's Light
73468603 1 --Set Rotation 73468603 1 --Set Rotation
52340444 1 --Sky Striker Mecha - Hornet Drones 52340444 1 --Sky Striker Mecha - Hornet Drones
71344451 1 --Slash Draw 71344451 1 --Slash Draw
45986603 1 --Snatch Steal 45986603 1 --Snatch Steal
73628505 1 --Terraforming 73628505 1 --Terraforming
11110587 1 --That Grass Looks Greener
58921041 1 --Anti-Spell Fragrance
53334471 1 --Gozen Match 53334471 1 --Gozen Match
32723153 1 --Magical Explosion 32723153 1 --Magical Explosion
03734202 1 --Naturia Sacred Tree 03734202 1 --Naturia Sacred Tree
90846359 1 --Rivalry of Warlords 90846359 1 --Rivalry of Warlords
82732705 1 --Skill Drain
24207889 1 --There Can Be Only One 24207889 1 --There Can Be Only One
35316708 1 --Time Seal
#semi limit #semi limit
09411399 2 --Destiny HERO - Malicious 53804307 2 --Blaster, Dragon Ruler of Infernos
82385847 2 --Dinowrestler Pankratops 82385847 2 --Dinowrestler Pankratops
81275020 2 --Speedroid Terrortop 83190280 2 --Lunalight Tiger
90411554 2 --Redox, Dragon Ruler of Boulders
89399912 2 --Tempest, Dragon Ruler of Storms
26400609 2 --Tidal, Dragon Ruler of Waterfalls
15291624 2 --Thunder Dragon Colossus
94677445 2 --Ib the World Chalice Justiciar
14532163 2 --Lightning Storm 14532163 2 --Lightning Storm
55584558 2 --Purrely Delicious Memory
21347668 2 --Purrely Sleepy Memory 21347668 2 --Purrely Sleepy Memory
92107604 2 --Runick Fountain 92107604 2 --Runick Fountain
63166095 2 --Sky Striker Mobilize - Engage!
!2024.4 !2024.4
#forbidden #forbidden
...@@ -7557,6 +7564,405 @@ ...@@ -7557,6 +7564,405 @@
53582587 2 --激流葬 53582587 2 --激流葬
29401950 2 --奈落の落とし穴 29401950 2 --奈落の落とし穴
!2024.4 TCG
#forbidden
62320425 0 --Agido the Ancient Sentinel
20292186 0 --Artifact Scythe
73356503 0 --Barrier Statue of the Stormwinds
09929398 0 --Blackwing - Gofu the Vague Shadow
94689206 0 --Block Dragon
69015963 0 --Cyber-Stein
15341821 0 --Dandylion
08903700 0 --Djinn Releaser of Rituals
51858306 0 --Eclipse Wyvern
40177746 0 --Eva
55623480 0 --Fairy Tail - Snow
78706415 0 --Fiber Jar
93369354 0 --Fishborg Blaster
67441435 0 --Glow-Up Bulb
75732622 0 --Grinder Golem
25926710 0 --Kelbek the Ancient Vanguard
57421866 0 --Level Eater
34206604 0 --Magical Scientist
21377582 0 --Master Peace, the True Dracoslaying King
36521307 0 --Mathmech Circular
23434538 0 --Maxx "C"
96782886 0 --Mind Master
07563579 0 --Performage Plushfire
23558733 0 --Phoenixian Cluster Amaryllis
01357146 0 --Ronintoadin
91258852 0 --SPYRAL Master Plan
88071625 0 --The Tyrant Neptune
44910027 0 --Victory Dragon
17412721 0 --Elder Entity Norden
43387895 0 --Supreme King Dragon Starving Venom
92731385 0 --Tearlaments Kitkallos
50588353 0 --Crystron Halqifibrax
98095162 0 --Curious, the Lightsworn Dominion
59537380 0 --Guardragon Agarpain
86148577 0 --Guardragon Elpy
24094258 0 --Heavymetalfoes Electrumite
59934749 0 --Isolde, Two Tales of the Noble Knights
39064822 0 --Knightmare Goblin
03679218 0 --Knightmare Mermaid
85243784 0 --Linkross
41999284 0 --Linkuriboh
44097050 0 --Mecha Phantom Beast Auroradon
25725326 0 --Prank-Kids Meow-Meow-Mu
70369116 0 --Predaplant Verte Anaconda
72330894 0 --Simorgh, Bird of Sovereignty
27381364 0 --Spright Elf
61665245 0 --Summon Sorceress
33918636 0 --Superheavy Samurai Scarecrow
22593417 0 --Topologic Gumblar Dragon
83152482 0 --Union Carrier
84815190 0 --Baronne de Fleur
27548199 0 --Borreload Savage Dragon
03040496 0 --Chaos Ruler, the Chaotic Magical Dragon
63101919 0 --Tempest Magician
48626373 0 --Kashtira Arise-Heart
34086406 0 --Lavalval Chain
04423206 0 --M-X-Saber Invoker
54719828 0 --Number 16: Shock Master
10389142 0 --Number 42: Galaxy Tomahawk
63504681 0 --Number 86: Heroic Champion - Rhongomyniad
95474755 0 --Number 89: Diablosis the Mind Hacker
58820923 0 --Number 95: Galaxy-Eyes Dark Matter Dragon
52653092 0 --Number S0: Utopic ZEXAL
34945480 0 --Outer Entity Azathot
88581108 0 --True King of All Calamities
81122844 0 --Wind-Up Carrier Zenmaity
85115440 0 --Zoodiac Broadbull
48905153 0 --Zoodiac Drident
07394770 0 --Brilliant Fusion
69243953 0 --Butterfly Dagger - Elma
57953380 0 --Card of Safe Return
60682203 0 --Cold Wave
17375316 0 --Confiscation
44763025 0 --Delinquent Duo
23557835 0 --Dimension Fusion
42703248 0 --Giant Trunade
79571449 0 --Graceful Charity
19613556 0 --Heavy Storm
35059553 0 --Kaiser Colosseum
85602018 0 --Last Will
34906152 0 --Mass Driver
46411259 0 --Metamorphosis
41482598 0 --Mirage of Nightmare
76375976 0 --Mystic Mine
74191942 0 --Painful Choice
55144522 0 --Pot of Greed
70828912 0 --Premature Burial
63789924 0 --Smoke Grenade of the Thief
54447022 0 --Soul Charge
11110587 0 --That Grass Looks Greener
42829885 0 --The Forceful Sentry
46060017 0 --Zoodiac Barrage
43262273 0 --Appointer of the Red Lotus
01041278 0 --Branded Expulsion
61740673 0 --Imperial Order
28566710 0 --Last Turn
23002292 0 --Red Reboot
27174286 0 --Return from the Different Dimension
93016201 0 --Royal Oppression
57585212 0 --Self-Destruct Button
03280747 0 --Sixth Sense
23516703 0 --Summon Limit
64697231 0 --Trap Dustshoot
80604091 0 --Ultimate Offering
05851097 0 --Vanity's Emptiness
#limit
07902349 1 --Left Arm of the Forbidden One
44519536 1 --Left Leg of the Forbidden One
70903634 1 --Right Arm of the Forbidden One
08124921 1 --Right Leg of the Forbidden One
06728559 1 --Archnemeses Protos
76794549 1 --Astrograph Sorcerer
61901281 1 --Black Dragon Collapserpent
53804307 1 --Blaster, Dragon Ruler of Infernos
33854624 1 --Bystial Magnamhut
34124316 1 --Cyber Jar
43694650 1 --Danger!? Jackalope?
99745551 1 --Danger!? Tsuchinoko?
14536035 1 --Dark Grepher
33396948 1 --Exodia the Forbidden One
63542003 1 --Keldo the Sacred Protector
83190280 1 --Lunalight Tiger
31178212 1 --Majespecter Unicorn - Kirin
38572779 1 --Miscellaneousaurus
33508719 1 --Morphing Jar
99937011 1 --Mudora the Sword Oracle
17330916 1 --Performapal Monkeyboard
12958919 1 --Phantom Skyblaster
38814750 1 --PSY-Framegear Gamma
26118970 1 --Red Rose Dragon
90411554 1 --Redox, Dragon Ruler of Boulders
65734501 1 --Rescue-ACE Air Lifter
20663556 1 --Substitoad
37961969 1 --Tearlaments Havnis
74078255 1 --Tearlaments Merrli
00572850 1 --Tearlaments Scheiren
89399912 1 --Tempest, Dragon Ruler of Storms
26400609 1 --Tidal, Dragon Ruler of Waterfalls
41165831 1 --Unchained Soul of Sharvara
99234526 1 --White Dragon Wyverburster
78872731 1 --Zoodiac Ratpier
39512984 1 --Gem-Knight Master Diamond
15291624 1 --Thunder Dragon Colossus
73539069 1 --Striker Dragon
93896655 1 --Sunavalon Dryas
65563871 1 --Sunvine Healer
25862681 1 --Ancient Fairy Dragon
65536818 1 --Denglong, First of the Yang Zing
94677445 1 --Ib the World Chalice Justiciar
74586817 1 --PSY-Framelord Omega
90953320 1 --T.G. Hyper Librarian
27552504 1 --Beatrice, Lady of the Eternal
00581014 1 --Daigusto Emeral
24224830 1 --Called by the Grave
72892473 1 --Card Destruction
59750328 1 --Card of Demise
91623717 1 --Chain Strike
04031928 1 --Change of Heart
99266988 1 --Chaos Space
67616300 1 --Chicken Game
15854426 1 --Divine Wind of Mist Valley
13035077 1 --Dragonic Diagram
95308449 1 --Final Countdown
81439173 1 --Foolish Burial
27970830 1 --Gateway of the Six
75500286 1 --Gold Sarcophagus
18144506 1 --Harpie's Feather Duster
66957584 1 --Infernity Launcher
01845204 1 --Instant Fusion
93946239 1 --Into the Void
71650854 1 --Magical Mid-Breaker Field
43040603 1 --Monster Gate
83764718 1 --Monster Reborn
33782437 1 --One Day of Peace
02295440 1 --One for One
58577036 1 --Reasoning
32807846 1 --Reinforcement of the Army
24940422 1 --Sekka's Light
73468603 1 --Set Rotation
52340444 1 --Sky Striker Mecha - Hornet Drones
71344451 1 --Slash Draw
45986603 1 --Snatch Steal
73628505 1 --Terraforming
58921041 1 --Anti-Spell Fragrance
53334471 1 --Gozen Match
32723153 1 --Magical Explosion
03734202 1 --Naturia Sacred Tree
90846359 1 --Rivalry of Warlords
24207889 1 --There Can Be Only One
35316708 1 --Time Seal
#semi limit
28985331 2 --Armageddon Knight
82385847 2 --Dinowrestler Pankratops
14532163 2 --Lightning Storm
55584558 2 --Purrely Delicious Memory
21347668 2 --Purrely Sleepy Memory
92107604 2 --Runick Fountain
!2024.1 TCG
#forbidden
62320425 0 --Agido the Ancient Sentinel
06728559 0 --Archnemeses Protos
20292186 0 --Artifact Scythe
73356503 0 --Barrier Statue of the Stormwinds
09929398 0 --Blackwing - Gofu the Vague Shadow
94689206 0 --Block Dragon
69015963 0 --Cyber-Stein
15341821 0 --Dandylion
08903700 0 --Djinn Releaser of Rituals
51858306 0 --Eclipse Wyvern
40177746 0 --Eva
55623480 0 --Fairy Tail - Snow
78706415 0 --Fiber Jar
93369354 0 --Fishborg Blaster
67441435 0 --Glow-Up Bulb
75732622 0 --Grinder Golem
25926710 0 --Kelbek the Ancient Vanguard
57421866 0 --Level Eater
34206604 0 --Magical Scientist
31178212 0 --Majespecter Unicorn - Kirin
21377582 0 --Master Peace, the True Dracoslaying King
36521307 0 --Mathmech Circular
23434538 0 --Maxx "C"
96782886 0 --Mind Master
07563579 0 --Performage Plushfire
23558733 0 --Phoenixian Cluster Amaryllis
01357146 0 --Ronintoadin
91258852 0 --SPYRAL Master Plan
88071625 0 --The Tyrant Neptune
26400609 0 --Tidal, Dragon Ruler of Waterfalls
44910027 0 --Victory Dragon
17412721 0 --Elder Entity Norden
43387895 0 --Supreme King Dragon Starving Venom
92731385 0 --Tearlaments Kitkallos
15291624 0 --Thunder Dragon Colossus
50588353 0 --Crystron Halqifibrax
98095162 0 --Curious, the Lightsworn Dominion
59537380 0 --Guardragon Agarpain
86148577 0 --Guardragon Elpy
24094258 0 --Heavymetalfoes Electrumite
59934749 0 --Isolde, Two Tales of the Noble Knights
39064822 0 --Knightmare Goblin
03679218 0 --Knightmare Mermaid
85243784 0 --Linkross
44097050 0 --Mecha Phantom Beast Auroradon
25725326 0 --Prank-Kids Meow-Meow-Mu
70369116 0 --Predaplant Verte Anaconda
72330894 0 --Simorgh, Bird of Sovereignty
27381364 0 --Spright Elf
61665245 0 --Summon Sorceress
33918636 0 --Superheavy Samurai Scarecrow
22593417 0 --Topologic Gumblar Dragon
83152482 0 --Union Carrier
03040496 0 --Chaos Ruler, the Chaotic Magical Dragon
63101919 0 --Tempest Magician
48626373 0 --Kashtira Arise-Heart
34086406 0 --Lavalval Chain
04423206 0 --M-X-Saber Invoker
54719828 0 --Number 16: Shock Master
10389142 0 --Number 42: Galaxy Tomahawk
63504681 0 --Number 86: Heroic Champion - Rhongomyniad
95474755 0 --Number 89: Diablosis the Mind Hacker
58820923 0 --Number 95: Galaxy-Eyes Dark Matter Dragon
52653092 0 --Number S0: Utopic ZEXAL
34945480 0 --Outer Entity Azathot
88581108 0 --True King of All Calamities
81122844 0 --Wind-Up Carrier Zenmaity
85115440 0 --Zoodiac Broadbull
48905153 0 --Zoodiac Drident
07394770 0 --Brilliant Fusion
69243953 0 --Butterfly Dagger - Elma
57953380 0 --Card of Safe Return
67616300 0 --Chicken Game
60682203 0 --Cold Wave
17375316 0 --Confiscation
44763025 0 --Delinquent Duo
23557835 0 --Dimension Fusion
42703248 0 --Giant Trunade
79571449 0 --Graceful Charity
19613556 0 --Heavy Storm
35059553 0 --Kaiser Colosseum
85602018 0 --Last Will
34906152 0 --Mass Driver
46411259 0 --Metamorphosis
41482598 0 --Mirage of Nightmare
76375976 0 --Mystic Mine
74191942 0 --Painful Choice
55144522 0 --Pot of Greed
70828912 0 --Premature Burial
63789924 0 --Smoke Grenade of the Thief
54447022 0 --Soul Charge
11110587 0 --That Grass Looks Greener
42829885 0 --The Forceful Sentry
46060017 0 --Zoodiac Barrage
43262273 0 --Appointer of the Red Lotus
01041278 0 --Branded Expulsion
61740673 0 --Imperial Order
28566710 0 --Last Turn
23002292 0 --Red Reboot
27174286 0 --Return from the Different Dimension
93016201 0 --Royal Oppression
57585212 0 --Self-Destruct Button
03280747 0 --Sixth Sense
64697231 0 --Trap Dustshoot
80604091 0 --Ultimate Offering
05851097 0 --Vanity's Emptiness
#limit
07902349 1 --Left Arm of the Forbidden One
44519536 1 --Left Leg of the Forbidden One
70903634 1 --Right Arm of the Forbidden One
08124921 1 --Right Leg of the Forbidden One
28985331 1 --Armageddon Knight
76794549 1 --Astrograph Sorcerer
61901281 1 --Black Dragon Collapserpent
53804307 1 --Blaster, Dragon Ruler of Infernos
33854624 1 --Bystial Magnamhut
34124316 1 --Cyber Jar
43694650 1 --Danger!? Jackalope?
99745551 1 --Danger!? Tsuchinoko?
14536035 1 --Dark Grepher
33396948 1 --Exodia the Forbidden One
63542003 1 --Keldo the Sacred Protector
83190280 1 --Lunalight Tiger
38572779 1 --Miscellaneousaurus
33508719 1 --Morphing Jar
99937011 1 --Mudora the Sword Oracle
57835716 1 --Orcust Harp Horror
17330916 1 --Performapal Monkeyboard
12958919 1 --Phantom Skyblaster
38814750 1 --PSY-Framegear Gamma
26118970 1 --Red Rose Dragon
90411554 1 --Redox, Dragon Ruler of Boulders
65734501 1 --Rescue-ACE Air Lifter
20663556 1 --Substitoad
37961969 1 --Tearlaments Havnis
74078255 1 --Tearlaments Merrli
00572850 1 --Tearlaments Scheiren
89399912 1 --Tempest, Dragon Ruler of Storms
41165831 1 --Unchained Soul of Sharvara
99234526 1 --White Dragon Wyverburster
78872731 1 --Zoodiac Ratpier
39512984 1 --Gem-Knight Master Diamond
73539069 1 --Striker Dragon
93896655 1 --Sunavalon Dryas
65563871 1 --Sunvine Healer
25862681 1 --Ancient Fairy Dragon
65536818 1 --Denglong, First of the Yang Zing
94677445 1 --Ib the World Chalice Justiciar
74586817 1 --PSY-Framelord Omega
90953320 1 --T.G. Hyper Librarian
27552504 1 --Beatrice, Lady of the Eternal
00581014 1 --Daigusto Emeral
24224830 1 --Called by the Grave
72892473 1 --Card Destruction
59750328 1 --Card of Demise
91623717 1 --Chain Strike
04031928 1 --Change of Heart
99266988 1 --Chaos Space
15854426 1 --Divine Wind of Mist Valley
13035077 1 --Dragonic Diagram
95308449 1 --Final Countdown
81439173 1 --Foolish Burial
27970830 1 --Gateway of the Six
75500286 1 --Gold Sarcophagus
18144506 1 --Harpie's Feather Duster
66957584 1 --Infernity Launcher
01845204 1 --Instant Fusion
93946239 1 --Into the Void
71650854 1 --Magical Mid-Breaker Field
43040603 1 --Monster Gate
83764718 1 --Monster Reborn
33782437 1 --One Day of Peace
02295440 1 --One for One
55584558 1 --Purrely Delicious Memory
58577036 1 --Reasoning
32807846 1 --Reinforcement of the Army
24940422 1 --Sekka's Light
73468603 1 --Set Rotation
52340444 1 --Sky Striker Mecha - Hornet Drones
71344451 1 --Slash Draw
45986603 1 --Snatch Steal
73628505 1 --Terraforming
53334471 1 --Gozen Match
32723153 1 --Magical Explosion
03734202 1 --Naturia Sacred Tree
90846359 1 --Rivalry of Warlords
24207889 1 --There Can Be Only One
35316708 1 --Time Seal
#semi limit
09411399 2 --Destiny HERO - Malicious
82385847 2 --Dinowrestler Pankratops
81275020 2 --Speedroid Terrortop
14532163 2 --Lightning Storm
21347668 2 --Purrely Sleepy Memory
92107604 2 --Runick Fountain
63166095 2 --Sky Striker Mobilize - Engage!
!2023.9 TCG !2023.9 TCG
#forbidden #forbidden
06728559 0 --Archnemeses Protos 06728559 0 --Archnemeses Protos
......
Subproject commit 83d47d022b53b227455cf22638bea4e0be18c488 Subproject commit 7c2de13c71531d921a2d15ebb92eb20f995769d3
Subproject commit 1c81fae96af10e8e084b2a895f9a53f78b468bbe Subproject commit 625da06a404246d7a29e0f0095d9dc8c6aea094d
...@@ -1238,3 +1238,6 @@ ...@@ -1238,3 +1238,6 @@
!setname 0x1bb 魔瞳 モルガナイト !setname 0x1bb 魔瞳 モルガナイト
!setname 0x1bc 蓟花 アザミナ !setname 0x1bc 蓟花 アザミナ
!setname 0x1bd 祝台 !setname 0x1bd 祝台
!setname 0x1be 雷火沸动 ライゼオル
!setname 0x1bf 码丽丝 MLICE
!setname 0x1c0 龙华 竜華
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