Commit a6a2506e authored by fallenstardust's avatar fallenstardust

sync ocgcore

update gframe
parent 17fc7188
......@@ -472,7 +472,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
// text
wchar_t formatBuffer[2048];
if(conti_selecting)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string);
myswprintf(formatBuffer, L"%ls", dataManager.unknown_string);
else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0));
else if(selectable_cards[i]->location == LOCATION_OVERLAY)
......@@ -1567,7 +1567,8 @@ void ClientField::UpdateDeclarableList() {
int trycode = BufferIO::GetVal(pname);
CardData cd;
if (dataManager.GetData(trycode, &cd) && is_declarable(cd, declare_opcodes)) {
auto it = dataManager.GetStringPointer(trycode);
auto& _strings = dataManager.GetStringTable();
auto it = _strings.find(trycode);
mainGame->lstANCard->clear();
ancard.clear();
mainGame->lstANCard->addItem(it->second.name.c_str());
......@@ -1580,19 +1581,23 @@ void ClientField::UpdateDeclarableList() {
}
mainGame->lstANCard->clear();
ancard.clear();
for(auto cit = dataManager.strings_begin(); cit != dataManager.strings_end(); ++cit) {
if(cit->second.name.find(pname) != std::wstring::npos) {
auto cp = dataManager.GetCodePointer(cit->first);
if (cp == dataManager.datas_end())
auto& _datas = dataManager.GetDataTable();
auto& _strings = dataManager.GetStringTable();
for(auto& entry : _strings) {
auto& code = entry.first;
auto& str = entry.second;
if(str.name.find(pname) != std::wstring::npos) {
auto cp = _datas.find(code);
if (cp == _datas.end())
continue;
//datas.alias can be double card names or alias
if(is_declarable(cp->second, declare_opcodes)) {
if(pname == cit->second.name || trycode == cit->first) { //exact match or last used
mainGame->lstANCard->insertItem(0, cit->second.name.c_str(), -1);
ancard.insert(ancard.begin(), cit->first);
if(pname == str.name || trycode == code) { //exact match or last used
mainGame->lstANCard->insertItem(0, str.name.c_str(), -1);
ancard.insert(ancard.begin(), code);
} else {
mainGame->lstANCard->addItem(cit->second.name.c_str());
ancard.push_back(cit->first);
mainGame->lstANCard->addItem(str.name.c_str());
ancard.push_back(code);
}
}
}
......
......@@ -4,9 +4,7 @@
namespace ygo {
const wchar_t* DataManager::unknown_string = L"???";
unsigned char DataManager::scriptBuffer[0x100000] = {};
irr::io::IFileSystem* DataManager::FileSystem = nullptr;
DataManager dataManager;
DataManager::DataManager() : _datas(32768), _strings(32768) {
......@@ -397,7 +395,7 @@ unsigned char* DataManager::ScriptReaderEx(const char* script_path, int* slen) {
return nullptr;
}
unsigned char* DataManager::ReadScriptFromIrrFS(const char* script_name, int* slen) {
auto reader = FileSystem->createAndOpenFile(script_name);
auto reader = dataManager.FileSystem->createAndOpenFile(script_name);
if (!reader)
return nullptr;
int size = reader->read(scriptBuffer, sizeof scriptBuffer);
......
......@@ -68,17 +68,11 @@ public:
code_pointer GetCodePointer(uint32_t code) const;
string_pointer GetStringPointer(uint32_t code) const;
code_pointer datas_begin() const noexcept {
return _datas.cbegin();
const std::unordered_map<uint32_t, CardDataC>& GetDataTable() const {
return _datas;
}
code_pointer datas_end() const noexcept {
return _datas.cend();
}
string_pointer strings_begin() const noexcept {
return _strings.cbegin();
}
string_pointer strings_end() const noexcept {
return _strings.cend();
const std::unordered_map<uint32_t, CardString>& GetStringTable() const {
return _strings;
}
bool GetData(uint32_t code, CardData* pData) const;
bool GetString(uint32_t code, CardString* pStr) const;
......@@ -103,9 +97,10 @@ public:
std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings;
char errmsg[512]{};
const wchar_t* unknown_string{ L"???" };
irr::io::IFileSystem* FileSystem{};
static unsigned char scriptBuffer[0x100000];
static const wchar_t* unknown_string;
static uint32_t CardReader(uint32_t, card_data*);
static unsigned char* ScriptReaderEx(const char* script_path, int* slen);
......@@ -114,8 +109,6 @@ public:
//read by fread
static unsigned char* ReadScriptFromFile(const char* script_name, int* slen);
static irr::io::IFileSystem* FileSystem;
static bool deck_sort_lv(code_pointer l1, code_pointer l2);
static bool deck_sort_atk(code_pointer l1, code_pointer l2);
static bool deck_sort_def(code_pointer l1, code_pointer l2);
......
......@@ -177,6 +177,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
#endif
if(mainGame->dField.OnCommonEvent(event))
return false;
auto& _datas = dataManager.GetDataTable();
switch(event.EventType) {
case irr::EET_GUI_EVENT: {
irr::s32 id = event.GUIEvent.Caller->getID();
......@@ -1115,8 +1116,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break;
dragx = event.MouseInput.X;
dragy = event.MouseInput.Y;
draging_pointer = dataManager.GetCodePointer(hovered_code);
if(draging_pointer == dataManager.datas_end())
draging_pointer = _datas.find(hovered_code);
if (draging_pointer == _datas.end())
break;
if(hovered_pos == 4) {
if(!check_limit(draging_pointer))
......@@ -1164,8 +1165,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break;
if(hovered_pos == 0 || hovered_seq == -1)
break;
auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end())
auto pointer = _datas.find(hovered_code);
if (pointer == _datas.end())
break;
mainGame->soundManager->PlaySoundEffect(SoundManager::SFX::CARD_DROP);
if(hovered_pos == 1) {
......@@ -1195,8 +1196,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} else if(hovered_pos == 3) {
pop_side(hovered_seq);
} else {
auto pointer = dataManager.GetCodePointer(hovered_code);
if(pointer == dataManager.datas_end())
auto pointer = _datas.find(hovered_code);
if (pointer == _datas.end())
break;
if(!check_limit(pointer))
break;
......@@ -1230,8 +1231,8 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break;
if (is_draging)
break;
auto pointer = dataManager.GetCodePointer(hovered_code);
if (pointer == dataManager.datas_end())
auto pointer = _datas.find(hovered_code);
if (pointer == _datas.end())
break;
if(!check_limit(pointer))
break;
......@@ -1494,10 +1495,13 @@ void DeckBuilder::FilterCards() {
query_elements.push_back(element);
}
}
for(code_pointer ptr = dataManager.datas_begin(); ptr != dataManager.datas_end(); ++ptr) {
const CardDataC& data = ptr->second;
auto strpointer = dataManager.GetStringPointer(ptr->first);
if (strpointer == dataManager.strings_end())
auto& _datas = dataManager.GetDataTable();
auto& _strings = dataManager.GetStringTable();
for (code_pointer ptr = _datas.begin(); ptr != _datas.end(); ++ptr) {
auto& code = ptr->first;
auto& data = ptr->second;
auto strpointer = _strings.find(code);
if (strpointer == _strings.end())
continue;
const CardString& strings = strpointer->second;
if(data.type & TYPE_TOKEN)
......@@ -1855,16 +1859,16 @@ bool DeckBuilder::check_limit(code_pointer pointer) {
auto flit = filterList->content.find(limitcode);
if(flit != filterList->content.end())
limit = flit->second;
for(auto it = deckManager.current_deck.main.begin(); it != deckManager.current_deck.main.end(); ++it) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode)
for (auto& card : deckManager.current_deck.main) {
if (card->first == limitcode || card->second.alias == limitcode)
limit--;
}
for(auto it = deckManager.current_deck.extra.begin(); it != deckManager.current_deck.extra.end(); ++it) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode)
for (auto& card : deckManager.current_deck.extra) {
if (card->first == limitcode || card->second.alias == limitcode)
limit--;
}
for(auto it = deckManager.current_deck.side.begin(); it != deckManager.current_deck.side.end(); ++it) {
if((*it)->first == limitcode || (*it)->second.alias == limitcode)
for (auto& card : deckManager.current_deck.side) {
if (card->first == limitcode || card->second.alias == limitcode)
limit--;
}
return limit > 0;
......
......@@ -151,42 +151,46 @@ unsigned int DeckManager::CheckDeck(const Deck& deck, unsigned int lfhash, int r
uint32_t DeckManager::LoadDeck(Deck& deck, uint32_t dbuf[], int mainc, int sidec, bool is_packlist) {
deck.clear();
uint32_t errorcode = 0;
CardData cd;
auto& _datas = dataManager.GetDataTable();
for(int i = 0; i < mainc; ++i) {
auto code = dbuf[i];
if(!dataManager.GetData(code, &cd)) {
auto it = _datas.find(code);
if(it == _datas.end()) {
errorcode = code;
continue;
}
auto& cd = it->second;
if (cd.type & TYPE_TOKEN) {
errorcode = code;
continue;
}
if(is_packlist) {
deck.main.push_back(dataManager.GetCodePointer(code));
deck.main.push_back(it);
continue;
}
if (cd.type & TYPES_EXTRA_DECK) {
if (deck.extra.size() < EXTRA_MAX_SIZE)
deck.extra.push_back(dataManager.GetCodePointer(code));
deck.extra.push_back(it);
}
else {
if (deck.main.size() < DECK_MAX_SIZE)
deck.main.push_back(dataManager.GetCodePointer(code));
deck.main.push_back(it);
}
}
for(int i = 0; i < sidec; ++i) {
auto code = dbuf[mainc + i];
if(!dataManager.GetData(code, &cd)) {
auto it = _datas.find(code);
if(it == _datas.end()) {
errorcode = code;
continue;
}
auto& cd = it->second;
if (cd.type & TYPE_TOKEN) {
errorcode = code;
continue;
}
if(deck.side.size() < SIDE_MAX_SIZE)
deck.side.push_back(dataManager.GetCodePointer(code));
deck.side.push_back(it);
}
return errorcode;
}
......@@ -291,7 +295,7 @@ FILE* DeckManager::OpenDeckFile(const wchar_t* file, const char* mode) {
irr::io::IReadFile* DeckManager::OpenDeckReader(const wchar_t* file) {
char file2[256];
BufferIO::EncodeUTF8(file, file2);
auto reader = DataManager::FileSystem->createAndOpenFile(file2);
auto reader = dataManager.FileSystem->createAndOpenFile(file2);
return reader;
}
bool DeckManager::LoadCurrentDeck(std::istringstream& deckStream, bool is_packlist) {
......
......@@ -989,7 +989,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
myswprintf(formatBuffer, L"");
} else {
if(conti_selecting)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string);
myswprintf(formatBuffer, L"%ls", dataManager.unknown_string);
else if(cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0));
else if(selectable_cards[i + pos]->location == LOCATION_OVERLAY)
......
......@@ -1620,8 +1620,8 @@ void Game::LoadExpansions() {
}
closedir(dir);
#endif
for(irr::u32 i = 0; i < DataManager::FileSystem->getFileArchiveCount(); ++i) {
auto archive = DataManager::FileSystem->getFileArchive(i)->getFileList();
for(irr::u32 i = 0; i < dataManager.FileSystem->getFileArchiveCount(); ++i) {
auto archive = dataManager.FileSystem->getFileArchive(i)->getFileList();
for(irr::u32 j = 0; j < archive->getFileCount(); ++j) {
wchar_t fname[1024];
const char* uname = archive->getFullFileName(j).c_str();
......@@ -1631,7 +1631,7 @@ void Game::LoadExpansions() {
continue;
}
if (IsExtension(fname, L".conf")) {
auto reader = DataManager::FileSystem->createAndOpenFile(uname);
auto reader = dataManager.FileSystem->createAndOpenFile(uname);
dataManager.LoadStrings(reader);
continue;
}
......@@ -1894,8 +1894,9 @@ void Game::SaveConfig() {
void Game::ShowCardInfo(int code) {
wchar_t formatBuffer[256];
auto cit = dataManager.GetCodePointer(code);
bool is_valid = (cit != dataManager.datas_end());
auto& _datas = dataManager.GetDataTable();
auto cit = _datas.find(code);
bool is_valid = (cit != _datas.end());
imgCard->setImage(imageManager.GetTexture(code));
imgCard->setScaleImage(true);
if (is_valid) {
......@@ -1917,8 +1918,8 @@ void Game::ShowCardInfo(int code) {
if (is_valid && !gameConf.hide_setname) {
auto& cd = cit->second;
auto target = cit;
if (cd.alias && dataManager.GetCodePointer(cd.alias) != dataManager.datas_end()) {
target = dataManager.GetCodePointer(cd.alias);
if (cd.alias && _datas.find(cd.alias) != _datas.end()) {
target = _datas.find(cd.alias);
}
if (target->second.setcode[0]) {
offset = 23;// *yScale;
......
......@@ -1754,6 +1754,8 @@ int32_t card::add_effect(effect* peffect) {
return 0;
if (peffect->type & EFFECT_TYPES_TRIGGER_LIKE && is_continuous_event(peffect->code))
return 0;
if (peffect->type & EFFECT_TYPES_CHAIN_LINK && peffect->owner == pduel->game_field->temp_card)
return 0;
// the trigger effect in phase is "once per turn" by default
if (peffect->get_code_type() == CODE_PHASE && peffect->code & (PHASE_DRAW | PHASE_STANDBY | PHASE_END)
&& peffect->type & (EFFECT_TYPE_TRIGGER_O | EFFECT_TYPE_TRIGGER_F) && !peffect->is_flag(EFFECT_FLAG_COUNT_LIMIT)) {
......
......@@ -1164,6 +1164,8 @@ void field::add_effect(effect* peffect, uint8_t owner_player) {
return;
if (effects.indexer.find(peffect) != effects.indexer.end())
return;
if (peffect->type & EFFECT_TYPES_CHAIN_LINK && peffect->owner == temp_card)
return;
effect_container::iterator it;
if (!(peffect->type & EFFECT_TYPE_ACTIONS)) {
it = effects.aura_effect.emplace(peffect->code, peffect);
......
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