Commit 7064fc4b authored by nanahira's avatar nanahira

Merge branch 'master' into server

parents c9b0fe6f 600b4728
...@@ -2,9 +2,9 @@ ...@@ -2,9 +2,9 @@
set -x set -x
set -o errexit set -o errexit
# ygopro-database # ygopro-database
apt update && apt -y install wget git p7zip-full apt update && apt -y install wget git libarchive-tools
git clone --depth=1 https://code.mycard.moe/nanahira/ygopro-database git clone --depth=1 https://code.mycard.moe/mycard/ygopro-database
cp -rf ./ygopro-database/locales/$TARGET_LOCALE/* . cp -rf ./ygopro-database/locales/$TARGET_LOCALE/* .
# ygopro-images # ygopro-images
wget -O ygopro-images.zip https://cdn01.moecube.com/images/ygopro-images-${TARGET_LOCALE}.zip mkdir pics
7z x -y -opics ygopro-images.zip wget -O - https://cdn01.moecube.com/images/ygopro-images-${TARGET_LOCALE}.zip | bsdtar -C pics -xf -
No preview for this file type
...@@ -38,6 +38,7 @@ ClientField::ClientField() { ...@@ -38,6 +38,7 @@ ClientField::ClientField() {
mzone[p].resize(7, 0); mzone[p].resize(7, 0);
szone[p].resize(8, 0); szone[p].resize(8, 0);
} }
rnd.reset(std::random_device()());
} }
void ClientField::Clear() { void ClientField::Clear() {
for(int i = 0; i < 2; ++i) { for(int i = 0; i < 2; ++i) {
...@@ -421,7 +422,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) { ...@@ -421,7 +422,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
} }
} }
if(has_card_in_grave) { if(has_card_in_grave) {
std::random_shuffle(selectable_cards.begin(), selectable_cards.end()); rnd.shuffle_vector(selectable_cards);
} }
} }
int startpos; int startpos;
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define CLIENT_FIELD_H #define CLIENT_FIELD_H
#include "config.h" #include "config.h"
#include "../ocgcore/mtrandom.h"
#include <vector> #include <vector>
#include <set> #include <set>
#include <map> #include <map>
...@@ -85,6 +86,7 @@ public: ...@@ -85,6 +86,7 @@ public:
bool deck_reversed; bool deck_reversed;
bool conti_selecting; bool conti_selecting;
bool cant_check_grave; bool cant_check_grave;
mt19937 rnd;
ClientField(); ClientField();
void Clear(); void Clear();
......
...@@ -1490,15 +1490,15 @@ void DeckBuilder::FilterCards() { ...@@ -1490,15 +1490,15 @@ void DeckBuilder::FilterCards() {
if(filter_lm) { if(filter_lm) {
if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList).at(ptr->first) != filter_lm - 1)) if(filter_lm <= 3 && (!filterList->count(ptr->first) || (*filterList).at(ptr->first) != filter_lm - 1))
continue; continue;
if(filter_lm == 4 && (data.ot & 0x3) != 1) if(filter_lm == 4 && !(data.ot & AVAIL_OCG))
continue; continue;
if(filter_lm == 5 && (data.ot & 0x3) != 2) if(filter_lm == 5 && !(data.ot & AVAIL_TCG))
continue; continue;
if(filter_lm == 6 && (data.ot & 0x3) != 3) if(filter_lm == 6 && !(data.ot & AVAIL_SC))
continue; continue;
if(filter_lm == 7 && data.ot != 4) if(filter_lm == 7 && !(data.ot & AVAIL_CUSTOM))
continue; continue;
if(filter_lm == 8 && !(data.ot & 0x8)) if(filter_lm == 8 && ((data.ot & AVAIL_OCGTCG) != AVAIL_OCGTCG))
continue; continue;
} }
bool is_target = true; bool is_target = true;
......
...@@ -72,24 +72,16 @@ const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) { ...@@ -72,24 +72,16 @@ const std::unordered_map<int, int>* DeckManager::GetLFListContent(int lfhash) {
return &lit->content; return &lit->content;
return nullptr; return nullptr;
} }
int DeckManager::IsGameRuleDisallowed(unsigned char hostInfoRule, unsigned int cardOt) { static int checkAvail(int ot, int avail) {
if(hostInfoRule != 4) { // non-CCG if((ot & avail) == avail)
bool allow_ocg = hostInfoRule == 0 || hostInfoRule == 2; // OCG can be used in OCG and OT duels return 0;
bool allow_tcg = hostInfoRule == 1 || hostInfoRule == 2; // TCG can be used in TCG and OT duels if((ot & AVAIL_OCG) && !(avail == AVAIL_OCG))
if(!allow_ocg && ((cardOt & 0x3) == 0x1)) return DECKERROR_OCGONLY;
return DECKERROR_OCGONLY; if((ot & AVAIL_TCG) && !(avail == AVAIL_TCG))
if(!allow_tcg && ((cardOt & 0x3) == 0x2)) return DECKERROR_TCGONLY;
return DECKERROR_TCGONLY; return DECKERROR_NOTAVAIL;
} else if(!(cardOt & 0x8) && (cardOt & 0x3)) { // in CCG duels, cards labeled with ither OCG or TCG, but not CCG, would not be allowed.
if((cardOt & 0x3) == 0x2) {
return DECKERROR_TCGONLY;
} else {
return DECKERROR_OCGONLY;
}
}
return 0;
} }
int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) { int DeckManager::CheckDeck(Deck& deck, int lfhash, int rule) {
std::unordered_map<int, int> ccount; std::unordered_map<int, int> ccount;
auto list = GetLFListContent(lfhash); auto list = GetLFListContent(lfhash);
if(!list) if(!list)
...@@ -110,10 +102,11 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) { ...@@ -110,10 +102,11 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) {
if(deck.side.size() > 15) if(deck.side.size() > 15)
return (DECKERROR_SIDECOUNT << 28) + deck.side.size(); return (DECKERROR_SIDECOUNT << 28) + deck.side.size();
#endif #endif
const int rule_map[6] = { AVAIL_OCG, AVAIL_TCG, AVAIL_SC, AVAIL_CUSTOM, AVAIL_OCGTCG, 0 };
int avail = rule_map[rule];
for(size_t i = 0; i < deck.main.size(); ++i) { for(size_t i = 0; i < deck.main.size(); ++i) {
code_pointer cit = deck.main[i]; code_pointer cit = deck.main[i];
const int gameruleDeckError = IsGameRuleDisallowed(hostInfoRule, cit->second.ot); int gameruleDeckError = checkAvail(cit->second.ot, avail);
if(gameruleDeckError) if(gameruleDeckError)
return (gameruleDeckError << 28) + cit->first; return (gameruleDeckError << 28) + cit->first;
if(cit->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_TOKEN | TYPE_LINK)) if(cit->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_TOKEN | TYPE_LINK))
...@@ -129,7 +122,7 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) { ...@@ -129,7 +122,7 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) {
} }
for(size_t i = 0; i < deck.extra.size(); ++i) { for(size_t i = 0; i < deck.extra.size(); ++i) {
code_pointer cit = deck.extra[i]; code_pointer cit = deck.extra[i];
const int gameruleDeckError = IsGameRuleDisallowed(hostInfoRule, cit->second.ot); int gameruleDeckError = checkAvail(cit->second.ot, avail);
if(gameruleDeckError) if(gameruleDeckError)
return (gameruleDeckError << 28) + cit->first; return (gameruleDeckError << 28) + cit->first;
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
...@@ -143,7 +136,7 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) { ...@@ -143,7 +136,7 @@ int DeckManager::CheckDeck(Deck& deck, int lfhash, unsigned char hostInfoRule) {
} }
for(size_t i = 0; i < deck.side.size(); ++i) { for(size_t i = 0; i < deck.side.size(); ++i) {
code_pointer cit = deck.side[i]; code_pointer cit = deck.side[i];
const int gameruleDeckError = IsGameRuleDisallowed(hostInfoRule, cit->second.ot); int gameruleDeckError = checkAvail(cit->second.ot, avail);
if(gameruleDeckError) if(gameruleDeckError)
return (gameruleDeckError << 28) + cit->first; return (gameruleDeckError << 28) + cit->first;
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
......
...@@ -39,8 +39,7 @@ public: ...@@ -39,8 +39,7 @@ public:
void LoadLFList(); void LoadLFList();
const wchar_t* GetLFListName(int lfhash); const wchar_t* GetLFListName(int lfhash);
const std::unordered_map<int, int>* GetLFListContent(int lfhash); const std::unordered_map<int, int>* GetLFListContent(int lfhash);
int IsGameRuleDisallowed(unsigned char hostInfoRule, unsigned int cardOt); int CheckDeck(Deck& deck, int lfhash, int rule);
int CheckDeck(Deck &deck, int lfhash, unsigned char hostInfoRule);
int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec); int LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec); bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
#ifndef YGOPRO_SERVER_MODE #ifndef YGOPRO_SERVER_MODE
......
...@@ -1185,17 +1185,32 @@ void Game::DrawThumb(code_pointer cp, position2di pos, const std::unordered_map< ...@@ -1185,17 +1185,32 @@ void Game::DrawThumb(code_pointer cp, position2di pos, const std::unordered_map<
break; break;
} }
} }
if(cbLimit->getSelected() >= 4 && ((cp->second.ot & 0x8) || cp->second.ot & 0x3 && (cp->second.ot & 0x3) != 0x3)) { bool showAvail = false;
int xOffset = 0, yOffset = 0; bool showNotAvail = false;
if(cp->second.ot & 0x8) int filter_lm = cbLimit->getSelected();
xOffset += 128; bool avail = !((filter_lm == 4 && !(cp->second.ot & AVAIL_OCG)
else if((cp->second.ot & 0x3)== 0x2) { || (filter_lm == 5 && !(cp->second.ot & AVAIL_TCG))
yOffset += 64; || (filter_lm == 6 && !(cp->second.ot & AVAIL_SC))
} || (filter_lm == 7 && !(cp->second.ot & AVAIL_CUSTOM))
if(!deckManager.IsGameRuleDisallowed(gameConf.defaultOT, cp->second.ot)) { || (filter_lm == 8 && (cp->second.ot & AVAIL_OCGTCG) != AVAIL_OCGTCG)));
yOffset += 128; if(filter_lm >= 4) {
} showAvail = avail;
driver->draw2DImage(imageManager.tOT, otloc, recti(xOffset, yOffset, 128 + xOffset, 64 + yOffset), 0, 0, true); showNotAvail = !avail;
} else if(!(cp->second.ot & gameConf.defaultOT)) {
showNotAvail = true;
}
if(showAvail) {
if((cp->second.ot & AVAIL_OCG) && !(cp->second.ot & AVAIL_TCG))
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 128, 128, 192), 0, 0, true);
else if((cp->second.ot & AVAIL_TCG) && !(cp->second.ot & AVAIL_OCG))
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 192, 128, 256), 0, 0, true);
} else if(showNotAvail) {
if(cp->second.ot & AVAIL_OCG)
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 0, 128, 64), 0, 0, true);
else if(cp->second.ot & AVAIL_TCG)
driver->draw2DImage(imageManager.tOT, otloc, recti(0, 64, 128, 128), 0, 0, true);
else if(!avail)
driver->draw2DImage(imageManager.tLim, otloc, recti(0, 0, 64, 64), 0, 0, true);
} }
} }
void Game::DrawDeckBd() { void Game::DrawDeckBd() {
...@@ -1347,11 +1362,11 @@ void Game::DrawDeckBd() { ...@@ -1347,11 +1362,11 @@ void Game::DrawDeckBd() {
myswprintf(scaleBuffer, L" %d/%d", ptr->second.lscale, ptr->second.rscale); myswprintf(scaleBuffer, L" %d/%d", ptr->second.lscale, ptr->second.rscale);
wcscat(textBuffer, scaleBuffer); wcscat(textBuffer, scaleBuffer);
} }
if((ptr->second.ot & 0x3) == 1) if((ptr->second.ot & AVAIL_OCGTCG) == AVAIL_OCG)
wcscat(textBuffer, L" [OCG]"); wcscat(textBuffer, L" [OCG]");
else if((ptr->second.ot & 0x3) == 2) else if((ptr->second.ot & AVAIL_OCGTCG) == AVAIL_TCG)
wcscat(textBuffer, L" [TCG]"); wcscat(textBuffer, L" [TCG]");
else if((ptr->second.ot & 0x7) == 4) else if((ptr->second.ot & AVAIL_CUSTOM) == AVAIL_CUSTOM)
wcscat(textBuffer, L" [Custom]"); wcscat(textBuffer, L" [Custom]");
DrawShadowText(textFont, textBuffer, Resize(860, 209 + i * 66, 955, 229 + i * 66), Resize(1, 1, 0, 0)); DrawShadowText(textFont, textBuffer, Resize(860, 209 + i * 66, 955, 229 + i * 66), Resize(1, 1, 0, 0));
} else { } else {
...@@ -1360,11 +1375,11 @@ void Game::DrawDeckBd() { ...@@ -1360,11 +1375,11 @@ void Game::DrawDeckBd() {
const wchar_t* ptype = dataManager.FormatType(ptr->second.type); const wchar_t* ptype = dataManager.FormatType(ptr->second.type);
DrawShadowText(textFont, ptype, Resize(860, 187 + i * 66, 955, 207 + i * 66), Resize(1, 1, 0, 0)); DrawShadowText(textFont, ptype, Resize(860, 187 + i * 66, 955, 207 + i * 66), Resize(1, 1, 0, 0));
textBuffer[0] = 0; textBuffer[0] = 0;
if((ptr->second.ot & 0x3) == 1) if((ptr->second.ot & AVAIL_OCGTCG) == AVAIL_OCG)
wcscat(textBuffer, L"[OCG]"); wcscat(textBuffer, L"[OCG]");
else if((ptr->second.ot & 0x3) == 2) else if((ptr->second.ot & AVAIL_OCGTCG) == AVAIL_TCG)
wcscat(textBuffer, L"[TCG]"); wcscat(textBuffer, L"[TCG]");
else if((ptr->second.ot & 0x7) == 4) else if((ptr->second.ot & AVAIL_CUSTOM) == AVAIL_CUSTOM)
wcscat(textBuffer, L"[Custom]"); wcscat(textBuffer, L"[Custom]");
DrawShadowText(textFont, textBuffer, Resize(860, 209 + i * 66, 955, 229 + i * 66), Resize(1, 1, 0, 0)); DrawShadowText(textFont, textBuffer, Resize(860, 209 + i * 66, 955, 229 + i * 66), Resize(1, 1, 0, 0));
} }
......
...@@ -133,7 +133,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) { ...@@ -133,7 +133,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
if(bot_mode) { if(bot_mode) {
BufferIO::CopyWStr(L"Bot Game", cscg.name, 20); BufferIO::CopyWStr(L"Bot Game", cscg.name, 20);
BufferIO::CopyWStr(L"", cscg.pass, 20); BufferIO::CopyWStr(L"", cscg.pass, 20);
cscg.info.rule = 2; cscg.info.rule = 5;
cscg.info.mode = 0; cscg.info.mode = 0;
cscg.info.start_hand = 5; cscg.info.start_hand = 5;
cscg.info.start_lp = 8000; cscg.info.start_lp = 8000;
...@@ -340,6 +340,10 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -340,6 +340,10 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
myswprintf(msgbuf, dataManager.GetSysString(1419), code); myswprintf(msgbuf, dataManager.GetSysString(1419), code);
break; break;
} }
case DECKERROR_NOTAVAIL: {
myswprintf(msgbuf, dataManager.GetSysString(1432), dataManager.GetName(code));
break;
}
default: { default: {
myswprintf(msgbuf, dataManager.GetSysString(1406)); myswprintf(msgbuf, dataManager.GetSysString(1406));
break; break;
...@@ -520,7 +524,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) { ...@@ -520,7 +524,7 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
wchar_t msgbuf[256]; wchar_t msgbuf[256];
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1226), deckManager.GetLFListName(pkt->info.lflist)); myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1226), deckManager.GetLFListName(pkt->info.lflist));
str.append(msgbuf); str.append(msgbuf);
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1225), dataManager.GetSysString(pkt->info.rule == 4 ? 1249 : 1240 + pkt->info.rule)); myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1225), dataManager.GetSysString(1481 + pkt->info.rule));
str.append(msgbuf); str.append(msgbuf);
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1227), dataManager.GetSysString(1244 + pkt->info.mode)); myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1227), dataManager.GetSysString(1244 + pkt->info.mode));
str.append(msgbuf); str.append(msgbuf);
...@@ -1272,6 +1276,10 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -1272,6 +1276,10 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
soundManager.StopBGM(); soundManager.StopBGM();
} }
} }
// lyric
case 24: { //HINT_LYRIC
mainGame->AddChatMsg(dataManager.GetDesc(data), 15);
}
} }
break; break;
} }
...@@ -2391,7 +2399,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -2391,7 +2399,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
soundManager.PlaySoundEffect(SOUND_SHUFFLE); soundManager.PlaySoundEffect(SOUND_SHUFFLE);
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
for (auto cit = mainGame->dField.deck[player].begin(); cit != mainGame->dField.deck[player].end(); ++cit) { for (auto cit = mainGame->dField.deck[player].begin(); cit != mainGame->dField.deck[player].end(); ++cit) {
(*cit)->dPos = irr::core::vector3df(rand() * 0.4f / RAND_MAX - 0.2f, 0, 0); (*cit)->dPos = irr::core::vector3df(rnd.rand() * 0.4f / rnd.rand_max - 0.2f, 0, 0);
(*cit)->dRot = irr::core::vector3df(0, 0, 0); (*cit)->dRot = irr::core::vector3df(0, 0, 0);
(*cit)->is_moving = true; (*cit)->is_moving = true;
(*cit)->aniFrame = 3; (*cit)->aniFrame = 3;
...@@ -2463,7 +2471,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) { ...@@ -2463,7 +2471,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
for (int i = 0; i < 5; ++i) { for (int i = 0; i < 5; ++i) {
for (auto cit = mainGame->dField.extra[player].begin(); cit != mainGame->dField.extra[player].end(); ++cit) { for (auto cit = mainGame->dField.extra[player].begin(); cit != mainGame->dField.extra[player].end(); ++cit) {
if(!((*cit)->position & POS_FACEUP)) { if(!((*cit)->position & POS_FACEUP)) {
(*cit)->dPos = irr::core::vector3df(rand() * 0.4f / RAND_MAX - 0.2f, 0, 0); (*cit)->dPos = irr::core::vector3df(rnd.rand() * 0.4f / rnd.rand_max - 0.2f, 0, 0);
(*cit)->dRot = irr::core::vector3df(0, 0, 0); (*cit)->dRot = irr::core::vector3df(0, 0, 0);
(*cit)->is_moving = true; (*cit)->is_moving = true;
(*cit)->aniFrame = 3; (*cit)->aniFrame = 3;
...@@ -4294,7 +4302,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) { ...@@ -4294,7 +4302,7 @@ void DuelClient::BroadcastReply(evutil_socket_t fd, short events, void * arg) {
hoststr.append(L"["); hoststr.append(L"[");
hoststr.append(deckManager.GetLFListName(pHP->host.lflist)); hoststr.append(deckManager.GetLFListName(pHP->host.lflist));
hoststr.append(L"]["); hoststr.append(L"][");
hoststr.append(dataManager.GetSysString(pHP->host.rule + 1240)); hoststr.append(dataManager.GetSysString(pHP->host.rule + 1481));
hoststr.append(L"]["); hoststr.append(L"][");
hoststr.append(dataManager.GetSysString(pHP->host.mode + 1244)); hoststr.append(dataManager.GetSysString(pHP->host.mode + 1244));
hoststr.append(L"]["); hoststr.append(L"][");
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include <regex> #include <regex>
#endif //YGOPRO_SERVER_MODE #endif //YGOPRO_SERVER_MODE
unsigned short PRO_VERSION = 0x1352; unsigned short PRO_VERSION = 0x1353;
namespace ygo { namespace ygo {
...@@ -114,11 +114,7 @@ bool Game::Initialize() { ...@@ -114,11 +114,7 @@ bool Game::Initialize() {
return false; return false;
} }
dataManager.FileSystem = device->getFileSystem(); dataManager.FileSystem = device->getFileSystem();
<<<<<<< HEAD
LoadExpansions();
if(dataManager.LoadDB(GetLocaleDirWide("cards.cdb"))) {} else if(dataManager.LoadDB(GetLocaleDirWide("cards.cdb"))) {} else
=======
>>>>>>> 2ef8ca22fcca4bf8d4a3a1b5ca9be32922b7a98f
if(!dataManager.LoadDB(L"cards.cdb")) { if(!dataManager.LoadDB(L"cards.cdb")) {
ErrorLog("Failed to load card database (cards.cdb)!"); ErrorLog("Failed to load card database (cards.cdb)!");
return false; return false;
...@@ -254,12 +250,30 @@ bool Game::Initialize() { ...@@ -254,12 +250,30 @@ bool Game::Initialize() {
cbHostLFlist->setSelected(gameConf.use_lflist ? gameConf.default_lflist : cbHostLFlist->getItemCount() - 1); cbHostLFlist->setSelected(gameConf.use_lflist ? gameConf.default_lflist : cbHostLFlist->getItemCount() - 1);
env->addStaticText(dataManager.GetSysString(1225), rect<s32>(20, 60, 220, 80), false, false, wCreateHost); env->addStaticText(dataManager.GetSysString(1225), rect<s32>(20, 60, 220, 80), false, false, wCreateHost);
cbRule = env->addComboBox(rect<s32>(140, 55, 300, 80), wCreateHost); cbRule = env->addComboBox(rect<s32>(140, 55, 300, 80), wCreateHost);
cbRule->addItem(dataManager.GetSysString(1240)); cbRule->setMaxSelectionRows(10);
cbRule->addItem(dataManager.GetSysString(1241)); cbRule->addItem(dataManager.GetSysString(1481));
cbRule->addItem(dataManager.GetSysString(1242)); cbRule->addItem(dataManager.GetSysString(1482));
cbRule->addItem(dataManager.GetSysString(1243)); cbRule->addItem(dataManager.GetSysString(1483));
cbRule->addItem(dataManager.GetSysString(1249)); cbRule->addItem(dataManager.GetSysString(1484));
cbRule->setSelected(gameConf.defaultOT - 1); cbRule->addItem(dataManager.GetSysString(1485));
cbRule->addItem(dataManager.GetSysString(1486));
switch(gameConf.defaultOT) {
case 1:
cbRule->setSelected(0);
break;
case 2:
cbRule->setSelected(1);
break;
case 4:
cbRule->setSelected(3);
break;
case 8:
cbRule->setSelected(2);
break;
default:
cbRule->setSelected(5);
break;
}
env->addStaticText(dataManager.GetSysString(1227), rect<s32>(20, 90, 220, 110), false, false, wCreateHost); env->addStaticText(dataManager.GetSysString(1227), rect<s32>(20, 90, 220, 110), false, false, wCreateHost);
cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost); cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost);
cbMatchMode->addItem(dataManager.GetSysString(1244)); cbMatchMode->addItem(dataManager.GetSysString(1244));
...@@ -759,11 +773,11 @@ bool Game::Initialize() { ...@@ -759,11 +773,11 @@ bool Game::Initialize() {
cbLimit->addItem(dataManager.GetSysString(1316)); cbLimit->addItem(dataManager.GetSysString(1316));
cbLimit->addItem(dataManager.GetSysString(1317)); cbLimit->addItem(dataManager.GetSysString(1317));
cbLimit->addItem(dataManager.GetSysString(1318)); cbLimit->addItem(dataManager.GetSysString(1318));
cbLimit->addItem(dataManager.GetSysString(1240)); cbLimit->addItem(dataManager.GetSysString(1481));
cbLimit->addItem(dataManager.GetSysString(1241)); cbLimit->addItem(dataManager.GetSysString(1482));
cbLimit->addItem(dataManager.GetSysString(1242)); cbLimit->addItem(dataManager.GetSysString(1483));
cbLimit->addItem(dataManager.GetSysString(1243)); cbLimit->addItem(dataManager.GetSysString(1484));
cbLimit->addItem(dataManager.GetSysString(1249)); cbLimit->addItem(dataManager.GetSysString(1485));
stAttribute = env->addStaticText(dataManager.GetSysString(1319), rect<s32>(10, 22 + 50 / 6, 70, 42 + 50 / 6), false, false, wFilter); stAttribute = env->addStaticText(dataManager.GetSysString(1319), rect<s32>(10, 22 + 50 / 6, 70, 42 + 50 / 6), false, false, wFilter);
cbAttribute = env->addComboBox(rect<s32>(60, 20 + 50 / 6, 190, 40 + 50 / 6), wFilter, COMBOBOX_ATTRIBUTE); cbAttribute = env->addComboBox(rect<s32>(60, 20 + 50 / 6, 190, 40 + 50 / 6), wFilter, COMBOBOX_ATTRIBUTE);
cbAttribute->setMaxSelectionRows(10); cbAttribute->setMaxSelectionRows(10);
......
...@@ -875,6 +875,12 @@ extern unsigned int pre_seed[3]; ...@@ -875,6 +875,12 @@ extern unsigned int pre_seed[3];
#define TEXTURE_ATTACK 5 #define TEXTURE_ATTACK 5
#define TEXTURE_ACTIVATE 6 #define TEXTURE_ACTIVATE 6
#define AVAIL_OCG 0x5
#define AVAIL_TCG 0x6
#define AVAIL_CUSTOM 0x4
#define AVAIL_SC 0xc
#define AVAIL_OCGTCG (AVAIL_OCG|AVAIL_TCG)
#ifndef DEFAULT_DUEL_RULE #ifndef DEFAULT_DUEL_RULE
#define DEFAULT_DUEL_RULE 5 #define DEFAULT_DUEL_RULE 5
#endif #endif
......
...@@ -299,8 +299,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -299,8 +299,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode = new TagDuel(); duel_mode = new TagDuel();
duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode); duel_mode->etimer = event_new(net_evbase, 0, EV_TIMEOUT | EV_PERSIST, TagDuel::TagTimer, duel_mode);
} }
if(pkt->info.rule > 4) if(pkt->info.rule > 5)
pkt->info.rule = 0; pkt->info.rule = 5;
if(pkt->info.mode > 2) if(pkt->info.mode > 2)
pkt->info.mode = 0; pkt->info.mode = 0;
unsigned int hash = 1; unsigned int hash = 1;
......
...@@ -230,6 +230,7 @@ public: ...@@ -230,6 +230,7 @@ public:
#define DECKERROR_MAINCOUNT 0x6 #define DECKERROR_MAINCOUNT 0x6
#define DECKERROR_EXTRACOUNT 0x7 #define DECKERROR_EXTRACOUNT 0x7
#define DECKERROR_SIDECOUNT 0x8 #define DECKERROR_SIDECOUNT 0x8
#define DECKERROR_NOTAVAIL 0x9
#define MODE_SINGLE 0x0 #define MODE_SINGLE 0x0
#define MODE_MATCH 0x1 #define MODE_MATCH 0x1
......
...@@ -788,7 +788,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -788,7 +788,8 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
case 10: case 10:
case 21: case 21:
case 22: case 22:
case 23: { case 23:
case 24: {
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
......
...@@ -13,6 +13,7 @@ bool SoundManager::Init() { ...@@ -13,6 +13,7 @@ bool SoundManager::Init() {
previous_bgm_scene = -1; previous_bgm_scene = -1;
RefreshBGMList(); RefreshBGMList();
bgm_process = false; bgm_process = false;
rnd.reset((unsigned int)time(nullptr));
engineSound = irrklang::createIrrKlangDevice(); engineSound = irrklang::createIrrKlangDevice();
engineMusic = irrklang::createIrrKlangDevice(); engineMusic = irrklang::createIrrKlangDevice();
if(!engineSound || !engineMusic) { if(!engineSound || !engineMusic) {
...@@ -229,7 +230,7 @@ void SoundManager::PlayBGM(int scene) { ...@@ -229,7 +230,7 @@ void SoundManager::PlayBGM(int scene) {
if(count <= 0) if(count <= 0)
return; return;
bgm_scene = scene; bgm_scene = scene;
int bgm = rand() % count; int bgm = rnd.get_random_integer(0, count -1);
auto name = BGMList[scene][bgm].c_str(); auto name = BGMList[scene][bgm].c_str();
wchar_t fname[1024]; wchar_t fname[1024];
myswprintf(fname, L"./sound/BGM/%ls", name); myswprintf(fname, L"./sound/BGM/%ls", name);
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#define SOUNDMANAGER_H #define SOUNDMANAGER_H
#include "game.h" #include "game.h"
#include "../ocgcore/mtrandom.h"
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
#include <irrKlang.h> #include <irrKlang.h>
#endif #endif
...@@ -14,6 +15,7 @@ private: ...@@ -14,6 +15,7 @@ private:
int bgm_scene; int bgm_scene;
int previous_bgm_scene; int previous_bgm_scene;
bool bgm_process; bool bgm_process;
mt19937 rnd;
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
irrklang::ISoundEngine* engineSound; irrklang::ISoundEngine* engineSound;
irrklang::ISoundEngine* engineMusic; irrklang::ISoundEngine* engineMusic;
......
...@@ -737,10 +737,11 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -737,10 +737,11 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
#endif #endif
break; break;
} }
case 10:
case 21: case 21:
case 22: case 22:
case 23: case 23:
case 10: { case 24: {
for(int i = 0; i < 4; ++i) for(int i = 0; i < 4; ++i)
NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[i], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit) for(auto oit = observers.begin(); oit != observers.end(); ++oit)
......
...@@ -301,16 +301,11 @@ ...@@ -301,16 +301,11 @@
!system 1235 主机密码: !system 1235 主机密码:
!system 1236 规则: !system 1236 规则:
!system 1237 每回合时间: !system 1237 每回合时间:
!system 1240 OCG
!system 1241 TCG
!system 1242 OCG&TCG
!system 1243 自定义卡片
!system 1244 单局模式 !system 1244 单局模式
!system 1245 比赛模式 !system 1245 比赛模式
!system 1246 TAG !system 1246 TAG
!system 1247 标准对战 !system 1247 标准对战
!system 1248 自定义 !system 1248 自定义
!system 1249 简体中文
!system 1250 决斗准备 !system 1250 决斗准备
!system 1251 →决斗者 !system 1251 →决斗者
!system 1252 →观战 !system 1252 →观战
...@@ -472,6 +467,7 @@ ...@@ -472,6 +467,7 @@
!system 1429 选择的位置不符合条件。 !system 1429 选择的位置不符合条件。
!system 1430 选择的表示形式不符合条件。 !system 1430 选择的表示形式不符合条件。
!system 1431 选择的指示物不符合条件。 !system 1431 选择的指示物不符合条件。
!system 1432 「%ls」不允许在当前设定下使用。
!system 1440 关闭大图 !system 1440 关闭大图
!system 1441 放大 !system 1441 放大
!system 1442 缩小 !system 1442 缩小
...@@ -497,6 +493,12 @@ ...@@ -497,6 +493,12 @@
!system 1474 已存在同名分类 !system 1474 已存在同名分类
!system 1475 已存在同名卡组 !system 1475 已存在同名卡组
!system 1476 删除失败 !system 1476 删除失败
!system 1481 OCG
!system 1482 TCG
!system 1483 简体中文
!system 1484 自定义卡片
!system 1485 无独有卡
!system 1486 所有卡片
!system 1500 决斗结束。 !system 1500 决斗结束。
!system 1501 录像结束。 !system 1501 录像结束。
!system 1502 连接已断开。 !system 1502 连接已断开。
......
textures/ot.png

9.92 KB | W: | H:

textures/ot.png

8.26 KB | W: | H:

textures/ot.png
textures/ot.png
textures/ot.png
textures/ot.png
  • 2-up
  • Swipe
  • Onion skin
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