Commit e1ac1164 authored by nanahira's avatar nanahira

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

parents 41fc6203 88f2f8e1
...@@ -32,12 +32,12 @@ ClientCard::~ClientCard() { ...@@ -32,12 +32,12 @@ ClientCard::~ClientCard() {
} }
overlayed.clear(); overlayed.clear();
} }
void ClientCard::SetCode(int code) { void ClientCard::SetCode(int x) {
if((location == LOCATION_HAND) && (this->code != (unsigned int)code)) { if((location == LOCATION_HAND) && (code != (unsigned int)x)) {
this->code = code; code = x;
mainGame->dField.MoveCard(this, 5); mainGame->dField.MoveCard(this, 5);
} else } else
this->code = code; code = x;
} }
void ClientCard::UpdateInfo(unsigned char* buf) { void ClientCard::UpdateInfo(unsigned char* buf) {
int flag = BufferIO::ReadInt32(buf); int flag = BufferIO::ReadInt32(buf);
......
...@@ -98,7 +98,7 @@ public: ...@@ -98,7 +98,7 @@ public:
ClientCard() = default; ClientCard() = default;
~ClientCard(); ~ClientCard();
void SetCode(int code); void SetCode(int x);
void UpdateInfo(unsigned char* buf); void UpdateInfo(unsigned char* buf);
void ClearTarget(); void ClearTarget();
void ClearData(); void ClearData();
......
#ifndef __CONFIG_H #ifndef YGOPRO_CONFIG_H
#define __CONFIG_H #define YGOPRO_CONFIG_H
#pragma once
#define _IRR_STATIC_LIB_ #define _IRR_STATIC_LIB_
#define IRR_COMPILE_WITH_DX9_DEV_PACK #define IRR_COMPILE_WITH_DX9_DEV_PACK
...@@ -41,43 +39,29 @@ ...@@ -41,43 +39,29 @@
#define SOCKADDR sockaddr #define SOCKADDR sockaddr
#define SOCKET_ERRNO() (errno) #define SOCKET_ERRNO() (errno)
#include <wchar.h>
#define mywcsncasecmp wcsncasecmp #define mywcsncasecmp wcsncasecmp
#define mystrncasecmp strncasecmp #define mystrncasecmp strncasecmp
inline int _wtoi(const wchar_t * s) {
wchar_t * endptr;
return (int)wcstol(s, &endptr, 10);
}
#endif #endif
#include <wchar.h>
inline int _wtoi(const wchar_t * str){
return (int)wcstol(str, 0, 10);
}
template<size_t N, typename... TR> template<size_t N, typename... TR>
inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) { inline int myswprintf(wchar_t(&buf)[N], const wchar_t* fmt, TR... args) {
return swprintf(buf, N, fmt, args...); return swprintf(buf, N, fmt, args...);
} }
#include <irrlicht.h>
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#else //__APPLE__
#include <GL/gl.h>
#include <GL/glu.h>
#endif //__APPLE__
#include "CGUITTFont.h"
#include "CGUIImageButton.h"
#include <iostream>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <time.h> #include <iostream>
#include <thread>
#include <mutex>
#include <algorithm> #include <algorithm>
#include <string>
#include "bufferio.h" #include "bufferio.h"
#include "myfilesystem.h"
#include "mysignal.h"
#include "../ocgcore/ocgapi.h" #include "../ocgcore/ocgapi.h"
#include "../ocgcore/common.h" #include "../ocgcore/common.h"
#include <irrlicht.h>
using namespace irr; using namespace irr;
using namespace core; using namespace core;
using namespace scene; using namespace scene;
......
...@@ -127,7 +127,7 @@ bool DataManager::LoadStrings(IReadFile* reader) { ...@@ -127,7 +127,7 @@ bool DataManager::LoadStrings(IReadFile* reader) {
while(reader->read(&ch[0], 1)) { while(reader->read(&ch[0], 1)) {
if(ch[0] == '\0') if(ch[0] == '\0')
break; break;
strcat(linebuf, ch); std::strcat(linebuf, ch);
if(ch[0] == '\n') { if(ch[0] == '\n') {
ReadStringConfLine(linebuf); ReadStringConfLine(linebuf);
linebuf[0] = '\0'; linebuf[0] = '\0';
...@@ -144,22 +144,22 @@ void DataManager::ReadStringConfLine(const char* linebuf) { ...@@ -144,22 +144,22 @@ void DataManager::ReadStringConfLine(const char* linebuf) {
wchar_t strBuffer[4096]{}; wchar_t strBuffer[4096]{};
if (sscanf(linebuf, "!%63s", strbuf) != 1) if (sscanf(linebuf, "!%63s", strbuf) != 1)
return; return;
if(!strcmp(strbuf, "system")) { if(!std::strcmp(strbuf, "system")) {
if (sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf) != 2) if (sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf) != 2)
return; return;
BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
_sysStrings[value] = strBuffer; _sysStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "victory")) { } else if(!std::strcmp(strbuf, "victory")) {
if (sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf) != 2) if (sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf) != 2)
return; return;
BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
_victoryStrings[value] = strBuffer; _victoryStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "counter")) { } else if(!std::strcmp(strbuf, "counter")) {
if (sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf) != 2) if (sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf) != 2)
return; return;
BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
_counterStrings[value] = strBuffer; _counterStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "setname")) { } else if(!std::strcmp(strbuf, "setname")) {
//using tab for comment //using tab for comment
if (sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf) != 2) if (sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf) != 2)
return; return;
......
#include "config.h" #include "config.h"
#include "deck_con.h" #include "deck_con.h"
#include "myfilesystem.h"
#include "data_manager.h" #include "data_manager.h"
#include "deck_manager.h" #include "deck_manager.h"
#include "image_manager.h" #include "image_manager.h"
...@@ -504,7 +505,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -504,7 +505,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) { for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) {
if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) { if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(filepath); deckManager.LoadCurrentDeck(filepath);
prev_deck = i; prev_deck = i;
mainGame->cbDBDecks->setSelected(prev_deck); mainGame->cbDBDecks->setSelected(prev_deck);
mainGame->lstDecks->setSelected(prev_deck); mainGame->lstDecks->setSelected(prev_deck);
...@@ -538,7 +539,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -538,7 +539,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
ChangeCategory(catesel); ChangeCategory(catesel);
for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) { for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) {
if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), newdeckname, 256)) { if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), newdeckname, 256)) {
deckManager.LoadDeck(newfilepath); deckManager.LoadCurrentDeck(newfilepath);
prev_deck = i; prev_deck = i;
mainGame->cbDBDecks->setSelected(prev_deck); mainGame->cbDBDecks->setSelected(prev_deck);
mainGame->lstDecks->setSelected(prev_deck); mainGame->lstDecks->setSelected(prev_deck);
...@@ -565,7 +566,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -565,7 +566,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(decksel != -1) { if(decksel != -1) {
mainGame->lstDecks->setSelected(decksel); mainGame->lstDecks->setSelected(decksel);
mainGame->cbDBDecks->setSelected(decksel); mainGame->cbDBDecks->setSelected(decksel);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadCurrentDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
} }
RefreshReadonly(prev_category); RefreshReadonly(prev_category);
prev_deck = decksel; prev_deck = decksel;
...@@ -602,7 +603,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -602,7 +603,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
ChangeCategory(catesel); ChangeCategory(catesel);
for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) { for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) {
if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) { if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(newfilepath); deckManager.LoadCurrentDeck(newfilepath);
prev_deck = i; prev_deck = i;
mainGame->cbDBDecks->setSelected(prev_deck); mainGame->cbDBDecks->setSelected(prev_deck);
mainGame->lstDecks->setSelected(prev_deck); mainGame->lstDecks->setSelected(prev_deck);
...@@ -640,7 +641,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -640,7 +641,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
ChangeCategory(catesel); ChangeCategory(catesel);
for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) { for(int i = 0; i < (int)mainGame->lstDecks->getItemCount(); i++) {
if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) { if(!mywcsncasecmp(mainGame->lstDecks->getListItem(i), deckname, 256)) {
deckManager.LoadDeck(newfilepath); deckManager.LoadCurrentDeck(newfilepath);
prev_deck = i; prev_deck = i;
mainGame->cbDBDecks->setSelected(prev_deck); mainGame->cbDBDecks->setSelected(prev_deck);
mainGame->lstDecks->setSelected(prev_deck); mainGame->lstDecks->setSelected(prev_deck);
...@@ -693,7 +694,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -693,7 +694,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_SIDE_RELOAD: { case BUTTON_SIDE_RELOAD: {
deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect); deckManager.LoadCurrentDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect);
break; break;
} }
case BUTTON_BIG_CARD_ORIG_SIZE: { case BUTTON_BIG_CARD_ORIG_SIZE: {
...@@ -739,7 +740,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -739,7 +740,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
sel = count - 1; sel = count - 1;
mainGame->cbDBDecks->setSelected(sel); mainGame->cbDBDecks->setSelected(sel);
if(sel != -1) if(sel != -1)
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadCurrentDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->stACMessage->setText(dataManager.GetSysString(1338)); mainGame->stACMessage->setText(dataManager.GetSysString(1338));
mainGame->PopupElement(mainGame->wACMessage, 20); mainGame->PopupElement(mainGame->wACMessage, 20);
prev_deck = sel; prev_deck = sel;
...@@ -753,7 +754,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -753,7 +754,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
ChangeCategory(catesel); ChangeCategory(catesel);
} else if(prev_operation == COMBOBOX_DBDECKS) { } else if(prev_operation == COMBOBOX_DBDECKS) {
int decksel = mainGame->cbDBDecks->getSelected(); int decksel = mainGame->cbDBDecks->getSelected();
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadCurrentDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
prev_deck = decksel; prev_deck = decksel;
is_modified = false; is_modified = false;
} else if(prev_operation == BUTTON_MANAGE_DECK) { } else if(prev_operation == BUTTON_MANAGE_DECK) {
...@@ -870,7 +871,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -870,7 +871,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
} }
int decksel = mainGame->cbDBDecks->getSelected(); int decksel = mainGame->cbDBDecks->getSelected();
if(decksel >= 0) { if(decksel >= 0) {
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadCurrentDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
} }
prev_deck = decksel; prev_deck = decksel;
is_modified = false; is_modified = false;
...@@ -1029,7 +1030,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) { ...@@ -1029,7 +1030,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
wchar_t catepath[256]; wchar_t catepath[256];
deckManager.GetCategoryPath(catepath, mainGame->lstCategories->getSelected(), mainGame->lstCategories->getListItem(mainGame->lstCategories->getSelected())); deckManager.GetCategoryPath(catepath, mainGame->lstCategories->getSelected(), mainGame->lstCategories->getListItem(mainGame->lstCategories->getSelected()));
myswprintf(filepath, L"%ls/%ls.ydk", catepath, mainGame->lstDecks->getListItem(decksel)); myswprintf(filepath, L"%ls/%ls.ydk", catepath, mainGame->lstDecks->getListItem(decksel));
deckManager.LoadDeck(filepath, showing_pack); deckManager.LoadCurrentDeck(filepath, showing_pack);
RefreshPackListScroll(); RefreshPackListScroll();
prev_deck = decksel; prev_deck = decksel;
break; break;
...@@ -1343,12 +1344,12 @@ void DeckBuilder::GetHoveredCard() { ...@@ -1343,12 +1344,12 @@ void DeckBuilder::GetHoveredCard() {
} else if(x >= 810 && x <= 995 && y >= 165 && y <= 626) { } else if(x >= 810 && x <= 995 && y >= 165 && y <= 626) {
hovered_pos = 4; hovered_pos = 4;
hovered_seq = (y - 165) / 66; hovered_seq = (y - 165) / 66;
int pos = mainGame->scrFilter->getPos() + hovered_seq; int current_pos = mainGame->scrFilter->getPos() + hovered_seq;
if(pos >= (int)results.size()) { if(current_pos >= (int)results.size()) {
hovered_seq = -1; hovered_seq = -1;
hovered_code = 0; hovered_code = 0;
} else { } else {
hovered_code = results[pos]->first; hovered_code = results[current_pos]->first;
} }
} }
if(is_draging) { if(is_draging) {
...@@ -1677,7 +1678,7 @@ void DeckBuilder::ChangeCategory(int catesel) { ...@@ -1677,7 +1678,7 @@ void DeckBuilder::ChangeCategory(int catesel) {
mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); mainGame->RefreshDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->cbDBDecks->setSelected(0); mainGame->cbDBDecks->setSelected(0);
RefreshReadonly(catesel); RefreshReadonly(catesel);
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadCurrentDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
is_modified = false; is_modified = false;
prev_category = catesel; prev_category = catesel;
prev_deck = 0; prev_deck = 0;
......
This diff is collapsed.
...@@ -64,14 +64,14 @@ public: ...@@ -64,14 +64,14 @@ public:
const std::unordered_map<int, int>* GetLFListContent(int lfhash); const std::unordered_map<int, int>* GetLFListContent(int lfhash);
int CheckDeck(Deck& deck, int lfhash, int rule); int CheckDeck(Deck& deck, int lfhash, int rule);
int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_packlist = false); int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec, bool is_packlist = false);
int LoadDeck(Deck& deck, std::istringstream& deckStream, bool is_packlist = false);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec); bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
void GetCategoryPath(wchar_t* ret, int index, const wchar_t* text); void GetCategoryPath(wchar_t* ret, int index, const wchar_t* text);
void GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck); void GetDeckFile(wchar_t* ret, irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
bool LoadDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
FILE* OpenDeckFile(const wchar_t* file, const char* mode); FILE* OpenDeckFile(const wchar_t* file, const char* mode);
IReadFile* OpenDeckReader(const wchar_t* file); IReadFile* OpenDeckReader(const wchar_t* file);
bool LoadDeck(const wchar_t* file, bool is_packlist = false); bool LoadCurrentDeck(const wchar_t* file, bool is_packlist = false);
bool LoadDeck(std::istringstream* deckStream, bool is_packlist = false); bool LoadCurrentDeck(irr::gui::IGUIComboBox* cbCategory, irr::gui::IGUIComboBox* cbDeck);
bool SaveDeck(Deck& deck, const wchar_t* file); bool SaveDeck(Deck& deck, const wchar_t* file);
bool DeleteDeck(const wchar_t* file); bool DeleteDeck(const wchar_t* file);
wchar_t DeckFormatBuffer[128]; wchar_t DeckFormatBuffer[128];
...@@ -81,6 +81,7 @@ public: ...@@ -81,6 +81,7 @@ public:
bool CreateCategory(const wchar_t* name); bool CreateCategory(const wchar_t* name);
bool RenameCategory(const wchar_t* oldname, const wchar_t* newname); bool RenameCategory(const wchar_t* oldname, const wchar_t* newname);
bool DeleteCategory(const wchar_t* name); bool DeleteCategory(const wchar_t* name);
bool SaveDeckBuffer(const int deckbuf[], const wchar_t* name);
}; };
extern DeckManager deckManager; extern DeckManager deckManager;
......
...@@ -224,7 +224,7 @@ void Game::DrawBackGround() { ...@@ -224,7 +224,7 @@ void Game::DrawBackGround() {
} }
} }
void Game::DrawLinkedZones(ClientCard* pcard) { void Game::DrawLinkedZones(ClientCard* pcard) {
int mark = pcard->link_marker; auto mark = pcard->link_marker;
ClientCard* pcard2; ClientCard* pcard2;
if (dField.hovered_sequence < 5) { if (dField.hovered_sequence < 5) {
if (mark & LINK_MARKER_LEFT && dField.hovered_sequence > 0) { if (mark & LINK_MARKER_LEFT && dField.hovered_sequence > 0) {
...@@ -241,25 +241,25 @@ void Game::DrawLinkedZones(ClientCard* pcard) { ...@@ -241,25 +241,25 @@ void Game::DrawLinkedZones(ClientCard* pcard) {
if ((mark & LINK_MARKER_TOP_LEFT && dField.hovered_sequence == 2) if ((mark & LINK_MARKER_TOP_LEFT && dField.hovered_sequence == 2)
|| (mark & LINK_MARKER_TOP && dField.hovered_sequence == 1) || (mark & LINK_MARKER_TOP && dField.hovered_sequence == 1)
|| (mark & LINK_MARKER_TOP_RIGHT && dField.hovered_sequence == 0)) { || (mark & LINK_MARKER_TOP_RIGHT && dField.hovered_sequence == 0)) {
int mark = (dField.hovered_sequence == 2) ? LINK_MARKER_BOTTOM_RIGHT : (dField.hovered_sequence == 1) ? LINK_MARKER_BOTTOM : LINK_MARKER_BOTTOM_LEFT; int arrow = (dField.hovered_sequence == 2) ? LINK_MARKER_BOTTOM_RIGHT : (dField.hovered_sequence == 1) ? LINK_MARKER_BOTTOM : LINK_MARKER_BOTTOM_LEFT;
pcard2 = dField.mzone[dField.hovered_controler][5]; pcard2 = dField.mzone[dField.hovered_controler][5];
if (!pcard2) { if (!pcard2) {
pcard2 = dField.mzone[1 - dField.hovered_controler][6]; pcard2 = dField.mzone[1 - dField.hovered_controler][6];
mark = (dField.hovered_sequence == 2) ? LINK_MARKER_TOP_LEFT : (dField.hovered_sequence == 1) ? LINK_MARKER_TOP : LINK_MARKER_TOP_RIGHT; arrow = (dField.hovered_sequence == 2) ? LINK_MARKER_TOP_LEFT : (dField.hovered_sequence == 1) ? LINK_MARKER_TOP : LINK_MARKER_TOP_RIGHT;
} }
CheckMutual(pcard2, mark); CheckMutual(pcard2, arrow);
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][5], 4, matManager.iRectangle, 2); driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][5], 4, matManager.iRectangle, 2);
} }
if ((mark & LINK_MARKER_TOP_LEFT && dField.hovered_sequence == 4) if ((mark & LINK_MARKER_TOP_LEFT && dField.hovered_sequence == 4)
|| (mark & LINK_MARKER_TOP && dField.hovered_sequence == 3) || (mark & LINK_MARKER_TOP && dField.hovered_sequence == 3)
|| (mark & LINK_MARKER_TOP_RIGHT && dField.hovered_sequence == 2)) { || (mark & LINK_MARKER_TOP_RIGHT && dField.hovered_sequence == 2)) {
int mark = (dField.hovered_sequence == 4) ? LINK_MARKER_BOTTOM_RIGHT : (dField.hovered_sequence == 3) ? LINK_MARKER_BOTTOM : LINK_MARKER_BOTTOM_LEFT; int arrow = (dField.hovered_sequence == 4) ? LINK_MARKER_BOTTOM_RIGHT : (dField.hovered_sequence == 3) ? LINK_MARKER_BOTTOM : LINK_MARKER_BOTTOM_LEFT;
pcard2 = dField.mzone[dField.hovered_controler][6]; pcard2 = dField.mzone[dField.hovered_controler][6];
if (!pcard2) { if (!pcard2) {
pcard2 = dField.mzone[1 - dField.hovered_controler][5]; pcard2 = dField.mzone[1 - dField.hovered_controler][5];
mark = (dField.hovered_sequence == 4) ? LINK_MARKER_TOP_LEFT : (dField.hovered_sequence == 3) ? LINK_MARKER_TOP : LINK_MARKER_TOP_RIGHT; arrow = (dField.hovered_sequence == 4) ? LINK_MARKER_TOP_LEFT : (dField.hovered_sequence == 3) ? LINK_MARKER_TOP : LINK_MARKER_TOP_RIGHT;
} }
CheckMutual(pcard2, mark); CheckMutual(pcard2, arrow);
driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][6], 4, matManager.iRectangle, 2); driver->drawVertexPrimitiveList(&matManager.vFieldMzone[dField.hovered_controler][6], 4, matManager.iRectangle, 2);
} }
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#ifdef _WIN32 #ifdef _WIN32
#include <Windns.h> #include <Windns.h>
#endif #endif
#include <thread>
namespace ygo { namespace ygo {
...@@ -52,7 +53,7 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g ...@@ -52,7 +53,7 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g
client_base = event_base_new(); client_base = event_base_new();
if(!client_base) if(!client_base)
return false; return false;
memset(&sin, 0, sizeof(sin)); std::memset(&sin, 0, sizeof sin);
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(ip); sin.sin_addr.s_addr = htonl(ip);
sin.sin_port = htons(port); sin.sin_port = htons(port);
...@@ -73,8 +74,8 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g ...@@ -73,8 +74,8 @@ bool DuelClient::StartClient(unsigned int ip, unsigned short port, bool create_g
rnd.reset((uint_fast32_t)std::random_device()()); rnd.reset((uint_fast32_t)std::random_device()());
if(!create_game) { if(!create_game) {
timeval timeout = {5, 0}; timeval timeout = {5, 0};
event* resp_event = event_new(client_base, 0, EV_TIMEOUT, ConnectTimeout, 0); event* timeout_event = event_new(client_base, 0, EV_TIMEOUT, ConnectTimeout, 0);
event_add(resp_event, &timeout); event_add(timeout_event, &timeout);
} }
std::thread(ClientThread).detach(); std::thread(ClientThread).detach();
return true; return true;
...@@ -112,7 +113,7 @@ void DuelClient::StopClient(bool is_exiting) { ...@@ -112,7 +113,7 @@ void DuelClient::StopClient(bool is_exiting) {
void DuelClient::ClientRead(bufferevent* bev, void* ctx) { void DuelClient::ClientRead(bufferevent* bev, void* ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
unsigned char* duel_client_read = new unsigned char[std::min(len, SIZE_NETWORK_BUFFER)]; unsigned char* duel_client_read = new unsigned char[SIZE_NETWORK_BUFFER];
unsigned short packet_len; unsigned short packet_len;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
...@@ -157,10 +158,10 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { ...@@ -157,10 +158,10 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
BufferIO::CopyWStr(mainGame->ebServerPass->getText(), cscg.pass, 20); BufferIO::CopyWStr(mainGame->ebServerPass->getText(), cscg.pass, 20);
cscg.info.rule = mainGame->cbRule->getSelected(); cscg.info.rule = mainGame->cbRule->getSelected();
cscg.info.mode = mainGame->cbMatchMode->getSelected(); cscg.info.mode = mainGame->cbMatchMode->getSelected();
cscg.info.start_hand = _wtoi(mainGame->ebStartHand->getText()); cscg.info.start_hand = wcstol(mainGame->ebStartHand->getText(),nullptr,10);
cscg.info.start_lp = _wtoi(mainGame->ebStartLP->getText()); cscg.info.start_lp = wcstol(mainGame->ebStartLP->getText(),nullptr,10);
cscg.info.draw_count = _wtoi(mainGame->ebDrawCount->getText()); cscg.info.draw_count = wcstol(mainGame->ebDrawCount->getText(),nullptr,10);
cscg.info.time_limit = _wtoi(mainGame->ebTimeLimit->getText()); cscg.info.time_limit = wcstol(mainGame->ebTimeLimit->getText(),nullptr,10);
cscg.info.lflist = mainGame->cbHostLFlist->getItemData(mainGame->cbHostLFlist->getSelected()); cscg.info.lflist = mainGame->cbHostLFlist->getItemData(mainGame->cbHostLFlist->getSelected());
cscg.info.duel_rule = mainGame->cbDuelRule->getSelected() + 1; cscg.info.duel_rule = mainGame->cbDuelRule->getSelected() + 1;
cscg.info.no_check_deck = mainGame->chkNoCheckDeck->isChecked(); cscg.info.no_check_deck = mainGame->chkNoCheckDeck->isChecked();
...@@ -1573,8 +1574,8 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -1573,8 +1574,8 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
else if (pcard->location == LOCATION_EXTRA) else if (pcard->location == LOCATION_EXTRA)
mainGame->dField.extra_act = true; mainGame->dField.extra_act = true;
else { else {
int seq = mainGame->dInfo.duel_rule >= 4 ? 0 : 6; int left_seq = mainGame->dInfo.duel_rule >= 4 ? 0 : 6;
if (pcard->location == LOCATION_SZONE && pcard->sequence == seq && (pcard->type & TYPE_PENDULUM) && !pcard->equipTarget) if (pcard->location == LOCATION_SZONE && pcard->sequence == left_seq && (pcard->type & TYPE_PENDULUM) && !pcard->equipTarget)
mainGame->dField.pzone_act[pcard->controler] = true; mainGame->dField.pzone_act[pcard->controler] = true;
} }
} }
...@@ -3401,8 +3402,8 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -3401,8 +3402,8 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
pcard = mainGame->dField.GetCard(player, LOCATION_DECK, mainGame->dField.deck[player].size() - 1); pcard = mainGame->dField.GetCard(player, LOCATION_DECK, mainGame->dField.deck[player].size() - 1);
mainGame->dField.deck[player].erase(mainGame->dField.deck[player].end() - 1); mainGame->dField.deck[player].erase(mainGame->dField.deck[player].end() - 1);
mainGame->dField.AddCard(pcard, player, LOCATION_HAND, 0); mainGame->dField.AddCard(pcard, player, LOCATION_HAND, 0);
for(size_t i = 0; i < mainGame->dField.hand[player].size(); ++i) for(int j = 0; j < (int)mainGame->dField.hand[player].size(); ++j)
mainGame->dField.MoveCard(mainGame->dField.hand[player][i], 10); mainGame->dField.MoveCard(mainGame->dField.hand[player][j], 10);
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
mainGame->WaitFrameSignal(5); mainGame->WaitFrameSignal(5);
} }
...@@ -4337,7 +4338,7 @@ void DuelClient::BeginRefreshHost() { ...@@ -4337,7 +4338,7 @@ void DuelClient::BeginRefreshHost() {
return; return;
SOCKET reply = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); SOCKET reply = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
sockaddr_in reply_addr; sockaddr_in reply_addr;
memset(&reply_addr, 0, sizeof(reply_addr)); std::memset(&reply_addr, 0, sizeof reply_addr);
reply_addr.sin_family = AF_INET; reply_addr.sin_family = AF_INET;
reply_addr.sin_port = htons(7921); reply_addr.sin_port = htons(7921);
reply_addr.sin_addr.s_addr = 0; reply_addr.sin_addr.s_addr = 0;
......
...@@ -1474,7 +1474,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1474,7 +1474,6 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
DuelClient::SetResponseB(respbuf, selectable_cards.size() * 2); DuelClient::SetResponseB(respbuf, selectable_cards.size() * 2);
DuelClient::SendResponse(); DuelClient::SendResponse();
} else { } else {
wchar_t formatBuffer[2048];
myswprintf(formatBuffer, dataManager.GetSysString(204), select_counter_count, dataManager.GetCounterName(select_counter_type)); myswprintf(formatBuffer, dataManager.GetSysString(204), select_counter_count, dataManager.GetCounterName(select_counter_type));
mainGame->stHintMsg->setText(formatBuffer); mainGame->stHintMsg->setText(formatBuffer);
} }
...@@ -1683,8 +1682,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) { ...@@ -1683,8 +1682,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
player_name = mainGame->dInfo.clientname_tag; player_name = mainGame->dInfo.clientname_tag;
} }
std::wstring str(player_name); std::wstring str(player_name);
const auto& player_desc_hints = mainGame->dField.player_desc_hints[mplayer]; const auto& mplayer_hints = mainGame->dField.player_desc_hints[mplayer];
for(auto iter = player_desc_hints.begin(); iter != player_desc_hints.end(); ++iter) { for(auto iter = mplayer_hints.begin(); iter != mplayer_hints.end(); ++iter) {
myswprintf(formatBuffer, L"\n*%ls", dataManager.GetDesc(iter->first)); myswprintf(formatBuffer, L"\n*%ls", dataManager.GetDesc(iter->first));
str.append(formatBuffer); str.append(formatBuffer);
} }
......
This diff is collapsed.
...@@ -2,13 +2,26 @@ ...@@ -2,13 +2,26 @@
#define GAME_H #define GAME_H
#include "config.h" #include "config.h"
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
#else //__APPLE__
#include <GL/gl.h>
#include <GL/glu.h>
#endif //__APPLE__
#include "CGUIImageButton.h"
#include "CGUITTFont.h"
#include "mysignal.h"
#include "client_field.h" #include "client_field.h"
#include "deck_con.h" #include "deck_con.h"
#include "menu_handler.h" #include "menu_handler.h"
#include "CGUISkinSystem/CGUISkinSystem.h" #include "CGUISkinSystem/CGUISkinSystem.h"
#include <time.h>
#include <unordered_map> #include <unordered_map>
#include <vector> #include <vector>
#include <list> #include <list>
#include <mutex>
#include <functional>
#ifndef YGOPRO_DEFAULT_DUEL_RULE #ifndef YGOPRO_DEFAULT_DUEL_RULE
#define YGOPRO_DEFAULT_DUEL_RULE 5 #define YGOPRO_DEFAULT_DUEL_RULE 5
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <event2/thread.h> #include <event2/thread.h>
#include <locale.h> #include <locale.h>
#include <memory> #include <memory>
#ifdef __APPLE__ #ifdef __APPLE__
#import <CoreFoundation/CoreFoundation.h> #import <CoreFoundation/CoreFoundation.h>
#endif #endif
...@@ -39,7 +40,7 @@ int main(int argc, char* argv[]) { ...@@ -39,7 +40,7 @@ int main(int argc, char* argv[]) {
#ifdef _WIN32 #ifdef _WIN32
#ifndef _DEBUG #ifndef _DEBUG
char* pstrext; char* pstrext;
if(argc == 2 && (pstrext = strrchr(argv[1], '.')) if(argc == 2 && (pstrext = std::strrchr(argv[1], '.'))
&& (!mystrncasecmp(pstrext, ".ydk", 4) || !mystrncasecmp(pstrext, ".yrp", 4))) { && (!mystrncasecmp(pstrext, ".ydk", 4) || !mystrncasecmp(pstrext, ".yrp", 4))) {
wchar_t exepath[MAX_PATH]; wchar_t exepath[MAX_PATH];
GetModuleFileNameW(NULL, exepath, MAX_PATH); GetModuleFileNameW(NULL, exepath, MAX_PATH);
......
#include "image_manager.h" #include "image_manager.h"
#include "game.h" #include "game.h"
#include <thread>
#include "myfilesystem.h"
namespace ygo { namespace ygo {
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "data_manager.h" #include "data_manager.h"
#include <unordered_map> #include <unordered_map>
#include <queue> #include <queue>
#include <mutex>
namespace ygo { namespace ygo {
......
#include "config.h" #include "config.h"
#include "menu_handler.h" #include "menu_handler.h"
#include "myfilesystem.h"
#include "netserver.h" #include "netserver.h"
#include "duelclient.h" #include "duelclient.h"
#include "deck_manager.h" #include "deck_manager.h"
...@@ -145,20 +146,20 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -145,20 +146,20 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_HP_KICK: { case BUTTON_HP_KICK: {
int id = 0; int index = 0;
while(id < 4) { while(index < 4) {
if(mainGame->btnHostPrepKick[id] == caller) if(mainGame->btnHostPrepKick[index] == caller)
break; break;
id++; ++index;
} }
CTOS_Kick csk; CTOS_Kick csk;
csk.pos = id; csk.pos = index;
DuelClient::SendPacketToServer(CTOS_HS_KICK, csk); DuelClient::SendPacketToServer(CTOS_HS_KICK, csk);
break; break;
} }
case BUTTON_HP_READY: { case BUTTON_HP_READY: {
if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 || if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) { !deckManager.LoadCurrentDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) {
mainGame->gMutex.lock(); mainGame->gMutex.lock();
soundManager.PlaySoundEffect(SOUND_INFO); soundManager.PlaySoundEffect(SOUND_INFO);
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1406)); mainGame->env->addMessageBox(L"", dataManager.GetSysString(1406));
...@@ -236,7 +237,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -236,7 +237,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->dField.Clear(); mainGame->dField.Clear();
mainGame->HideElement(mainGame->wReplay); mainGame->HideElement(mainGame->wReplay);
mainGame->device->setEventReceiver(&mainGame->dField); mainGame->device->setEventReceiver(&mainGame->dField);
unsigned int start_turn = _wtoi(mainGame->ebRepStartTurn->getText()); unsigned int start_turn = wcstol(mainGame->ebRepStartTurn->getText(), nullptr, 10);
if(start_turn == 1) if(start_turn == 1)
start_turn = 0; start_turn = 0;
ReplayMode::StartReplay(start_turn); ReplayMode::StartReplay(start_turn);
...@@ -278,40 +279,40 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -278,40 +279,40 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(mainGame->lstReplayList->getSelected() == -1) if(mainGame->lstReplayList->getSelected() == -1)
break; break;
Replay replay; Replay replay;
wchar_t ex_filename[256]; wchar_t ex_filename[256]{};
wchar_t namebuf[4][20]; wchar_t namebuf[4][20]{};
wchar_t filename[256]; wchar_t filename[256]{};
myswprintf(ex_filename, L"%ls", mainGame->lstReplayList->getListItem(mainGame->lstReplayList->getSelected())); myswprintf(ex_filename, L"%ls", mainGame->lstReplayList->getListItem(mainGame->lstReplayList->getSelected()));
if(!replay.OpenReplay(ex_filename)) if(!replay.OpenReplay(ex_filename))
break; break;
const ReplayHeader& rh = replay.pheader; const ReplayHeader& rh = replay.pheader;
if(rh.flag & REPLAY_SINGLE_MODE) if(rh.flag & REPLAY_SINGLE_MODE)
break; break;
int max = (rh.flag & REPLAY_TAG) ? 4 : 2; int player_count = (rh.flag & REPLAY_TAG) ? 4 : 2;
//player name //player name
for(int i = 0; i < max; ++i) for(int i = 0; i < player_count; ++i)
replay.ReadName(namebuf[i]); replay.ReadName(namebuf[i]);
//skip pre infos //skip pre infos
for(int i = 0; i < 4; ++i) for(int i = 0; i < 4; ++i)
replay.ReadInt32(); replay.ReadInt32();
//deck //deck
for(int i = 0; i < max; ++i) { std::vector<int> deckbuf;
for(int i = 0; i < player_count; ++i) {
deckbuf.clear();
int main = replay.ReadInt32(); int main = replay.ReadInt32();
Deck tmp_deck; deckbuf.push_back(main);
for (int j = 0; j < main; ++j) { for (int j = 0; j < main; ++j) {
auto card = dataManager.GetCodePointer(replay.ReadInt32()); deckbuf.push_back(replay.ReadInt32());
if (card != dataManager.datas_end)
tmp_deck.main.push_back(card);
} }
int extra = replay.ReadInt32(); int extra = replay.ReadInt32();
deckbuf.push_back(extra);
for (int j = 0; j < extra; ++j) { for (int j = 0; j < extra; ++j) {
auto card = dataManager.GetCodePointer(replay.ReadInt32()); deckbuf.push_back(replay.ReadInt32());
if (card != dataManager.datas_end)
tmp_deck.extra.push_back(card);
} }
deckbuf.push_back(0);
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.SaveDeckBuffer(deckbuf.data(), filename);
} }
mainGame->stACMessage->setText(dataManager.GetSysString(1335)); mainGame->stACMessage->setText(dataManager.GetSysString(1335));
mainGame->PopupElement(mainGame->wACMessage, 20); mainGame->PopupElement(mainGame->wACMessage, 20);
...@@ -409,7 +410,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -409,7 +410,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
} }
case BUTTON_DECK_EDIT: { case BUTTON_DECK_EDIT: {
mainGame->RefreshCategoryDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); mainGame->RefreshCategoryDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
if(open_file && deckManager.LoadDeck(open_file_name)) { if(open_file && deckManager.LoadCurrentDeck(open_file_name)) {
#ifdef WIN32 #ifdef WIN32
wchar_t *dash = wcsrchr(open_file_name, L'\\'); wchar_t *dash = wcsrchr(open_file_name, L'\\');
#else #else
...@@ -447,7 +448,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -447,7 +448,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
} }
open_file = false; open_file = false;
} else if(mainGame->cbDBCategory->getSelected() != -1 && mainGame->cbDBDecks->getSelected() != -1) { } else if(mainGame->cbDBCategory->getSelected() != -1 && mainGame->cbDBDecks->getSelected() != -1) {
deckManager.LoadDeck(mainGame->cbDBCategory, mainGame->cbDBDecks); deckManager.LoadCurrentDeck(mainGame->cbDBCategory, mainGame->cbDBDecks);
mainGame->ebDeckname->setText(L""); mainGame->ebDeckname->setText(L"");
} }
mainGame->HideElement(mainGame->wMainMenu); mainGame->HideElement(mainGame->wMainMenu);
...@@ -534,7 +535,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -534,7 +535,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
tm* st = localtime(&curtime); tm* st = localtime(&curtime);
wcsftime(infobuf, 256, L"%Y/%m/%d %H:%M:%S\n", st); wcsftime(infobuf, 256, L"%Y/%m/%d %H:%M:%S\n", st);
repinfo.append(infobuf); repinfo.append(infobuf);
wchar_t namebuf[4][20]; wchar_t namebuf[4][20]{};
ReplayMode::cur_replay.ReadName(namebuf[0]); ReplayMode::cur_replay.ReadName(namebuf[0]);
ReplayMode::cur_replay.ReadName(namebuf[1]); ReplayMode::cur_replay.ReadName(namebuf[1]);
if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG) { if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG) {
...@@ -574,9 +575,9 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -574,9 +575,9 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
std::wstring message = L""; std::wstring message = L"";
bool in_message = false; bool in_message = false;
while(fgets(linebuf, 1024, fp)) { while(fgets(linebuf, 1024, fp)) {
if(!strncmp(linebuf, "--[[message", 11)) { if(!std::strncmp(linebuf, "--[[message", 11)) {
size_t len = strlen(linebuf); size_t len = std::strlen(linebuf);
char* msgend = strrchr(linebuf, ']'); char* msgend = std::strrchr(linebuf, ']');
if(len <= 13) { if(len <= 13) {
in_message = true; in_message = true;
continue; continue;
...@@ -587,7 +588,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -587,7 +588,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
} }
if(!strncmp(linebuf, "]]", 2)) { if(!std::strncmp(linebuf, "]]", 2)) {
in_message = false; in_message = false;
break; break;
} }
...@@ -620,7 +621,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -620,7 +621,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->env->setFocus(mainGame->wHostPrepare); mainGame->env->setFocus(mainGame->wHostPrepare);
if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) { if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) {
if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 || if(mainGame->cbCategorySelect->getSelected() == -1 || mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) { !deckManager.LoadCurrentDeck(mainGame->cbCategorySelect, mainGame->cbDeckSelect)) {
mainGame->gMutex.lock(); mainGame->gMutex.lock();
static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false); static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false);
soundManager.PlaySoundEffect(SOUND_INFO); soundManager.PlaySoundEffect(SOUND_INFO);
......
#include "netserver.h" #include "netserver.h"
#include "single_duel.h" #include "single_duel.h"
#include "tag_duel.h" #include "tag_duel.h"
#include <thread>
namespace ygo { namespace ygo {
std::unordered_map<bufferevent*, DuelPlayer> NetServer::users; std::unordered_map<bufferevent*, DuelPlayer> NetServer::users;
...@@ -19,7 +20,7 @@ bool NetServer::StartServer(unsigned short port) { ...@@ -19,7 +20,7 @@ bool NetServer::StartServer(unsigned short port) {
if(!net_evbase) if(!net_evbase)
return false; return false;
sockaddr_in sin; sockaddr_in sin;
memset(&sin, 0, sizeof(sin)); std::memset(&sin, 0, sizeof sin);
server_port = port; server_port = port;
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(INADDR_ANY); sin.sin_addr.s_addr = htonl(INADDR_ANY);
...@@ -43,7 +44,7 @@ bool NetServer::StartBroadcast() { ...@@ -43,7 +44,7 @@ bool NetServer::StartBroadcast() {
setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof opt); setsockopt(udp, SOL_SOCKET, SO_BROADCAST, (const char*)&opt, sizeof opt);
setsockopt(udp, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof opt); setsockopt(udp, SOL_SOCKET, SO_REUSEADDR, (const char*)&opt, sizeof opt);
sockaddr_in addr; sockaddr_in addr;
memset(&addr, 0, sizeof(addr)); std::memset(&addr, 0, sizeof addr);
addr.sin_family = AF_INET; addr.sin_family = AF_INET;
addr.sin_port = htons(7920); addr.sin_port = htons(7920);
addr.sin_addr.s_addr = 0; addr.sin_addr.s_addr = 0;
...@@ -122,7 +123,7 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) { ...@@ -122,7 +123,7 @@ void NetServer::ServerAcceptError(evconnlistener* listener, void* ctx) {
void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) { void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
evbuffer* input = bufferevent_get_input(bev); evbuffer* input = bufferevent_get_input(bev);
int len = evbuffer_get_length(input); int len = evbuffer_get_length(input);
unsigned char* net_server_read = new unsigned char[std::min(len, SIZE_NETWORK_BUFFER)]; unsigned char* net_server_read = new unsigned char[SIZE_NETWORK_BUFFER];
unsigned short packet_len; unsigned short packet_len;
while (len >= 2) { while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len); evbuffer_copyout(input, &packet_len, sizeof packet_len);
......
...@@ -253,7 +253,7 @@ public: ...@@ -253,7 +253,7 @@ public:
#define NETPLAYER_TYPE_OBSERVER 7 #define NETPLAYER_TYPE_OBSERVER 7
#define CTOS_RESPONSE 0x1 // byte array #define CTOS_RESPONSE 0x1 // byte array
#define CTOS_UPDATE_DECK 0x2 // int32_t array #define CTOS_UPDATE_DECK 0x2 // mainc, sidec, int32_t[mainc + sidec]
#define CTOS_HAND_RESULT 0x3 // CTOS_HandResult #define CTOS_HAND_RESULT 0x3 // CTOS_HandResult
#define CTOS_TP_RESULT 0x4 // CTOS_TPResult #define CTOS_TP_RESULT 0x4 // CTOS_TPResult
#define CTOS_PLAYER_INFO 0x10 // CTOS_PlayerInfo #define CTOS_PLAYER_INFO 0x10 // CTOS_PlayerInfo
......
#include "replay.h" #include "replay.h"
#include "myfilesystem.h"
#include "lzma/LzmaLib.h" #include "lzma/LzmaLib.h"
namespace ygo { namespace ygo {
...@@ -27,7 +28,7 @@ void Replay::BeginRecord() { ...@@ -27,7 +28,7 @@ void Replay::BeginRecord() {
if(!fp) if(!fp)
return; return;
#endif #endif
pdata = replay_data; pwrite = replay_data;
replay_size = 0; replay_size = 0;
comp_size = 0; comp_size = 0;
is_replaying = false; is_replaying = false;
...@@ -46,10 +47,10 @@ void Replay::WriteHeader(ReplayHeader& header) { ...@@ -46,10 +47,10 @@ void Replay::WriteHeader(ReplayHeader& header) {
void Replay::WriteData(const void* data, int length, bool flush) { void Replay::WriteData(const void* data, int length, bool flush) {
if(!is_recording) if(!is_recording)
return; return;
if (length < 0 || (pdata - replay_data) + length > MAX_REPLAY_SIZE) if (length < 0 || (int)(pwrite - replay_data) + length > MAX_REPLAY_SIZE)
return; return;
std::memcpy(pdata, data, length); std::memcpy(pwrite, data, length);
pdata += length; pwrite += length;
#ifdef _WIN32 #ifdef _WIN32
DWORD size; DWORD size;
WriteFile(recording_fp, data, length, &size, NULL); WriteFile(recording_fp, data, length, &size, NULL);
...@@ -60,49 +61,13 @@ void Replay::WriteData(const void* data, int length, bool flush) { ...@@ -60,49 +61,13 @@ void Replay::WriteData(const void* data, int length, bool flush) {
#endif #endif
} }
void Replay::WriteInt32(int data, bool flush) { void Replay::WriteInt32(int data, bool flush) {
if(!is_recording) WriteData(&data, sizeof data, flush);
return;
if ((pdata - replay_data) + 4 > MAX_REPLAY_SIZE)
return;
BufferIO::WriteInt32(pdata, data);
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(int), &size, NULL);
#else
fwrite(&data, sizeof(int), 1, fp);
if(flush)
fflush(fp);
#endif
} }
void Replay::WriteInt16(short data, bool flush) { void Replay::WriteInt16(short data, bool flush) {
if(!is_recording) WriteData(&data, sizeof data, flush);
return;
if ((pdata - replay_data) + 2 > MAX_REPLAY_SIZE)
return;
BufferIO::WriteInt16(pdata, data);
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(short), &size, NULL);
#else
fwrite(&data, sizeof(short), 1, fp);
if(flush)
fflush(fp);
#endif
} }
void Replay::WriteInt8(char data, bool flush) { void Replay::WriteInt8(char data, bool flush) {
if(!is_recording) WriteData(&data, sizeof data, flush);
return;
if ((pdata - replay_data) + 1 > MAX_REPLAY_SIZE)
return;
BufferIO::WriteInt8(pdata, data);
#ifdef _WIN32
DWORD size;
WriteFile(recording_fp, &data, sizeof(char), &size, NULL);
#else
fwrite(&data, sizeof(char), 1, fp);
if(flush)
fflush(fp);
#endif
} }
void Replay::Flush() { void Replay::Flush() {
if(!is_recording) if(!is_recording)
...@@ -120,10 +85,7 @@ void Replay::EndRecord() { ...@@ -120,10 +85,7 @@ void Replay::EndRecord() {
#else #else
fclose(fp); fclose(fp);
#endif #endif
if(pdata - replay_data > 0 && pdata - replay_data <= MAX_REPLAY_SIZE) replay_size = pwrite - replay_data;
replay_size = pdata - replay_data;
else
replay_size = 0;
pheader.datasize = replay_size; pheader.datasize = replay_size;
pheader.flag |= REPLAY_COMPRESSED; pheader.flag |= REPLAY_COMPRESSED;
size_t propsize = 5; size_t propsize = 5;
...@@ -252,45 +214,53 @@ bool Replay::RenameReplay(const wchar_t* oldname, const wchar_t* newname) { ...@@ -252,45 +214,53 @@ bool Replay::RenameReplay(const wchar_t* oldname, const wchar_t* newname) {
#endif #endif
} }
bool Replay::ReadNextResponse(unsigned char resp[]) { bool Replay::ReadNextResponse(unsigned char resp[]) {
if(pdata - replay_data >= (int)replay_size) unsigned char len{};
if (!ReadData(&len, sizeof len))
return false;
if (len > SIZE_RETURN_VALUE) {
is_replaying = false;
return false; return false;
int len = *pdata++; }
if(len > SIZE_RETURN_VALUE) if (!ReadData(resp, len))
return false; return false;
std::memcpy(resp, pdata, len);
pdata += len;
return true; return true;
} }
void Replay::ReadName(wchar_t* data) { void Replay::ReadName(wchar_t* data) {
if(!is_replaying) uint16_t buffer[20]{};
if (!ReadData(buffer, sizeof buffer)) {
data[0] = 0;
return; return;
unsigned short buffer[20]; }
ReadData(buffer, 40);
BufferIO::CopyWStr(buffer, data, 20); BufferIO::CopyWStr(buffer, data, 20);
} }
void Replay::ReadData(void* data, int length) { bool Replay::ReadData(void* data, int length) {
if(!is_replaying) if(!is_replaying)
return; return false;
if (length < 0)
return false;
if ((int)(pdata - replay_data) + length > (int)replay_size) {
is_replaying = false;
return false;
}
std::memcpy(data, pdata, length); std::memcpy(data, pdata, length);
pdata += length; pdata += length;
return true;
} }
int Replay::ReadInt32() { template<typename T>
if(!is_replaying) T Replay::ReadValue() {
T ret{};
if (!ReadData(&ret, sizeof ret))
return -1; return -1;
int ret = BufferIO::ReadInt32(pdata);
return ret; return ret;
} }
int Replay::ReadInt32() {
return ReadValue<int32_t>();
}
short Replay::ReadInt16() { short Replay::ReadInt16() {
if(!is_replaying) return ReadValue<int16_t>();
return -1;
short ret = BufferIO::ReadInt16(pdata);
return ret;
} }
char Replay::ReadInt8() { char Replay::ReadInt8() {
if(!is_replaying) return ReadValue<char>();
return -1;
char ret= BufferIO::ReadInt8(pdata);
return ret;
} }
void Replay::Rewind() { void Replay::Rewind() {
pdata = replay_data; pdata = replay_data;
......
...@@ -50,7 +50,9 @@ public: ...@@ -50,7 +50,9 @@ public:
bool ReadNextResponse(unsigned char resp[]); bool ReadNextResponse(unsigned char resp[]);
void ReadName(wchar_t* data); void ReadName(wchar_t* data);
//void ReadHeader(ReplayHeader& header); //void ReadHeader(ReplayHeader& header);
void ReadData(void* data, int length); bool ReadData(void* data, int length);
template<typename T>
T ReadValue();
int ReadInt32(); int ReadInt32();
short ReadInt16(); short ReadInt16();
char ReadInt8(); char ReadInt8();
...@@ -62,13 +64,14 @@ public: ...@@ -62,13 +64,14 @@ public:
#endif #endif
ReplayHeader pheader; ReplayHeader pheader;
unsigned char* replay_data;
unsigned char* comp_data; unsigned char* comp_data;
size_t replay_size{};
size_t comp_size{}; size_t comp_size{};
private: private:
unsigned char* pdata{ nullptr }; unsigned char* replay_data;
size_t replay_size{};
unsigned char* pwrite{};
unsigned char* pdata{};
bool is_recording{}; bool is_recording{};
bool is_replaying{}; bool is_replaying{};
}; };
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "game.h" #include "game.h"
#include "../ocgcore/common.h" #include "../ocgcore/common.h"
#include "../ocgcore/mtrandom.h" #include "../ocgcore/mtrandom.h"
#include <thread>
namespace ygo { namespace ygo {
......
...@@ -444,7 +444,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -444,7 +444,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count);
preload_script(pduel, "./script/special.lua", 0); preload_script(pduel, "./script/special.lua", 0);
preload_script(pduel, "./script/init.lua", 0); preload_script(pduel, "./script/init.lua", 0);
int opt = (int)host_info.duel_rule << 16; unsigned int opt = (unsigned int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck) if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE; opt |= DUEL_PSEUDO_SHUFFLE;
last_replay.WriteInt32(host_info.start_lp, false); last_replay.WriteInt32(host_info.start_lp, false);
...@@ -1514,7 +1514,7 @@ void SingleDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1514,7 +1514,7 @@ void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
continue; continue;
auto position = GetPosition(qbuf, 8); auto position = GetPosition(qbuf, 8);
if (position & POS_FACEDOWN) if (position & POS_FACEDOWN)
memset(qbuf, 0, clen - 4); std::memset(qbuf, 0, clen - 4);
qbuf += clen - 4; qbuf += clen - 4;
} }
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer.data(), len + 3); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer.data(), len + 3);
...@@ -1535,7 +1535,7 @@ void SingleDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1535,7 +1535,7 @@ void SingleDuel::RefreshSzone(int player, int flag, int use_cache) {
continue; continue;
auto position = GetPosition(qbuf, 8); auto position = GetPosition(qbuf, 8);
if (position & POS_FACEDOWN) if (position & POS_FACEDOWN)
memset(qbuf, 0, clen - 4); std::memset(qbuf, 0, clen - 4);
qbuf += clen - 4; qbuf += clen - 4;
} }
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer.data(), len + 3); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer.data(), len + 3);
...@@ -1556,7 +1556,7 @@ void SingleDuel::RefreshHand(int player, int flag, int use_cache) { ...@@ -1556,7 +1556,7 @@ void SingleDuel::RefreshHand(int player, int flag, int use_cache) {
continue; continue;
auto position = GetPosition(qbuf, 8); auto position = GetPosition(qbuf, 8);
if(!(position & POS_FACEUP)) if(!(position & POS_FACEUP))
memset(qbuf, 0, slen - 4); std::memset(qbuf, 0, slen - 4);
qbuf += slen - 4; qbuf += slen - 4;
} }
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer.data(), len + 3); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer.data(), len + 3);
...@@ -1597,7 +1597,7 @@ void SingleDuel::RefreshSingle(int player, int location, int sequence, int flag) ...@@ -1597,7 +1597,7 @@ void SingleDuel::RefreshSingle(int player, int location, int sequence, int flag)
if (position & POS_FACEDOWN) { if (position & POS_FACEDOWN) {
BufferIO::WriteInt32(qbuf, QUERY_CODE); BufferIO::WriteInt32(qbuf, QUERY_CODE);
BufferIO::WriteInt32(qbuf, 0); BufferIO::WriteInt32(qbuf, 0);
memset(qbuf, 0, clen - 12); std::memset(qbuf, 0, clen - 12);
} }
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 4); NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, query_buffer, len + 4);
for (auto pit = observers.begin(); pit != observers.end(); ++pit) for (auto pit = observers.begin(); pit != observers.end(); ++pit)
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
#include "game.h" #include "game.h"
#include "../ocgcore/common.h" #include "../ocgcore/common.h"
#include "../ocgcore/mtrandom.h" #include "../ocgcore/mtrandom.h"
#include <thread>
namespace ygo { namespace ygo {
......
#include "sound_manager.h" #include "sound_manager.h"
#include "myfilesystem.h"
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
#include "../ikpmp3/ikpMP3.h" #include "../ikpmp3/ikpMP3.h"
#endif #endif
......
...@@ -421,7 +421,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -421,7 +421,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count);
preload_script(pduel, "./script/special.lua", 0); preload_script(pduel, "./script/special.lua", 0);
preload_script(pduel, "./script/init.lua", 0); preload_script(pduel, "./script/init.lua", 0);
int opt = (int)host_info.duel_rule << 16; unsigned int opt = (unsigned int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck) if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE; opt |= DUEL_PSEUDO_SHUFFLE;
opt |= DUEL_TAG_MODE; opt |= DUEL_TAG_MODE;
...@@ -1640,7 +1640,7 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) { ...@@ -1640,7 +1640,7 @@ void TagDuel::RefreshMzone(int player, int flag, int use_cache) {
continue; continue;
auto position = GetPosition(qbuf, 8); auto position = GetPosition(qbuf, 8);
if (position & POS_FACEDOWN) if (position & POS_FACEDOWN)
memset(qbuf, 0, clen - 4); std::memset(qbuf, 0, clen - 4);
qbuf += clen - 4; qbuf += clen - 4;
} }
pid = 2 - pid; pid = 2 - pid;
...@@ -1665,7 +1665,7 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) { ...@@ -1665,7 +1665,7 @@ void TagDuel::RefreshSzone(int player, int flag, int use_cache) {
continue; continue;
auto position = GetPosition(qbuf, 8); auto position = GetPosition(qbuf, 8);
if (position & POS_FACEDOWN) if (position & POS_FACEDOWN)
memset(qbuf, 0, clen - 4); std::memset(qbuf, 0, clen - 4);
qbuf += clen - 4; qbuf += clen - 4;
} }
pid = 2 - pid; pid = 2 - pid;
...@@ -1688,7 +1688,7 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) { ...@@ -1688,7 +1688,7 @@ void TagDuel::RefreshHand(int player, int flag, int use_cache) {
continue; continue;
auto position = GetPosition(qbuf, 8); auto position = GetPosition(qbuf, 8);
if(!(position & POS_FACEUP)) if(!(position & POS_FACEUP))
memset(qbuf, 0, slen - 4); std::memset(qbuf, 0, slen - 4);
qbuf += slen - 4; qbuf += slen - 4;
} }
for(int i = 0; i < 4; ++i) for(int i = 0; i < 4; ++i)
......
...@@ -756,8 +756,11 @@ ...@@ -756,8 +756,11 @@
!setname 0x3a 遗式 リチュア !setname 0x3a 遗式 リチュア
!setname 0x3b 真红眼 レッドアイズ !setname 0x3b 真红眼 レッドアイズ
!setname 0x3c 爬虫妖 レプティレス !setname 0x3c 爬虫妖 レプティレス
!setname 0x3d 六武众 六武衆 #setname 0x3d 六武
!setname 0x103d 影六武众 影六武衆 !setname 0x103d 六武众 六武衆
!setname 0x203d 六武式
#setname 0x503d 真六武众 真六武衆
!setname 0x903d 影六武众 影六武衆
!setname 0x3e 异虫 ワーム !setname 0x3e 异虫 ワーム
!setname 0x3f 救世 セイヴァー !setname 0x3f 救世 セイヴァー
!setname 0x40 被封印 封印されし !setname 0x40 被封印 封印されし
...@@ -1239,8 +1242,7 @@ ...@@ -1239,8 +1242,7 @@
!setname 0x1b8 鲨 シャーク !setname 0x1b8 鲨 シャーク
!setname 0x11b8 鲨龙兽 シャーク・ドレイク !setname 0x11b8 鲨龙兽 シャーク・ドレイク
!setname 0x1b9 原石 !setname 0x1b9 原石
!setname 0x1ba 六武式 !setname 0x1ba 金属化 メタル化
!setname 0x1bb 金属化 メタル化 !setname 0x1bb 魔瞳 モルガナイト
!setname 0x1bc 魔瞳 !setname 0x1bc 蓟花 アザミナ
!setname 0x1bd 蓟花 アザミナ !setname 0x1bd 祝台
!setname 0x1be 祝台
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