Commit e5bcb58e authored by VanillaSalt's avatar VanillaSalt

fix

parent f9979a9f
......@@ -82,7 +82,7 @@ public:
return str - pstr;
}
static int DecodeUTF8(const char * src, wchar_t * wstr) {
char* p = (char*)src;
const char* p = src;
wchar_t* wp = wstr;
while(*p != 0) {
if((*p & 0x80) == 0) {
......
......@@ -214,9 +214,19 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
}
break;
}
case irr::gui::EGET_SCROLL_BAR_CHANGED: {
switch(id) {
case SCROLL_CARDTEXT: {
u32 pos = mainGame->scrCardText->getPos();
mainGame->SetStaticText(mainGame->stText, mainGame->stText->getRelativePosition().getWidth()-25, mainGame->textFont, mainGame->showingtext, pos);
break;
}
break;
}
}
case irr::gui::EGET_EDITBOX_ENTER: {
switch(id) {
case SCROLL_KEYWORD: {
case EDITBOX_KEYWORD: {
irr::SEvent me;
me.EventType = irr::EET_GUI_EVENT;
me.GUIEvent.EventType = irr::gui::EGET_BUTTON_CLICKED;
......@@ -639,8 +649,8 @@ void DeckBuilder::FilterCards() {
pstr = 0;
auto strpointer = dataManager._strings.begin();
for(code_pointer ptr = dataManager._datas.begin(); ptr != dataManager._datas.end(); ++ptr, ++strpointer) {
CardDataC& data = ptr->second;
CardString& text = strpointer->second;
const CardDataC& data = ptr->second;
const CardString& text = strpointer->second;
if(data.type & TYPE_TOKEN)
continue;
switch(filter_type) {
......
......@@ -305,7 +305,7 @@ void Game::DrawMisc() {
else driver->draw2DImage(imageManager.tLPBar, recti(335, 12, 335 + 290 * dInfo.lp[0] / 8000, 28), recti(0, 0, 16, 16), 0, 0, true);
if(dInfo.lp[1] >= 8000)
driver->draw2DImage(imageManager.tLPBar, recti(696, 12, 986, 28), recti(0, 0, 16, 16), 0, 0, true);
else driver->draw2DImage(imageManager.tLPBar, recti(986 - 290 * dInfo.lp[1] / 8000, 12, 986 , 28), recti(0, 0, 16, 16), 0, 0, true);
else driver->draw2DImage(imageManager.tLPBar, recti(986 - 290 * dInfo.lp[1] / 8000, 12, 986, 28), recti(0, 0, 16, 16), 0, 0, true);
if(lpframe) {
dInfo.lp[lpplayer] -= lpd;
myswprintf(dInfo.strLP[lpplayer], L"%d", dInfo.lp[lpplayer]);
......@@ -666,31 +666,22 @@ void Game::DrawSpec() {
if (attack_sv > 28)
attack_sv = 0;
}
bool showChat=true;
if(hideChat)
{
showChat=false;
bool showChat = true;
if(hideChat) {
showChat = false;
hideChatTimer = 10;
}
else if (hideChatTimer > 0)
{
showChat= false;
} else if(hideChatTimer > 0) {
showChat = false;
hideChatTimer--;
}
int maxChatLines = mainGame->dInfo.isStarted?5:8;
for(int i = 0; i < maxChatLines ; ++i) {
int maxChatLines = mainGame->dInfo.isStarted ? 5 : 8;
for(int i = 0; i < maxChatLines; ++i) {
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]) {
chatTiming[i]--;
if(!showChat && i >2)
continue;
if(!showChat && i > 2)
continue;
int w = textFont->getDimension(chatMsg[i].c_str()).Width;
driver->draw2DRectangle(recti(305, 596 - 20 * i, 307 + w, 616 - 20 * i), 0xa0000000, 0xa0000000, 0xa0000000, 0xa0000000);
textFont->draw(chatMsg[i].c_str(), rect<s32>(305, 595 - 20 * i, 1020, 615 - 20 * i), 0xff000000, false, false);
......@@ -797,7 +788,7 @@ void Game::DrawThumb(code_pointer cp, position2di pos, std::unordered_map<int, i
}
}
void Game::DrawDeckBd() {
wchar_t textBuffer[32];
wchar_t textBuffer[64];
//main deck
driver->draw2DRectangle(recti(310, 137, 410, 157), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(recti(309, 136, 410, 157));
......
......@@ -548,68 +548,43 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
}
case STOC_CHAT: {
STOC_Chat* pkt = (STOC_Chat*)pdata;
wchar_t msg[256];
if(pkt->player < 4) {
int player = pkt->player;
if(player < 4) {
if(mainGame->chkIgnore1->isChecked())
break;
BufferIO::CopyWStr(pkt->msg, msg, 256);
msg[(len - 3) / 2] = 0;
mainGame->gMutex.Lock();
if(!mainGame->dInfo.isTag) {
if(mainGame->dInfo.isStarted)
mainGame->AddChatMsg(msg, mainGame->LocalPlayer(pkt->player));
else
mainGame->AddChatMsg(msg, pkt->player);
player = mainGame->LocalPlayer(player);
} else {
if(mainGame->dInfo.isFirst || !mainGame->dInfo.isStarted) {
if(pkt->player == 0)
mainGame->AddChatMsg(msg, 0);
else if(pkt->player == 1)
mainGame->AddChatMsg(msg, 2);
else if(pkt->player == 2)
mainGame->AddChatMsg(msg, 1);
else if(pkt->player == 3)
mainGame->AddChatMsg(msg, 3);
else
mainGame->AddChatMsg(msg, 10);
} else {
if(pkt->player == 0)
mainGame->AddChatMsg(msg, 1);
else if(pkt->player == 1)
mainGame->AddChatMsg(msg, 3);
else if(pkt->player == 2)
mainGame->AddChatMsg(msg, 0);
else if(pkt->player == 3)
mainGame->AddChatMsg(msg, 2);
else
mainGame->AddChatMsg(msg, 10);
}
if(mainGame->dInfo.isStarted && !mainGame->dInfo.isFirst)
player ^= 2;
if(player == 0)
player = 0;
else if(player == 1)
player = 2;
else if(player == 2)
player = 1;
else if(player == 3)
player = 3;
else
player = 10;
}
mainGame->gMutex.Unlock();
} else if(pkt->player == 8) { //system custom message.
if(mainGame->chkIgnore1->isChecked())
break;
BufferIO::CopyWStr(pkt->msg, msg, 256);
msg[(len - 3) / 2] = 0;
mainGame->gMutex.Lock();
mainGame->AddChatMsg(msg, 8);
mainGame->gMutex.Unlock();
} else if(pkt->player >= 11 && pkt->player<=19) { //system custom message.
BufferIO::CopyWStr(pkt->msg, msg, 256);
msg[(len - 3) / 2] = 0;
mainGame->gMutex.Lock();
mainGame->AddChatMsg(msg, pkt->player);
mainGame->gMutex.Unlock();
} else {
if(mainGame->chkIgnore2->isChecked())
break;
BufferIO::CopyWStr(pkt->msg, msg, 256);
msg[(len - 3) / 2] = 0;
mainGame->gMutex.Lock();
mainGame->AddChatMsg(msg, 10);
mainGame->gMutex.Unlock();
if(player == 8) { //system custom message.
if(mainGame->chkIgnore1->isChecked())
break;
} else if(player < 11 || player > 19) {
if(mainGame->chkIgnore2->isChecked())
break;
player = 10;
}
}
wchar_t msg[256];
BufferIO::CopyWStr(pkt->msg, msg, 256);
msg[(len - 3) / 2] = 0;
mainGame->gMutex.Lock();
mainGame->AddChatMsg(msg, player);
mainGame->gMutex.Unlock();
break;
}
case STOC_HS_PLAYER_ENTER: {
......
......@@ -726,6 +726,11 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
break;
}
case SCROLL_CARDTEXT: {
u32 pos = mainGame->scrCardText->getPos();
mainGame->SetStaticText(mainGame->stText, mainGame->stText->getRelativePosition().getWidth()-25, mainGame->textFont, mainGame->showingtext, pos);
break;
}
break;
}
}
......@@ -822,6 +827,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->stInfo->setText(L"");
mainGame->stDataInfo->setText(L"");
mainGame->stText->setText(L"");
mainGame->scrCardText->setVisible(false);
}
}
break;
......@@ -1304,8 +1310,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(hovered_card->location == LOCATION_HAND && !mainGame->dInfo.is_shuffling && mainGame->dInfo.curMsg != MSG_SHUFFLE_HAND) {
hovered_card->is_hovered = false;
MoveCard(hovered_card, 5);
if(hovered_controler== 0)
mainGame->hideChat=false;
if(hovered_controler == 0)
mainGame->hideChat = false;
}
if(hovered_card->equipTarget)
hovered_card->equipTarget->is_showequip = false;
......@@ -1325,8 +1331,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(hovered_location == LOCATION_HAND) {
mcard->is_hovered = true;
MoveCard(mcard, 5);
if(hovered_controler== 0)
mainGame->hideChat=true;
if(hovered_controler == 0)
mainGame->hideChat = true;
}
if(mcard->equipTarget)
mcard->equipTarget->is_showequip = true;
......@@ -1346,7 +1352,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
if(mcard->type & TYPE_MONSTER) {
myswprintf(formatBuffer, L"%ls", dataManager.GetName(mcard->code));
str.append(formatBuffer);
if(mcard->alias && (mcard->alias < mcard->code - 10 || mcard->alias > mcard->code + 10)) {
if(mcard->alias && (mcard->alias < mcard->code - 10 || mcard->alias > mcard->code + 10)
&& wcscmp(dataManager.GetName(mcard->code), dataManager.GetName(mcard->alias))) {
myswprintf(formatBuffer, L"\n(%ls)", dataManager.GetName(mcard->alias));
str.append(formatBuffer);
}
......@@ -1420,6 +1427,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->stInfo->setText(L"");
mainGame->stDataInfo->setText(L"");
mainGame->stText->setText(L"");
mainGame->scrCardText->setVisible(false);
}
} else {
mainGame->stTip->setVisible(false);
......
......@@ -206,7 +206,11 @@ bool Game::Initialize() {
stInfo->setOverrideColor(SColor(255, 0, 0, 255));
stDataInfo = env->addStaticText(L"", rect<s32>(15, 60, 296, 83), false, true, tabInfo, -1, false);
stDataInfo->setOverrideColor(SColor(255, 0, 0, 255));
stText = env->addStaticText(L"", rect<s32>(15, 83, 296, 324), false, true, tabInfo, -1, false);
stText = env->addStaticText(L"", rect<s32>(15, 83, 287, 324), false, true, tabInfo, -1, false);
scrCardText = env->addScrollBar(false, rect<s32>(267, 83, 287, 324), tabInfo, SCROLL_CARDTEXT);
scrCardText->setLargeStep(1);
scrCardText->setSmallStep(1);
scrCardText->setVisible(false);
//log
irr::gui::IGUITab* tabLog = wInfos->addTab(dataManager.GetSysString(1271));
lstLog = env->addListBox(rect<s32>(10, 10, 290, 290), tabLog, LISTBOX_LOG, false);
......@@ -409,7 +413,7 @@ bool Game::Initialize() {
ebStar = env->addEditBox(L"", rect<s32>(60, 72, 140, 92), true, wFilter);
ebStar->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
env->addStaticText(dataManager.GetSysString(1325), rect<s32>(205, 74, 280, 94), false, false, wFilter);
ebCardName = env->addEditBox(L"", rect<s32>(260, 72, 390, 92), true, wFilter, SCROLL_KEYWORD);
ebCardName = env->addEditBox(L"", rect<s32>(260, 72, 390, 92), true, wFilter, EDITBOX_KEYWORD);
ebCardName->setTextAlignment(irr::gui::EGUIA_CENTER, irr::gui::EGUIA_CENTER);
btnEffectFilter = env->addButton(rect<s32>(345, 28, 390, 69), wFilter, BUTTON_EFFECT_FILTER, dataManager.GetSysString(1326));
btnStartFilter = env->addButton(rect<s32>(210, 96, 390, 118), wFilter, BUTTON_START_FILTER, dataManager.GetSysString(1327));
......@@ -484,8 +488,8 @@ bool Game::Initialize() {
col.setAlpha(224);
env->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col);
}
hideChat=false;
hideChatTimer=0;
hideChat = false;
hideChatTimer = 0;
return true;
}
void Game::MainLoop() {
......@@ -588,16 +592,38 @@ void Game::BuildProjectionMatrix(irr::core::matrix4& mProjection, f32 left, f32
mProjection[11] = 1.0f;
mProjection[14] = znear * zfar / (znear - zfar);
}
void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, wchar_t* text) {
void Game::InitStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, u32 cHeight, irr::gui::CGUITTFont* font, const wchar_t* text) {
SetStaticText(pControl, cWidth, font, text);
if(font->getDimension(dataManager.strBuffer).Height <= cHeight) {
scrCardText->setVisible(false);
return;
}
SetStaticText(pControl, cWidth-25, font, text);
u32 fontheight = font->getDimension(L"A").Height + font->getKerningHeight();
u32 step = (font->getDimension(dataManager.strBuffer).Height - cHeight) / fontheight + 1;
scrCardText->setVisible(true);
scrCardText->setMin(0);
scrCardText->setMax(step);
scrCardText->setPos(0);
}
void Game::SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, u32 pos) {
int pbuffer = 0;
unsigned int _width = 0, w = 0;
u32 _width = 0, _height = 0;
for(int i = 0; text[i] != 0 && i < 1023; ++i) {
w = font->getCharDimension(text[i]).Width;
if(text[i] == L'\n')
u32 w = font->getCharDimension(text[i]).Width;
if(text[i] == L'\n') {
dataManager.strBuffer[pbuffer++] = L'\n';
_width = 0;
else if(_width > 0 && _width + w > cWidth) {
_height++;
if(_height == pos)
pbuffer = 0;
continue;
} else if(_width > 0 && _width + w > cWidth) {
dataManager.strBuffer[pbuffer++] = L'\n';
_width = 0;
_height++;
if(_height == pos)
pbuffer = 0;
}
_width += w;
dataManager.strBuffer[pbuffer++] = text[i];
......@@ -817,14 +843,18 @@ void Game::ShowCardInfo(int code) {
else
myswprintf(&formatBuffer[cd.level + 3], L"%d/%d", cd.attack, cd.defence);
stDataInfo->setText(formatBuffer);
stText->setRelativePosition(irr::core::position2di(15, 83));
stText->setRelativePosition(rect<s32>(15, 83, 287, 324));
scrCardText->setRelativePosition(rect<s32>(267, 83, 287, 324));
} else {
myswprintf(formatBuffer, L"[%ls]", dataManager.FormatType(cd.type));
stInfo->setText(formatBuffer);
stDataInfo->setText(L"");
stText->setRelativePosition(irr::core::position2di(15, 60));
stText->setRelativePosition(rect<s32>(15, 60, 287, 324));
scrCardText->setRelativePosition(rect<s32>(267, 60, 287, 324));
}
SetStaticText(stText, 270, textFont, (wchar_t*)dataManager.GetText(code));
showingtext = dataManager.GetText(code);
const auto& tsize = stText->getRelativePosition();
InitStaticText(stText, tsize.getWidth(), tsize.getHeight(), textFont, showingtext);
}
void Game::AddChatMsg(wchar_t* msg, int player) {
for(int i = 7; i > 0; --i) {
......@@ -835,7 +865,7 @@ void Game::AddChatMsg(wchar_t* msg, int player) {
chatMsg[0].clear();
chatTiming[0] = 1200;
chatType[0] = player;
if (player<11 || player > 19) switch(player) {
switch(player) {
case 0: //from host
chatMsg[0].append(dInfo.hostname);
chatMsg[0].append(L": ");
......@@ -863,7 +893,8 @@ void Game::AddChatMsg(wchar_t* msg, int player) {
chatMsg[0].append(L"[Script error:] ");
break;
default: //from watcher or unknown
chatMsg[0].append(L"[---]: ");
if(player < 11 || player > 19)
chatMsg[0].append(L"[---]: ");
}
chatMsg[0].append(msg);
}
......
......@@ -69,7 +69,8 @@ public:
bool Initialize();
void MainLoop();
void BuildProjectionMatrix(irr::core::matrix4& mProjection, f32 left, f32 right, f32 bottom, f32 top, f32 znear, f32 zfar);
void SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, wchar_t* text);
void InitStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, u32 cHeight, irr::gui::CGUITTFont* font, const wchar_t* text);
void SetStaticText(irr::gui::IGUIStaticText* pControl, u32 cWidth, irr::gui::CGUITTFont* font, const wchar_t* text, u32 pos = 0);
void RefreshDeck(irr::gui::IGUIComboBox* cbDeck);
void RefreshReplay();
void RefreshSingleplay();
......@@ -119,6 +120,7 @@ public:
int waitFrame;
int signalFrame;
int actionParam;
const wchar_t* showingtext;
int showcard;
int showcardcode;
int showcarddif;
......@@ -166,6 +168,7 @@ public:
irr::gui::IGUIStaticText* stInfo;
irr::gui::IGUIStaticText* stDataInfo;
irr::gui::IGUIStaticText* stText;
irr::gui::IGUIScrollBar *scrCardText;
irr::gui::IGUICheckBox* chkAutoPos;
irr::gui::IGUICheckBox* chkRandomPos;
irr::gui::IGUICheckBox* chkAutoChain;
......@@ -436,6 +439,7 @@ extern Game* mainGame;
#define BUTTON_LEAVE_GAME 263
#define BUTTON_CLEAR_LOG 270
#define LISTBOX_LOG 271
#define SCROLL_CARDTEXT 280
#define BUTTON_CATEGORY_OK 300
#define COMBOBOX_DBLFLIST 301
#define COMBOBOX_DBDECKS 302
......@@ -450,7 +454,7 @@ extern Game* mainGame;
#define BUTTON_EFFECT_FILTER 311
#define BUTTON_START_FILTER 312
#define SCROLL_FILTER 314
#define SCROLL_KEYWORD 315
#define EDITBOX_KEYWORD 315
#define BUTTON_REPLAY_START 320
#define BUTTON_REPLAY_PAUSE 321
#define BUTTON_REPLAY_STEP 322
......
......@@ -31,36 +31,30 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break;
}
case BUTTON_JOIN_HOST: {
struct addrinfo hints, *servinfo;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
hints.ai_protocol = 0; /* Any protocol */
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
int status;
char hostname[100];
char ip[20];
int i = 0;
wchar_t* pstr = (wchar_t *)mainGame->ebJoinIP->getText();
while(*pstr && i < 16)
ip[i++] = *pstr++;
ip[i] = 0;
struct addrinfo hints, *servinfo;
memset(&hints, 0, sizeof(struct addrinfo));
hints.ai_family = AF_INET; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* Datagram socket */
hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */
hints.ai_protocol = 0; /* Any protocol */
hints.ai_canonname = NULL;
hints.ai_addr = NULL;
hints.ai_next = NULL;
int status;
char hostname[100];
BufferIO::CopyWStr((wchar_t *)mainGame->ebJoinIP->getText(),hostname,100);
if ((status = getaddrinfo(hostname, NULL, &hints, &servinfo)) == -1) {
//fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
//error handling
}
else
{
inet_ntop(AF_INET, &(((struct sockaddr_in *)servinfo->ai_addr)->sin_addr), ip, 20);
}
unsigned int remote_addr = htonl(inet_addr(ip));
const wchar_t* pstr = mainGame->ebJoinIP->getText();
BufferIO::CopyWStr(pstr, hostname, 100);
if ((status = getaddrinfo(hostname, NULL, &hints, &servinfo)) == -1) {
//fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
//error handling
BufferIO::CopyWStr(pstr, ip, 16);
} else
inet_ntop(AF_INET, &(((struct sockaddr_in *)servinfo->ai_addr)->sin_addr), ip, 20);
freeaddrinfo(servinfo);
unsigned int remote_addr = htonl(inet_addr(ip));
unsigned int remote_port = _wtoi(mainGame->ebJoinPort->getText());
BufferIO::CopyWStr(mainGame->ebJoinIP->getText(), mainGame->gameConf.lastip, 20);
BufferIO::CopyWStr(pstr, mainGame->gameConf.lastip, 20);
BufferIO::CopyWStr(mainGame->ebJoinPort->getText(), mainGame->gameConf.lastport, 20);
if(DuelClient::StartClient(remote_addr, remote_port, false)) {
mainGame->btnCreateHost->setEnabled(false);
......@@ -170,6 +164,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->stInfo->setText(L"");
mainGame->stDataInfo->setText(L"");
mainGame->stText->setText(L"");
mainGame->scrCardText->setVisible(false);
mainGame->wReplayControl->setVisible(true);
mainGame->btnReplayStart->setVisible(false);
mainGame->btnReplayPause->setVisible(true);
......
......@@ -63,6 +63,7 @@ int SingleMode::SinglePlayThread(void* param) {
mainGame->stInfo->setText(L"");
mainGame->stDataInfo->setText(L"");
mainGame->stText->setText(L"");
mainGame->scrCardText->setVisible(false);
mainGame->wPhase->setVisible(true);
mainGame->dField.panel = 0;
mainGame->dField.hovered_card = 0;
......
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