Commit 2e407cc7 authored by mercury233's avatar mercury233

Merge branch 'fh' into patch-irr-clipboard

parents 487f04d5 e69da396
......@@ -102,7 +102,7 @@ void Draw2DImageQuad(video::IVideoDriver* driver, video::ITexture* image, core::
driver->setTransform(irr::video::ETS_VIEW, oldViewMat);
}
CGUIImageButton* CGUIImageButton::addImageButton(IGUIEnvironment *env, const core::rect<s32>& rectangle, IGUIElement* parent, s32 id) {
CGUIImageButton* button = new CGUIImageButton(env, parent ? parent : 0, id, rectangle);
CGUIImageButton* button = new CGUIImageButton(env, parent, id, rectangle);
button->drop();
return button;
}
......
......@@ -322,7 +322,7 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia
tt_face = face->face;
// Store font metrics.
FT_Set_Pixel_Sizes(tt_face, size, 0);
FT_Set_Pixel_Sizes(tt_face, 0, size);
font_metrics = tt_face->size->metrics;
// Allocate our glyphs.
......@@ -834,6 +834,7 @@ video::IImage* CGUITTFont::createTextureFromChar(const uchar32_t& ch) {
core::dimension2du glyph_size(glyph.source_rect.getSize());
video::IImage* image = Driver->createImage(format, glyph_size);
pageholder->copyTo(image, irr::core::vector2di(0, 0), glyph.source_rect);
pageholder->drop();
tex->unlock();
return image;
......
......@@ -351,7 +351,7 @@ private:
load_flags = FT_LOAD_DEFAULT | FT_LOAD_RENDER;
if (!useHinting()) load_flags |= FT_LOAD_NO_HINTING;
if (!useAutoHinting()) load_flags |= FT_LOAD_NO_AUTOHINT;
if (useMonochrome()) load_flags |= FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO | FT_RENDER_MODE_MONO;
if (useMonochrome()) load_flags |= FT_LOAD_MONOCHROME | FT_LOAD_TARGET_MONO;
else load_flags |= FT_LOAD_TARGET_NORMAL;
}
u32 getWidthFromCharacter(wchar_t c) const;
......
......@@ -22,9 +22,8 @@ public:
}
static void VectorWriteBlock(std::vector<unsigned char>& buffer, const void* src, size_t size) {
const auto len = buffer.size();
buffer.resize(len + size);
std::memcpy(buffer.data() + len, src, size);
auto* bytes = static_cast<const unsigned char*>(src);
buffer.insert(buffer.end(), bytes, bytes + size);
}
template<typename T>
static void VectorWrite(std::vector<unsigned char>& buffer, const T& value) {
......
......@@ -1392,11 +1392,11 @@ bool ClientField::check_sum_trib(std::set<ClientCard*>::const_iterator index, st
return false;
int l1, l2;
get_sum_params((*index)->opParam, l1, l2);
if((acc + l1 >= select_min && acc + l1 <= select_max) || (acc + l2 >= select_min && acc + l2 <= select_max))
if((acc + l1 >= select_min && acc + l1 <= select_max) || (l2 > 0 && acc + l2 >= select_min && acc + l2 <= select_max))
return true;
++index;
return check_sum_trib(index, end, acc + l1)
|| check_sum_trib(index, end, acc + l2)
|| (l2 > 0 && check_sum_trib(index, end, acc + l2))
|| check_sum_trib(index, end, acc);
}
template <class T>
......@@ -1440,7 +1440,7 @@ static bool is_declarable(const T& cd, const std::vector<unsigned int>& opcode)
stack.pop();
int lhs = stack.top();
stack.pop();
stack.push(lhs / rhs);
stack.push(rhs != 0 ? lhs / rhs : 0);
}
break;
}
......
......@@ -242,16 +242,30 @@ const wchar_t* DataManager::GetSetName(uint32_t code) const {
std::vector<uint32_t> DataManager::GetSetCodes(std::wstring setname) const {
std::vector<uint32_t> matchingCodes;
for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) {
auto xpos = csit->second.find_first_of(L'|');//setname|another setname or extra info
if(setname.size() < 2) {
if(csit->second.compare(0, xpos, setname) == 0
|| csit->second.compare(xpos + 1, csit->second.length(), setname) == 0)
matchingCodes.push_back(csit->first);
} else {
if(csit->second.substr(0, xpos).find(setname) != std::wstring::npos
|| csit->second.substr(xpos + 1).find(setname) != std::wstring::npos) {
matchingCodes.push_back(csit->first);
const std::wstring& setnameString = csit->second;
size_t start = 0;
while(start < setnameString.size()) { // handle "setname|another setname"
auto pos = setnameString.find(L'|', start);
std::wstring token;
if(pos == std::wstring::npos)
token = setnameString.substr(start);
else
token = setnameString.substr(start, pos - start);
if(setname.size() < 2) {
// exact match for short set names to avoid too many results
if(token == setname) {
matchingCodes.push_back(csit->first);
break;
}
} else {
if(token.find(setname) != std::wstring::npos) {
matchingCodes.push_back(csit->first);
break;
}
}
if(pos == std::wstring::npos)
break;
start = pos + 1;
}
}
return matchingCodes;
......
#ifndef DECK_H
#define DECK_H
#include <vector>
#include <cstdint>
#include "data_manager.h"
namespace ygo {
struct Deck {
std::vector<code_pointer> main;
std::vector<code_pointer> extra;
std::vector<code_pointer> side;
void clear() {
main.clear();
extra.clear();
side.clear();
}
};
struct DeckArray {
std::vector<uint32_t> main;
std::vector<uint32_t> extra;
std::vector<uint32_t> side;
};
}
#endif // DECK_H
......@@ -163,6 +163,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
return true;
break;
}
break;
}
case irr::gui::EGET_BUTTON_CLICKED: {
soundManager.PlaySoundEffect(SOUND_BUTTON);
......@@ -1007,6 +1008,7 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
InstantSearch();
break;
}
break;
}
case irr::gui::EGET_LISTBOX_CHANGED: {
switch(id) {
......
......@@ -309,7 +309,6 @@ bool DeckManager::LoadCurrentDeck(const wchar_t* file, bool is_packlist) {
}
if(!reader)
return false;
std::memset(deckBuffer, 0, sizeof deckBuffer);
int size = reader->read(deckBuffer, sizeof deckBuffer);
reader->drop();
if (size >= (int)sizeof deckBuffer) {
......
......@@ -4,7 +4,7 @@
#include <unordered_map>
#include <vector>
#include <sstream>
#include "data_manager.h"
#include "deck.h"
namespace ygo {
......@@ -28,28 +28,6 @@ struct LFList {
std::wstring listName;
std::unordered_map<uint32_t, int> content;
};
struct Deck {
std::vector<code_pointer> main;
std::vector<code_pointer> extra;
std::vector<code_pointer> side;
Deck() = default;
Deck(const Deck& ndeck) {
main = ndeck.main;
extra = ndeck.extra;
side = ndeck.side;
}
void clear() {
main.clear();
extra.clear();
side.clear();
}
};
struct DeckArray {
std::vector<uint32_t> main;
std::vector<uint32_t> extra;
std::vector<uint32_t> side;
};
class DeckManager {
public:
......
......@@ -5,7 +5,7 @@
#include <set>
#include <random>
#include "config.h"
#include "deck_manager.h"
#include "deck.h"
#include "network.h"
namespace ygo {
......
......@@ -907,8 +907,8 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
} else {
if (select_continuous)
myswprintf(formatBuffer, L"%ls", dataManager.unknown_string);
else if (cant_check_grave && selectable_cards[i]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i]->location, 0));
else if (cant_check_grave && selectable_cards[i + pos]->location == LOCATION_GRAVE)
myswprintf(formatBuffer, L"%ls", dataManager.FormatLocation(selectable_cards[i + pos]->location, 0));
else if (selectable_cards[i + pos]->location == LOCATION_OVERLAY)
myswprintf(formatBuffer, L"%ls[%d](%d)",
dataManager.FormatLocation(selectable_cards[i + pos]->overlayTarget), selectable_cards[i + pos]->overlayTarget->sequence + 1, selectable_cards[i + pos]->sequence + 1);
......
......@@ -93,7 +93,8 @@ void ImageManager::ResizeTexture() {
irr::s32 bgWidth = 1024 * mainGame->xScale;
irr::s32 bgHeight = 640 * mainGame->yScale;
driver->removeTexture(tCover[0]);
driver->removeTexture(tCover[1]);
if(tCover[1] != tCover[0])
driver->removeTexture(tCover[1]);
tCover[0] = GetTextureFromFile("textures/cover.jpg", imgWidth, imgHeight);
tCover[1] = GetTextureFromFile("textures/cover2.jpg", imgWidth, imgHeight);
if(!tCover[1])
......@@ -107,12 +108,14 @@ void ImageManager::ResizeTexture() {
tUnknownFit = GetTextureFromFile("textures/unknown.jpg", imgWidthFit, imgHeightFit);
tUnknownThumb = GetTextureFromFile("textures/unknown.jpg", imgWidthThumb, imgHeightThumb);
driver->removeTexture(tBackGround);
if(tBackGround_menu != tBackGround)
driver->removeTexture(tBackGround_menu);
if(tBackGround_deck != tBackGround)
driver->removeTexture(tBackGround_deck);
tBackGround = GetTextureFromFile("textures/bg.jpg", bgWidth, bgHeight);
driver->removeTexture(tBackGround_menu);
tBackGround_menu = GetTextureFromFile("textures/bg_menu.jpg", bgWidth, bgHeight);
if(!tBackGround_menu)
tBackGround_menu = tBackGround;
driver->removeTexture(tBackGround_deck);
tBackGround_deck = GetTextureFromFile("textures/bg_deck.jpg", bgWidth, bgHeight);
if(!tBackGround_deck)
tBackGround_deck = tBackGround;
......
......@@ -197,7 +197,7 @@ public:
//! \return Myself.
_Iter& operator-=(const difference_type v) {
if(v == 0) return *this;
if(v > 0) return operator+=(v * -1);
if(v < 0) return operator+=(-v);
if(pos == 0)
return *this;
......
......@@ -311,7 +311,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
}
for (size_t i = 0; i < replay.decks.size(); ++i) {
myswprintf(filename, L"./deck/%ls-%d %ls.ydk", replay_filename, i + 1, namebuf[i]);
DeckManager::SaveDeckArray(replay.decks[i], filename);
replay.SaveDeck(i, filename);
}
mainGame->stACMessage->setText(dataManager.GetSysString(1335));
mainGame->PopupElement(mainGame->wACMessage, 20);
......@@ -356,6 +356,8 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
NetServer::StopServer();
break;
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
#else
if(fork() == 0) {
usleep(100000);
......
......@@ -18,6 +18,7 @@
#define NOMINMAX
#include <Windows.h>
#include <shellapi.h>
class FileSystem {
public:
......@@ -71,13 +72,18 @@ public:
}
static bool DeleteDir(const wchar_t* wdir) {
wchar_t pdir[256];
size_t len = std::wcslen(wdir);
wchar_t pdir[1024 + 1]{};
if(len >= 1024)
return false;
BufferIO::CopyWideString(wdir, pdir);
// pFrom must be double-null terminated for SHFileOperationW
// pdir[len] is already '\0' and pdir[len+1] is '\0' due to zero-init
SHFILEOPSTRUCTW lpFileOp{};
lpFileOp.hwnd = nullptr;
lpFileOp.wFunc = FO_DELETE;
lpFileOp.pFrom = pdir;
lpFileOp.pTo = 0;
lpFileOp.pTo = nullptr;
lpFileOp.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT;
return SHFileOperationW(&lpFileOp) == 0;
}
......@@ -233,7 +239,8 @@ public:
int len = std::snprintf(fname, sizeof(fname), "%s/%s", path, dirp->d_name);
if (len < 0 || len >= (int)(sizeof fname))
continue;
stat(fname, &fileStat);
if (stat(fname, &fileStat) != 0)
continue;
funit.filename = std::string(dirp->d_name);
funit.is_dir = S_ISDIR(fileStat.st_mode);
if(funit.is_dir && (std::strcmp(dirp->d_name, ".") == 0 || std::strcmp(dirp->d_name, "..") == 0))
......
......@@ -13,6 +13,7 @@ event* NetServer::broadcast_ev = 0;
evconnlistener* NetServer::listener = 0;
DuelMode* NetServer::duel_mode = 0;
unsigned char NetServer::net_server_write[SIZE_NETWORK_BUFFER];
unsigned char NetServer::net_server_read[SIZE_NETWORK_BUFFER];
size_t NetServer::last_sent = 0;
bool NetServer::StartServer(unsigned short port) {
......@@ -126,7 +127,6 @@ void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
int len = evbuffer_get_length(input);
if (len < 2)
return;
unsigned char* net_server_read = new unsigned char[SIZE_NETWORK_BUFFER];
uint16_t packet_len = 0;
while (len >= 2) {
evbuffer_copyout(input, &packet_len, sizeof packet_len);
......@@ -137,7 +137,6 @@ void NetServer::ServerEchoRead(bufferevent *bev, void *ctx) {
HandleCTOSPacket(&users[bev], &net_server_read[2], read_len - 2);
len -= packet_len + 2;
}
delete[] net_server_read;
}
void NetServer::ServerEchoEvent(bufferevent* bev, short events, void* ctx) {
if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) {
......
......@@ -16,6 +16,7 @@ private:
static evconnlistener* listener;
static DuelMode* duel_mode;
static unsigned char net_server_write[SIZE_NETWORK_BUFFER];
static unsigned char net_server_read[SIZE_NETWORK_BUFFER];
static size_t last_sent;
public:
......
#include "config.h"
#include "replay.h"
#include "myfilesystem.h"
#include "deck_manager.h"
#include "lzma/LzmaLib.h"
namespace ygo {
......@@ -220,6 +221,14 @@ void Replay::SkipInfo(){
bool Replay::IsReplaying() const {
return is_replaying;
}
bool Replay::SaveDeck(size_t index, const wchar_t* filename) {
if(index >= decks.size())
return false;
DeckArray deck = decks[index];
std::reverse(deck.main.begin(), deck.main.end());
std::reverse(deck.extra.begin(), deck.extra.end());
return DeckManager::SaveDeckArray(deck, filename);
}
bool Replay::ReadInfo() {
int player_count = (pheader.base.flag & REPLAY_TAG) ? 4 : 2;
for (int i = 0; i < player_count; ++i) {
......
......@@ -5,7 +5,7 @@
#include <vector>
#include <string>
#include "../ocgcore/ocgapi.h"
#include "deck_manager.h"
#include "deck.h"
namespace ygo {
......@@ -96,6 +96,7 @@ public:
void Reset();
void SkipInfo();
bool IsReplaying() const;
bool SaveDeck(size_t index, const wchar_t* filename);
FILE* fp{ nullptr };
ExtendedReplayHeader pheader;
......
......@@ -399,14 +399,10 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
pplayer[0] = players[0];
pplayer[1] = players[1];
if((tp && dp->type == 1) || (!tp && dp->type == 0)) {
DuelPlayer* p = players[0];
players[0] = players[1];
players[1] = p;
std::swap(players[0], players[1]);
players[0]->type = 0;
players[1]->type = 1;
Deck d = pdeck[0];
pdeck[0] = pdeck[1];
pdeck[1] = d;
std::swap(pdeck[0], pdeck[1]);
swapped = true;
}
dp->state = CTOS_RESPONSE;
......
......@@ -3,7 +3,7 @@
#include <set>
#include "network.h"
#include "deck_manager.h"
#include "deck.h"
#include "replay.h"
namespace ygo {
......@@ -17,7 +17,7 @@ public:
void LeaveGame(DuelPlayer* dp) override;
void ToDuelist(DuelPlayer* dp) override;
void ToObserver(DuelPlayer* dp) override;
void PlayerReady(DuelPlayer* dp, bool ready) override;
void PlayerReady(DuelPlayer* dp, bool is_ready) override;
void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
void StartDuel(DuelPlayer* dp) override;
......
......@@ -247,7 +247,6 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
case MSG_SELECT_EFFECTYN: {
player = BufferIO::Read<uint8_t>(pbuf);
pbuf += 12;
DuelClient::ClientAnalyze(offset, pbuf - offset);
if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->singleSignal.Reset();
mainGame->singleSignal.Wait();
......
......@@ -257,7 +257,7 @@ bool SoundManager::IsPlayingMusic(wchar_t* music) {
if(music) {
return !mywcsncasecmp(currentPlayingMusic, music, 1024) && ma_sound_is_playing(&soundBGM);
} else {
return ma_sound_is_playing(&soundBGM);
return currentPlayingMusic[0] && ma_sound_is_playing(&soundBGM);
}
#endif
#ifdef YGOPRO_USE_IRRKLANG
......
......@@ -143,7 +143,6 @@ void TagDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
NetServer::DisconnectPlayer(dp);
} else if(duel_stage != DUEL_STAGE_END) {
EndDuel();
DuelEndProc();
......@@ -228,7 +227,7 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
unsigned int deckerror = 0;
if(!host_info.no_check_deck) {
if(deck_error[dp->type]) {
deckerror = (DECKERROR_UNKNOWNCARD << 28) + deck_error[dp->type];
deckerror = (DECKERROR_UNKNOWNCARD << 28) | deck_error[dp->type];
} else {
deckerror = deckManager.CheckDeck(pdeck[dp->type], host_info.lflist, host_info.rule);
}
......
......@@ -3,7 +3,7 @@
#include <set>
#include "network.h"
#include "deck_manager.h"
#include "deck.h"
#include "replay.h"
namespace ygo {
......@@ -17,7 +17,7 @@ public:
void LeaveGame(DuelPlayer* dp) override;
void ToDuelist(DuelPlayer* dp) override;
void ToObserver(DuelPlayer* dp) override;
void PlayerReady(DuelPlayer* dp, bool ready) override;
void PlayerReady(DuelPlayer* dp, bool is_ready) override;
void PlayerKick(DuelPlayer* dp, unsigned char pos) override;
void UpdateDeck(DuelPlayer* dp, unsigned char* pdata, int len) override;
void StartDuel(DuelPlayer* dp) override;
......
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