Commit 5efcd279 authored by nanahira's avatar nanahira

Merge branch 'master' into server

parents b4387a80 d9fa2ac8
No preview for this file type
...@@ -527,29 +527,28 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position ...@@ -527,29 +527,28 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
core::ustring::const_iterator iter(utext); core::ustring::const_iterator iter(utext);
while (!iter.atEnd()) { while (!iter.atEnd()) {
uchar32_t currentChar = *iter; uchar32_t currentChar = *iter;
n = getGlyphIndexByChar(currentChar);
bool visible = (Invisible.findFirst(currentChar) == -1);
if (n > 0 && visible) {
bool lineBreak = false; bool lineBreak = false;
if (currentChar == L'\r') { // Mac or Windows breaks if (currentChar == L'\r') { // Mac or Windows breaks
lineBreak = true; lineBreak = true;
if (*(iter + 1) == (uchar32_t)'\n') // Windows line breaks. if (*(iter + 1) == L'\n') // Windows line breaks.
currentChar = *(++iter); currentChar = *(++iter);
} else if (currentChar == (uchar32_t)'\n') { // Unix breaks } else if (currentChar == L'\n') { // Unix breaks
lineBreak = true; lineBreak = true;
} }
if (lineBreak) { if (lineBreak) {
previousChar = 0; previousChar = 0;
offset.Y += supposed_line_height; //font_metrics.ascender / 64; offset.Y += supposed_line_height; //font_metrics.ascender / 64;
offset.X = position.UpperLeftCorner.X; offset.X = position.UpperLeftCorner.X;
if (hcenter) if (hcenter)
offset.X += (position.getWidth() - textDimension.Width) >> 1; offset.X += (position.getWidth() - textDimension.Width) >> 1;
++iter; ++iter;
continue; continue;
} }
n = getGlyphIndexByChar(currentChar);
bool visible = (Invisible.findFirst(currentChar) == -1);
if (n > 0 && visible) {
// Calculate the glyph offset. // Calculate the glyph offset.
s32 offx = Glyphs[n - 1].offset.X; s32 offx = Glyphs[n - 1].offset.X;
s32 offy = (font_metrics.ascender / 64) - Glyphs[n - 1].offset.Y; s32 offy = (font_metrics.ascender / 64) - Glyphs[n - 1].offset.Y;
......
...@@ -1075,21 +1075,22 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir ...@@ -1075,21 +1075,22 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
break; break;
} }
case LOCATION_OVERLAY: { case LOCATION_OVERLAY: {
if (pcard->overlayTarget->location != LOCATION_MZONE) { if (!(pcard->overlayTarget->location & LOCATION_ONFIELD)) {
return; return;
} }
int oseq = pcard->overlayTarget->sequence; int oseq = pcard->overlayTarget->sequence;
int mseq = (sequence < MAX_LAYER_COUNT) ? sequence : (MAX_LAYER_COUNT - 1); int mseq = (sequence < MAX_LAYER_COUNT) ? sequence : (MAX_LAYER_COUNT - 1);
auto vFieldZone = (pcard->overlayTarget->location == LOCATION_MZONE) ? matManager.vFieldMzone[pcard->overlayTarget->controler][oseq] : matManager.vFieldSzone[pcard->overlayTarget->controler][oseq][rule];
if (pcard->overlayTarget->controler == 0) { if (pcard->overlayTarget->controler == 0) {
t->X = (matManager.vFieldMzone[0][oseq][0].Pos.X + matManager.vFieldMzone[0][oseq][1].Pos.X) / 2 - 0.12f + 0.06f * mseq; t->X = (vFieldZone[0].Pos.X + vFieldZone[1].Pos.X) / 2 - 0.12f + 0.06f * mseq;
t->Y = (matManager.vFieldMzone[0][oseq][0].Pos.Y + matManager.vFieldMzone[0][oseq][2].Pos.Y) / 2 + 0.05f; t->Y = (vFieldZone[0].Pos.Y + vFieldZone[2].Pos.Y) / 2 + 0.05f;
t->Z = overlay_buttom + mseq * material_height; t->Z = overlay_buttom + mseq * material_height;
r->X = 0.0f; r->X = 0.0f;
r->Y = 0.0f; r->Y = 0.0f;
r->Z = 0.0f; r->Z = 0.0f;
} else { } else {
t->X = (matManager.vFieldMzone[1][oseq][0].Pos.X + matManager.vFieldMzone[1][oseq][1].Pos.X) / 2 + 0.12f - 0.06f * mseq; t->X = (vFieldZone[0].Pos.X + vFieldZone[1].Pos.X) / 2 + 0.12f - 0.06f * mseq;
t->Y = (matManager.vFieldMzone[1][oseq][0].Pos.Y + matManager.vFieldMzone[1][oseq][2].Pos.Y) / 2 - 0.05f; t->Y = (vFieldZone[0].Pos.Y + vFieldZone[2].Pos.Y) / 2 - 0.05f;
t->Z = overlay_buttom + mseq * material_height; t->Z = overlay_buttom + mseq * material_height;
r->X = 0.0f; r->X = 0.0f;
r->Y = 0.0f; r->Y = 0.0f;
......
...@@ -96,10 +96,8 @@ using namespace irr; ...@@ -96,10 +96,8 @@ using namespace irr;
using namespace io; using namespace io;
#endif #endif
typedef int BOOL;
extern unsigned short PRO_VERSION; extern unsigned short PRO_VERSION;
extern int enable_log; extern unsigned int enable_log;
extern bool exit_on_return; extern bool exit_on_return;
extern bool auto_watch_mode; extern bool auto_watch_mode;
extern bool open_file; extern bool open_file;
......
...@@ -169,24 +169,30 @@ bool DataManager::LoadStrings(IReadFile* reader) { ...@@ -169,24 +169,30 @@ bool DataManager::LoadStrings(IReadFile* reader) {
void DataManager::ReadStringConfLine(const char* linebuf) { void DataManager::ReadStringConfLine(const char* linebuf) {
if(linebuf[0] != '!') if(linebuf[0] != '!')
return; return;
char strbuf[256]; char strbuf[256]{};
int value; int value{};
wchar_t strBuffer[4096]; wchar_t strBuffer[4096]{};
sscanf(linebuf, "!%s", strbuf); if (sscanf(linebuf, "!%63s", strbuf) != 1)
return;
if(!strcmp(strbuf, "system")) { if(!strcmp(strbuf, "system")) {
sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf); if (sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf) != 2)
return;
BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
_sysStrings[value] = strBuffer; _sysStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "victory")) { } else if(!strcmp(strbuf, "victory")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf); if (sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf) != 2)
return;
BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
_victoryStrings[value] = strBuffer; _victoryStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "counter")) { } else if(!strcmp(strbuf, "counter")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf); if (sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf) != 2)
return;
BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
_counterStrings[value] = strBuffer; _counterStrings[value] = strBuffer;
} else if(!strcmp(strbuf, "setname")) { } else if(!strcmp(strbuf, "setname")) {
sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf);//using tab for comment //using tab for comment
if (sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf) != 2)
return;
BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
_setnameStrings[value] = strBuffer; _setnameStrings[value] = strBuffer;
} }
......
...@@ -94,6 +94,7 @@ void DeckBuilder::Terminate() { ...@@ -94,6 +94,7 @@ void DeckBuilder::Terminate() {
mainGame->btnBigCardZoomIn->setVisible(false); mainGame->btnBigCardZoomIn->setVisible(false);
mainGame->btnBigCardZoomOut->setVisible(false); mainGame->btnBigCardZoomOut->setVisible(false);
mainGame->btnBigCardClose->setVisible(false); mainGame->btnBigCardClose->setVisible(false);
mainGame->ResizeChatInputWindow();
mainGame->PopupElement(mainGame->wMainMenu); mainGame->PopupElement(mainGame->wMainMenu);
mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->wACMessage->setVisible(false); mainGame->wACMessage->setVisible(false);
......
...@@ -14,15 +14,16 @@ DeckManager deckManager; ...@@ -14,15 +14,16 @@ DeckManager deckManager;
void DeckManager::LoadLFListSingle(const char* path) { void DeckManager::LoadLFListSingle(const char* path) {
LFList* cur = nullptr; LFList* cur = nullptr;
FILE* fp = fopen(path, "r"); FILE* fp = fopen(path, "r");
char linebuf[256]; char linebuf[256]{};
wchar_t strBuffer[256]; wchar_t strBuffer[256]{};
if(fp) { if(fp) {
while(fgets(linebuf, 256, fp)) { while(fgets(linebuf, 256, fp)) {
if(linebuf[0] == '#') if(linebuf[0] == '#')
continue; continue;
if(linebuf[0] == '!') { if(linebuf[0] == '!') {
int sa = BufferIO::DecodeUTF8(&linebuf[1], strBuffer); int sa = BufferIO::DecodeUTF8(&linebuf[1], strBuffer);
while(strBuffer[sa - 1] == L'\r' || strBuffer[sa - 1] == L'\n' ) sa--; while(strBuffer[sa - 1] == L'\r' || strBuffer[sa - 1] == L'\n' )
sa--;
strBuffer[sa] = 0; strBuffer[sa] = 0;
LFList newlist; LFList newlist;
_lfList.push_back(newlist); _lfList.push_back(newlist);
...@@ -31,20 +32,18 @@ void DeckManager::LoadLFListSingle(const char* path) { ...@@ -31,20 +32,18 @@ void DeckManager::LoadLFListSingle(const char* path) {
cur->hash = 0x7dfcee6a; cur->hash = 0x7dfcee6a;
continue; continue;
} }
int p = 0; if(linebuf[0] == 0)
while(linebuf[p] != ' ' && linebuf[p] != '\t' && linebuf[p] != 0) p++;
if(linebuf[p] == 0)
continue; continue;
linebuf[p++] = 0; int code = 0;
int sa = p; int count = -1;
int code = atoi(linebuf); if (sscanf(linebuf, "%d %d", &code, &count) != 2)
if(code == 0) continue;
if (code <= 0 || code > 99999999)
continue;
if (count < 0 || count > 2)
continue;
if (!cur)
continue; continue;
while(linebuf[p] == ' ' || linebuf[p] == '\t') p++;
while(linebuf[p] != ' ' && linebuf[p] != '\t' && linebuf[p] != 0) p++;
linebuf[p] = 0;
int count = atoi(&linebuf[sa]);
if(!cur) continue;
cur->content[code] = count; cur->content[code] = count;
cur->hash = cur->hash ^ ((code << 18) | (code >> 14)) ^ ((code << (27 + count)) | (code >> (5 - count))); cur->hash = cur->hash ^ ((code << 18) | (code >> 14)) ^ ((code << (27 + count)) | (code >> (5 - count)));
} }
......
...@@ -1065,26 +1065,40 @@ void Game::DrawSpec() { ...@@ -1065,26 +1065,40 @@ void Game::DrawSpec() {
showChat = false; showChat = false;
hideChatTimer--; hideChatTimer--;
} }
int chatRectY = 0;
for(int i = 0; i < 8; ++i) { for(int i = 0; i < 8; ++i) {
static unsigned int chatColor[] = {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xff8080ff, 0xffff4040, 0xffff4040, static unsigned int chatColor[] = {0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xff8080ff, 0xffff4040, 0xffff4040,
0xffff4040, 0xff40ff40, 0xff4040ff, 0xff40ffff, 0xffff40ff, 0xffffff40, 0xffffffff, 0xff808080, 0xff404040}; 0xffff4040, 0xff40ff40, 0xff4040ff, 0xff40ffff, 0xffff40ff, 0xffffff40, 0xffffffff, 0xff808080, 0xff404040};
if(chatTiming[i]) { if(chatTiming[i]) {
chatTiming[i]--; chatTiming[i]--;
if(mainGame->dInfo.isStarted && i >= 5) if(!is_building) {
if(dInfo.isStarted && i >= 5)
continue; continue;
if(!showChat && i > 2) if(!showChat && i > 2)
continue; continue;
int w = guiFont->getDimension(chatMsg[i].c_str()).Width; }
int x = wChat->getRelativePosition().UpperLeftCorner.X;
int y = window_size.Height - 25;
int maxwidth = 705 * xScale;
if(is_building) {
x = 810 * xScale;
maxwidth = 205 * xScale;
}
std::wstring msg = SetStaticText(nullptr, maxwidth, guiFont, chatMsg[i].c_str());
int w = guiFont->getDimension(msg).Width;
int h = guiFont->getDimension(msg).Height + 2;
recti rectloc(mainGame->wChat->getRelativePosition().UpperLeftCorner.X, mainGame->window_size.Height - 45, mainGame->wChat->getRelativePosition().UpperLeftCorner.X + 2 + w, mainGame->window_size.Height - 25); recti rectloc(x, y - chatRectY - h, x + 2 + w, y - chatRectY);
rectloc -= position2di(0, i * 20); recti msgloc(x, y - chatRectY - h, x - 4, y - chatRectY);
recti msgloc(mainGame->wChat->getRelativePosition().UpperLeftCorner.X, mainGame->window_size.Height - 45, mainGame->wChat->getRelativePosition().UpperLeftCorner.X - 4, mainGame->window_size.Height - 25);
msgloc -= position2di(0, i * 20);
recti shadowloc = msgloc + position2di(1, 1); recti shadowloc = msgloc + position2di(1, 1);
driver->draw2DRectangle(rectloc, 0xa0000000, 0xa0000000, 0xa0000000, 0xa0000000); driver->draw2DRectangle(rectloc, 0xa0000000, 0xa0000000, 0xa0000000, 0xa0000000);
guiFont->draw(chatMsg[i].c_str(), msgloc, 0xff000000, false, false); guiFont->draw(msg.c_str(), msgloc, 0xff000000, false, false);
guiFont->draw(chatMsg[i].c_str(), shadowloc, chatColor[chatType[i]], false, false); guiFont->draw(msg.c_str(), shadowloc, chatColor[chatType[i]], false, false);
chatRectY += h;
} }
} }
} }
...@@ -1366,6 +1380,11 @@ void Game::DrawDeckBd() { ...@@ -1366,6 +1380,11 @@ void Game::DrawDeckBd() {
driver->draw2DRectangleOutline(Resize(313 + i * dx, 563, 359 + i * dx, 629)); driver->draw2DRectangleOutline(Resize(313 + i * dx, 563, 359 + i * dx, 629));
} }
} }
if(is_siding) {
// side chat background
driver->draw2DRectangle(Resize(805, 10, 1020, 630), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(804, 9, 1020, 630));
} else {
//search result //search result
driver->draw2DRectangle(Resize(805, 137, 926, 157), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(Resize(805, 137, 926, 157), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(804, 136, 926, 157)); driver->draw2DRectangleOutline(Resize(804, 136, 926, 157));
...@@ -1373,6 +1392,7 @@ void Game::DrawDeckBd() { ...@@ -1373,6 +1392,7 @@ void Game::DrawDeckBd() {
DrawShadowText(numFont, deckBuilder.result_string, Resize(875, 137, 935, 157), Resize(1, 1, 1, 1), 0xffffffff, 0xff000000, false, true); DrawShadowText(numFont, deckBuilder.result_string, Resize(875, 137, 935, 157), Resize(1, 1, 1, 1), 0xffffffff, 0xff000000, false, true);
driver->draw2DRectangle(Resize(805, 160, 1020, 630), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(Resize(805, 160, 1020, 630), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(Resize(804, 159, 1020, 630)); driver->draw2DRectangleOutline(Resize(804, 159, 1020, 630));
}
for(size_t i = 0; i < 9 && i + scrFilter->getPos() < deckBuilder.results.size(); ++i) { for(size_t i = 0; i < 9 && i + scrFilter->getPos() < deckBuilder.results.size(); ++i) {
code_pointer ptr = deckBuilder.results[i + scrFilter->getPos()]; code_pointer ptr = deckBuilder.results[i + scrFilter->getPos()];
if(i >= 7) if(i >= 7)
......
...@@ -242,6 +242,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { ...@@ -242,6 +242,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
mainGame->dInfo.isInDuel = false; mainGame->dInfo.isInDuel = false;
mainGame->dInfo.isFinished = false; mainGame->dInfo.isFinished = false;
mainGame->is_building = false; mainGame->is_building = false;
mainGame->ResizeChatInputWindow();
mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->device->setEventReceiver(&mainGame->menuHandler);
if(bot_mode) if(bot_mode)
mainGame->ShowElement(mainGame->wSinglePlay); mainGame->ShowElement(mainGame->wSinglePlay);
...@@ -478,7 +479,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -478,7 +479,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
mainGame->is_building = true; mainGame->is_building = true;
mainGame->is_siding = true; mainGame->is_siding = true;
mainGame->CloseGameWindow(); mainGame->CloseGameWindow();
mainGame->wChat->setVisible(false); mainGame->ResizeChatInputWindow();
mainGame->wDeckEdit->setVisible(false); mainGame->wDeckEdit->setVisible(false);
mainGame->wFilter->setVisible(false); mainGame->wFilter->setVisible(false);
mainGame->wSort->setVisible(false); mainGame->wSort->setVisible(false);
...@@ -504,6 +505,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -504,6 +505,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
break; break;
} }
case STOC_WAITING_SIDE: { case STOC_WAITING_SIDE: {
mainGame->dInfo.isInDuel = false;
mainGame->gMutex.lock(); mainGame->gMutex.lock();
mainGame->dField.Clear(); mainGame->dField.Clear();
mainGame->stHintMsg->setText(dataManager.GetSysString(1409)); mainGame->stHintMsg->setText(dataManager.GetSysString(1409));
...@@ -595,6 +597,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -595,6 +597,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
mainGame->HideElement(mainGame->wLanWindow); mainGame->HideElement(mainGame->wLanWindow);
mainGame->HideElement(mainGame->wSinglePlay); mainGame->HideElement(mainGame->wSinglePlay);
mainGame->ShowElement(mainGame->wHostPrepare); mainGame->ShowElement(mainGame->wHostPrepare);
mainGame->ResizeChatInputWindow();
//if(!mainGame->chkIgnore1->isChecked()) //if(!mainGame->chkIgnore1->isChecked())
mainGame->wChat->setVisible(true); mainGame->wChat->setVisible(true);
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
...@@ -708,6 +711,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -708,6 +711,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
mainGame->btnM2->setVisible(false); mainGame->btnM2->setVisible(false);
mainGame->btnEP->setVisible(false); mainGame->btnEP->setVisible(false);
mainGame->btnShuffle->setVisible(false); mainGame->btnShuffle->setVisible(false);
mainGame->ResizeChatInputWindow();
//if(!mainGame->chkIgnore1->isChecked()) //if(!mainGame->chkIgnore1->isChecked())
mainGame->wChat->setVisible(true); mainGame->wChat->setVisible(true);
if(mainGame->chkDefaultShowChain->isChecked()) { if(mainGame->chkDefaultShowChain->isChecked()) {
...@@ -789,6 +793,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -789,6 +793,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
mainGame->btnStartBot->setEnabled(true); mainGame->btnStartBot->setEnabled(true);
mainGame->btnBotCancel->setEnabled(true); mainGame->btnBotCancel->setEnabled(true);
mainGame->stTip->setVisible(false); mainGame->stTip->setVisible(false);
mainGame->ResizeChatInputWindow();
mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->device->setEventReceiver(&mainGame->menuHandler);
if(bot_mode) if(bot_mode)
mainGame->ShowElement(mainGame->wSinglePlay); mainGame->ShowElement(mainGame->wSinglePlay);
...@@ -861,15 +866,19 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -861,15 +866,19 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
case STOC_CHAT: { case STOC_CHAT: {
STOC_Chat* pkt = (STOC_Chat*)pdata; STOC_Chat* pkt = (STOC_Chat*)pdata;
int player = pkt->player; int player = pkt->player;
auto play_sound = false;
if(player < 4) { if(player < 4) {
auto localplayer = mainGame->ChatLocalPlayer(player);
player = localplayer & 0xf;
if(!(localplayer & 0x10))
play_sound = true;
if(play_sound && mainGame->chkIgnore1->isChecked())
break;
if(!mainGame->dInfo.isTag) { if(!mainGame->dInfo.isTag) {
if(mainGame->dInfo.isInDuel) { if(mainGame->dInfo.isStarted)
player = mainGame->LocalPlayer(player); player = mainGame->LocalPlayer(player);
if(player == 1 && mainGame->chkIgnore1->isChecked())
break;
}
} else { } else {
if(mainGame->dInfo.isInDuel && !mainGame->dInfo.isFirst) if(mainGame->dInfo.isStarted && !mainGame->dInfo.isFirst)
player ^= 2; player ^= 2;
if(player == 0) if(player == 0)
player = 0; player = 0;
...@@ -881,11 +890,10 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -881,11 +890,10 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
player = 3; player = 3;
else else
player = 10; player = 10;
if(mainGame->dInfo.isStarted && (player == 1 || player == 3) && mainGame->chkIgnore1->isChecked())
break;
} }
} else { } else {
if(player == 8) { //system custom message. if(player == 8) { //system custom message.
play_sound = true;
if(mainGame->chkIgnore1->isChecked()) if(mainGame->chkIgnore1->isChecked())
break; break;
} else if(player < 11 || player > 19) { } else if(player < 11 || player > 19) {
...@@ -897,7 +905,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) { ...@@ -897,7 +905,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, unsigned int len) {
wchar_t msg[256]; wchar_t msg[256];
BufferIO::CopyWStr(pkt->msg, msg, 256); BufferIO::CopyWStr(pkt->msg, msg, 256);
mainGame->gMutex.lock(); mainGame->gMutex.lock();
mainGame->AddChatMsg(msg, player); mainGame->AddChatMsg(msg, player, play_sound);
mainGame->gMutex.unlock(); mainGame->gMutex.unlock();
break; break;
} }
...@@ -2894,7 +2902,7 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) { ...@@ -2894,7 +2902,7 @@ int DuelClient::ClientAnalyze(unsigned char* msg, unsigned int len) {
pcard->overlayTarget = olcard; pcard->overlayTarget = olcard;
pcard->location = LOCATION_OVERLAY; pcard->location = LOCATION_OVERLAY;
pcard->sequence = (unsigned char)(olcard->overlayed.size() - 1); pcard->sequence = (unsigned char)(olcard->overlayed.size() - 1);
if (olcard->location == LOCATION_MZONE) { if (olcard->location & LOCATION_ONFIELD) {
mainGame->gMutex.lock(); mainGame->gMutex.lock();
mainGame->dField.MoveCard(pcard, 10); mainGame->dField.MoveCard(pcard, 10);
if (pl == 0x2) if (pl == 0x2)
......
...@@ -62,7 +62,6 @@ private: ...@@ -62,7 +62,6 @@ private:
static unsigned char response_buf[SIZE_RETURN_VALUE]; static unsigned char response_buf[SIZE_RETURN_VALUE];
static unsigned int response_len; static unsigned int response_len;
static unsigned int watching; static unsigned int watching;
static unsigned char selftype;
static bool is_host; static bool is_host;
static event_base* client_base; static event_base* client_base;
static bufferevent* client_bev; static bufferevent* client_bev;
...@@ -82,7 +81,7 @@ public: ...@@ -82,7 +81,7 @@ public:
static unsigned short temp_port; static unsigned short temp_port;
static unsigned short temp_ver; static unsigned short temp_ver;
static bool try_needed; static bool try_needed;
static unsigned char selftype;
static bool StartClient(unsigned int ip, unsigned short port, bool create_game = true); static bool StartClient(unsigned int ip, unsigned short port, bool create_game = true);
static void ConnectTimeout(evutil_socket_t fd, short events, void* arg); static void ConnectTimeout(evutil_socket_t fd, short events, void* arg);
static void StopClient(bool is_exiting = false); static void StopClient(bool is_exiting = false);
......
...@@ -1947,7 +1947,7 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) { ...@@ -1947,7 +1947,7 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
} }
#endif #endif
case CHECKBOX_DISABLE_CHAT: { case CHECKBOX_DISABLE_CHAT: {
bool show = !mainGame->is_building; bool show = (mainGame->is_building && !mainGame->is_siding) ? false : true;
mainGame->wChat->setVisible(show); mainGame->wChat->setVisible(show);
/* /*
if(!show) if(!show)
......
...@@ -275,7 +275,7 @@ bool Game::Initialize() { ...@@ -275,7 +275,7 @@ bool Game::Initialize() {
SetWindowsIcon(); SetWindowsIcon();
//main menu //main menu
wchar_t strbuf[256]; wchar_t strbuf[256];
myswprintf(strbuf, L"KoishiPro %X.0%X.%X Snowdream", PRO_VERSION >> 12, (PRO_VERSION >> 4) & 0xff, PRO_VERSION & 0xf); myswprintf(strbuf, L"KoishiPro %X.0%X.%X Natsukoi", PRO_VERSION >> 12, (PRO_VERSION >> 4) & 0xff, PRO_VERSION & 0xf);
wMainMenu = env->addWindow(rect<s32>(370, 200, 650, 415), false, strbuf); wMainMenu = env->addWindow(rect<s32>(370, 200, 650, 415), false, strbuf);
wMainMenu->getCloseButton()->setVisible(false); wMainMenu->getCloseButton()->setVisible(false);
btnLanMode = env->addButton(rect<s32>(10, 30, 270, 60), wMainMenu, BUTTON_LAN_MODE, dataManager.GetSysString(1200)); btnLanMode = env->addButton(rect<s32>(10, 30, 270, 60), wMainMenu, BUTTON_LAN_MODE, dataManager.GetSysString(1200));
...@@ -806,7 +806,7 @@ bool Game::Initialize() { ...@@ -806,7 +806,7 @@ bool Game::Initialize() {
btnShuffleDeck = env->addButton(rect<s32>(5, 99, 55, 120), wDeckEdit, BUTTON_SHUFFLE_DECK, dataManager.GetSysString(1307)); btnShuffleDeck = env->addButton(rect<s32>(5, 99, 55, 120), wDeckEdit, BUTTON_SHUFFLE_DECK, dataManager.GetSysString(1307));
btnSortDeck = env->addButton(rect<s32>(60, 99, 110, 120), wDeckEdit, BUTTON_SORT_DECK, dataManager.GetSysString(1305)); btnSortDeck = env->addButton(rect<s32>(60, 99, 110, 120), wDeckEdit, BUTTON_SORT_DECK, dataManager.GetSysString(1305));
btnClearDeck = env->addButton(rect<s32>(115, 99, 165, 120), wDeckEdit, BUTTON_CLEAR_DECK, dataManager.GetSysString(1304)); btnClearDeck = env->addButton(rect<s32>(115, 99, 165, 120), wDeckEdit, BUTTON_CLEAR_DECK, dataManager.GetSysString(1304));
btnSideOK = env->addButton(rect<s32>(510, 40, 820, 80), 0, BUTTON_SIDE_OK, dataManager.GetSysString(1334)); btnSideOK = env->addButton(rect<s32>(400, 40, 710, 80), 0, BUTTON_SIDE_OK, dataManager.GetSysString(1334));
btnSideOK->setVisible(false); btnSideOK->setVisible(false);
btnSideShuffle = env->addButton(rect<s32>(310, 100, 370, 130), 0, BUTTON_SHUFFLE_DECK, dataManager.GetSysString(1307)); btnSideShuffle = env->addButton(rect<s32>(310, 100, 370, 130), 0, BUTTON_SHUFFLE_DECK, dataManager.GetSysString(1307));
btnSideShuffle->setVisible(false); btnSideShuffle->setVisible(false);
...@@ -1271,7 +1271,7 @@ std::wstring Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, ...@@ -1271,7 +1271,7 @@ std::wstring Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth,
strBuffer[pbuffer++] = c; strBuffer[pbuffer++] = c;
} }
strBuffer[pbuffer] = 0; strBuffer[pbuffer] = 0;
pControl->setText(strBuffer); if(pControl) pControl->setText(strBuffer);
ret.assign(strBuffer); ret.assign(strBuffer);
return ret; return ret;
} }
...@@ -1435,26 +1435,32 @@ void Game::RefreshBot() { ...@@ -1435,26 +1435,32 @@ void Game::RefreshBot() {
FILE* fp = fopen(GetLocaleDir("bot.conf"), "r"); FILE* fp = fopen(GetLocaleDir("bot.conf"), "r");
if(!fp) if(!fp)
fp = fopen("bot.conf", "r"); fp = fopen("bot.conf", "r");
char linebuf[256]; char linebuf[256]{};
char strbuf[256]; char strbuf[256]{};
if(fp) { if(fp) {
while(fgets(linebuf, 256, fp)) { while(fgets(linebuf, 256, fp)) {
if(linebuf[0] == '#') if(linebuf[0] == '#')
continue; continue;
if(linebuf[0] == '!') { if(linebuf[0] == '!') {
BotInfo newinfo; BotInfo newinfo;
sscanf(linebuf, "!%240[^\n]", strbuf); if (sscanf(linebuf, "!%240[^\n]", strbuf) != 1)
continue;
BufferIO::DecodeUTF8(strbuf, newinfo.name); BufferIO::DecodeUTF8(strbuf, newinfo.name);
fgets(linebuf, 256, fp); if (!fgets(linebuf, 256, fp))
sscanf(linebuf, "%240[^\n]", strbuf); break;
if (sscanf(linebuf, "%240[^\n]", strbuf) != 1)
continue;
#ifndef _WIN32 #ifndef _WIN32
bool skipRandom = !!strstr(strbuf, "Random="); bool skipRandom = !!strstr(strbuf, "Random=");
#endif #endif
BufferIO::DecodeUTF8(strbuf, newinfo.command); BufferIO::DecodeUTF8(strbuf, newinfo.command);
fgets(linebuf, 256, fp); if (!fgets(linebuf, 256, fp))
sscanf(linebuf, "%240[^\n]", strbuf); break;
if (sscanf(linebuf, "%240[^\n]", strbuf) != 1)
continue;
BufferIO::DecodeUTF8(strbuf, newinfo.desc); BufferIO::DecodeUTF8(strbuf, newinfo.desc);
fgets(linebuf, 256, fp); if (!fgets(linebuf, 256, fp))
break;
#ifndef _WIN32 #ifndef _WIN32
if(skipRandom) { if(skipRandom) {
continue; continue;
...@@ -1493,126 +1499,140 @@ bool Game::LoadConfigFromFile(const char* file) { ...@@ -1493,126 +1499,140 @@ bool Game::LoadConfigFromFile(const char* file) {
if(!fp){ if(!fp){
return false; return false;
} }
char linebuf[256]; char linebuf[256]{};
char strbuf[32]; char strbuf[64]{};
char valbuf[256]; char valbuf[256]{};
wchar_t wstr[256]; wchar_t wstr[256]{};
while(fgets(linebuf, 256, fp)) { while(fgets(linebuf, 256, fp)) {
sscanf(linebuf, "%s = %s", strbuf, valbuf); if (sscanf(linebuf, "%63s = %255s", strbuf, valbuf) != 2)
continue;
if(!strcmp(strbuf, "antialias")) { if(!strcmp(strbuf, "antialias")) {
gameConf.antialias = atoi(valbuf); gameConf.antialias = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "use_d3d")) { } else if(!strcmp(strbuf, "use_d3d")) {
gameConf.use_d3d = atoi(valbuf) > 0; gameConf.use_d3d = strtol(valbuf, nullptr, 10) > 0;
} else if(!strcmp(strbuf, "use_image_scale")) { } else if(!strcmp(strbuf, "use_image_scale")) {
gameConf.use_image_scale = atoi(valbuf) > 0; gameConf.use_image_scale = strtol(valbuf, nullptr, 10) > 0;
} else if(!strcmp(strbuf, "pro_version")) { } else if(!strcmp(strbuf, "pro_version")) {
PRO_VERSION = atoi(valbuf); PRO_VERSION = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "errorlog")) { } else if(!strcmp(strbuf, "errorlog")) {
enable_log = atoi(valbuf); unsigned int val = strtol(valbuf, nullptr, 10);
enable_log = val & 0xff;
} else if(!strcmp(strbuf, "textfont")) { } else if(!strcmp(strbuf, "textfont")) {
BufferIO::DecodeUTF8(valbuf, wstr); int textfontsize = 0;
int textfontsize = gameConf.textfontsize; if (sscanf(linebuf, "%63s = %255s %d", strbuf, valbuf, &textfontsize) != 3)
sscanf(linebuf, "%s = %s %d", strbuf, valbuf, &textfontsize); continue;
gameConf.textfontsize = textfontsize; gameConf.textfontsize = textfontsize;
BufferIO::DecodeUTF8(valbuf, wstr);
BufferIO::CopyWStr(wstr, gameConf.textfont, 256); BufferIO::CopyWStr(wstr, gameConf.textfont, 256);
} else if(!strcmp(strbuf, "numfont")) { } else if(!strcmp(strbuf, "numfont")) {
BufferIO::DecodeUTF8(valbuf, wstr); BufferIO::DecodeUTF8(valbuf, wstr);
BufferIO::CopyWStr(wstr, gameConf.numfont, 256); BufferIO::CopyWStr(wstr, gameConf.numfont, 256);
} else if(!strcmp(strbuf, "serverport")) { } else if(!strcmp(strbuf, "serverport")) {
gameConf.serverport = atoi(valbuf); gameConf.serverport = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "lasthost")) { } else if(!strcmp(strbuf, "lasthost")) {
BufferIO::DecodeUTF8(valbuf, wstr); BufferIO::DecodeUTF8(valbuf, wstr);
BufferIO::CopyWStr(wstr, gameConf.lasthost, 100); BufferIO::CopyWStr(wstr, gameConf.lasthost, 100);
} else if(!strcmp(strbuf, "lastport")) { } else if(!strcmp(strbuf, "lastport")) {
gameConf.lastport = (unsigned short)atoi(valbuf); gameConf.lastport = (unsigned short)strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "roompass")) { } else if(!strcmp(strbuf, "roompass")) {
BufferIO::DecodeUTF8(valbuf, wstr); BufferIO::DecodeUTF8(valbuf, wstr);
BufferIO::CopyWStr(wstr, gameConf.roompass, 20); BufferIO::CopyWStr(wstr, gameConf.roompass, 20);
} else if(!strcmp(strbuf, "automonsterpos")) { } else if(!strcmp(strbuf, "automonsterpos")) {
gameConf.chkMAutoPos = atoi(valbuf); gameConf.chkMAutoPos = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "autospellpos")) { } else if(!strcmp(strbuf, "autospellpos")) {
gameConf.chkSTAutoPos = atoi(valbuf); gameConf.chkSTAutoPos = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "randompos")) { } else if(!strcmp(strbuf, "randompos")) {
gameConf.chkRandomPos = atoi(valbuf); gameConf.chkRandomPos = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "autochain")) { } else if(!strcmp(strbuf, "autochain")) {
gameConf.chkAutoChain = atoi(valbuf); gameConf.chkAutoChain = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "waitchain")) { } else if(!strcmp(strbuf, "waitchain")) {
gameConf.chkWaitChain = atoi(valbuf); gameConf.chkWaitChain = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "showchain")) { } else if(!strcmp(strbuf, "showchain")) {
gameConf.chkDefaultShowChain = atoi(valbuf); gameConf.chkDefaultShowChain = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "mute_opponent")) { } else if(!strcmp(strbuf, "mute_opponent")) {
gameConf.chkIgnore1 = atoi(valbuf); gameConf.chkIgnore1 = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "mute_spectators")) { } else if(!strcmp(strbuf, "mute_spectators")) {
gameConf.chkIgnore2 = atoi(valbuf); gameConf.chkIgnore2 = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "use_lflist")) { } else if(!strcmp(strbuf, "use_lflist")) {
gameConf.use_lflist = atoi(valbuf); gameConf.use_lflist = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "default_lflist")) { } else if(!strcmp(strbuf, "default_lflist")) {
gameConf.default_lflist = atoi(valbuf); gameConf.default_lflist = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "default_rule")) { } else if(!strcmp(strbuf, "default_rule")) {
gameConf.default_rule = atoi(valbuf); gameConf.default_rule = strtol(valbuf, nullptr, 10);
if(gameConf.default_rule <= 0) if(gameConf.default_rule <= 0)
gameConf.default_rule = YGOPRO_DEFAULT_DUEL_RULE; gameConf.default_rule = YGOPRO_DEFAULT_DUEL_RULE;
} else if(!strcmp(strbuf, "hide_setname")) { } else if(!strcmp(strbuf, "hide_setname")) {
gameConf.hide_setname = atoi(valbuf); gameConf.hide_setname = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "hide_hint_button")) { } else if(!strcmp(strbuf, "hide_hint_button")) {
gameConf.hide_hint_button = atoi(valbuf); gameConf.hide_hint_button = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "control_mode")) { } else if(!strcmp(strbuf, "control_mode")) {
gameConf.control_mode = atoi(valbuf); gameConf.control_mode = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "draw_field_spell")) { } else if(!strcmp(strbuf, "draw_field_spell")) {
gameConf.draw_field_spell = atoi(valbuf); gameConf.draw_field_spell = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "separate_clear_button")) { } else if(!strcmp(strbuf, "separate_clear_button")) {
gameConf.separate_clear_button = atoi(valbuf); gameConf.separate_clear_button = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "auto_search_limit")) { } else if(!strcmp(strbuf, "auto_search_limit")) {
gameConf.auto_search_limit = atoi(valbuf); gameConf.auto_search_limit = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "search_multiple_keywords")) { } else if(!strcmp(strbuf, "search_multiple_keywords")) {
gameConf.search_multiple_keywords = atoi(valbuf); gameConf.search_multiple_keywords = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "search_regex")) { } else if(!strcmp(strbuf, "search_regex")) {
gameConf.search_regex = atoi(valbuf); gameConf.search_regex = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "ignore_deck_changes")) { } else if(!strcmp(strbuf, "ignore_deck_changes")) {
gameConf.chkIgnoreDeckChanges = atoi(valbuf); gameConf.chkIgnoreDeckChanges = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "default_ot")) { } else if(!strcmp(strbuf, "default_ot")) {
gameConf.defaultOT = atoi(valbuf); gameConf.defaultOT = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "enable_bot_mode")) { } else if(!strcmp(strbuf, "enable_bot_mode")) {
gameConf.enable_bot_mode = atoi(valbuf); gameConf.enable_bot_mode = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "quick_animation")) { } else if(!strcmp(strbuf, "quick_animation")) {
gameConf.quick_animation = atoi(valbuf); gameConf.quick_animation = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "auto_save_replay")) { } else if(!strcmp(strbuf, "auto_save_replay")) {
gameConf.auto_save_replay = atoi(valbuf); gameConf.auto_save_replay = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "draw_single_chain")) { } else if(!strcmp(strbuf, "draw_single_chain")) {
gameConf.draw_single_chain = atoi(valbuf); gameConf.draw_single_chain = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "hide_player_name")) { } else if(!strcmp(strbuf, "hide_player_name")) {
gameConf.hide_player_name = atoi(valbuf); gameConf.hide_player_name = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "prefer_expansion_script")) { } else if(!strcmp(strbuf, "prefer_expansion_script")) {
gameConf.prefer_expansion_script = atoi(valbuf); gameConf.prefer_expansion_script = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "ask_mset")) { } else if(!strcmp(strbuf, "ask_mset")) {
gameConf.ask_mset = atoi(valbuf); gameConf.ask_mset = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "window_maximized")) { } else if(!strcmp(strbuf, "window_maximized")) {
gameConf.window_maximized = atoi(valbuf) > 0; gameConf.window_maximized = strtol(valbuf, nullptr, 10) > 0;
} else if(!strcmp(strbuf, "window_width")) { } else if(!strcmp(strbuf, "window_width")) {
gameConf.window_width = atoi(valbuf); gameConf.window_width = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "window_height")) { } else if(!strcmp(strbuf, "window_height")) {
gameConf.window_height = atoi(valbuf); gameConf.window_height = strtol(valbuf, nullptr, 10);
} else if(!strcmp(strbuf, "resize_popup_menu")) { } else if(!strcmp(strbuf, "resize_popup_menu")) {
gameConf.resize_popup_menu = atoi(valbuf) > 0; gameConf.resize_popup_menu = strtol(valbuf, nullptr, 10) > 0;
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
} else if(!strcmp(strbuf, "enable_sound")) { } else if(!strcmp(strbuf, "enable_sound")) {
gameConf.enable_sound = atoi(valbuf) > 0; gameConf.enable_sound = strtol(valbuf, nullptr, 10) > 0;
} else if(!strcmp(strbuf, "sound_volume")) { } else if(!strcmp(strbuf, "sound_volume")) {
gameConf.sound_volume = atof(valbuf) / 100; int vol = strtol(valbuf, nullptr, 10);
if (vol < 0)
vol = 0;
else if (vol > 100)
vol = 100;
gameConf.sound_volume = (double)vol / 100;
} else if(!strcmp(strbuf, "enable_music")) { } else if(!strcmp(strbuf, "enable_music")) {
gameConf.enable_music = atoi(valbuf) > 0; gameConf.enable_music = strtol(valbuf, nullptr, 10) > 0;
} else if(!strcmp(strbuf, "music_volume")) { } else if(!strcmp(strbuf, "music_volume")) {
gameConf.music_volume = atof(valbuf) / 100; int vol = strtol(valbuf, nullptr, 10);
if (vol < 0)
vol = 0;
else if (vol > 100)
vol = 100;
gameConf.music_volume = (double)vol / 100;
} else if(!strcmp(strbuf, "music_mode")) { } else if(!strcmp(strbuf, "music_mode")) {
gameConf.music_mode = atoi(valbuf); gameConf.music_mode = strtol(valbuf, nullptr, 10);
#endif #endif
} else if(!strcmp(strbuf, "enable_pendulum_scale")) { } else if(!strcmp(strbuf, "enable_pendulum_scale")) {
gameConf.chkEnablePScale = atoi(valbuf); gameConf.chkEnablePScale = strtol(valbuf, nullptr, 10);
} else if (!strcmp(strbuf, "skin_index")) { } else if (!strcmp(strbuf, "skin_index")) {
gameConf.skin_index = atoi(valbuf); gameConf.skin_index = atoi(valbuf);
} else { } else {
// options allowing multiple words // options allowing multiple words
sscanf(linebuf, "%s = %240[^\n]", strbuf, valbuf); if (sscanf(linebuf, "%63s = %240[^\n]", strbuf, valbuf) != 2)
continue;
if (!strcmp(strbuf, "nickname")) { if (!strcmp(strbuf, "nickname")) {
BufferIO::DecodeUTF8(valbuf, wstr); BufferIO::DecodeUTF8(valbuf, wstr);
BufferIO::CopyWStr(wstr, gameConf.nickname, 20); BufferIO::CopyWStr(wstr, gameConf.nickname, 20);
...@@ -1769,7 +1789,7 @@ void Game::SaveConfig() { ...@@ -1769,7 +1789,7 @@ void Game::SaveConfig() {
fprintf(fp, "use_image_scale = %d\n", gameConf.use_image_scale ? 1 : 0); fprintf(fp, "use_image_scale = %d\n", gameConf.use_image_scale ? 1 : 0);
fprintf(fp, "pro_version = %d\n", PRO_VERSION); fprintf(fp, "pro_version = %d\n", PRO_VERSION);
fprintf(fp, "antialias = %d\n", gameConf.antialias); fprintf(fp, "antialias = %d\n", gameConf.antialias);
fprintf(fp, "errorlog = %d\n", enable_log); fprintf(fp, "errorlog = %u\n", enable_log);
BufferIO::CopyWStr(ebNickName->getText(), gameConf.nickname, 20); BufferIO::CopyWStr(ebNickName->getText(), gameConf.nickname, 20);
BufferIO::EncodeUTF8(gameConf.nickname, linebuf); BufferIO::EncodeUTF8(gameConf.nickname, linebuf);
fprintf(fp, "nickname = %s\n", linebuf); fprintf(fp, "nickname = %s\n", linebuf);
...@@ -1830,10 +1850,8 @@ void Game::SaveConfig() { ...@@ -1830,10 +1850,8 @@ void Game::SaveConfig() {
fprintf(fp, "enable_music = %d\n", (chkEnableMusic->isChecked() ? 1 : 0)); fprintf(fp, "enable_music = %d\n", (chkEnableMusic->isChecked() ? 1 : 0));
fprintf(fp, "#Volume of sound and music, between 0 and 100\n"); fprintf(fp, "#Volume of sound and music, between 0 and 100\n");
int vol = gameConf.sound_volume * 100; int vol = gameConf.sound_volume * 100;
if(vol < 0) vol = 0; else if(vol > 100) vol = 100;
fprintf(fp, "sound_volume = %d\n", vol); fprintf(fp, "sound_volume = %d\n", vol);
vol = gameConf.music_volume * 100; vol = gameConf.music_volume * 100;
if(vol < 0) vol = 0; else if(vol > 100) vol = 100;
fprintf(fp, "music_volume = %d\n", vol); fprintf(fp, "music_volume = %d\n", vol);
fprintf(fp, "music_mode = %d\n", (chkMusicMode->isChecked() ? 1 : 0)); fprintf(fp, "music_mode = %d\n", (chkMusicMode->isChecked() ? 1 : 0));
#endif #endif
...@@ -1960,7 +1978,7 @@ void Game::AddLog(const wchar_t* msg, int param) { ...@@ -1960,7 +1978,7 @@ void Game::AddLog(const wchar_t* msg, int param) {
lstLog->setSelected(-1); lstLog->setSelected(-1);
} }
} }
void Game::AddChatMsg(const wchar_t* msg, int player) { void Game::AddChatMsg(const wchar_t* msg, int player, bool play_sound) {
for(int i = 7; i > 0; --i) { for(int i = 7; i > 0; --i) {
chatMsg[i] = chatMsg[i - 1]; chatMsg[i] = chatMsg[i - 1];
chatTiming[i] = chatTiming[i - 1]; chatTiming[i] = chatTiming[i - 1];
...@@ -1971,23 +1989,22 @@ void Game::AddChatMsg(const wchar_t* msg, int player) { ...@@ -1971,23 +1989,22 @@ void Game::AddChatMsg(const wchar_t* msg, int player) {
chatType[0] = player; chatType[0] = player;
if(gameConf.hide_player_name && player < 4) if(gameConf.hide_player_name && player < 4)
player = 10; player = 10;
if(play_sound)
soundManager.PlaySoundEffect(SOUND_CHAT);
switch(player) { switch(player) {
case 0: //from host case 0: //from host
chatMsg[0].append(dInfo.hostname); chatMsg[0].append(dInfo.hostname);
chatMsg[0].append(L": "); chatMsg[0].append(L": ");
break; break;
case 1: //from client case 1: //from client
soundManager.PlaySoundEffect(SOUND_CHAT);
chatMsg[0].append(dInfo.clientname); chatMsg[0].append(dInfo.clientname);
chatMsg[0].append(L": "); chatMsg[0].append(L": ");
break; break;
case 2: //host tag case 2: //host tag
soundManager.PlaySoundEffect(SOUND_CHAT);
chatMsg[0].append(dInfo.hostname_tag); chatMsg[0].append(dInfo.hostname_tag);
chatMsg[0].append(L": "); chatMsg[0].append(L": ");
break; break;
case 3: //client tag case 3: //client tag
soundManager.PlaySoundEffect(SOUND_CHAT);
chatMsg[0].append(dInfo.clientname_tag); chatMsg[0].append(dInfo.clientname_tag);
chatMsg[0].append(L": "); chatMsg[0].append(L": ");
break; break;
...@@ -1996,7 +2013,6 @@ void Game::AddChatMsg(const wchar_t* msg, int player) { ...@@ -1996,7 +2013,6 @@ void Game::AddChatMsg(const wchar_t* msg, int player) {
chatMsg[0].append(L": "); chatMsg[0].append(L": ");
break; break;
case 8: //system custom message, no prefix. case 8: //system custom message, no prefix.
soundManager.PlaySoundEffect(SOUND_CHAT);
chatMsg[0].append(L"[System]: "); chatMsg[0].append(L"[System]: ");
break; break;
case 9: //error message case 9: //error message
...@@ -2160,12 +2176,47 @@ void Game::CloseDuelWindow() { ...@@ -2160,12 +2176,47 @@ void Game::CloseDuelWindow() {
lstHostList->clear(); lstHostList->clear();
DuelClient::hosts.clear(); DuelClient::hosts.clear();
ClearTextures(); ClearTextures();
ResizeChatInputWindow();
closeDoneSignal.Set(); closeDoneSignal.Set();
} }
int Game::LocalPlayer(int player) const { int Game::LocalPlayer(int player) const {
int pid = player ? 1 : 0; int pid = player ? 1 : 0;
return dInfo.isFirst ? pid : 1 - pid; return dInfo.isFirst ? pid : 1 - pid;
} }
int Game::OppositePlayer(int player) {
auto player_side_bit = dInfo.isTag ? 0x2 : 0x1;
return player ^ player_side_bit;
}
int Game::ChatLocalPlayer(int player) {
if(player > 3)
return player;
bool is_self;
if(dInfo.isStarted || is_siding) {
if(dInfo.isInDuel)
// when in duel
player = mainGame->dInfo.isFirst ? player : OppositePlayer(player);
else {
// when changing side or waiting tp result
auto selftype_boundary = dInfo.isTag ? 2 : 1;
if(DuelClient::selftype >= selftype_boundary && DuelClient::selftype < 4)
player = OppositePlayer(player);
}
if (DuelClient::selftype >= 4) {
is_self = false;
} else if (dInfo.isTag) {
is_self = (player & 0x2) == 0 && (player & 0x1) == (DuelClient::selftype & 0x1);
} else {
is_self = player == 0;
}
} else {
// when in lobby
is_self = player == DuelClient::selftype;
}
if(dInfo.isTag && (player == 1 || player == 2)) {
player = 3 - player;
}
return player | (is_self ? 0x10 : 0);
}
const wchar_t* Game::LocalName(int local_player) { const wchar_t* Game::LocalName(int local_player) {
return local_player == 0 ? dInfo.hostname : dInfo.clientname; return local_player == 0 ? dInfo.hostname : dInfo.clientname;
} }
...@@ -2250,7 +2301,7 @@ void Game::OnResize() { ...@@ -2250,7 +2301,7 @@ void Game::OnResize() {
stStar->setRelativePosition(Resize(10, 62 + 100 / 6, 70, 82 + 100 / 6)); stStar->setRelativePosition(Resize(10, 62 + 100 / 6, 70, 82 + 100 / 6));
stSearch->setRelativePosition(Resize(205, 62 + 100 / 6, 280, 82 + 100 / 6)); stSearch->setRelativePosition(Resize(205, 62 + 100 / 6, 280, 82 + 100 / 6));
stScale->setRelativePosition(Resize(105, 62 + 100 / 6, 165, 82 + 100 / 6)); stScale->setRelativePosition(Resize(105, 62 + 100 / 6, 165, 82 + 100 / 6));
btnSideOK->setRelativePosition(Resize(510, 40, 820, 80)); btnSideOK->setRelativePosition(Resize(400, 40, 710, 80));
btnSideShuffle->setRelativePosition(Resize(310, 100, 370, 130)); btnSideShuffle->setRelativePosition(Resize(310, 100, 370, 130));
btnSideSort->setRelativePosition(Resize(375, 100, 435, 130)); btnSideSort->setRelativePosition(Resize(375, 100, 435, 130));
btnSideReload->setRelativePosition(Resize(440, 100, 500, 130)); btnSideReload->setRelativePosition(Resize(440, 100, 500, 130));
...@@ -2344,8 +2395,7 @@ void Game::OnResize() { ...@@ -2344,8 +2395,7 @@ void Game::OnResize() {
btnM2->setRelativePosition(Resize(160, 0, 210, 20)); btnM2->setRelativePosition(Resize(160, 0, 210, 20));
btnEP->setRelativePosition(Resize(320, 0, 370, 20)); btnEP->setRelativePosition(Resize(320, 0, 370, 20));
wChat->setRelativePosition(recti(wInfos->getRelativePosition().LowerRightCorner.X + 6, window_size.Height - 25, window_size.Width, window_size.Height)); ResizeChatInputWindow();
ebChatInput->setRelativePosition(recti(3, 2, window_size.Width - wChat->getRelativePosition().UpperLeftCorner.X - 6, 22));
btnLeaveGame->setRelativePosition(Resize(205, 5, 295, 80)); btnLeaveGame->setRelativePosition(Resize(205, 5, 295, 80));
wReplayControl->setRelativePosition(Resize(205, 143, 295, 273)); wReplayControl->setRelativePosition(Resize(205, 143, 295, 273));
...@@ -2368,6 +2418,12 @@ void Game::OnResize() { ...@@ -2368,6 +2418,12 @@ void Game::OnResize() {
btnBigCardZoomOut->setRelativePosition(Resize(205, 180, 295, 215)); btnBigCardZoomOut->setRelativePosition(Resize(205, 180, 295, 215));
btnBigCardClose->setRelativePosition(Resize(205, 230, 295, 265)); btnBigCardClose->setRelativePosition(Resize(205, 230, 295, 265));
} }
void Game::ResizeChatInputWindow() {
s32 x = wInfos->getRelativePosition().LowerRightCorner.X + 6;
if(is_building) x = 802 * xScale;
wChat->setRelativePosition(recti(x, window_size.Height - 25, window_size.Width, window_size.Height));
ebChatInput->setRelativePosition(recti(3, 2, window_size.Width - wChat->getRelativePosition().UpperLeftCorner.X - 6, 22));
}
recti Game::Resize(s32 x, s32 y, s32 x2, s32 y2) { recti Game::Resize(s32 x, s32 y, s32 x2, s32 y2) {
x = x * xScale; x = x * xScale;
y = y * yScale; y = y * yScale;
......
...@@ -210,7 +210,7 @@ public: ...@@ -210,7 +210,7 @@ public:
void ShowCardInfo(int code, bool resize = false); void ShowCardInfo(int code, bool resize = false);
void ClearCardInfo(int player = 0); void ClearCardInfo(int player = 0);
void AddLog(const wchar_t* msg, int param = 0); void AddLog(const wchar_t* msg, int param = 0);
void AddChatMsg(const wchar_t* msg, int player); void AddChatMsg(const wchar_t* msg, int player, bool play_sound = false);
void ClearChatMsg(); void ClearChatMsg();
void AddDebugMsg(const char* msgbuf); void AddDebugMsg(const char* msgbuf);
void ErrorLog(const char* msgbuf); void ErrorLog(const char* msgbuf);
...@@ -221,6 +221,8 @@ public: ...@@ -221,6 +221,8 @@ public:
void CloseDuelWindow(); void CloseDuelWindow();
int LocalPlayer(int player) const; int LocalPlayer(int player) const;
int OppositePlayer(int player);
int ChatLocalPlayer(int player);
const wchar_t* LocalName(int local_player); const wchar_t* LocalName(int local_player);
const char* GetLocaleDir(const char* dir); const char* GetLocaleDir(const char* dir);
const wchar_t* GetLocaleDirWide(const char* dir); const wchar_t* GetLocaleDirWide(const char* dir);
...@@ -238,6 +240,7 @@ public: ...@@ -238,6 +240,7 @@ public:
} }
void OnResize(); void OnResize();
void ResizeChatInputWindow();
recti Resize(s32 x, s32 y, s32 x2, s32 y2); recti Resize(s32 x, s32 y, s32 x2, s32 y2);
recti Resize(s32 x, s32 y, s32 x2, s32 y2, s32 dx, s32 dy, s32 dx2, s32 dy2); recti Resize(s32 x, s32 y, s32 x2, s32 y2, s32 dx, s32 dy, s32 dx2, s32 dy2);
position2di Resize(s32 x, s32 y); position2di Resize(s32 x, s32 y);
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
#import <CoreFoundation/CoreFoundation.h> #import <CoreFoundation/CoreFoundation.h>
#endif #endif
int enable_log = 0; unsigned int enable_log = 0x3;
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
bool exit_on_return = false; bool exit_on_return = false;
bool auto_watch_mode = false; bool auto_watch_mode = false;
......
<<<<<<< HEAD
1 ICON "ygopro.ico" 1 ICON "ygopro.ico"
1 VERSIONINFO 1 VERSIONINFO
...@@ -25,3 +26,32 @@ BEGIN ...@@ -25,3 +26,32 @@ BEGIN
VALUE "Translation", 0x804, 1200 VALUE "Translation", 0x804, 1200
END END
END END
=======
1 ICON "ygopro.ico"
1 VERSIONINFO
FILEVERSION 1, 0, 36, 0
PRODUCTVERSION 1, 0, 36, 0
FILEOS 0x4
FILETYPE 0x1
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "080404b0"
BEGIN
VALUE "FileDescription", "KoishiPro"
VALUE "InternalName", "KoishiPro"
VALUE "LegalCopyright", "Copyright (C) 2023 Nanahira"
VALUE "OriginalFilename", "ygopro.exe"
VALUE "ProductName", "KoishiPro"
VALUE "FileVersion", "Natsukoi"
VALUE "ProductVersion", "Natsukoi"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x804, 1200
END
END
>>>>>>> master
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