Commit 6143a504 authored by nanahira's avatar nanahira

Merge branch 'master' of github.com:Fluorohydride/ygopro into develop

parents d1065dc3 2a9f0903
...@@ -7,9 +7,13 @@ namespace ygo { ...@@ -7,9 +7,13 @@ namespace ygo {
ClientCard::~ClientCard() { ClientCard::~ClientCard() {
ClearTarget(); ClearTarget();
if (equipTarget) if (equipTarget) {
equipTarget->is_showequip = false;
equipTarget->equipped.erase(this); equipTarget->equipped.erase(this);
for (auto card : equipped) { equipTarget = nullptr;
}
for (auto& card : equipped) {
card->is_showequip = false;
card->equipTarget = nullptr; card->equipTarget = nullptr;
} }
equipped.clear(); equipped.clear();
...@@ -21,8 +25,9 @@ ClientCard::~ClientCard() { ...@@ -21,8 +25,9 @@ ClientCard::~ClientCard() {
else else
++it; ++it;
} }
overlayTarget = nullptr;
} }
for (auto card : overlayed) { for (auto& card : overlayed) {
card->overlayTarget = nullptr; card->overlayTarget = nullptr;
} }
overlayed.clear(); overlayed.clear();
...@@ -206,10 +211,6 @@ void ClientCard::ClearData() { ...@@ -206,10 +211,6 @@ void ClientCard::ClearData() {
rscstring[0] = 0; rscstring[0] = 0;
lscstring[0] = 0; lscstring[0] = 0;
counters.clear(); counters.clear();
for (auto card : equipped) {
card->equipTarget = nullptr;
}
equipped.clear();
} }
bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) { bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) {
if(c1->is_selected != c2->is_selected) if(c1->is_selected != c2->is_selected)
...@@ -220,23 +221,26 @@ bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) { ...@@ -220,23 +221,26 @@ bool ClientCard::client_card_sort(ClientCard* c1, ClientCard* c2) {
return cp1 < cp2; return cp1 < cp2;
if(c1->location != c2->location) if(c1->location != c2->location)
return c1->location < c2->location; return c1->location < c2->location;
if(c1->location & LOCATION_OVERLAY) if (c1->location & LOCATION_OVERLAY) {
if(c1->overlayTarget != c2->overlayTarget) if (c1->overlayTarget != c2->overlayTarget)
return c1->overlayTarget->sequence < c2->overlayTarget->sequence; return c1->overlayTarget->sequence < c2->overlayTarget->sequence;
else return c1->sequence < c2->sequence; else
return c1->sequence < c2->sequence;
}
else { else {
if(c1->location & (LOCATION_DECK | LOCATION_GRAVE | LOCATION_REMOVED | LOCATION_EXTRA)) { if(c1->location & (LOCATION_DECK | LOCATION_GRAVE | LOCATION_REMOVED | LOCATION_EXTRA)) {
auto it1 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c1](const auto& ch) { auto it1 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c1](const ChainInfo& ch) {
return c1 == ch.chain_card || ch.target.find(c1) != ch.target.end(); return c1 == ch.chain_card || ch.target.find(c1) != ch.target.end();
}); });
auto it2 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c2](const auto& ch) { auto it2 = std::find_if(mainGame->dField.chains.rbegin(), mainGame->dField.chains.rend(), [c2](const ChainInfo& ch) {
return c2 == ch.chain_card || ch.target.find(c2) != ch.target.end(); return c2 == ch.chain_card || ch.target.find(c2) != ch.target.end();
}); });
if(it1 != mainGame->dField.chains.rend() || it2 != mainGame->dField.chains.rend()) { if(it1 != mainGame->dField.chains.rend() || it2 != mainGame->dField.chains.rend()) {
return it1 < it2; return it1 < it2;
} }
return c1->sequence > c2->sequence; return c1->sequence > c2->sequence;
} else }
else
return c1->sequence < c2->sequence; return c1->sequence < c2->sequence;
} }
} }
......
...@@ -33,6 +33,7 @@ struct CardString { ...@@ -33,6 +33,7 @@ struct CardString {
std::wstring desc[16]; std::wstring desc[16];
}; };
typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer; typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer;
typedef std::unordered_map<unsigned int, CardString>::const_iterator string_pointer;
class ClientCard { class ClientCard {
public: public:
......
...@@ -19,39 +19,39 @@ ClientField::ClientField() { ...@@ -19,39 +19,39 @@ ClientField::ClientField() {
} }
ClientField::~ClientField() { ClientField::~ClientField() {
for (int i = 0; i < 2; ++i) { for (int i = 0; i < 2; ++i) {
for (auto card : deck[i]) { for (auto& card : deck[i]) {
delete card; delete card;
} }
deck[i].clear(); deck[i].clear();
for (auto card : hand[i]) { for (auto& card : hand[i]) {
delete card; delete card;
} }
hand[i].clear(); hand[i].clear();
for (auto card : mzone[i]) { for (auto& card : mzone[i]) {
if (card) if (card)
delete card; delete card;
card = nullptr; card = nullptr;
} }
for (auto card : szone[i]) { for (auto& card : szone[i]) {
if (card) if (card)
delete card; delete card;
card = nullptr; card = nullptr;
} }
for (auto card : grave[i]) { for (auto& card : grave[i]) {
delete card; delete card;
} }
grave[i].clear(); grave[i].clear();
for (auto card : remove[i]) { for (auto& card : remove[i]) {
delete card; delete card;
} }
remove[i].clear(); remove[i].clear();
for (auto card : extra[i]) { for (auto& card : extra[i]) {
delete card; delete card;
} }
extra[i].clear(); extra[i].clear();
} }
for (auto card : overlay_cards) { for (auto& card : overlay_cards) {
delete card; delete card;
} }
overlay_cards.clear(); overlay_cards.clear();
...@@ -1578,9 +1578,11 @@ void ClientField::UpdateDeclarableList() { ...@@ -1578,9 +1578,11 @@ 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 || mainGame->CheckRegEx(cit->second.name, pname)) { if(cit->second.name.find(pname) != std::wstring::npos) {
auto cp = dataManager.GetCodePointer(cit->first); //verified by _strings auto cp = dataManager.GetCodePointer(cit->first);
if (cp == dataManager.datas_end)
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)) {
if(pname == cit->second.name || mainGame->CheckRegEx(cit->second.name, pname, true)) { //exact match if(pname == cit->second.name || mainGame->CheckRegEx(cit->second.name, pname, true)) { //exact match
......
...@@ -83,6 +83,10 @@ bool DataManager::LoadDB(const wchar_t* wfile) { ...@@ -83,6 +83,10 @@ bool DataManager::LoadDB(const wchar_t* wfile) {
sqlite3_finalize(pStmt); sqlite3_finalize(pStmt);
spmemvfs_close_db(&db); spmemvfs_close_db(&db);
spmemvfs_env_fini(); spmemvfs_env_fini();
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
return true; return true;
} }
bool DataManager::LoadStrings(const char* file) { bool DataManager::LoadStrings(const char* file) {
...@@ -148,10 +152,10 @@ bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) { ...@@ -148,10 +152,10 @@ bool DataManager::Error(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt) {
return false; return false;
} }
bool DataManager::GetData(unsigned int code, CardData* pData) { bool DataManager::GetData(unsigned int code, CardData* pData) {
auto cdit = _datas.find(code); code_pointer cdit = _datas.find(code);
if(cdit == _datas.end()) if(cdit == _datas.end())
return false; return false;
auto data = cdit->second; auto& data = cdit->second;
if (pData) { if (pData) {
pData->code = data.code; pData->code = data.code;
pData->alias = data.alias; pData->alias = data.alias;
...@@ -168,9 +172,12 @@ bool DataManager::GetData(unsigned int code, CardData* pData) { ...@@ -168,9 +172,12 @@ bool DataManager::GetData(unsigned int code, CardData* pData) {
} }
return true; return true;
} }
code_pointer DataManager::GetCodePointer(int code) { code_pointer DataManager::GetCodePointer(unsigned int code) const {
return _datas.find(code); return _datas.find(code);
} }
string_pointer DataManager::GetStringPointer(unsigned int code) const {
return _strings.find(code);
}
bool DataManager::GetString(int code, CardString* pStr) { bool DataManager::GetString(int code, CardString* pStr) {
auto csit = _strings.find(code); auto csit = _strings.find(code);
if(csit == _strings.end()) { if(csit == _strings.end()) {
......
...@@ -11,14 +11,20 @@ namespace ygo { ...@@ -11,14 +11,20 @@ namespace ygo {
class DataManager { class DataManager {
public: public:
DataManager(): _datas(16384), _strings(16384) {} DataManager(): _datas(16384), _strings(16384) {
datas_begin = _datas.begin();
datas_end = _datas.end();
strings_begin = _strings.begin();
strings_end = _strings.end();
}
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(spmemvfs_db_t* pDB, sqlite3_stmt* pStmt = 0);
bool GetData(unsigned int code, CardData* pData); bool GetData(unsigned int code, CardData* pData);
code_pointer GetCodePointer(int code); code_pointer GetCodePointer(unsigned int code) const;
string_pointer GetStringPointer(unsigned int code) const;
bool GetString(int code, CardString* pStr); bool GetString(int code, CardString* pStr);
const wchar_t* GetName(int code); const wchar_t* GetName(int code);
const wchar_t* GetText(int code); const wchar_t* GetText(int code);
...@@ -36,12 +42,14 @@ public: ...@@ -36,12 +42,14 @@ public:
const wchar_t* FormatSetName(unsigned long long setcode); const wchar_t* FormatSetName(unsigned long long setcode);
const wchar_t* FormatLinkMarker(int link_marker); const wchar_t* FormatLinkMarker(int link_marker);
std::unordered_map<unsigned int, CardDataC> _datas;
std::unordered_map<unsigned int, CardString> _strings;
std::unordered_map<unsigned int, std::wstring> _counterStrings; std::unordered_map<unsigned int, std::wstring> _counterStrings;
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;
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];
...@@ -58,6 +66,10 @@ public: ...@@ -58,6 +66,10 @@ public:
static byte* ScriptReaderExSingle(const char* path, const char* script_name, int* slen, int pre_len = 2); static byte* ScriptReaderExSingle(const char* path, const char* script_name, int* slen, int pre_len = 2);
static byte* ScriptReader(const char* script_name, int* slen); static byte* ScriptReader(const char* script_name, int* slen);
static IFileSystem* FileSystem; static IFileSystem* FileSystem;
private:
std::unordered_map<unsigned int, CardDataC> _datas;
std::unordered_map<unsigned int, CardString> _strings;
}; };
extern DataManager dataManager; extern DataManager dataManager;
......
...@@ -43,8 +43,8 @@ static int parse_filter(const wchar_t* pstr, unsigned int* type) { ...@@ -43,8 +43,8 @@ static int parse_filter(const wchar_t* pstr, unsigned int* type) {
static bool check_set_code(const CardDataC& data, int set_code) { static bool check_set_code(const CardDataC& data, int set_code) {
unsigned long long sc = data.setcode; unsigned long long sc = data.setcode;
if (data.alias) { if (data.alias) {
auto aptr = dataManager._datas.find(data.alias); auto aptr = dataManager.GetCodePointer(data.alias);
if (aptr != dataManager._datas.end()) if (aptr != dataManager.datas_end)
sc = aptr->second.setcode; sc = aptr->second.setcode;
} }
bool res = false; bool res = false;
...@@ -1071,7 +1071,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1071,7 +1071,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))
...@@ -1125,7 +1125,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1125,7 +1125,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) {
...@@ -1160,7 +1160,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1160,7 +1160,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;
...@@ -1195,6 +1195,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1195,6 +1195,8 @@ 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)
break;
if(!check_limit(pointer)) if(!check_limit(pointer))
break; break;
soundManager.PlaySoundEffect(SOUND_CARD_PICK); soundManager.PlaySoundEffect(SOUND_CARD_PICK);
...@@ -1462,9 +1464,11 @@ void DeckBuilder::FilterCards() { ...@@ -1462,9 +1464,11 @@ void DeckBuilder::FilterCards() {
query_elements.push_back(element); query_elements.push_back(element);
} }
} }
auto strpointer = dataManager._strings.begin(); for(code_pointer ptr = dataManager.datas_begin; ptr != dataManager.datas_end; ++ptr) {
for(code_pointer ptr = dataManager._datas.begin(); ptr != dataManager._datas.end(); ++ptr, ++strpointer) {
const CardDataC& data = ptr->second; const CardDataC& data = ptr->second;
auto strpointer = dataManager.GetStringPointer(ptr->first);
if (strpointer == dataManager.strings_end)
continue;
const CardString& text = strpointer->second; const CardString& text = strpointer->second;
if(data.type & TYPE_TOKEN) if(data.type & TYPE_TOKEN)
continue; continue;
......
...@@ -164,7 +164,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -164,7 +164,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
else if(cd.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) { else if(cd.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK)) {
if(deck.extra.size() >= YGOPRO_MAX_EXTRA) if(deck.extra.size() >= YGOPRO_MAX_EXTRA)
continue; continue;
deck.extra.push_back(dataManager.GetCodePointer(code)); //verified by GetData() deck.extra.push_back(dataManager.GetCodePointer(code));
} else if(deck.main.size() < YGOPRO_MAX_DECK) { } else if(deck.main.size() < YGOPRO_MAX_DECK) {
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(dataManager.GetCodePointer(code));
} }
...@@ -178,7 +178,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p ...@@ -178,7 +178,7 @@ int DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_p
if(cd.type & TYPE_TOKEN) if(cd.type & TYPE_TOKEN)
continue; continue;
if(deck.side.size() < YGOPRO_MAX_SIDE) if(deck.side.size() < YGOPRO_MAX_SIDE)
deck.side.push_back(dataManager.GetCodePointer(code)); //verified by GetData() deck.side.push_back(dataManager.GetCodePointer(code));
} }
return errorcode; return errorcode;
} }
......
...@@ -2282,6 +2282,7 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2282,6 +2282,7 @@ void ClientField::GetHoverField(int x, int y) {
hovered_location = LOCATION_REMOVED; hovered_location = LOCATION_REMOVED;
} }
} else if(rule == 1 && boardx >= matManager.vFieldSzone[1][7][rule][1].Pos.X && boardx <= matManager.vFieldSzone[1][7][rule][2].Pos.X) { } else if(rule == 1 && boardx >= matManager.vFieldSzone[1][7][rule][1].Pos.X && boardx <= matManager.vFieldSzone[1][7][rule][2].Pos.X) {
// deprecated szone[7]
if(boardy >= matManager.vFieldSzone[1][7][rule][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][rule][0].Pos.Y) { if(boardy >= matManager.vFieldSzone[1][7][rule][2].Pos.Y && boardy <= matManager.vFieldSzone[1][7][rule][0].Pos.Y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
...@@ -2313,7 +2314,8 @@ void ClientField::GetHoverField(int x, int y) { ...@@ -2313,7 +2314,8 @@ void ClientField::GetHoverField(int x, int y) {
hovered_controler = 1; hovered_controler = 1;
hovered_location = LOCATION_EXTRA; hovered_location = LOCATION_EXTRA;
} }
} else if(rule == 0 && boardx >= matManager.vFieldSzone[0][7][rule][0].Pos.X && boardx <= matManager.vFieldSzone[0][7][rule][1].Pos.X) { } else if(rule == 1 && boardx >= matManager.vFieldSzone[0][7][rule][0].Pos.X && boardx <= matManager.vFieldSzone[0][7][rule][1].Pos.X) {
// deprecated szone[7]
if(boardy >= matManager.vFieldSzone[0][7][rule][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][rule][2].Pos.Y) { if(boardy >= matManager.vFieldSzone[0][7][rule][0].Pos.Y && boardy <= matManager.vFieldSzone[0][7][rule][2].Pos.Y) {
hovered_controler = 0; hovered_controler = 0;
hovered_location = LOCATION_SZONE; hovered_location = LOCATION_SZONE;
......
...@@ -116,9 +116,6 @@ bool Game::Initialize() { ...@@ -116,9 +116,6 @@ bool Game::Initialize() {
is_building = false; is_building = false;
menuHandler.prev_operation = 0; menuHandler.prev_operation = 0;
menuHandler.prev_sel = -1; menuHandler.prev_sel = -1;
for (int i = 0; i < 8; ++i) {
chatTiming[i] = 0;
}
deckManager.LoadLFList(); deckManager.LoadLFList();
driver = device->getVideoDriver(); driver = device->getVideoDriver();
driver->setTextureCreationFlag(irr::video::ETCF_CREATE_MIP_MAPS, false); driver->setTextureCreationFlag(irr::video::ETCF_CREATE_MIP_MAPS, false);
...@@ -1317,7 +1314,7 @@ void Game::RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBo ...@@ -1317,7 +1314,7 @@ void Game::RefreshDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBo
} }
void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem) { void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const wchar_t*)>& additem) {
if(!mywcsncasecmp(deckpath, L"./pack", 6)) { if(!mywcsncasecmp(deckpath, L"./pack", 6)) {
for(auto pack : deckBuilder.expansionPacks) { for(auto& pack : deckBuilder.expansionPacks) {
additem(pack.substr(5, pack.size() - 9).c_str()); additem(pack.substr(5, pack.size() - 9).c_str());
} }
} }
...@@ -1790,8 +1787,8 @@ void Game::ShowCardInfo(int code, bool resize) { ...@@ -1790,8 +1787,8 @@ void Game::ShowCardInfo(int code, bool resize) {
if(!gameConf.hide_setname) { if(!gameConf.hide_setname) {
unsigned long long sc = cd.setcode; unsigned long long sc = cd.setcode;
if(cd.alias) { if(cd.alias) {
auto aptr = dataManager._datas.find(cd.alias); auto aptr = dataManager.GetCodePointer(cd.alias);
if(aptr != dataManager._datas.end()) if(aptr != dataManager.datas_end)
sc = aptr->second.setcode; sc = aptr->second.setcode;
} }
if(sc) { if(sc) {
......
...@@ -10,65 +10,85 @@ ...@@ -10,65 +10,85 @@
#include <vector> #include <vector>
#include <list> #include <list>
#ifndef YGOPRO_DEFAULT_DUEL_RULE
#define YGOPRO_DEFAULT_DUEL_RULE 5
#endif
#ifndef YGOPRO_MAX_DECK
#define YGOPRO_MAX_DECK 60
#endif
#ifndef YGOPRO_MIN_DECK
#define YGOPRO_MIN_DECK 40
#endif
#ifndef YGOPRO_MAX_EXTRA
#define YGOPRO_MAX_EXTRA 15
#endif
#ifndef YGOPRO_MAX_SIDE
#define YGOPRO_MAX_SIDE 15
#endif
namespace ygo { namespace ygo {
struct Config { struct Config {
bool use_d3d; bool use_d3d{ false };
bool use_image_scale; bool use_image_scale{ true };
unsigned short antialias; unsigned short antialias{ 0 };
unsigned short serverport; unsigned short serverport{ 7911 };
unsigned char textfontsize; unsigned char textfontsize{ 14 };
wchar_t lasthost[100]; wchar_t lasthost[100]{};
unsigned short lastport; int lastport{ 0 };
wchar_t nickname[20]; wchar_t nickname[20]{};
wchar_t gamename[20]; wchar_t gamename[20]{};
wchar_t lastcategory[64]; wchar_t lastcategory[64]{};
wchar_t lastdeck[64]; wchar_t lastdeck[64]{};
wchar_t textfont[256]; wchar_t textfont[256]{};
wchar_t numfont[256]; wchar_t numfont[256]{};
wchar_t roompass[20]; wchar_t roompass[20]{};
wchar_t bot_deck_path[64]{};
wchar_t locale[64]; wchar_t locale[64];
wchar_t bot_deck_path[64];
//settings //settings
int chkMAutoPos; int chkMAutoPos{ 0 };
int chkSTAutoPos; int chkSTAutoPos{ 1 };
int chkRandomPos; int chkRandomPos{ 0 };
int chkAutoChain; int chkAutoChain{ 0 };
int chkWaitChain; int chkWaitChain{ 0 };
int chkDefaultShowChain; int chkDefaultShowChain{ 0 };
int chkIgnore1; int chkIgnore1{ 0 };
int chkIgnore2; int chkIgnore2{ 0 };
int use_lflist; int use_lflist{ 1 };
int default_lflist; int default_lflist{ 0 };
int default_rule; int default_rule{ YGOPRO_DEFAULT_DUEL_RULE };
int hide_setname; int hide_setname{ 0 };
int hide_hint_button; int hide_hint_button{ 0 };
int control_mode; int control_mode{ 0 };
int draw_field_spell; int draw_field_spell{ 1 };
int separate_clear_button; int separate_clear_button{ 1 };
int auto_search_limit; int auto_search_limit{ -1 };
int search_multiple_keywords; int search_multiple_keywords{ 1 };
int search_regex; int chkIgnoreDeckChanges{ 0 };
int chkIgnoreDeckChanges; int defaultOT{ 1 };
int defaultOT; int enable_bot_mode{ 0 };
int enable_bot_mode; int quick_animation{ 0 };
int quick_animation; int auto_save_replay{ 0 };
bool window_maximized; int draw_single_chain{ 0 };
int window_width; int hide_player_name{ 0 };
int window_height; int prefer_expansion_script{ 0 };
bool resize_popup_menu; bool enable_sound{ true };
int auto_save_replay; bool enable_music{ true };
int draw_single_chain; double sound_volume{ 0.5 };
int hide_player_name; double music_volume{ 0.5 };
int prefer_expansion_script; int music_mode{ 1 };
int ask_mset; bool window_maximized{ false };
bool enable_sound; int window_width{ 1024 };
bool enable_music; int window_height{ 640 };
double sound_volume; bool resize_popup_menu{ false };
double music_volume; int search_regex{ 0 };
int music_mode; int chkEnablePScale{ 1 };
int chkEnablePScale; int skin_index { -1 };
int skin_index; int ask_mset{ 0 };
}; };
struct DuelInfo { struct DuelInfo {
...@@ -112,13 +132,13 @@ struct DuelInfo { ...@@ -112,13 +132,13 @@ struct DuelInfo {
}; };
struct BotInfo { struct BotInfo {
wchar_t name[256]; wchar_t name[256]{};
wchar_t command[256]; wchar_t command[256]{};
wchar_t desc[256]; wchar_t desc[256]{};
bool support_master_rule_3; bool support_master_rule_3{ false };
bool support_new_master_rule; bool support_new_master_rule{ false };
bool support_master_rule_2020; bool support_master_rule_2020{ false };
bool select_deckfile; bool select_deckfile{ false };
}; };
struct FadingUnit { struct FadingUnit {
...@@ -240,8 +260,8 @@ public: ...@@ -240,8 +260,8 @@ public:
int hideChatTimer; int hideChatTimer;
bool hideChat; bool hideChat;
int chatTiming[8]; int chatTiming[8]{};
int chatType[8]; int chatType[8]{};
unsigned short linePatternD3D; unsigned short linePatternD3D;
unsigned short linePatternGL; unsigned short linePatternGL;
int waitFrame; int waitFrame;
...@@ -887,26 +907,6 @@ extern Game* mainGame; ...@@ -887,26 +907,6 @@ extern Game* mainGame;
#define AVAIL_SC 0x8 #define AVAIL_SC 0x8
#define AVAIL_OCGTCG (AVAIL_OCG|AVAIL_TCG) #define AVAIL_OCGTCG (AVAIL_OCG|AVAIL_TCG)
#ifndef YGOPRO_DEFAULT_DUEL_RULE
#define YGOPRO_DEFAULT_DUEL_RULE 5
#endif
#ifndef YGOPRO_MAX_DECK
#define YGOPRO_MAX_DECK 60
#endif
#ifndef YGOPRO_MIN_DECK
#define YGOPRO_MIN_DECK 40
#endif
#ifndef YGOPRO_MAX_EXTRA
#define YGOPRO_MAX_EXTRA 15
#endif
#ifndef YGOPRO_MAX_SIDE
#define YGOPRO_MAX_SIDE 15
#endif
#define CARD_ARTWORK_VERSIONS_OFFSET 10 #define CARD_ARTWORK_VERSIONS_OFFSET 10
#define MAX_LAYER_COUNT 6 #define MAX_LAYER_COUNT 6
#endif // GAME_H #endif // GAME_H
...@@ -22,11 +22,11 @@ public: ...@@ -22,11 +22,11 @@ public:
S3DVertex vFieldSpell2[4]; S3DVertex vFieldSpell2[4];
//S3DVertex vBackLine[76]; //S3DVertex vBackLine[76];
S3DVertex vFieldDeck[2][4]; S3DVertex vFieldDeck[2][4];
S3DVertex vFieldGrave[2][2][4]; S3DVertex vFieldGrave[2][2][4]; //[player][rule], rule = 0: dule_rule <= 3, 1: dule_rule >= 4
S3DVertex vFieldExtra[2][4]; S3DVertex vFieldExtra[2][4];
S3DVertex vFieldRemove[2][2][4]; S3DVertex vFieldRemove[2][2][4]; //[player][rule]
S3DVertex vFieldMzone[2][7][4]; S3DVertex vFieldMzone[2][7][4]; //[player][sequence]
S3DVertex vFieldSzone[2][8][2][4]; S3DVertex vFieldSzone[2][8][2][4]; //[player][sequence][rule]
irr::core::vector3df vFieldContiAct[4]; irr::core::vector3df vFieldContiAct[4];
S3DVertex vArrow[40]; S3DVertex vArrow[40];
SColor c2d[4]; SColor c2d[4];
......
...@@ -298,11 +298,17 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -298,11 +298,17 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
for(int i = 0; i < max; ++i) { for(int i = 0; i < max; ++i) {
int main = replay.ReadInt32(); int main = replay.ReadInt32();
Deck tmp_deck; Deck tmp_deck;
for(int j = 0; j < main; ++j) for (int j = 0; j < main; ++j) {
tmp_deck.main.push_back(dataManager.GetCodePointer(replay.ReadInt32())); auto card = dataManager.GetCodePointer(replay.ReadInt32());
if (card != dataManager.datas_end)
tmp_deck.main.push_back(card);
}
int extra = replay.ReadInt32(); int extra = replay.ReadInt32();
for(int j = 0; j < extra; ++j) for (int j = 0; j < extra; ++j) {
tmp_deck.extra.push_back(dataManager.GetCodePointer(replay.ReadInt32())); auto card = dataManager.GetCodePointer(replay.ReadInt32());
if (card != dataManager.datas_end)
tmp_deck.extra.push_back(card);
}
FileSystem::SafeFileName(namebuf[i]); FileSystem::SafeFileName(namebuf[i]);
myswprintf(filename, L"deck/%ls-%d %ls.ydk", ex_filename, i + 1, namebuf[i]); myswprintf(filename, L"deck/%ls-%d %ls.ydk", ex_filename, i + 1, namebuf[i]);
deckManager.SaveDeck(tmp_deck, filename); deckManager.SaveDeck(tmp_deck, filename);
......
...@@ -12,16 +12,16 @@ ...@@ -12,16 +12,16 @@
namespace ygo { namespace ygo {
struct HostInfo { struct HostInfo {
unsigned int lflist; unsigned int lflist{ 0 };
unsigned char rule; unsigned char rule{ 0 };
unsigned char mode; unsigned char mode{ 0 };
unsigned char duel_rule; unsigned char duel_rule{ 0 };
bool no_check_deck; bool no_check_deck{ false };
bool no_shuffle_deck; bool no_shuffle_deck{ false };
unsigned int start_lp; unsigned int start_lp{ 0 };
unsigned char start_hand; unsigned char start_hand{ 0 };
unsigned char draw_count; unsigned char draw_count{ 0 };
unsigned short time_limit; unsigned short time_limit{ 0 };
}; };
struct HostPacket { struct HostPacket {
unsigned short identifier; unsigned short identifier;
...@@ -99,22 +99,16 @@ struct STOC_HS_WatchChange { ...@@ -99,22 +99,16 @@ struct STOC_HS_WatchChange {
class DuelMode; class DuelMode;
struct DuelPlayer { struct DuelPlayer {
unsigned short name[20]; unsigned short name[20]{};
DuelMode* game; DuelMode* game{ nullptr };
unsigned char type; unsigned char type{ 0 };
unsigned char state; unsigned char state{ 0 };
bufferevent* bev; bufferevent* bev{ 0 };
DuelPlayer() {
game = 0;
type = 0;
state = 0;
bev = 0;
}
}; };
class DuelMode { class DuelMode {
public: public:
DuelMode(): host_player(0), pduel(0), duel_stage(0) {} DuelMode(): host_player(nullptr), pduel(0), duel_stage(0) {}
virtual ~DuelMode() {} virtual ~DuelMode() {}
virtual void Chat(DuelPlayer* dp, void* pdata, int len) {} virtual void Chat(DuelPlayer* dp, void* pdata, int len) {}
virtual void JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {} virtual void JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {}
......
...@@ -301,7 +301,7 @@ void ReplayMode::Restart(bool refresh) { ...@@ -301,7 +301,7 @@ void ReplayMode::Restart(bool refresh) {
std::swap(mainGame->dInfo.hostname, mainGame->dInfo.clientname); std::swap(mainGame->dInfo.hostname, mainGame->dInfo.clientname);
std::swap(mainGame->dInfo.hostname_tag, mainGame->dInfo.clientname_tag); std::swap(mainGame->dInfo.hostname_tag, mainGame->dInfo.clientname_tag);
} }
skip_turn = 0; skip_turn = 0;
} }
void ReplayMode::Undo() { void ReplayMode::Undo() {
if(skip_step > 0 || current_step == 0) if(skip_step > 0 || current_step == 0)
......
#[2024.1][2024.1 TCG][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][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.1][2024.1 TCG][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][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.1 !2024.1
#forbidden #forbidden
91869203 0 --アマゾネスの射手 91869203 0 --アマゾネスの射手
...@@ -139,11 +138,11 @@ ...@@ -139,11 +138,11 @@
33508719 1 --メタモルポット 33508719 1 --メタモルポット
89399912 1 --嵐征竜-テンペスト 89399912 1 --嵐征竜-テンペスト
92746535 1 --竜剣士ラスターP 92746535 1 --竜剣士ラスターP
19613556 1 --大嵐
77103950 1 --壱世壊=ペルレイノ 77103950 1 --壱世壊=ペルレイノ
33782437 1 --一時休戦 33782437 1 --一時休戦
61292243 1 --EMERGENCY!
01845204 1 --簡易融合 01845204 1 --簡易融合
61292243 1 --EMERGENCY
19613556 1 --大嵐
81439173 1 --おろかな埋葬 81439173 1 --おろかな埋葬
84211599 1 --金満で謙虚な壺 84211599 1 --金満で謙虚な壺
23701465 1 --原初の種 23701465 1 --原初の種
...@@ -168,8 +167,8 @@ ...@@ -168,8 +167,8 @@
92107604 1 --神碑の泉 92107604 1 --神碑の泉
27970830 1 --六武の門 27970830 1 --六武の門
02295440 1 --ワン・フォー・ワン 02295440 1 --ワン・フォー・ワン
82732705 1 --スキルドレイン
90846359 1 --群雄割拠 90846359 1 --群雄割拠
82732705 1 --スキルドレイン
35316708 1 --刻の封印 35316708 1 --刻の封印
21076084 1 --トリックスター・リンカーネイション 21076084 1 --トリックスター・リンカーネイション
23002292 1 --レッド・リブート 23002292 1 --レッド・リブート
...@@ -184,16 +183,16 @@ ...@@ -184,16 +183,16 @@
35726888 2 --おろかな副葬 35726888 2 --おろかな副葬
67723438 2 --緊急テレポート 67723438 2 --緊急テレポート
35261759 2 --強欲で貪欲な壺 35261759 2 --強欲で貪欲な壺
12580477 2 --サンダー・ボルト
04031928 2 --心変わり 04031928 2 --心変わり
12580477 2 --サンダー・ボルト
48130397 2 --超融合 48130397 2 --超融合
11110587 2 --隣の芝刈り 11110587 2 --隣の芝刈り
24207889 2 --センサー万別 24224830 2 --墓穴の指名者
55584558 2 --ピュアリィ・デリシャスメモリー 55584558 2 --ピュアリィ・デリシャスメモリー
56700100 2 --ピュアリィ・マイフレンド 56700100 2 --ピュアリィ・マイフレンド
92714517 2 --ビッグウェルカム・ラビュリンス
24224830 2 --墓穴の指名者
14532163 2 --ライトニング・ストーム 14532163 2 --ライトニング・ストーム
24207889 2 --センサー万別
92714517 2 --ビッグウェルカム・ラビュリンス
!2024.1 TCG !2024.1 TCG
#forbidden #forbidden
...@@ -213,10 +212,12 @@ ...@@ -213,10 +212,12 @@
93369354 0 --Fishborg Blaster 93369354 0 --Fishborg Blaster
67441435 0 --Glow-Up Bulb 67441435 0 --Glow-Up Bulb
75732622 0 --Grinder Golem 75732622 0 --Grinder Golem
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 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
23434538 0 --Maxx "C" 23434538 0 --Maxx "C"
96782886 0 --Mind Master 96782886 0 --Mind Master
07563579 0 --Performage Plushfire 07563579 0 --Performage Plushfire
...@@ -235,11 +236,10 @@ ...@@ -235,11 +236,10 @@
59537380 0 --Guardragon Agarpain 59537380 0 --Guardragon Agarpain
86148577 0 --Guardragon Elpy 86148577 0 --Guardragon Elpy
24094258 0 --Heavymetalfoes Electrumite 24094258 0 --Heavymetalfoes Electrumite
25926710 0 --Kelbek the Ancient Vanguard 59934749 0 --Isolde, Two Tales of the Noble Knights
39064822 0 --Knightmare Goblin 39064822 0 --Knightmare Goblin
03679218 0 --Knightmare Mermaid 03679218 0 --Knightmare Mermaid
85243784 0 --Linkross 85243784 0 --Linkross
36521307 0 --Mathmech Circular
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
...@@ -251,7 +251,6 @@ ...@@ -251,7 +251,6 @@
83152482 0 --Union Carrier 83152482 0 --Union Carrier
03040496 0 --Chaos Ruler, the Chaotic Magical Dragon 03040496 0 --Chaos Ruler, the Chaotic Magical Dragon
63101919 0 --Tempest Magician 63101919 0 --Tempest Magician
59934749 0 --Isolde, Two Tales of the Noble Knights
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
...@@ -340,12 +339,12 @@ ...@@ -340,12 +339,12 @@
78872731 1 --Zoodiac Ratpier 78872731 1 --Zoodiac Ratpier
39512984 1 --Gem-Knight Master Diamond 39512984 1 --Gem-Knight Master Diamond
73539069 1 --Striker Dragon 73539069 1 --Striker Dragon
93896655 1 --Sunavalon Dryas
65563871 1 --Sunvine Healer
25862681 1 --Ancient Fairy Dragon 25862681 1 --Ancient Fairy Dragon
65536818 1 --Denglong, First of the Yang Zing 65536818 1 --Denglong, First of the Yang Zing
94677445 1 --Ib the World Chalice Justiciar 94677445 1 --Ib the World Chalice Justiciar
74586817 1 --PSY-Framelord Omega 74586817 1 --PSY-Framelord Omega
39880350 1 --Sunavalon Dryas
65563871 1 --Sunvine Healer
90953320 1 --T.G. Hyper Librarian 90953320 1 --T.G. Hyper Librarian
27552504 1 --Beatrice, Lady of the Eternal 27552504 1 --Beatrice, Lady of the Eternal
00581014 1 --Daigusto Emeral 00581014 1 --Daigusto Emeral
...@@ -361,7 +360,6 @@ ...@@ -361,7 +360,6 @@
81439173 1 --Foolish Burial 81439173 1 --Foolish Burial
27970830 1 --Gateway of the Six 27970830 1 --Gateway of the Six
75500286 1 --Gold Sarcophagus 75500286 1 --Gold Sarcophagus
53334471 1 --Gozen Match
18144506 1 --Harpie's Feather Duster 18144506 1 --Harpie's Feather Duster
66957584 1 --Infernity Launcher 66957584 1 --Infernity Launcher
01845204 1 --Instant Fusion 01845204 1 --Instant Fusion
...@@ -374,22 +372,23 @@ ...@@ -374,22 +372,23 @@
55584558 1 --Purrely Delicious Memory 55584558 1 --Purrely Delicious Memory
58577036 1 --Reasoning 58577036 1 --Reasoning
32807846 1 --Reinforcement of the Army 32807846 1 --Reinforcement of the Army
90846359 1 --Rivalry of Warlords
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
24207889 1 --There Can Be Only One 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
24207889 1 --There Can Be Only One
35316708 1 --Time Seal 35316708 1 --Time Seal
#semi limit #semi limit
09411399 2 --Destiny HERO - Malicious 09411399 2 --Destiny HERO - Malicious
82385847 2 --Dinowrestler Pankratops 82385847 2 --Dinowrestler Pankratops
14532163 2 --Lightning Storm
81275020 2 --Speedroid Terrortop 81275020 2 --Speedroid Terrortop
14532163 2 --Lightning Storm
21347668 2 --Purrely Sleepy Memory 21347668 2 --Purrely Sleepy Memory
92107604 2 --Runick Fountain 92107604 2 --Runick Fountain
63166095 2 --Sky Striker Mobilize - Engage! 63166095 2 --Sky Striker Mobilize - Engage!
......
...@@ -318,11 +318,8 @@ ...@@ -318,11 +318,8 @@
!system 1260 大师规则 !system 1260 大师规则
!system 1261 大师规则2 !system 1261 大师规则2
!system 1262 大师规则3 !system 1262 大师规则3
!system 1263 新大师规则 !system 1263 新大师规则(2017
!system 1264 大师规则2020 !system 1264 大师规则(2020
!system 1267 语言(重启后生效)
!system 1268 盖放怪兽前询问
!system 1269 数字灵摆图片
!system 1270 卡片信息 !system 1270 卡片信息
!system 1271 消息记录 !system 1271 消息记录
!system 1272 清除记录 !system 1272 清除记录
...@@ -343,7 +340,7 @@ ...@@ -343,7 +340,7 @@
!system 1287 只有连锁1也显示连锁动画 !system 1287 只有连锁1也显示连锁动画
!system 1288 禁限卡表 !system 1288 禁限卡表
!system 1289 隐藏玩家昵称 !system 1289 隐藏玩家昵称
!system 1290 忽略对方发言 !system 1290 禁用聊天功能
!system 1291 忽略观战者发言 !system 1291 忽略观战者发言
!system 1292 忽略时点 !system 1292 忽略时点
!system 1293 显示时点 !system 1293 显示时点
...@@ -407,7 +404,6 @@ ...@@ -407,7 +404,6 @@
!system 1352 主要信息: !system 1352 主要信息:
!system 1353 播放起始于回合: !system 1353 播放起始于回合:
!system 1354 开局默认显示所有时点 !system 1354 开局默认显示所有时点
!system 1355 是否确定盖放[%ls]?
!system 1356 此操作将放弃对当前卡组的修改,是否继续? !system 1356 此操作将放弃对当前卡组的修改,是否继续?
!system 1357 不提示保留对卡组的修改 !system 1357 不提示保留对卡组的修改
!system 1358 键入关键字后自动进行搜索 !system 1358 键入关键字后自动进行搜索
...@@ -433,10 +429,6 @@ ...@@ -433,10 +429,6 @@
!system 1382 人机信息: !system 1382 人机信息:
!system 1384 电脑锁定出剪刀 !system 1384 电脑锁定出剪刀
!system 1385 列表为空,可能未安装合适的人机 !system 1385 列表为空,可能未安装合适的人机
!system 1386 使用正则表达式搜索卡片
!system 1387 卡组代码
!system 1388 Ctrl+A全选,Ctrl+C复制,Ctrl+V粘贴
!system 1389 卡组代码无效。
!system 1390 等待行动中... !system 1390 等待行动中...
!system 1391 等待行动中.... !system 1391 等待行动中....
!system 1392 等待行动中..... !system 1392 等待行动中.....
......
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