Commit 944a7897 authored by nanahira's avatar nanahira

Merge branch 'develop-nanahira' into 'develop'

Develop update

See merge request nanahira/ygopro!1
parents 25e5c6a4 3a6724a5
No preview for this file type
...@@ -6,40 +6,36 @@ ...@@ -6,40 +6,36 @@
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 unsigned int ReadUInt32(unsigned char*& p) { static unsigned int ReadUInt32(unsigned char*& p) {
unsigned int ret = *(unsigned int*)p; return buffer_read<uint32_t>(p);
p += 4;
return ret;
} }
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 unsigned short ReadUInt16(unsigned char*& p) { static unsigned short ReadUInt16(unsigned char*& p) {
unsigned short ret = *(unsigned short*)p; return buffer_read<uint16_t>(p);
p += 2;
return ret;
} }
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];
...@@ -49,7 +45,7 @@ public: ...@@ -49,7 +45,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];
...@@ -59,22 +55,117 @@ public: ...@@ -59,22 +55,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:
...@@ -90,13 +181,6 @@ public: ...@@ -90,13 +181,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;
...@@ -106,10 +190,9 @@ public: ...@@ -106,10 +190,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
...@@ -117,9 +200,11 @@ public: ...@@ -117,9 +200,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
...@@ -127,30 +212,18 @@ public: ...@@ -127,30 +212,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;
......
...@@ -1572,10 +1572,10 @@ void ClientField::UpdateDeclarableList() { ...@@ -1572,10 +1572,10 @@ void ClientField::UpdateDeclarableList() {
if(ancard.size()) if(ancard.size())
return; return;
} }
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) { if(cit->second.name.find(pname) != std::wstring::npos) {
auto cp = dataManager.GetCodePointer(cit->first); auto cp = dataManager.GetCodePointer(cit->first);
if (cp == dataManager.datas_end) if (cp == dataManager.datas_end())
continue; continue;
//datas.alias can be double card names or alias //datas.alias can be double card names or alias
if(is_declarable(cp->second, declare_opcodes)) { if(is_declarable(cp->second, declare_opcodes)) {
......
...@@ -63,6 +63,20 @@ inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) { ...@@ -63,6 +63,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;
}
#include <irrlicht.h> #include <irrlicht.h>
using namespace irr; using namespace irr;
using namespace core; using namespace core;
......
#include "data_manager.h" #include "data_manager.h"
#include "game.h" #include "game.h"
#include <stdio.h> #include <stdio.h>
#include "spmemvfs/spmemvfs.h"
namespace ygo { namespace ygo {
...@@ -9,47 +10,23 @@ byte DataManager::scriptBuffer[0x20000]; ...@@ -9,47 +10,23 @@ byte DataManager::scriptBuffer[0x20000];
IFileSystem* DataManager::FileSystem; IFileSystem* DataManager::FileSystem;
DataManager dataManager; DataManager dataManager;
DataManager::DataManager() : _datas(16384), _strings(16384) { DataManager::DataManager() : _datas(32768), _strings(32768) {
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
extra_setcode = { {8512558u, {0x8f, 0x54, 0x59, 0x82, 0x13a}}, }; extra_setcode = { {8512558u, {0x8f, 0x54, 0x59, 0x82, 0x13a}}, };
} }
bool DataManager::LoadDB(const wchar_t* wfile) { bool DataManager::ReadDB(sqlite3* pDB) {
char file[256]; sqlite3_stmt* pStmt{};
BufferIO::EncodeUTF8(wfile, file);
#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;
sqlite3_stmt* pStmt;
const char* sql = "select * from datas,texts where datas.id=texts.id"; const char* sql = "select * from datas,texts where datas.id=texts.id";
if(sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK) if (sqlite3_prepare_v2(pDB, sql, -1, &pStmt, 0) != SQLITE_OK)
return Error(&db); return Error(pDB);
wchar_t strBuffer[4096]; wchar_t strBuffer[4096];
int step = 0; int step = 0;
do { do {
CardDataC cd; CardDataC cd;
CardString cs; CardString cs;
step = sqlite3_step(pStmt); step = sqlite3_step(pStmt);
if(step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE) if (step == SQLITE_BUSY || step == SQLITE_ERROR || step == SQLITE_MISUSE)
return Error(&db, pStmt); return Error(pDB, pStmt);
else if(step == SQLITE_ROW) { else if (step == SQLITE_ROW) {
cd.code = sqlite3_column_int(pStmt, 0); cd.code = sqlite3_column_int(pStmt, 0);
cd.ot = sqlite3_column_int(pStmt, 1); cd.ot = sqlite3_column_int(pStmt, 1);
cd.alias = sqlite3_column_int(pStmt, 2); cd.alias = sqlite3_column_int(pStmt, 2);
...@@ -69,10 +46,11 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -69,10 +46,11 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
cd.type = sqlite3_column_int(pStmt, 4); cd.type = sqlite3_column_int(pStmt, 4);
cd.attack = sqlite3_column_int(pStmt, 5); cd.attack = sqlite3_column_int(pStmt, 5);
cd.defense = sqlite3_column_int(pStmt, 6); cd.defense = sqlite3_column_int(pStmt, 6);
if(cd.type & TYPE_LINK) { if (cd.type & TYPE_LINK) {
cd.link_marker = cd.defense; cd.link_marker = cd.defense;
cd.defense = 0; cd.defense = 0;
} else }
else
cd.link_marker = 0; cd.link_marker = 0;
unsigned int level = sqlite3_column_int(pStmt, 7); unsigned int level = sqlite3_column_int(pStmt, 7);
cd.level = level & 0xff; cd.level = level & 0xff;
...@@ -82,31 +60,52 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -82,31 +60,52 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
cd.attribute = sqlite3_column_int(pStmt, 9); cd.attribute = sqlite3_column_int(pStmt, 9);
cd.category = sqlite3_column_int(pStmt, 10); cd.category = sqlite3_column_int(pStmt, 10);
_datas[cd.code] = cd; _datas[cd.code] = cd;
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); BufferIO::DecodeUTF8(text, strBuffer);
cs.name = 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); BufferIO::DecodeUTF8(text, strBuffer);
cs.text = strBuffer; cs.text = strBuffer;
} }
for(int i = 0; i < 16; ++i) { for (int i = 0; i < 16; ++i) {
if(const char* text = (const char*)sqlite3_column_text(pStmt, i + 14)) { if (const char* text = (const char*)sqlite3_column_text(pStmt, i + 14)) {
BufferIO::DecodeUTF8(text, strBuffer); BufferIO::DecodeUTF8(text, strBuffer);
cs.desc[i] = strBuffer; cs.desc[i] = strBuffer;
} }
} }
_strings[cd.code] = cs; _strings[cd.code] = cs;
} }
} while(step != SQLITE_DONE); } while (step != SQLITE_DONE);
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
return true;
}
bool DataManager::LoadDB(const wchar_t* wfile) {
char file[256];
BufferIO::EncodeUTF8(wfile, file);
#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_close_db(&db);
spmemvfs_env_fini(); spmemvfs_env_fini();
datas_begin = _datas.begin(); return ret;
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
return true;
} }
bool DataManager::LoadStrings(const char* file) { bool DataManager::LoadStrings(const char* file) {
FILE* fp = fopen(file, "r"); FILE* fp = fopen(file, "r");
...@@ -167,43 +166,41 @@ void DataManager::ReadStringConfLine(const char* linebuf) { ...@@ -167,43 +166,41 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
_setnameStrings[value] = strBuffer; _setnameStrings[value] = strBuffer;
} }
} }
bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) { bool DataManager::Error(sqlite3* pDB, sqlite3_stmt* pStmt) {
wchar_t strBuffer[4096]; errmsg[0] = '\0';
BufferIO::DecodeUTF8(sqlite3_errmsg(pDB->handle), strBuffer); std::strncat(errmsg, sqlite3_errmsg(pDB), sizeof errmsg - 1);
if(pStmt) if(pStmt)
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
spmemvfs_close_db(pDB);
spmemvfs_env_fini();
return false; return false;
} }
bool DataManager::GetData(unsigned int code, CardData* pData) {
code_pointer cdit = _datas.find(code);
if(cdit == _datas.end())
return false;
auto& data = cdit->second;
if (pData) {
pData->code = data.code;
pData->alias = data.alias;
std::memcpy(pData->setcode, data.setcode, SIZE_SETCODE);
pData->type = data.type;
pData->level = data.level;
pData->attribute = data.attribute;
pData->race = data.race;
pData->attack = data.attack;
pData->defense = data.defense;
pData->lscale = data.lscale;
pData->rscale = data.rscale;
pData->link_marker = data.link_marker;
}
return true;
}
code_pointer DataManager::GetCodePointer(unsigned int code) const { code_pointer DataManager::GetCodePointer(unsigned int code) const {
return _datas.find(code); return _datas.find(code);
} }
string_pointer DataManager::GetStringPointer(unsigned int code) const { string_pointer DataManager::GetStringPointer(unsigned int code) const {
return _strings.find(code); return _strings.find(code);
} }
bool DataManager::GetString(unsigned int code, CardString* pStr) { 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();
}
bool DataManager::GetData(unsigned int code, CardData* pData) const {
auto cdit = _datas.find(code);
if(cdit == _datas.end())
return false;
if (pData) {
*pData = cdit->second;
}
return true;
}
bool DataManager::GetString(unsigned int code, CardString* pStr) const {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) { if(csit == _strings.end()) {
pStr->name = unknown_string; pStr->name = unknown_string;
...@@ -213,7 +210,7 @@ bool DataManager::GetString(unsigned int code, CardString* pStr) { ...@@ -213,7 +210,7 @@ bool DataManager::GetString(unsigned int code, CardString* pStr) {
*pStr = csit->second; *pStr = csit->second;
return true; return true;
} }
const wchar_t* DataManager::GetName(unsigned int code) { const wchar_t* DataManager::GetName(unsigned int code) const {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) if(csit == _strings.end())
return unknown_string; return unknown_string;
...@@ -221,7 +218,7 @@ const wchar_t* DataManager::GetName(unsigned int code) { ...@@ -221,7 +218,7 @@ const wchar_t* DataManager::GetName(unsigned int code) {
return csit->second.name.c_str(); return csit->second.name.c_str();
return unknown_string; return unknown_string;
} }
const wchar_t* DataManager::GetText(unsigned int code) { const wchar_t* DataManager::GetText(unsigned int code) const {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) if(csit == _strings.end())
return unknown_string; return unknown_string;
...@@ -229,7 +226,7 @@ const wchar_t* DataManager::GetText(unsigned int code) { ...@@ -229,7 +226,7 @@ const wchar_t* DataManager::GetText(unsigned int code) {
return csit->second.text.c_str(); return csit->second.text.c_str();
return unknown_string; return unknown_string;
} }
const wchar_t* DataManager::GetDesc(unsigned int strCode) { const wchar_t* DataManager::GetDesc(unsigned int strCode) const {
if (strCode < (MIN_CARD_ID << 4)) if (strCode < (MIN_CARD_ID << 4))
return GetSysString(strCode); return GetSysString(strCode);
unsigned int code = (strCode >> 4) & 0x0fffffff; unsigned int code = (strCode >> 4) & 0x0fffffff;
...@@ -241,7 +238,7 @@ const wchar_t* DataManager::GetDesc(unsigned int strCode) { ...@@ -241,7 +238,7 @@ const wchar_t* DataManager::GetDesc(unsigned int strCode) {
return csit->second.desc[offset].c_str(); return csit->second.desc[offset].c_str();
return unknown_string; return unknown_string;
} }
const wchar_t* DataManager::GetSysString(int code) { const wchar_t* DataManager::GetSysString(int code) const {
if (code < 0 || code > MAX_STRING_ID) if (code < 0 || code > MAX_STRING_ID)
return unknown_string; return unknown_string;
auto csit = _sysStrings.find(code); auto csit = _sysStrings.find(code);
...@@ -249,25 +246,25 @@ const wchar_t* DataManager::GetSysString(int code) { ...@@ -249,25 +246,25 @@ const wchar_t* DataManager::GetSysString(int code) {
return unknown_string; return unknown_string;
return csit->second.c_str(); return csit->second.c_str();
} }
const wchar_t* DataManager::GetVictoryString(int code) { const wchar_t* DataManager::GetVictoryString(int code) const {
auto csit = _victoryStrings.find(code); auto csit = _victoryStrings.find(code);
if(csit == _victoryStrings.end()) if(csit == _victoryStrings.end())
return unknown_string; return unknown_string;
return csit->second.c_str(); return csit->second.c_str();
} }
const wchar_t* DataManager::GetCounterName(int code) { const wchar_t* DataManager::GetCounterName(int code) const {
auto csit = _counterStrings.find(code); auto csit = _counterStrings.find(code);
if(csit == _counterStrings.end()) if(csit == _counterStrings.end())
return unknown_string; return unknown_string;
return csit->second.c_str(); return csit->second.c_str();
} }
const wchar_t* DataManager::GetSetName(int code) { const wchar_t* DataManager::GetSetName(int code) const {
auto csit = _setnameStrings.find(code); auto csit = _setnameStrings.find(code);
if(csit == _setnameStrings.end()) if(csit == _setnameStrings.end())
return NULL; return nullptr;
return csit->second.c_str(); return csit->second.c_str();
} }
std::vector<unsigned int> DataManager::GetSetCodes(std::wstring setname) { std::vector<unsigned int> DataManager::GetSetCodes(std::wstring setname) const {
std::vector<unsigned int> matchingCodes; std::vector<unsigned int> matchingCodes;
for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) { for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) {
auto xpos = csit->second.find_first_of(L'|');//setname|another setname or extra info auto xpos = csit->second.find_first_of(L'|');//setname|another setname or extra info
...@@ -297,8 +294,8 @@ const wchar_t* DataManager::GetNumString(int num, bool bracket) { ...@@ -297,8 +294,8 @@ const wchar_t* DataManager::GetNumString(int num, bool bracket) {
*++p = 0; *++p = 0;
return numBuffer; return numBuffer;
} }
const wchar_t* DataManager::FormatLocation(int location, int sequence) { const wchar_t* DataManager::FormatLocation(int location, int sequence) const {
if(location == 0x8) { if(location == LOCATION_SZONE) {
if(sequence < 5) if(sequence < 5)
return GetSysString(1003); return GetSysString(1003);
else if(sequence == 5) else if(sequence == 5)
...@@ -306,12 +303,16 @@ const wchar_t* DataManager::FormatLocation(int location, int sequence) { ...@@ -306,12 +303,16 @@ const wchar_t* DataManager::FormatLocation(int location, int sequence) {
else else
return GetSysString(1009); return GetSysString(1009);
} }
unsigned filter = 1;
int i = 1000; int i = 1000;
for(; filter != 0x100 && filter != location; filter <<= 1) int string_id = 0;
++i; for (unsigned filter = LOCATION_DECK; filter <= LOCATION_PZONE; filter <<= 1, ++i) {
if(filter == location) if (filter == location) {
return GetSysString(i); string_id = i;
break;
}
}
if (string_id)
return GetSysString(string_id);
else else
return unknown_string; return unknown_string;
} }
......
...@@ -2,10 +2,9 @@ ...@@ -2,10 +2,9 @@
#define DATAMANAGER_H #define DATAMANAGER_H
#include "config.h" #include "config.h"
#include "sqlite3.h"
#include "spmemvfs/spmemvfs.h"
#include "client_card.h"
#include <unordered_map> #include <unordered_map>
#include <sqlite3.h>
#include "client_card.h"
namespace ygo { namespace ygo {
constexpr int MAX_STRING_ID = 0x7ff; constexpr int MAX_STRING_ID = 0x7ff;
...@@ -14,25 +13,31 @@ namespace ygo { ...@@ -14,25 +13,31 @@ namespace ygo {
class DataManager { class DataManager {
public: public:
DataManager(); DataManager();
bool ReadDB(sqlite3* pDB);
bool LoadDB(const wchar_t* wfile); bool LoadDB(const wchar_t* wfile);
bool LoadStrings(const char* file); bool LoadStrings(const char* file);
bool LoadStrings(IReadFile* reader); bool LoadStrings(IReadFile* reader);
void ReadStringConfLine(const char* linebuf); void ReadStringConfLine(const char* linebuf);
bool Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0); bool Error(sqlite3* pDB, sqlite3_stmt* pStmt = nullptr);
bool GetData(unsigned int code, CardData* pData);
code_pointer GetCodePointer(unsigned int code) const; code_pointer GetCodePointer(unsigned int code) const;
string_pointer GetStringPointer(unsigned int code) const; string_pointer GetStringPointer(unsigned int code) const;
bool GetString(unsigned int code, CardString* pStr); code_pointer datas_begin();
const wchar_t* GetName(unsigned int code); code_pointer datas_end();
const wchar_t* GetText(unsigned int code); string_pointer strings_begin();
const wchar_t* GetDesc(unsigned int strCode); string_pointer strings_end();
const wchar_t* GetSysString(int code); bool GetData(unsigned int code, CardData* pData) const;
const wchar_t* GetVictoryString(int code); bool GetString(unsigned int code, CardString* pStr) const;
const wchar_t* GetCounterName(int code); const wchar_t* GetName(unsigned int code) const;
const wchar_t* GetSetName(int code); const wchar_t* GetText(unsigned int code) const;
std::vector<unsigned int> GetSetCodes(std::wstring setname); const wchar_t* GetDesc(unsigned int strCode) const;
const wchar_t* GetSysString(int code) const;
const wchar_t* GetVictoryString(int code) const;
const wchar_t* GetCounterName(int code) const;
const wchar_t* GetSetName(int code) const;
std::vector<unsigned int> GetSetCodes(std::wstring setname) const;
const wchar_t* GetNumString(int num, bool bracket = false); const wchar_t* GetNumString(int num, bool bracket = false);
const wchar_t* FormatLocation(int location, int sequence); const wchar_t* FormatLocation(int location, int sequence) const;
const wchar_t* FormatAttribute(int attribute); const wchar_t* FormatAttribute(int attribute);
const wchar_t* FormatRace(int race); const wchar_t* FormatRace(int race);
const wchar_t* FormatType(int type); const wchar_t* FormatType(int type);
...@@ -43,10 +48,7 @@ public: ...@@ -43,10 +48,7 @@ public:
std::unordered_map<unsigned int, std::wstring> _victoryStrings; std::unordered_map<unsigned int, std::wstring> _victoryStrings;
std::unordered_map<unsigned int, std::wstring> _setnameStrings; std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings; std::unordered_map<unsigned int, std::wstring> _sysStrings;
code_pointer datas_begin; char errmsg[512]{};
code_pointer datas_end;
string_pointer strings_begin;
string_pointer strings_end;
wchar_t numStrings[301][4]{}; wchar_t numStrings[301][4]{};
wchar_t numBuffer[6]{}; wchar_t numBuffer[6]{};
......
...@@ -1058,7 +1058,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1058,7 +1058,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
dragx = event.MouseInput.X; dragx = event.MouseInput.X;
dragy = event.MouseInput.Y; dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code); draging_pointer = dataManager.GetCodePointer(hovered_code);
if(draging_pointer == dataManager.datas_end) if(draging_pointer == dataManager.datas_end())
break; break;
if(hovered_pos == 4) { if(hovered_pos == 4) {
if(!check_limit(draging_pointer)) if(!check_limit(draging_pointer))
...@@ -1112,7 +1112,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1112,7 +1112,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(hovered_pos == 0 || hovered_seq == -1) if(hovered_pos == 0 || hovered_seq == -1)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end) if(pointer == dataManager.datas_end())
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_DROP); soundManager.PlaySoundEffect(SOUND_CARD_DROP);
if(hovered_pos == 1) { if(hovered_pos == 1) {
...@@ -1147,7 +1147,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1147,7 +1147,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
pop_side(hovered_seq); pop_side(hovered_seq);
} else { } else {
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end) if(pointer == dataManager.datas_end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1182,7 +1182,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1182,7 +1182,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if (is_draging) if (is_draging)
break; break;
auto pointer = dataManager.GetCodePointer(hovered_code); auto pointer = dataManager.GetCodePointer(hovered_code);
if (pointer == dataManager.datas_end) if (pointer == dataManager.datas_end())
break; break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
...@@ -1391,6 +1391,7 @@ void DeckBuilder::FilterCards() { ...@@ -1391,6 +1391,7 @@ void DeckBuilder::FilterCards() {
element_t(): type(type_t::all), exclude(false) {} element_t(): type(type_t::all), exclude(false) {}
}; };
const wchar_t* pstr = mainGame->ebCardName->getText(); const wchar_t* pstr = mainGame->ebCardName->getText();
int trycode = BufferIO::GetVal(pstr);
std::wstring str = std::wstring(pstr); std::wstring str = std::wstring(pstr);
std::vector<element_t> query_elements; std::vector<element_t> query_elements;
if(mainGame->gameConf.search_multiple_keywords) { if(mainGame->gameConf.search_multiple_keywords) {
...@@ -1451,10 +1452,10 @@ void DeckBuilder::FilterCards() { ...@@ -1451,10 +1452,10 @@ void DeckBuilder::FilterCards() {
query_elements.push_back(element); 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; const CardDataC& data = ptr->second;
auto strpointer = dataManager.GetStringPointer(ptr->first); auto strpointer = dataManager.GetStringPointer(ptr->first);
if (strpointer == dataManager.strings_end) if (strpointer == dataManager.strings_end())
continue; continue;
const CardString& text = strpointer->second; const CardString& text = strpointer->second;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
...@@ -1535,17 +1536,13 @@ void DeckBuilder::FilterCards() { ...@@ -1535,17 +1536,13 @@ void DeckBuilder::FilterCards() {
match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str()); match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str());
} else if (elements_iterator->type == element_t::type_t::setcode) { } else if (elements_iterator->type == element_t::type_t::setcode) {
match = data.is_setcodes(elements_iterator->setcodes); match = data.is_setcodes(elements_iterator->setcodes);
} else if (trycode && (data.code == trycode || data.alias == trycode && data.is_alternative())){
match = true;
} else { } else {
int trycode = BufferIO::GetVal(elements_iterator->keyword.c_str()); match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str())
bool tryresult = dataManager.GetData(trycode, 0); || text.text.find(elements_iterator->keyword) != std::wstring::npos
if(!tryresult) { || mainGame->CheckRegEx(text.text, elements_iterator->keyword)
match = CardNameContains(text.name.c_str(), elements_iterator->keyword.c_str()) || data.is_setcodes(elements_iterator->setcodes);
|| text.text.find(elements_iterator->keyword) != std::wstring::npos
|| mainGame->CheckRegEx(text.text, elements_iterator->keyword)
|| data.is_setcodes(elements_iterator->setcodes);
} else {
match = data.code == trycode || data.alias == trycode;
}
} }
if(elements_iterator->exclude) if(elements_iterator->exclude)
match = !match; match = !match;
......
...@@ -270,15 +270,9 @@ void DeckManager::GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory, ...@@ -270,15 +270,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) {
......
...@@ -2586,11 +2586,14 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e ...@@ -2586,11 +2586,14 @@ void ClientField::ShowCardInfoInList(ClientCard* pcard, irr::gui::IGUIElement* e
} }
} }
void ClientField::SetResponseSelectedCards() const { void ClientField::SetResponseSelectedCards() const {
unsigned char respbuf[SIZE_RETURN_VALUE]; unsigned char respbuf[SIZE_RETURN_VALUE]{};
respbuf[0] = selected_cards.size(); int len = (int)selected_cards.size();
for (size_t i = 0; i < selected_cards.size(); ++i) 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; respbuf[i + 1] = selected_cards[i]->select_seq;
DuelClient::SetResponseB(respbuf, selected_cards.size() + 1); DuelClient::SetResponseB(respbuf, len + 1);
} }
void ClientField::SetResponseSelectedOption() const { void ClientField::SetResponseSelectedOption() const {
if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) { if(mainGame->dInfo.curMsg == MSG_SELECT_OPTION) {
......
...@@ -228,7 +228,7 @@ bool Game::Initialize() { ...@@ -228,7 +228,7 @@ bool Game::Initialize() {
SetWindowsIcon(); SetWindowsIcon();
//main menu //main menu
wchar_t strbuf[256]; wchar_t strbuf[256];
myswprintf(strbuf, L"KoishiPro %X.0%X.%X Euphoria", (PRO_VERSION & 0xf000U) >> 12, (PRO_VERSION & 0x0ff0U) >> 4, PRO_VERSION & 0x000fU); myswprintf(strbuf, L"KoishiPro %X.0%X.%X Do-Dai", (PRO_VERSION & 0xf000U) >> 12, (PRO_VERSION & 0x0ff0U) >> 4, PRO_VERSION & 0x000fU);
wMainMenu = env->addWindow(rect<s32>(370, 200, 650, 415), false, strbuf); wMainMenu = env->addWindow(rect<s32>(370, 200, 650, 415), false, strbuf);
wMainMenu->getCloseButton()->setVisible(false); wMainMenu->getCloseButton()->setVisible(false);
btnLanMode = env->addButton(rect<s32>(10, 30, 270, 60), wMainMenu, BUTTON_LAN_MODE, dataManager.GetSysString(1200)); btnLanMode = env->addButton(rect<s32>(10, 30, 270, 60), wMainMenu, BUTTON_LAN_MODE, dataManager.GetSysString(1200));
...@@ -1823,7 +1823,7 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -1823,7 +1823,7 @@ void Game::ShowCardInfo(int code, bool resize) {
return; return;
wchar_t formatBuffer[256]; wchar_t formatBuffer[256];
auto cit = dataManager.GetCodePointer(code); 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)); imgCard->setImage(imageManager.GetTexture(code, true));
if (is_valid) { if (is_valid) {
auto& cd = cit->second; auto& cd = cit->second;
...@@ -1840,7 +1840,7 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -1840,7 +1840,7 @@ void Game::ShowCardInfo(int code, bool resize) {
if (is_valid && !gameConf.hide_setname) { if (is_valid && !gameConf.hide_setname) {
auto& cd = cit->second; auto& cd = cit->second;
auto target = cit; 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); target = dataManager.GetCodePointer(cd.alias);
} }
if (target->second.setcode[0]) { if (target->second.setcode[0]) {
......
...@@ -558,14 +558,9 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -558,14 +558,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;
......
...@@ -208,26 +208,25 @@ inline unsigned int GetPosition(unsigned char* qbuf, int offset) { ...@@ -208,26 +208,25 @@ inline unsigned int GetPosition(unsigned char* qbuf, int offset) {
class DuelMode { class DuelMode {
public: public:
virtual ~DuelMode() {} DuelMode() = default;
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len) {} virtual ~DuelMode() = default;
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {} virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len) = 0;
virtual void LeaveGame(DuelPlayer* dp) {} virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) = 0;
virtual void ToDuelist(DuelPlayer* dp) {} virtual void LeaveGame(DuelPlayer* dp) = 0;
virtual void ToObserver(DuelPlayer* dp) {} virtual void ToDuelist(DuelPlayer* dp) = 0;
virtual void PlayerReady(DuelPlayer* dp, bool is_ready) {} virtual void ToObserver(DuelPlayer* dp) = 0;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) {} virtual void PlayerReady(DuelPlayer* dp, bool is_ready) = 0;
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) {} virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) = 0;
virtual void StartDuel(DuelPlayer* dp) {} virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) = 0;
virtual void HandResult(DuelPlayer* dp, unsigned char res) {} virtual void StartDuel(DuelPlayer* dp) = 0;
virtual void TPResult(DuelPlayer* dp, unsigned char tp) {} virtual void HandResult(DuelPlayer* dp, unsigned char res) = 0;
virtual void Process() {} virtual void TPResult(DuelPlayer* dp, unsigned char tp) = 0;
virtual int Analyze(char* msgbuffer, unsigned int len) { virtual void Process() = 0;
return 0; virtual int Analyze(unsigned char* msgbuffer, unsigned int len) = 0;
} virtual void Surrender(DuelPlayer* dp) = 0;
virtual void Surrender(DuelPlayer* dp) {} virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) = 0;
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) {} virtual void TimeConfirm(DuelPlayer* dp) = 0;
virtual void TimeConfirm(DuelPlayer* dp) {} virtual void EndDuel() = 0;
virtual void EndDuel() {}
public: public:
event* etimer { nullptr }; event* etimer { nullptr };
......
...@@ -102,39 +102,26 @@ void Replay::SaveReplay(const wchar_t* name) { ...@@ -102,39 +102,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;
...@@ -142,13 +129,13 @@ bool Replay::OpenReplay(const wchar_t* name) { ...@@ -142,13 +129,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;
...@@ -159,8 +146,8 @@ bool Replay::OpenReplay(const wchar_t* name) { ...@@ -159,8 +146,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;
...@@ -169,24 +156,20 @@ bool Replay::OpenReplay(const wchar_t* name) { ...@@ -169,24 +156,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
...@@ -201,7 +184,7 @@ bool Replay::RenameReplay(const wchar_t* oldname, const wchar_t* newname) { ...@@ -201,7 +184,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
......
...@@ -236,7 +236,7 @@ bool ReplayMode::StartDuel() { ...@@ -236,7 +236,7 @@ bool ReplayMode::StartDuel() {
} }
cur_replay.ReadData(filename, slen); cur_replay.ReadData(filename, slen);
filename[slen] = 0; filename[slen] = 0;
if(!preload_script(pduel, filename, 0)) { if(!preload_script(pduel, filename)) {
return false; return false;
} }
} }
......
...@@ -10,24 +10,24 @@ namespace ygo { ...@@ -10,24 +10,24 @@ namespace ygo {
class SingleDuel: public DuelMode { class SingleDuel: public DuelMode {
public: public:
SingleDuel(bool is_match); SingleDuel(bool is_match);
virtual ~SingleDuel(); ~SingleDuel() override;
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len); void Chat(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater); void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) override;
virtual void LeaveGame(DuelPlayer* dp); void LeaveGame(DuelPlayer* dp) override;
virtual void ToDuelist(DuelPlayer* dp); void ToDuelist(DuelPlayer* dp) override;
virtual void ToObserver(DuelPlayer* dp); void ToObserver(DuelPlayer* dp) override;
virtual void PlayerReady(DuelPlayer* dp, bool ready); void PlayerReady(DuelPlayer* dp, bool ready) override;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos); void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len); void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void StartDuel(DuelPlayer* dp); void StartDuel(DuelPlayer* dp) override;
virtual void HandResult(DuelPlayer* dp, unsigned char res); void HandResult(DuelPlayer* dp, unsigned char res) override;
virtual void TPResult(DuelPlayer* dp, unsigned char tp); void TPResult(DuelPlayer* dp, unsigned char tp) override;
virtual void Process(); void Process() override;
virtual void Surrender(DuelPlayer* dp); void Surrender(DuelPlayer* dp) override;
virtual int Analyze(unsigned char* msgbuffer, unsigned int len); int Analyze(unsigned char* msgbuffer, unsigned int len) override;
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len); void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
virtual void TimeConfirm(DuelPlayer* dp); void TimeConfirm(DuelPlayer* dp) override;
virtual void EndDuel(); void EndDuel() override;
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
......
...@@ -63,11 +63,11 @@ int SingleMode::SinglePlayThread() { ...@@ -63,11 +63,11 @@ int SingleMode::SinglePlayThread() {
if(open_file) { if(open_file) {
open_file = false; open_file = false;
slen = BufferIO::EncodeUTF8(open_file_name, filename); slen = BufferIO::EncodeUTF8(open_file_name, filename);
if(!preload_script(pduel, filename, 0)) { if(!preload_script(pduel, filename)) {
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./single/%ls", open_file_name); myswprintf(fname, L"./single/%ls", open_file_name);
slen = BufferIO::EncodeUTF8(fname, filename); slen = BufferIO::EncodeUTF8(fname, filename);
if(!preload_script(pduel, filename, 0)) if(!preload_script(pduel, filename))
slen = 0; slen = 0;
} }
} else { } else {
...@@ -75,7 +75,7 @@ int SingleMode::SinglePlayThread() { ...@@ -75,7 +75,7 @@ int SingleMode::SinglePlayThread() {
wchar_t fname[256]; wchar_t fname[256];
myswprintf(fname, L"./single/%ls", name); myswprintf(fname, L"./single/%ls", name);
slen = BufferIO::EncodeUTF8(fname, filename); slen = BufferIO::EncodeUTF8(fname, filename);
if(!preload_script(pduel, filename, 0)) if(!preload_script(pduel, filename))
slen = 0; slen = 0;
} }
if(slen == 0) { if(slen == 0) {
......
...@@ -10,24 +10,24 @@ namespace ygo { ...@@ -10,24 +10,24 @@ namespace ygo {
class TagDuel: public DuelMode { class TagDuel: public DuelMode {
public: public:
TagDuel(); TagDuel();
virtual ~TagDuel(); ~TagDuel() override;
virtual void Chat(DuelPlayer* dp, unsigned char* pdata, int len); void Chat(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater); void JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) override;
virtual void LeaveGame(DuelPlayer* dp); void LeaveGame(DuelPlayer* dp) override;
virtual void ToDuelist(DuelPlayer* dp); void ToDuelist(DuelPlayer* dp) override;
virtual void ToObserver(DuelPlayer* dp); void ToObserver(DuelPlayer* dp) override;
virtual void PlayerReady(DuelPlayer* dp, bool ready); void PlayerReady(DuelPlayer* dp, bool ready) override;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos); void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
virtual void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len); void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
virtual void StartDuel(DuelPlayer* dp); void StartDuel(DuelPlayer* dp) override;
virtual void HandResult(DuelPlayer* dp, unsigned char res); void HandResult(DuelPlayer* dp, unsigned char res) override;
virtual void TPResult(DuelPlayer* dp, unsigned char tp); void TPResult(DuelPlayer* dp, unsigned char tp) override;
virtual void Process(); void Process() override;
virtual void Surrender(DuelPlayer* dp); void Surrender(DuelPlayer* dp) override;
virtual int Analyze(unsigned char* msgbuffer, unsigned int len); int Analyze(unsigned char* msgbuffer, unsigned int len) override;
virtual void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len); void GetResponse(DuelPlayer* dp, unsigned char* pdata, unsigned int len) override;
virtual void TimeConfirm(DuelPlayer* dp); void TimeConfirm(DuelPlayer* dp) override;
virtual void EndDuel(); void EndDuel() override;
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
......
#[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.10][2024.9 TCG][2024.7][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.10
#forbidden #forbidden
91869203 0 --アマゾネスの射手 91869203 0 --アマゾネスの射手
20663556 0 --イレカエル 20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン 44910027 0 --ヴィクトリー・ドラゴン
27552504 0 --永遠の淑女 ベアトリーチェ
51858306 0 --エクリプス・ワイバーン 51858306 0 --エクリプス・ワイバーン
62242678 0 --琰魔竜王 レッド・デーモン・カラミティ 62242678 0 --琰魔竜王 レッド・デーモン・カラミティ
34945480 0 --外神アザトート 34945480 0 --外神アザトート
...@@ -20,17 +21,14 @@ ...@@ -20,17 +21,14 @@
02563463 0 --流離のグリフォンライダー 02563463 0 --流離のグリフォンライダー
88071625 0 --The tyrant NEPTUNE 88071625 0 --The tyrant NEPTUNE
52653092 0 --SNo.0 ホープ・ゼアル 52653092 0 --SNo.0 ホープ・ゼアル
48905153 0 --十二獣ドランシア
85115440 0 --十二獣ブルホーン 85115440 0 --十二獣ブルホーン
59537380 0 --守護竜アガーペイン 59537380 0 --守護竜アガーペイン
86148577 0 --守護竜エルピィ 86148577 0 --守護竜エルピィ
88581108 0 --真竜皇V.F.D. 88581108 0 --真竜皇V.F.D.
21377582 0 --真竜剣皇マスターP
27381364 0 --スプライト・エルフ 27381364 0 --スプライト・エルフ
16923472 0 --ゼンマイハンター 16923472 0 --ゼンマイハンター
15341821 0 --ダンディライオン 15341821 0 --ダンディライオン
77679716 0 --超重武者装留ブレイク・アーマー 77679716 0 --超重武者装留ブレイク・アーマー
37818794 0 --超魔導竜騎士-ドラグーン・オブ・レッドアイズ
92731385 0 --ティアラメンツ・キトカロス 92731385 0 --ティアラメンツ・キトカロス
69015963 0 --デビル・フランケン 69015963 0 --デビル・フランケン
79875176 0 --トゥーン・キャノン・ソルジャー 79875176 0 --トゥーン・キャノン・ソルジャー
...@@ -62,7 +60,6 @@ ...@@ -62,7 +60,6 @@
35059553 0 --カイザーコロシアム 35059553 0 --カイザーコロシアム
74191942 0 --苦渋の選択 74191942 0 --苦渋の選択
42829885 0 --強引な番兵 42829885 0 --強引な番兵
45986603 0 --強奪
55144522 0 --強欲な壺 55144522 0 --強欲な壺
23557835 0 --次元融合 23557835 0 --次元融合
31423101 0 --神剣-フェニックスブレード 31423101 0 --神剣-フェニックスブレード
...@@ -90,39 +87,40 @@ ...@@ -90,39 +87,40 @@
28566710 0 --ラストバトル! 28566710 0 --ラストバトル!
#limit #limit
76794549 1 --アストログラフ・マジシャン 76794549 1 --アストログラフ・マジシャン
40177746 1 --イーバ
27552504 1 --永遠の淑女 ベアトリーチェ
29301450 1 --SPリトルナイト 29301450 1 --SPリトルナイト
07563579 1 --Emヒグルミ
17330916 1 --EMモンキーボード 17330916 1 --EMモンキーボード
68304193 1 --クシャトリラ・ユニコーン 68304193 1 --クシャトリラ・ユニコーン
12289247 1 --クロノグラフ・マジシャン 12289247 1 --クロノグラフ・マジシャン
72270339 1 --黒魔女ディアベルスター
99937011 1 --剣神官ムドラ 99937011 1 --剣神官ムドラ
38814750 1 --PSYフレームギア・γ 38814750 1 --PSYフレームギア・γ
74586817 1 --PSYフレームロード・Ω 74586817 1 --PSYフレームロード・Ω
32731036 1 --深淵の獣ルベリオン 32731036 1 --深淵の獣ルベリオン
36521307 1 --斬機サーキュラー 36521307 1 --斬機サーキュラー
48905153 1 --十二獣ドランシア
78872731 1 --十二獣モルモラット 78872731 1 --十二獣モルモラット
06602300 1 --重爆撃禽 ボム・フェネクス 06602300 1 --重爆撃禽 ボム・フェネクス
63542003 1 --宿神像ケルドウ 63542003 1 --宿神像ケルドウ
21377582 1 --真竜剣皇マスターP
09674034 1 --スネークアイ・エクセル 09674034 1 --スネークアイ・エクセル
81275020 1 --SRベイゴマックス 90241276 1 --蛇眼の炎燐
13533678 1 --スプライト・ジェット 13533678 1 --スプライト・ジェット
76145933 1 --スプライト・ブルー 76145933 1 --スプライト・ブルー
82385847 1 --ダイナレスラー・パンクラトプス
90361010 1 --超重武者装留イワトオシ 90361010 1 --超重武者装留イワトオシ
37818794 1 --超魔導竜騎士-ドラグーン・オブ・レッドアイズ
04928565 1 --ティアラメンツ・クシャトリラ 04928565 1 --ティアラメンツ・クシャトリラ
00572850 1 --ティアラメンツ・シェイレーン 00572850 1 --ティアラメンツ・シェイレーン
37961969 1 --ティアラメンツ・ハゥフニス 37961969 1 --ティアラメンツ・ハゥフニス
74078255 1 --ティアラメンツ・メイルゥ 74078255 1 --ティアラメンツ・メイルゥ
73956664 1 --ティアラメンツ・レイノハート 73956664 1 --ティアラメンツ・レイノハート
90953320 1 --TG ハイパー・ライブラリアン 90953320 1 --TG ハイパー・ライブラリアン
91810826 1 --天盃龍チュンドラ
75433814 1 --No.40 ギミック・パペット-ヘブンズ・ストリングス 75433814 1 --No.40 ギミック・パペット-ヘブンズ・ストリングス
90448279 1 --天霆號アーゼウス
17266660 1 --朱光の宣告者 17266660 1 --朱光の宣告者
06637331 1 --深淵の獣ドルイドヴルム 06637331 1 --深淵の獣ドルイドヴルム
72656408 1 --深淵の獣バルドレイク 72656408 1 --深淵の獣バルドレイク
33854624 1 --深淵の獣マグナムート 33854624 1 --深淵の獣マグナムート
80453041 1 --ファントム・オブ・ユベル
33396948 1 --封印されしエクゾディア 33396948 1 --封印されしエクゾディア
44519536 1 --封印されし者の左足 44519536 1 --封印されし者の左足
07902349 1 --封印されし者の左腕 07902349 1 --封印されし者の左腕
...@@ -130,18 +128,18 @@ ...@@ -130,18 +128,18 @@
70903634 1 --封印されし者の右腕 70903634 1 --封印されし者の右腕
94689206 1 --ブロックドラゴン 94689206 1 --ブロックドラゴン
24094258 1 --ヘビーメタルフォーゼ・エレクトラム 24094258 1 --ヘビーメタルフォーゼ・エレクトラム
31178212 1 --マジェスペクター・ユニコーン 60764609 1 --魔を刻むデモンスミス
04423206 1 --M.X-セイバー インヴォーカー
33508719 1 --メタモルポット 33508719 1 --メタモルポット
92746535 1 --竜剣士ラスターP
77103950 1 --壱世壊=ペルレイノ 77103950 1 --壱世壊=ペルレイノ
33782437 1 --一時休戦 33782437 1 --一時休戦
01845204 1 --簡易融合 01845204 1 --簡易融合
61292243 1 --EMERGENCY 61292243 1 --EMERGENCY
19613556 1 --大嵐 19613556 1 --大嵐
81439173 1 --おろかな埋葬 81439173 1 --おろかな埋葬
85106525 1 --篝火
84211599 1 --金満で謙虚な壺 84211599 1 --金満で謙虚な壺
23701465 1 --原初の種 23701465 1 --原初の種
45986603 1 --強奪
80845034 1 --“罪宝狩りの悪魔” 80845034 1 --“罪宝狩りの悪魔”
30336082 1 --盃満ちる燦幻荘 30336082 1 --盃満ちる燦幻荘
83764718 1 --死者蘇生 83764718 1 --死者蘇生
...@@ -150,17 +148,15 @@ ...@@ -150,17 +148,15 @@
52340444 1 --閃刀機-ホーネットビット 52340444 1 --閃刀機-ホーネットビット
32807846 1 --増援 32807846 1 --増援
72892473 1 --手札抹殺 72892473 1 --手札抹殺
98567237 1 --刻まれし魔の詠聖
73628505 1 --テラ・フォーミング 73628505 1 --テラ・フォーミング
18144506 1 --ハーピィの羽根帚 18144506 1 --ハーピィの羽根帚
21347668 1 --ピュアリィ・スリーピィメモリー 21347668 1 --ピュアリィ・スリーピィメモリー
75500286 1 --封印の黄金櫃
52947044 1 --フュージョン・デステニー
07394770 1 --ブリリアント・フュージョン 07394770 1 --ブリリアント・フュージョン
73468603 1 --盆回し 73468603 1 --盆回し
93600443 1 --マスク・チェンジ・セカンド 93600443 1 --マスク・チェンジ・セカンド
65681983 1 --抹殺の指名者 65681983 1 --抹殺の指名者
71832012 1 --六世壊=パライゾス 71832012 1 --六世壊=パライゾス
36637374 1 --烙印開幕
44362883 1 --烙印融合 44362883 1 --烙印融合
92107604 1 --神碑の泉 92107604 1 --神碑の泉
27970830 1 --六武の門 27970830 1 --六武の門
...@@ -172,30 +168,32 @@ ...@@ -172,30 +168,32 @@
21076084 1 --トリックスター・リンカーネイション 21076084 1 --トリックスター・リンカーネイション
23002292 1 --レッド・リブート 23002292 1 --レッド・リブート
#semi limit #semi limit
40177746 2 --イーバ
02526224 2 --炎王神獣 キリン 02526224 2 --炎王神獣 キリン
53804307 2 --焔征竜-ブラスター 81275020 2 --SRベイゴマックス
90411554 2 --巌征竜-レドックス 23434538 2 --増殖するG
78080961 2 --SPYRAL-ジーニア 82385847 2 --ダイナレスラー・パンクラトプ
91800273 2 --ディメンション・アトラクター 91800273 2 --ディメンション・アトラクター
09411399 2 --D-HERO ディアボリックガイ 09411399 2 --D-HERO ディアボリックガイ
26400609 2 --瀑征竜-タイダル 04423206 2 --M.X-セイバー インヴォーカー
89399912 2 --嵐征竜-テンペスト 92746535 2 --竜剣士ラスターP
65734501 2 --RACEエアホイスター 65734501 2 --RACEエアホイスター
35726888 2 --おろかな副葬 35726888 2 --おろかな副葬
85106525 2 --篝火
67723438 2 --緊急テレポート 67723438 2 --緊急テレポート
49238328 2 --強欲で金満な壺 49238328 2 --強欲で金満な壺
35261759 2 --強欲で貪欲な壺 35261759 2 --強欲で貪欲な壺
12580477 2 --サンダー・ボルト
48130397 2 --超融合 48130397 2 --超融合
11110587 2 --隣の芝刈り 11110587 2 --隣の芝刈り
93729896 2 --ナイトメア・スローン
24224830 2 --墓穴の指名者 24224830 2 --墓穴の指名者
55584558 2 --ピュアリィ・デリシャスメモリー 55584558 2 --ピュアリィ・デリシャスメモリー
56700100 2 --ピュアリィ・マイフレンド 75500286 2 --封印の黄金櫃
14532163 2 --ライトニング・ストーム 52947044 2 --フュージョン・デステニー
36637374 2 --烙印開幕
53334471 2 --御前試合
92714517 2 --ビッグウェルカム・ラビュリンス 92714517 2 --ビッグウェルカム・ラビュリンス
!2024.4 TCG !2024.9 TCG
#forbidden #forbidden
62320425 0 --Agido the Ancient Sentinel 62320425 0 --Agido the Ancient Sentinel
20292186 0 --Artifact Scythe 20292186 0 --Artifact Scythe
...@@ -206,7 +204,6 @@ ...@@ -206,7 +204,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
...@@ -219,15 +216,16 @@ ...@@ -219,15 +216,16 @@
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
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
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
...@@ -250,7 +248,9 @@ ...@@ -250,7 +248,9 @@
84815190 0 --Baronne de Fleur 84815190 0 --Baronne de Fleur
27548199 0 --Borreload Savage Dragon 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
...@@ -286,7 +286,6 @@ ...@@ -286,7 +286,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
...@@ -310,46 +309,40 @@ ...@@ -310,46 +309,40 @@
06728559 1 --Archnemeses Protos 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
31178212 1 --Majespecter Unicorn - Kirin
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
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
26400609 1 --Tidal, Dragon Ruler of Waterfalls
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
39512984 1 --Gem-Knight Master Diamond 39512984 1 --Gem-Knight Master Diamond
15291624 1 --Thunder Dragon Colossus
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
...@@ -372,29 +365,235 @@ ...@@ -372,29 +365,235 @@
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
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 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
28985331 2 --Armageddon Knight 53804307 2 --Blaster, Dragon Ruler of Infernos
82385847 2 --Dinowrestler Pankratops 82385847 2 --Dinowrestler Pankratops
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 55584558 2 --Purrely Delicious Memory
21347668 2 --Purrely Sleepy Memory 21347668 2 --Purrely Sleepy Memory
92107604 2 --Runick Fountain 92107604 2 --Runick Fountain
!2024.7
#forbidden
91869203 0 --アマゾネスの射手
20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン
51858306 0 --エクリプス・ワイバーン
62242678 0 --琰魔竜王 レッド・デーモン・カラミティ
34945480 0 --外神アザトート
95727991 0 --カタパルト・タートル
08903700 0 --儀式魔人リリーサー
11384280 0 --キャノン・ソルジャー
17412721 0 --旧神ノーデン
32909498 0 --クシャトリラ・フェンリル
50588353 0 --水晶機巧-ハリファイバー
62320425 0 --古衛兵アギド
25926710 0 --古尖兵ケルベク
03040496 0 --混沌魔龍 カオス・ルーラー
34124316 0 --サイバーポッド
02563463 0 --流離のグリフォンライダー
88071625 0 --The tyrant NEPTUNE
52653092 0 --SNo.0 ホープ・ゼアル
48905153 0 --十二獣ドランシア
85115440 0 --十二獣ブルホーン
59537380 0 --守護竜アガーペイン
86148577 0 --守護竜エルピィ
88581108 0 --真竜皇V.F.D.
21377582 0 --真竜剣皇マスターP
27381364 0 --スプライト・エルフ
16923472 0 --ゼンマイハンター
15341821 0 --ダンディライオン
77679716 0 --超重武者装留ブレイク・アーマー
37818794 0 --超魔導竜騎士-ドラグーン・オブ・レッドアイズ
92731385 0 --ティアラメンツ・キトカロス
69015963 0 --デビル・フランケン
79875176 0 --トゥーン・キャノン・ソルジャー
75732622 0 --トーチ・ゴーレム
22593417 0 --トポロジック・ガンブラー・ドラゴン
39064822 0 --トロイメア・ゴブリン
03679218 0 --トロイメア・マーメイド
54719828 0 --No.16 色の支配者ショック・ルーラー
63504681 0 --No.86 HC ロンゴミアント
58820923 0 --No.95 ギャラクシーアイズ・ダークマター・ドラゴン
78706415 0 --ファイバーポッド
93369354 0 --フィッシュボーグ-ガンナー
23558733 0 --フェニキシアン・クラスター・アマリリス
09929398 0 --BF-朧影のゴウフウ
70369116 0 --捕食植物ヴェルテ・アナコンダ
63101919 0 --マジックテンペスター
34206604 0 --魔導サイエンティスト
14702066 0 --メガキャノン・ソルジャー
96782886 0 --メンタルマスター
90809975 0 --餅カエル
83152482 0 --ユニオン・キャリアー
34086406 0 --ラヴァルバル・チェイン
85243784 0 --リンクロス
73356503 0 --烈風の結界像
57421866 0 --レベル・スティーラー
41482598 0 --悪夢の蜃気楼
44763025 0 --いたずら好きな双子悪魔
17375316 0 --押収
35059553 0 --カイザーコロシアム
74191942 0 --苦渋の選択
42829885 0 --強引な番兵
45986603 0 --強奪
55144522 0 --強欲な壺
23557835 0 --次元融合
31423101 0 --神剣-フェニックスブレード
57953380 0 --生還の宝札
54447022 0 --ソウル・チャージ
60682203 0 --大寒波
69243953 0 --蝶の短剣-エルマ
79571449 0 --天使の施し
63789924 0 --盗人の煙玉
70828912 0 --早すぎた埋葬
42703248 0 --ハリケーン
76375976 0 --魔鍾洞
34906152 0 --マスドライバー
46411259 0 --突然変異
85602018 0 --遺言状
27174286 0 --異次元からの帰還
05851097 0 --虚無空間
93016201 0 --王宮の弾圧
61740673 0 --王宮の勅命
03280747 0 --第六感
64697231 0 --ダスト・シュート
80604091 0 --血の代償
32723153 0 --マジカル・エクスプロージョン
17178486 0 --ライフチェンジャー
28566710 0 --ラストバトル!
#limit
76794549 1 --アストログラフ・マジシャン
40177746 1 --イーバ
27552504 1 --永遠の淑女 ベアトリーチェ
29301450 1 --SPリトルナイト
07563579 1 --Emヒグルミ
17330916 1 --EMモンキーボード
68304193 1 --クシャトリラ・ユニコーン
12289247 1 --クロノグラフ・マジシャン
99937011 1 --剣神官ムドラ
38814750 1 --PSYフレームギア・γ
74586817 1 --PSYフレームロード・Ω
32731036 1 --深淵の獣ルベリオン
36521307 1 --斬機サーキュラー
78872731 1 --十二獣モルモラット
06602300 1 --重爆撃禽 ボム・フェネクス
63542003 1 --宿神像ケルドウ
09674034 1 --スネークアイ・エクセル
81275020 1 --SRベイゴマックス
13533678 1 --スプライト・ジェット
76145933 1 --スプライト・ブルー
82385847 1 --ダイナレスラー・パンクラトプス
90361010 1 --超重武者装留イワトオシ
04928565 1 --ティアラメンツ・クシャトリラ
00572850 1 --ティアラメンツ・シェイレーン
37961969 1 --ティアラメンツ・ハゥフニス
74078255 1 --ティアラメンツ・メイルゥ
73956664 1 --ティアラメンツ・レイノハート
90953320 1 --TG ハイパー・ライブラリアン
75433814 1 --No.40 ギミック・パペット-ヘブンズ・ストリングス
90448279 1 --天霆號アーゼウス
17266660 1 --朱光の宣告者
06637331 1 --深淵の獣ドルイドヴルム
72656408 1 --深淵の獣バルドレイク
33854624 1 --深淵の獣マグナムート
33396948 1 --封印されしエクゾディア
44519536 1 --封印されし者の左足
07902349 1 --封印されし者の左腕
08124921 1 --封印されし者の右足
70903634 1 --封印されし者の右腕
94689206 1 --ブロックドラゴン
24094258 1 --ヘビーメタルフォーゼ・エレクトラム
31178212 1 --マジェスペクター・ユニコーン
04423206 1 --M.X-セイバー インヴォーカー
33508719 1 --メタモルポット
92746535 1 --竜剣士ラスターP
77103950 1 --壱世壊=ペルレイノ
33782437 1 --一時休戦
01845204 1 --簡易融合
61292243 1 --EMERGENCY
19613556 1 --大嵐
81439173 1 --おろかな埋葬
84211599 1 --金満で謙虚な壺
23701465 1 --原初の種
80845034 1 --“罪宝狩りの悪魔”
30336082 1 --盃満ちる燦幻荘
83764718 1 --死者蘇生
46060017 1 --十二獣の会局
15443125 1 --スプライト・スターター
52340444 1 --閃刀機-ホーネットビット
32807846 1 --増援
72892473 1 --手札抹殺
73628505 1 --テラ・フォーミング
18144506 1 --ハーピィの羽根帚
21347668 1 --ピュアリィ・スリーピィメモリー
75500286 1 --封印の黄金櫃
52947044 1 --フュージョン・デステニー
07394770 1 --ブリリアント・フュージョン
73468603 1 --盆回し
93600443 1 --マスク・チェンジ・セカンド
65681983 1 --抹殺の指名者
71832012 1 --六世壊=パライゾス
36637374 1 --烙印開幕
44362883 1 --烙印融合
92107604 1 --神碑の泉
27970830 1 --六武の門
02295440 1 --ワン・フォー・ワン
90846359 1 --群雄割拠
23516703 1 --サモンリミッター
82732705 1 --スキルドレイン
24207889 1 --センサー万別
21076084 1 --トリックスター・リンカーネイション
23002292 1 --レッド・リブート
#semi limit
02526224 2 --炎王神獣 キリン
53804307 2 --焔征竜-ブラスター
90411554 2 --巌征竜-レドックス
78080961 2 --SPYRAL-ジーニアス
91800273 2 --ディメンション・アトラクター
09411399 2 --D-HERO ディアボリックガイ
26400609 2 --瀑征竜-タイダル
89399912 2 --嵐征竜-テンペスト
65734501 2 --RACEエアホイスター
35726888 2 --おろかな副葬
85106525 2 --篝火
67723438 2 --緊急テレポート
49238328 2 --強欲で金満な壺
35261759 2 --強欲で貪欲な壺
12580477 2 --サンダー・ボルト
48130397 2 --超融合
11110587 2 --隣の芝刈り
24224830 2 --墓穴の指名者
55584558 2 --ピュアリィ・デリシャスメモリー
56700100 2 --ピュアリィ・マイフレンド
14532163 2 --ライトニング・ストーム
92714517 2 --ビッグウェルカム・ラビュリンス
!2024.4 !2024.4
#forbidden #forbidden
91869203 0 --アマゾネスの射手 91869203 0 --アマゾネスの射手
...@@ -7558,6 +7757,206 @@ ...@@ -7558,6 +7757,206 @@
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 !2024.1 TCG
#forbidden #forbidden
62320425 0 --Agido the Ancient Sentinel 62320425 0 --Agido the Ancient Sentinel
......
Subproject commit 0cf488769f8da7385bf1abd1ed12aa0cf8c59266 Subproject commit 204eb0d8bdedd2ca0c0e473798a63735c8c8528d
...@@ -16,8 +16,8 @@ VALUE "InternalName", "KoishiPro" ...@@ -16,8 +16,8 @@ VALUE "InternalName", "KoishiPro"
VALUE "LegalCopyright", "Copyright (C) 2023 Nanahira" VALUE "LegalCopyright", "Copyright (C) 2023 Nanahira"
VALUE "OriginalFilename", "ygopro.exe" VALUE "OriginalFilename", "ygopro.exe"
VALUE "ProductName", "KoishiPro" VALUE "ProductName", "KoishiPro"
VALUE "FileVersion", "Euphoria" VALUE "FileVersion", "Do-Dai"
VALUE "ProductVersion", "Euphoria" VALUE "ProductVersion", "Do-Dai"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"
......
...@@ -10,6 +10,9 @@ project "lua" ...@@ -10,6 +10,9 @@ project "lua"
filter "not action:vs*" filter "not action:vs*"
buildoptions { "-x c++" } buildoptions { "-x c++" }
filter "configurations:Debug"
defines { "LUA_USE_APICHECK" }
filter "system:bsd" filter "system:bsd"
defines { "LUA_USE_POSIX" } defines { "LUA_USE_POSIX" }
......
Subproject commit d30738e0ac99e66639e9b0afc8c09bf266fbf8b5 Subproject commit 02cf811961c11c61f448e105c732a5369025f076
...@@ -1246,3 +1246,6 @@ ...@@ -1246,3 +1246,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