Commit a2289e2f authored by edo9300's avatar edo9300

Merge remote-tracking branch 'refs/remotes/Fluorohydride/master' into Select_Unselect

parents 74221e0d 1dd3ac54
## ygopro ## YGOPro
A script engine for "yu-gi-oh!" and sample gui A script engine for "yu-gi-oh!" and sample gui
[中文说明](https://github.com/Fluorohydride/ygopro/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E) [中文说明](https://github.com/Fluorohydride/ygopro/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E)
...@@ -7,7 +7,8 @@ A script engine for "yu-gi-oh!" and sample gui ...@@ -7,7 +7,8 @@ A script engine for "yu-gi-oh!" and sample gui
* ESC: Minimize the window. * ESC: Minimize the window.
* A: Holding down this button will let the system stop at every timing. * A: Holding down this button will let the system stop at every timing.
* S: Holding down this button will let the system skip every timing. * S: Holding down this button will let the system skip every timing.
* R: Fix the font error. * D: Holding down this button will let the system stop at available timing.
* R: Fix the font glitch.
* F1~F4: Show the cards in your grave, banished zone, extra deck, xyz materials. * F1~F4: Show the cards in your grave, banished zone, extra deck, xyz materials.
* F5~F8: Show the cards in your opponent's grave, banished zone, extra deck, xyz materials. * F5~F8: Show the cards in your opponent's grave, banished zone, extra deck, xyz materials.
...@@ -26,7 +27,7 @@ Xyz materials: ...@@ -26,7 +27,7 @@ Xyz materials:
* Monster Zone: 1~5, starting from the left hand side. * Monster Zone: 1~5, starting from the left hand side.
* Spell & Trap Zone: 1~5, starting from the left hand side. * Spell & Trap Zone: 1~5, starting from the left hand side.
* Field Zone: 6 * Field Zone: 6
* Pendulum Zone: 7~8, starting from the left hand side. * Pendulum Zone: 0~1, starting from the left hand side.
* The others: 1~n, starting from the bottom. * The others: 1~n, starting from the bottom.
### Deck edit page: ### Deck edit page:
...@@ -34,11 +35,25 @@ Xyz materials: ...@@ -34,11 +35,25 @@ Xyz materials:
* Card name: Search card names and texts by default, $foo will only search foo in card names, and @foo will search cards of "foo" archetype(due to translation, card name contains "foo" does not mean that card is "foo" card). * Card name: Search card names and texts by default, $foo will only search foo in card names, and @foo will search cards of "foo" archetype(due to translation, card name contains "foo" does not mean that card is "foo" card).
### Command-line options: ### Command-line options:
* -j: Join the host in system.conf file. * `-e foo.cdb`: Load foo.cdb as the extra database.
* -d: Enter the deck edit page. * `-n nickname`: Set the nickname.
* -r: Enter the replay mode page. * `-h 192.168.0.2`: Set the host to join in LAN mode.
* -s: Enter the single mode page. * `-p 7911`: Set the port to join in LAN mode.
* -efoo: Load foo as the extra database. * `-w abc`: Set the password to join in LAN mode.
* `-d`: Enter the deck edit page.
* `-d deck`: If used along with `-j` it mean select the deck, or it will open the deck to edit.
* `-c`: Create host with default settings.
* `-j`: Join the host specified in above, or if absent, lasthost in system.conf file.
* `-r`: Enter the replay mode page.
* `-r replay.yrp`: Load the replay.yrp in replay mode.
* `-s`: Enter the single mode page.
* `-s puzzle.lua`: Load the puzzle.lua in single mode.
* `-k`: Keep when duel finished. See below.
#### Note:
* `-c` `-j` `-e` `-r` `-s` shoule be the last parameter, because any parameters after it will get ignored.
* `-d` `-c` `-j` `-e` `-r` `-s` will make YGOPro automatically exit when the duel or deck editing is finished. This is useful for some launchers. If you want to keep it, add `-k` before them.
* `-d` `-r` `-s` support full path of file, or just filename. But remember deck filename should NOT have extension when replay and single filename MUST have extension.
### Directories: ### Directories:
* pics: .jpg card images(177*254). * pics: .jpg card images(177*254).
......
...@@ -153,7 +153,7 @@ void SGUITTGlyph::preload(u32 char_index, FT_Face face, video::IVideoDriver* dri ...@@ -153,7 +153,7 @@ void SGUITTGlyph::preload(u32 char_index, FT_Face face, video::IVideoDriver* dri
} }
glyph_page = parent->getLastGlyphPageIndex(); glyph_page = parent->getLastGlyphPageIndex();
u32 texture_side_length = page->texture->getOriginalSize().Width; u32 texture_side_length = page->texture_size.Width;
core::vector2di page_position( core::vector2di page_position(
(page->used_slots % (texture_side_length / font_size)) * font_size, (page->used_slots % (texture_side_length / font_size)) * font_size,
(page->used_slots / (texture_side_length / font_size)) * font_size (page->used_slots / (texture_side_length / font_size)) * font_size
...@@ -230,7 +230,7 @@ CGUITTFont* CGUITTFont::create(IrrlichtDevice *device, const io::path& filename, ...@@ -230,7 +230,7 @@ CGUITTFont* CGUITTFont::create(IrrlichtDevice *device, const io::path& filename,
//! Constructor. //! Constructor.
CGUITTFont::CGUITTFont(IGUIEnvironment *env) CGUITTFont::CGUITTFont(IGUIEnvironment *env)
: use_monochrome(false), use_transparency(true), use_hinting(true), use_auto_hinting(true), : use_monochrome(false), use_transparency(true), use_hinting(true), use_auto_hinting(true),
batch_load_size(1), Device(0), Environment(env), Driver(0), GlobalKerningWidth(0), GlobalKerningHeight(0) { batch_load_size(1), Device(0), Environment(env), Driver(0), GlobalKerningWidth(0), GlobalKerningHeight(0), supposed_line_height(0) {
#ifdef _DEBUG #ifdef _DEBUG
setDebugName("CGUITTFont"); setDebugName("CGUITTFont");
#endif #endif
...@@ -345,6 +345,24 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia ...@@ -345,6 +345,24 @@ bool CGUITTFont::load(const io::path& filename, const u32 size, const bool antia
getGlyphIndexByChar((uchar32_t)0); getGlyphIndexByChar((uchar32_t)0);
batch_load_size = old_size; batch_load_size = old_size;
// Calculate the supposed line height of this font (of this size) --
// Not using FT_SizeMetric::ascender or height, but actually by testing some of the glyphs,
// to see what should give a reasonable not cluttered line height.
// The ascender or height info may as well just be arbitrary ones.
// Get the maximum font height. Unfortunately, we have to do this hack as
// Irrlicht will draw things wrong. In FreeType, the font size is the
// maximum size for a single glyph, but that glyph may hang "under" the
// draw line, increasing the total font height to beyond the set size.
// Irrlicht does not understand this concept when drawing fonts. Also, I
// add +1 to give it a 1 pixel blank border. This makes things like
// tooltips look nicer.
s32 test1 = getHeightFromCharacter((uchar32_t)'g') + 1;
s32 test2 = getHeightFromCharacter((uchar32_t)'j') + 1;
s32 test3 = getHeightFromCharacter((uchar32_t)0x55B5) + 1;
supposed_line_height = core::max_(test1, core::max_(test2, test3));
return true; return true;
} }
...@@ -443,9 +461,8 @@ CGUITTGlyphPage* CGUITTFont::createGlyphPage(const u8& pixel_mode) { ...@@ -443,9 +461,8 @@ CGUITTGlyphPage* CGUITTFont::createGlyphPage(const u8& pixel_mode) {
if (page_texture_size.Width > max_texture_size.Width || page_texture_size.Height > max_texture_size.Height) if (page_texture_size.Width > max_texture_size.Width || page_texture_size.Height > max_texture_size.Height)
page_texture_size = max_texture_size; page_texture_size = max_texture_size;
if (!page->createPageTexture(pixel_mode, page_texture_size)) page->texture_size = page_texture_size;
// TODO: add error message? page->pixel_mode = pixel_mode;
return 0;
if (page) { if (page) {
// Determine the number of glyph slots on the page and add it to the list of pages. // Determine the number of glyph slots on the page and add it to the list of pages.
...@@ -522,7 +539,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position ...@@ -522,7 +539,7 @@ void CGUITTFont::draw(const core::stringw& text, const core::rect<s32>& position
if (lineBreak) { if (lineBreak) {
previousChar = 0; previousChar = 0;
offset.Y += 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)
...@@ -577,20 +594,8 @@ core::dimension2d<u32> CGUITTFont::getDimension(const wchar_t* text) const { ...@@ -577,20 +594,8 @@ core::dimension2d<u32> CGUITTFont::getDimension(const wchar_t* text) const {
} }
core::dimension2d<u32> CGUITTFont::getDimension(const core::ustring& text) const { core::dimension2d<u32> CGUITTFont::getDimension(const core::ustring& text) const {
// Get the maximum font height. Unfortunately, we have to do this hack as core::dimension2d<u32> text_dimension(0, supposed_line_height);
// Irrlicht will draw things wrong. In FreeType, the font size is the core::dimension2d<u32> line(0, supposed_line_height);
// maximum size for a single glyph, but that glyph may hang "under" the
// draw line, increasing the total font height to beyond the set size.
// Irrlicht does not understand this concept when drawing fonts. Also, I
// add +1 to give it a 1 pixel blank border. This makes things like
// tooltips look nicer.
s32 test1 = getHeightFromCharacter((uchar32_t)'g') + 1;
s32 test2 = getHeightFromCharacter((uchar32_t)'j') + 1;
s32 test3 = getHeightFromCharacter((uchar32_t)'_') + 1;
s32 max_font_height = core::max_(test1, core::max_(test2, test3));
core::dimension2d<u32> text_dimension(0, max_font_height);
core::dimension2d<u32> line(0, max_font_height);
uchar32_t previousChar = 0; uchar32_t previousChar = 0;
core::ustring::const_iterator iter = text.begin(); core::ustring::const_iterator iter = text.begin();
...@@ -619,7 +624,7 @@ core::dimension2d<u32> CGUITTFont::getDimension(const core::ustring& text) const ...@@ -619,7 +624,7 @@ core::dimension2d<u32> CGUITTFont::getDimension(const core::ustring& text) const
if (text_dimension.Width < line.Width) if (text_dimension.Width < line.Width)
text_dimension.Width = line.Width; text_dimension.Width = line.Width;
line.Width = 0; line.Width = 0;
line.Height = max_font_height; line.Height = supposed_line_height;
continue; continue;
} }
line.Width += getWidthFromCharacter(p); line.Width += getWidthFromCharacter(p);
...@@ -938,7 +943,7 @@ core::array<scene::ISceneNode*> CGUITTFont::addTextSceneNode(const wchar_t* text ...@@ -938,7 +943,7 @@ core::array<scene::ISceneNode*> CGUITTFont::addTextSceneNode(const wchar_t* text
if (line_break) { if (line_break) {
previous_char = 0; previous_char = 0;
offset.Y -= tt_face->size->metrics.ascender / 64; offset.Y -= supposed_line_height; //tt_face->size->metrics.ascender / 64;
offset.X = start_point.X; offset.X = start_point.X;
if (center) if (center)
offset.X += (text_size.Width - getDimensionUntilEndOfLine(text + 1).Width) >> 1; offset.X += (text_size.Width - getDimensionUntilEndOfLine(text + 1).Width) >> 1;
......
...@@ -143,6 +143,12 @@ public: ...@@ -143,6 +143,12 @@ public:
void updateTexture() { void updateTexture() {
if (!dirty) return; if (!dirty) return;
if (!texture) {
if (!createPageTexture(pixel_mode, texture_size))
// TODO: add error message?
return;
}
void* ptr = texture->lock(); void* ptr = texture->lock();
video::ECOLOR_FORMAT format = texture->getColorFormat(); video::ECOLOR_FORMAT format = texture->getColorFormat();
core::dimension2du size = texture->getOriginalSize(); core::dimension2du size = texture->getOriginalSize();
...@@ -176,6 +182,9 @@ public: ...@@ -176,6 +182,9 @@ public:
core::array<core::vector2di> render_positions; core::array<core::vector2di> render_positions;
core::array<core::recti> render_source_rects; core::array<core::recti> render_source_rects;
core::dimension2du texture_size;
u8 pixel_mode;
private: private:
core::array<const SGUITTGlyph*> glyph_to_be_paged; core::array<const SGUITTGlyph*> glyph_to_be_paged;
video::IVideoDriver* driver; video::IVideoDriver* driver;
...@@ -368,6 +377,7 @@ private: ...@@ -368,6 +377,7 @@ private:
s32 GlobalKerningWidth; s32 GlobalKerningWidth;
s32 GlobalKerningHeight; s32 GlobalKerningHeight;
s32 supposed_line_height;
core::ustring Invisible; core::ustring Invisible;
}; };
......
...@@ -16,6 +16,7 @@ ClientCard::ClientCard() { ...@@ -16,6 +16,7 @@ ClientCard::ClientCard() {
is_selected = false; is_selected = false;
is_showequip = false; is_showequip = false;
is_showtarget = false; is_showtarget = false;
is_showchaintarget = false;
is_highlighting = false; is_highlighting = false;
is_disabled = false; is_disabled = false;
is_reversed = false; is_reversed = false;
......
...@@ -47,7 +47,6 @@ typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer ...@@ -47,7 +47,6 @@ typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer
class ClientCard { class ClientCard {
public: public:
irr::video::ITexture* curTexture;
irr::core::matrix4 mTransform; irr::core::matrix4 mTransform;
irr::core::vector3df curPos; irr::core::vector3df curPos;
irr::core::vector3df curRot; irr::core::vector3df curRot;
...@@ -63,6 +62,7 @@ public: ...@@ -63,6 +62,7 @@ public:
bool is_selected; bool is_selected;
bool is_showequip; bool is_showequip;
bool is_showtarget; bool is_showtarget;
bool is_showchaintarget;
bool is_highlighting; bool is_highlighting;
bool is_reversed; bool is_reversed;
u32 code; u32 code;
......
This diff is collapsed.
...@@ -3,12 +3,13 @@ ...@@ -3,12 +3,13 @@
#include "config.h" #include "config.h"
#include <vector> #include <vector>
#include <set>
namespace ygo { namespace ygo {
class ClientCard; class ClientCard;
struct ChainInfo{ struct ChainInfo {
irr::core::vector3df chain_pos; irr::core::vector3df chain_pos;
ClientCard* chain_card; ClientCard* chain_card;
int code; int code;
...@@ -17,6 +18,7 @@ struct ChainInfo{ ...@@ -17,6 +18,7 @@ struct ChainInfo{
int location; int location;
int sequence; int sequence;
bool solved; bool solved;
std::set<ClientCard*> target;
}; };
class ClientField: public irr::IEventReceiver { class ClientField: public irr::IEventReceiver {
...@@ -80,7 +82,7 @@ public: ...@@ -80,7 +82,7 @@ public:
bool last_chain; bool last_chain;
bool deck_reversed; bool deck_reversed;
bool conti_selecting; bool conti_selecting;
ClientField(); ClientField();
void Clear(); void Clear();
void Initial(int player, int deckc, int extrac); void Initial(int player, int deckc, int extrac);
...@@ -97,7 +99,7 @@ public: ...@@ -97,7 +99,7 @@ public:
void ShowLocationCard(); void ShowLocationCard();
void ReplaySwap(); void ReplaySwap();
void RefreshAllCards(); void RefreshAllCards();
void GetChainLocation(int controler, int location, int sequence, irr::core::vector3df* t); void GetChainLocation(int controler, int location, int sequence, irr::core::vector3df* t);
void GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, irr::core::vector3df* r, bool setTrans = false); void GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, irr::core::vector3df* r, bool setTrans = false);
void MoveCard(ClientCard* pcard, int frame); void MoveCard(ClientCard* pcard, int frame);
...@@ -129,10 +131,12 @@ public: ...@@ -129,10 +131,12 @@ public:
int list_command; int list_command;
virtual bool OnEvent(const irr::SEvent& event); virtual bool OnEvent(const irr::SEvent& event);
virtual bool OnCommonEvent(const irr::SEvent& event);
void GetHoverField(int x, int y); void GetHoverField(int x, int y);
void ShowMenu(int flag, int x, int y); void ShowMenu(int flag, int x, int y);
void UpdateChainButtons(); void UpdateChainButtons();
void ShowCancelOrFinishButton(int buttonOp); void ShowCancelOrFinishButton(int buttonOp);
void SetShowMark(ClientCard* pcard, bool enable);
void SetResponseSelectedCards() const; void SetResponseSelectedCards() const;
}; };
......
#ifndef __CONFIG_H #ifndef __CONFIG_H
#define __CONFIG_H #define __CONFIG_H
#pragma once #pragma once
#define _IRR_STATIC_LIB_ #define _IRR_STATIC_LIB_
#define _IRR_COMPILE_WITH_DX9_DEV_PACK #define IRR_COMPILE_WITH_DX9_DEV_PACK
#ifdef _WIN32 #ifdef _WIN32
#include <WinSock2.h> #include <WinSock2.h>
#include <windows.h> #include <windows.h>
#include <ws2tcpip.h> #include <ws2tcpip.h>
#ifdef _MSC_VER #ifdef _MSC_VER
#define myswprintf _swprintf #define myswprintf _swprintf
#else #else
#define myswprintf swprintf #define myswprintf swprintf
#endif #endif
#define socklen_t int #define socklen_t int
#else //_WIN32 #else //_WIN32
#include <errno.h> #include <errno.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <netdb.h> #include <netdb.h>
#include <unistd.h> #include <unistd.h>
#include <locale.h>
#define SD_BOTH 2
#define SOCKET int #define SD_BOTH 2
#define closesocket close #define SOCKET int
#define INVALID_SOCKET -1 #define closesocket close
#define SOCKET_ERROR -1 #define INVALID_SOCKET -1
#define SOCKADDR_IN sockaddr_in #define SOCKET_ERROR -1
#define SOCKADDR sockaddr #define SOCKADDR_IN sockaddr_in
#define SOCKET_ERRNO() (errno) #define SOCKADDR sockaddr
#define SOCKET_ERRNO() (errno)
#include <wchar.h>
#define myswprintf(buf, fmt, ...) swprintf(buf, 4096, fmt, ##__VA_ARGS__) #include <wchar.h>
inline int _wtoi(const wchar_t * s) { #define myswprintf(buf, fmt, ...) swprintf(buf, 4096, fmt, ##__VA_ARGS__)
wchar_t * endptr; inline int _wtoi(const wchar_t * s) {
return (int)wcstol(s, &endptr, 10); wchar_t * endptr;
} return (int)wcstol(s, &endptr, 10);
#endif }
#endif
#include <irrlicht.h>
#include <GL/gl.h> #include <irrlicht.h>
#include <GL/glu.h> #include <GL/gl.h>
#include "CGUITTFont.h" #include <GL/glu.h>
#include "CGUIImageButton.h" #include "CGUITTFont.h"
#include <iostream> #include "CGUIImageButton.h"
#include <stdio.h> #include <iostream>
#include <stdlib.h> #include <stdio.h>
#include <memory.h> #include <stdlib.h>
#include <time.h> #include <memory.h>
#include "bufferio.h" #include <time.h>
#include "mymutex.h" #include "bufferio.h"
#include "mysignal.h" #include "mymutex.h"
#include "mythread.h" #include "mysignal.h"
#include "../ocgcore/ocgapi.h" #include "mythread.h"
#include "../ocgcore/card.h" #include "../ocgcore/ocgapi.h"
#include "../ocgcore/card.h"
using namespace irr;
using namespace core; using namespace irr;
using namespace scene; using namespace core;
using namespace video; using namespace scene;
using namespace io; using namespace video;
using namespace gui; using namespace io;
using namespace gui;
extern const unsigned short PRO_VERSION;
extern int enable_log; extern const unsigned short PRO_VERSION;
extern bool exit_on_return; extern int enable_log;
extern bool open_file; extern bool exit_on_return;
extern wchar_t open_file_name[256]; extern bool open_file;
extern wchar_t open_file_name[256];
#endif
#endif
...@@ -78,39 +78,26 @@ bool DataManager::LoadStrings(const char* file) { ...@@ -78,39 +78,26 @@ bool DataManager::LoadStrings(const char* file) {
char linebuf[256]; char linebuf[256];
char strbuf[256]; char strbuf[256];
int value; int value;
fseek(fp, 0, SEEK_END); while(fgets(linebuf, 256, fp)) {
int fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);
fgets(linebuf, 256, fp);
while(ftell(fp) < fsize) {
fgets(linebuf, 256, fp);
if(linebuf[0] != '!') if(linebuf[0] != '!')
continue; continue;
sscanf(linebuf, "!%s", strbuf); sscanf(linebuf, "!%s", strbuf);
if(!strcmp(strbuf, "system")) { if(!strcmp(strbuf, "system")) {
sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf); sscanf(&linebuf[7], "%d %240[^\n]", &value, strbuf);
int len = BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
wchar_t* pbuf = new wchar_t[len + 1]; _sysStrings[value] = strBuffer;
wcscpy(pbuf, strBuffer);
_sysStrings[value] = pbuf;
} else if(!strcmp(strbuf, "victory")) { } else if(!strcmp(strbuf, "victory")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf); sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf);
int len = BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
wchar_t* pbuf = new wchar_t[len + 1]; _victoryStrings[value] = strBuffer;
wcscpy(pbuf, strBuffer);
_victoryStrings[value] = pbuf;
} else if(!strcmp(strbuf, "counter")) { } else if(!strcmp(strbuf, "counter")) {
sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf); sscanf(&linebuf[8], "%x %240[^\n]", &value, strbuf);
int len = BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
wchar_t* pbuf = new wchar_t[len + 1]; _counterStrings[value] = strBuffer;
wcscpy(pbuf, strBuffer);
_counterStrings[value] = pbuf;
} else if(!strcmp(strbuf, "setname")) { } else if(!strcmp(strbuf, "setname")) {
sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf);//using tab for comment sscanf(&linebuf[8], "%x %240[^\t\n]", &value, strbuf);//using tab for comment
int len = BufferIO::DecodeUTF8(strbuf, strBuffer); BufferIO::DecodeUTF8(strbuf, strBuffer);
wchar_t* pbuf = new wchar_t[len + 1]; _setnameStrings[value] = strBuffer;
wcscpy(pbuf, strBuffer);
_setnameStrings[value] = pbuf;
} }
} }
fclose(fp); fclose(fp);
...@@ -175,33 +162,35 @@ const wchar_t* DataManager::GetDesc(int strCode) { ...@@ -175,33 +162,35 @@ const wchar_t* DataManager::GetDesc(int strCode) {
return unknown_string; return unknown_string;
} }
const wchar_t* DataManager::GetSysString(int code) { const wchar_t* DataManager::GetSysString(int code) {
if(code < 0 || code >= 2048 || _sysStrings[code] == 0) if(code < 0 || code >= 2048)
return unknown_string; return unknown_string;
return _sysStrings[code]; auto csit = _sysStrings.find(code);
if(csit == _sysStrings.end())
return unknown_string;
return csit->second.c_str();
} }
const wchar_t* DataManager::GetVictoryString(int code) { const wchar_t* DataManager::GetVictoryString(int code) {
auto csit = _victoryStrings.find(code); auto csit = _victoryStrings.find(code);
if(csit == _victoryStrings.end()) if(csit == _victoryStrings.end())
return unknown_string; return unknown_string;
return csit->second; return csit->second.c_str();
} }
const wchar_t* DataManager::GetCounterName(int code) { const wchar_t* DataManager::GetCounterName(int code) {
auto csit = _counterStrings.find(code); auto csit = _counterStrings.find(code);
if(csit == _counterStrings.end()) if(csit == _counterStrings.end())
return unknown_string; return unknown_string;
return csit->second; return csit->second.c_str();
} }
const wchar_t* DataManager::GetSetName(int code) { const wchar_t* DataManager::GetSetName(int code) {
auto csit = _setnameStrings.find(code); auto csit = _setnameStrings.find(code);
if(csit == _setnameStrings.end()) if(csit == _setnameStrings.end())
return NULL; return NULL;
return csit->second; return csit->second.c_str();
} }
unsigned int DataManager::GetSetCode(const wchar_t* setname) { unsigned int DataManager::GetSetCode(const wchar_t* setname) {
wchar_t strbuff[256];
for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) { for(auto csit = _setnameStrings.begin(); csit != _setnameStrings.end(); ++csit) {
swscanf(csit->second, L"%[^|]", strbuff);//setname|extra info auto xpos = csit->second.find_first_of(L'|');//setname|extra info
if(wcscmp(strbuff, setname) == 0) if(csit->second.compare(0, xpos, setname) == 0)
return csit->first; return csit->first;
} }
return 0; return 0;
...@@ -290,7 +279,7 @@ const wchar_t* DataManager::FormatSetName(unsigned long long setcode) { ...@@ -290,7 +279,7 @@ const wchar_t* DataManager::FormatSetName(unsigned long long setcode) {
for(int i = 0; i < 4; ++i) { for(int i = 0; i < 4; ++i) {
const wchar_t* setname = GetSetName((setcode >> i * 16) & 0xffff); const wchar_t* setname = GetSetName((setcode >> i * 16) & 0xffff);
if(setname) { if(setname) {
BufferIO::CopyWStrRef(setname, p, 16); BufferIO::CopyWStrRef(setname, p, 32);
*p = L'|'; *p = L'|';
*++p = 0; *++p = 0;
} }
...@@ -303,38 +292,23 @@ const wchar_t* DataManager::FormatSetName(unsigned long long setcode) { ...@@ -303,38 +292,23 @@ const wchar_t* DataManager::FormatSetName(unsigned long long setcode) {
} }
const wchar_t* DataManager::FormatLinkMarker(int link_marker) { const wchar_t* DataManager::FormatLinkMarker(int link_marker) {
wchar_t* p = lmBuffer; wchar_t* p = lmBuffer;
if(link_marker & LINK_MARKER_TOP_LEFT) { *p = 0;
BufferIO::CopyWStrRef(L"[ ]", p, 4); if(link_marker & LINK_MARKER_TOP_LEFT)
*(p - 2) = 0x2196; BufferIO::CopyWStrRef(L"[\u2196]", p, 4);
} if(link_marker & LINK_MARKER_TOP)
if(link_marker & LINK_MARKER_TOP) { BufferIO::CopyWStrRef(L"[\u2191]", p, 4);
BufferIO::CopyWStrRef(L"[ ]", p, 4); if(link_marker & LINK_MARKER_TOP_RIGHT)
*(p - 2) = 0x2191; BufferIO::CopyWStrRef(L"[\u2197]", p, 4);
} if(link_marker & LINK_MARKER_LEFT)
if(link_marker & LINK_MARKER_TOP_RIGHT) { BufferIO::CopyWStrRef(L"[\u2190]", p, 4);
BufferIO::CopyWStrRef(L"[ ]", p, 4); if(link_marker & LINK_MARKER_RIGHT)
*(p - 2) = 0x2197; BufferIO::CopyWStrRef(L"[\u2192]", p, 4);
} if(link_marker & LINK_MARKER_BOTTOM_LEFT)
if(link_marker & LINK_MARKER_LEFT) { BufferIO::CopyWStrRef(L"[\u2199]", p, 4);
BufferIO::CopyWStrRef(L"[ ]", p, 4); if(link_marker & LINK_MARKER_BOTTOM)
*(p - 2) = 0x2190; BufferIO::CopyWStrRef(L"[\u2193]", p, 4);
} if(link_marker & LINK_MARKER_BOTTOM_RIGHT)
if(link_marker & LINK_MARKER_RIGHT) { BufferIO::CopyWStrRef(L"[\u2198]", p, 4);
BufferIO::CopyWStrRef(L"[ ]", p, 4);
*(p - 2) = 0x2192;
}
if(link_marker & LINK_MARKER_BOTTOM_LEFT) {
BufferIO::CopyWStrRef(L"[ ]", p, 4);
*(p - 2) = 0x2199;
}
if(link_marker & LINK_MARKER_BOTTOM) {
BufferIO::CopyWStrRef(L"[ ]", p, 4);
*(p - 2) = 0x2193;
}
if(link_marker & LINK_MARKER_BOTTOM_RIGHT) {
BufferIO::CopyWStrRef(L"[ ]", p, 4);
*(p - 2) = 0x2198;
}
return lmBuffer; return lmBuffer;
} }
int DataManager::CardReader(int code, void* pData) { int DataManager::CardReader(int code, void* pData) {
......
...@@ -35,11 +35,11 @@ public: ...@@ -35,11 +35,11 @@ public:
std::unordered_map<unsigned int, CardDataC> _datas; std::unordered_map<unsigned int, CardDataC> _datas;
std::unordered_map<unsigned int, CardString> _strings; std::unordered_map<unsigned int, CardString> _strings;
std::unordered_map<unsigned int, wchar_t*> _counterStrings; std::unordered_map<unsigned int, std::wstring> _counterStrings;
std::unordered_map<unsigned int, wchar_t*> _victoryStrings; std::unordered_map<unsigned int, std::wstring> _victoryStrings;
std::unordered_map<unsigned int, wchar_t*> _setnameStrings; std::unordered_map<unsigned int, std::wstring> _setnameStrings;
std::unordered_map<unsigned int, std::wstring> _sysStrings;
wchar_t* _sysStrings[2048];
wchar_t numStrings[256][4]; wchar_t numStrings[256][4];
wchar_t numBuffer[6]; wchar_t numBuffer[6];
wchar_t attBuffer[128]; wchar_t attBuffer[128];
...@@ -51,7 +51,7 @@ public: ...@@ -51,7 +51,7 @@ public:
static wchar_t strBuffer[4096]; static wchar_t strBuffer[4096];
static const wchar_t* unknown_string; static const wchar_t* unknown_string;
static int CardReader(int, void*); static int CardReader(int, void*);
}; };
extern DataManager dataManager; extern DataManager dataManager;
......
This diff is collapsed.
...@@ -11,11 +11,26 @@ namespace ygo { ...@@ -11,11 +11,26 @@ namespace ygo {
class DeckBuilder: public irr::IEventReceiver { class DeckBuilder: public irr::IEventReceiver {
public: public:
virtual bool OnEvent(const irr::SEvent& event); virtual bool OnEvent(const irr::SEvent& event);
void Initialize();
void Terminate();
void GetHoveredCard();
void FilterCards(); void FilterCards();
void StartFilter();
void ClearFilter(); void ClearFilter();
void InstantSearch();
void ClearSearch(); void ClearSearch();
void SortList(); void SortList();
bool CardNameContains(const wchar_t *haystack, const wchar_t *needle);
bool push_main(code_pointer pointer, int seq = -1);
bool push_extra(code_pointer pointer, int seq = -1);
bool push_side(code_pointer pointer, int seq = -1);
void pop_main(int seq);
void pop_extra(int seq);
void pop_side(int seq);
bool check_limit(code_pointer pointer);
long long filter_effect; long long filter_effect;
unsigned int filter_type; unsigned int filter_type;
unsigned int filter_type2; unsigned int filter_type2;
...@@ -29,21 +44,26 @@ public: ...@@ -29,21 +44,26 @@ public:
unsigned int filter_lv; unsigned int filter_lv;
unsigned int filter_scltype; unsigned int filter_scltype;
unsigned int filter_scl; unsigned int filter_scl;
unsigned int filter_marks;
int filter_lm; int filter_lm;
position2di mouse_pos;
int hovered_code; int hovered_code;
int hovered_pos; int hovered_pos;
int hovered_seq; int hovered_seq;
int is_lastcard;
int click_pos; int click_pos;
bool is_draging; bool is_draging;
bool is_starting_dragging;
int dragx; int dragx;
int dragy; int dragy;
size_t pre_mainc; size_t pre_mainc;
size_t pre_extrac; size_t pre_extrac;
size_t pre_sidec; size_t pre_sidec;
code_pointer draging_pointer; code_pointer draging_pointer;
bool is_deleting; int prev_deck;
bool is_clearing; s32 prev_operation;
bool is_modified;
std::unordered_map<int, int>* filterList; std::unordered_map<int, int>* filterList;
std::vector<code_pointer> results; std::vector<code_pointer> results;
wchar_t result_string[8]; wchar_t result_string[8];
......
...@@ -13,12 +13,7 @@ void DeckManager::LoadLFList() { ...@@ -13,12 +13,7 @@ void DeckManager::LoadLFList() {
char linebuf[256]; char linebuf[256];
wchar_t strBuffer[256]; wchar_t strBuffer[256];
if(fp) { if(fp) {
fseek(fp, 0, SEEK_END); while(fgets(linebuf, 256, fp)) {
int fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);
fgets(linebuf, 256, fp);
while(ftell(fp) < fsize) {
fgets(linebuf, 256, fp);
if(linebuf[0] == '#') if(linebuf[0] == '#')
continue; continue;
int p = 0, sa = 0, code, count; int p = 0, sa = 0, code, count;
...@@ -191,12 +186,7 @@ bool DeckManager::LoadDeck(const wchar_t* file) { ...@@ -191,12 +186,7 @@ bool DeckManager::LoadDeck(const wchar_t* file) {
int cardlist[128]; int cardlist[128];
bool is_side = false; bool is_side = false;
char linebuf[256]; char linebuf[256];
fseek(fp, 0, SEEK_END); while(fgets(linebuf, 256, fp) && ct < 128) {
int fsize = ftell(fp);
fseek(fp, 0, SEEK_SET);
fgets(linebuf, 256, fp);
while(ftell(fp) < fsize && ct < 128) {
fgets(linebuf, 256, fp);
if(linebuf[0] == '!') { if(linebuf[0] == '!') {
is_side = true; is_side = true;
continue; continue;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -13,6 +13,7 @@ namespace ygo { ...@@ -13,6 +13,7 @@ namespace ygo {
struct Config { struct Config {
bool use_d3d; bool use_d3d;
bool use_image_scale;
unsigned short antialias; unsigned short antialias;
unsigned short serverport; unsigned short serverport;
unsigned char textfontsize; unsigned char textfontsize;
...@@ -25,7 +26,8 @@ struct Config { ...@@ -25,7 +26,8 @@ struct Config {
wchar_t numfont[256]; wchar_t numfont[256];
wchar_t roompass[20]; wchar_t roompass[20];
//settings //settings
int chkAutoPos; int chkMAutoPos;
int chkSTAutoPos;
int chkRandomPos; int chkRandomPos;
int chkAutoChain; int chkAutoChain;
int chkWaitChain; int chkWaitChain;
...@@ -36,6 +38,8 @@ struct Config { ...@@ -36,6 +38,8 @@ struct Config {
int control_mode; int control_mode;
int draw_field_spell; int draw_field_spell;
int separate_clear_button; int separate_clear_button;
int auto_search_limit;
int chkIgnoreDeckChanges;
}; };
struct DuelInfo { struct DuelInfo {
...@@ -48,6 +52,7 @@ struct DuelInfo { ...@@ -48,6 +52,7 @@ struct DuelInfo {
bool is_shuffling; bool is_shuffling;
bool tag_player[2]; bool tag_player[2];
int lp[2]; int lp[2];
int duel_rule;
int turn; int turn;
short curMsg; short curMsg;
wchar_t hostname[20]; wchar_t hostname[20];
...@@ -88,12 +93,15 @@ public: ...@@ -88,12 +93,15 @@ public:
void RefreshSingleplay(); void RefreshSingleplay();
void DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width, float* cv); void DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width, float* cv);
void DrawBackGround(); void DrawBackGround();
void DrawLinkedZones(ClientCard* pcard);
void CheckMutual(ClientCard* pcard, int mark);
void DrawCards(); void DrawCards();
void DrawCard(ClientCard* pcard); void DrawCard(ClientCard* pcard);
void DrawMisc(); void DrawMisc();
void DrawStatus(ClientCard* pcard, int x1, int y1, int x2, int y2); void DrawStatus(ClientCard* pcard, int x1, int y1, int x2, int y2);
void DrawGUI(); void DrawGUI();
void DrawSpec(); void DrawSpec();
void DrawBackImage(irr::video::ITexture* texture);
void ShowElement(irr::gui::IGUIElement* element, int autoframe = 0); void ShowElement(irr::gui::IGUIElement* element, int autoframe = 0);
void HideElement(irr::gui::IGUIElement* element, bool set_action = false); void HideElement(irr::gui::IGUIElement* element, bool set_action = false);
void PopupElement(irr::gui::IGUIElement* element, int hideframe = 0); void PopupElement(irr::gui::IGUIElement* element, int hideframe = 0);
...@@ -198,12 +206,15 @@ public: ...@@ -198,12 +206,15 @@ public:
irr::gui::IGUIStaticText* stSetName; irr::gui::IGUIStaticText* stSetName;
irr::gui::IGUIStaticText* stText; irr::gui::IGUIStaticText* stText;
irr::gui::IGUIScrollBar* scrCardText; irr::gui::IGUIScrollBar* scrCardText;
irr::gui::IGUICheckBox* chkAutoPos; irr::gui::IGUICheckBox* chkMAutoPos;
irr::gui::IGUICheckBox* chkSTAutoPos;
irr::gui::IGUICheckBox* chkRandomPos; irr::gui::IGUICheckBox* chkRandomPos;
irr::gui::IGUICheckBox* chkAutoChain; irr::gui::IGUICheckBox* chkAutoChain;
irr::gui::IGUICheckBox* chkWaitChain; irr::gui::IGUICheckBox* chkWaitChain;
irr::gui::IGUICheckBox* chkHideSetname; irr::gui::IGUICheckBox* chkHideSetname;
irr::gui::IGUICheckBox* chkHideHintButton; irr::gui::IGUICheckBox* chkHideHintButton;
irr::gui::IGUICheckBox* chkIgnoreDeckChanges;
irr::gui::IGUICheckBox* chkAutoSearch;
irr::gui::IGUIListBox* lstLog; irr::gui::IGUIListBox* lstLog;
irr::gui::IGUIButton* btnClearLog; irr::gui::IGUIButton* btnClearLog;
irr::gui::IGUIButton* btnSaveLog; irr::gui::IGUIButton* btnSaveLog;
...@@ -252,6 +263,8 @@ public: ...@@ -252,6 +263,8 @@ public:
irr::gui::IGUIComboBox* cbDeckSelect; irr::gui::IGUIComboBox* cbDeckSelect;
irr::gui::IGUIStaticText* stHostPrepRule; irr::gui::IGUIStaticText* stHostPrepRule;
irr::gui::IGUIStaticText* stHostPrepOB; irr::gui::IGUIStaticText* stHostPrepOB;
irr::gui::IGUIButton* btnHostPrepReady;
irr::gui::IGUIButton* btnHostPrepNotReady;
irr::gui::IGUIButton* btnHostPrepStart; irr::gui::IGUIButton* btnHostPrepStart;
irr::gui::IGUIButton* btnHostPrepCancel; irr::gui::IGUIButton* btnHostPrepCancel;
//replay //replay
...@@ -346,9 +359,7 @@ public: ...@@ -346,9 +359,7 @@ public:
irr::gui::IGUICheckBox* chkIgnore2; irr::gui::IGUICheckBox* chkIgnore2;
//phase button //phase button
irr::gui::IGUIStaticText* wPhase; irr::gui::IGUIStaticText* wPhase;
irr::gui::IGUIButton* btnDP; irr::gui::IGUIButton* btnPhaseStatus;
irr::gui::IGUIButton* btnSP;
irr::gui::IGUIButton* btnM1;
irr::gui::IGUIButton* btnBP; irr::gui::IGUIButton* btnBP;
irr::gui::IGUIButton* btnM2; irr::gui::IGUIButton* btnM2;
irr::gui::IGUIButton* btnEP; irr::gui::IGUIButton* btnEP;
...@@ -383,6 +394,10 @@ public: ...@@ -383,6 +394,10 @@ public:
irr::gui::IGUIWindow* wCategories; irr::gui::IGUIWindow* wCategories;
irr::gui::IGUICheckBox* chkCategory[32]; irr::gui::IGUICheckBox* chkCategory[32];
irr::gui::IGUIButton* btnCategoryOK; irr::gui::IGUIButton* btnCategoryOK;
irr::gui::IGUIButton* btnMarksFilter;
irr::gui::IGUIWindow* wLinkMarks;
irr::gui::IGUIButton* btnMark[8];
irr::gui::IGUIButton* btnMarksOK;
//sort type //sort type
irr::gui::IGUIStaticText* wSort; irr::gui::IGUIStaticText* wSort;
irr::gui::IGUIComboBox* cbSortType; irr::gui::IGUIComboBox* cbSortType;
...@@ -401,6 +416,8 @@ public: ...@@ -401,6 +416,8 @@ public:
irr::gui::IGUIButton* btnReplaySwap; irr::gui::IGUIButton* btnReplaySwap;
//surrender/leave //surrender/leave
irr::gui::IGUIButton* btnLeaveGame; irr::gui::IGUIButton* btnLeaveGame;
//swap
irr::gui::IGUIButton* btnSpectatorSwap;
//chain control //chain control
irr::gui::IGUIButton* btnChainIgnore; irr::gui::IGUIButton* btnChainIgnore;
irr::gui::IGUIButton* btnChainAlways; irr::gui::IGUIButton* btnChainAlways;
...@@ -413,6 +430,11 @@ extern Game* mainGame; ...@@ -413,6 +430,11 @@ extern Game* mainGame;
} }
#define CARD_IMG_WIDTH 177
#define CARD_IMG_HEIGHT 254
#define CARD_THUMB_WIDTH 44
#define CARD_THUMB_HEIGHT 64
#define UEVENT_EXIT 0x1 #define UEVENT_EXIT 0x1
#define UEVENT_TOWINDOW 0x2 #define UEVENT_TOWINDOW 0x2
...@@ -448,6 +470,8 @@ extern Game* mainGame; ...@@ -448,6 +470,8 @@ extern Game* mainGame;
#define BUTTON_HP_CANCEL 123 #define BUTTON_HP_CANCEL 123
#define BUTTON_HP_KICK 124 #define BUTTON_HP_KICK 124
#define CHECKBOX_HP_READY 125 #define CHECKBOX_HP_READY 125
#define BUTTON_HP_READY 126
#define BUTTON_HP_NOTREADY 127
#define LISTBOX_REPLAY_LIST 130 #define LISTBOX_REPLAY_LIST 130
#define BUTTON_LOAD_REPLAY 131 #define BUTTON_LOAD_REPLAY 131
#define BUTTON_CANCEL_REPLAY 132 #define BUTTON_CANCEL_REPLAY 132
...@@ -498,6 +522,7 @@ extern Game* mainGame; ...@@ -498,6 +522,7 @@ extern Game* mainGame;
#define BUTTON_CHAIN_ALWAYS 265 #define BUTTON_CHAIN_ALWAYS 265
#define BUTTON_CHAIN_WHENAVAIL 266 #define BUTTON_CHAIN_WHENAVAIL 266
#define BUTTON_CANCEL_OR_FINISH 267 #define BUTTON_CANCEL_OR_FINISH 267
#define BUTTON_PHASE 268
#define BUTTON_CLEAR_LOG 270 #define BUTTON_CLEAR_LOG 270
#define LISTBOX_LOG 271 #define LISTBOX_LOG 271
#define SCROLL_CARDTEXT 280 #define SCROLL_CARDTEXT 280
...@@ -526,6 +551,8 @@ extern Game* mainGame; ...@@ -526,6 +551,8 @@ extern Game* mainGame;
#define SCROLL_FILTER 315 #define SCROLL_FILTER 315
#define EDITBOX_KEYWORD 316 #define EDITBOX_KEYWORD 316
#define BUTTON_CLEAR_FILTER 317 #define BUTTON_CLEAR_FILTER 317
#define COMBOBOX_ATTRIBUTE 318
#define COMBOBOX_RACE 319
#define BUTTON_REPLAY_START 320 #define BUTTON_REPLAY_START 320
#define BUTTON_REPLAY_PAUSE 321 #define BUTTON_REPLAY_PAUSE 321
#define BUTTON_REPLAY_STEP 322 #define BUTTON_REPLAY_STEP 322
...@@ -537,7 +564,12 @@ extern Game* mainGame; ...@@ -537,7 +564,12 @@ extern Game* mainGame;
#define LISTBOX_SINGLEPLAY_LIST 350 #define LISTBOX_SINGLEPLAY_LIST 350
#define BUTTON_LOAD_SINGLEPLAY 351 #define BUTTON_LOAD_SINGLEPLAY 351
#define BUTTON_CANCEL_SINGLEPLAY 352 #define BUTTON_CANCEL_SINGLEPLAY 352
#define CHECKBOX_AUTO_SEARCH 360
#define COMBOBOX_SORTTYPE 370 #define COMBOBOX_SORTTYPE 370
#define COMBOBOX_LIMIT 371
#define BUTTON_MARKS_FILTER 380
#define BUTTON_MARKERS_OK 381
#define DEFAULT_DUEL_RULE 3 #define DEFAULT_DUEL_RULE 4
#endif // GAME_H #endif // GAME_H
...@@ -2,6 +2,9 @@ ...@@ -2,6 +2,9 @@
#include "game.h" #include "game.h"
#include "data_manager.h" #include "data_manager.h"
#include <event2/thread.h> #include <event2/thread.h>
#ifdef __APPLE__
#import <CoreFoundation/CoreFoundation.h>
#endif
int enable_log = 0; int enable_log = 0;
bool exit_on_return = false; bool exit_on_return = false;
...@@ -33,12 +36,26 @@ void ClickButton(irr::gui::IGUIElement* btn) { ...@@ -33,12 +36,26 @@ void ClickButton(irr::gui::IGUIElement* btn) {
} }
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
#ifndef _WIN32
setlocale(LC_CTYPE, "UTF-8");
#endif
#ifdef __APPLE__
CFURLRef bundle_url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
CFURLRef bundle_base_url = CFURLCreateCopyDeletingLastPathComponent(NULL, bundle_url);
CFRelease(bundle_url);
CFStringRef path = CFURLCopyFileSystemPath(bundle_base_url, kCFURLPOSIXPathStyle);
CFRelease(bundle_base_url);
chdir(CFStringGetCStringPtr(path, kCFStringEncodingUTF8));
CFRelease(path);
#endif //__APPLE__
#ifdef _WIN32 #ifdef _WIN32
#ifndef _DEBUG
wchar_t exepath[MAX_PATH]; wchar_t exepath[MAX_PATH];
GetModuleFileNameW(NULL, exepath, MAX_PATH); GetModuleFileNameW(NULL, exepath, MAX_PATH);
wchar_t* p = wcsrchr(exepath, '\\'); wchar_t* p = wcsrchr(exepath, '\\');
*p = '\0'; *p = '\0';
SetCurrentDirectoryW(exepath); SetCurrentDirectoryW(exepath);
#endif //_DEBUG
#endif //_WIN32 #endif //_WIN32
#ifdef _WIN32 #ifdef _WIN32
WORD wVersionRequested; WORD wVersionRequested;
...@@ -94,19 +111,30 @@ int main(int argc, char* argv[]) { ...@@ -94,19 +111,30 @@ int main(int argc, char* argv[]) {
} else if(!strcmp(argv[i], "-k")) { // Keep on return } else if(!strcmp(argv[i], "-k")) { // Keep on return
exit_on_return = false; exit_on_return = false;
keep_on_return = true; keep_on_return = true;
} else if(!strcmp(argv[i], "-d")) { // Deck
if(i + 2 < argc) { // select deck
++i;
GetParameterW(ygo::mainGame->gameConf.lastdeck, &argv[i][0]);
continue;
} else { // open deck
exit_on_return = !keep_on_return;
if(i < argc) {
open_file = true;
GetParameterW(open_file_name, &argv[i + 1][0]);
}
ClickButton(ygo::mainGame->btnDeckEdit);
break;
}
} else if(!strcmp(argv[i], "-c")) { // Create host
exit_on_return = !keep_on_return;
ygo::mainGame->HideElement(ygo::mainGame->wMainMenu);
ClickButton(ygo::mainGame->btnHostConfirm);
break;
} else if(!strcmp(argv[i], "-j")) { // Join host } else if(!strcmp(argv[i], "-j")) { // Join host
exit_on_return = !keep_on_return; exit_on_return = !keep_on_return;
ClickButton(ygo::mainGame->btnLanMode); ClickButton(ygo::mainGame->btnLanMode);
ClickButton(ygo::mainGame->btnJoinHost); ClickButton(ygo::mainGame->btnJoinHost);
break; break;
} else if(!strcmp(argv[i], "-d")) { // Deck
exit_on_return = !keep_on_return;
if(i < argc) {
open_file = true;
GetParameterW(open_file_name, &argv[i + 1][0]);
}
ClickButton(ygo::mainGame->btnDeckEdit);
break;
} else if(!strcmp(argv[i], "-r")) { // Replay } else if(!strcmp(argv[i], "-r")) { // Replay
exit_on_return = !keep_on_return; exit_on_return = !keep_on_return;
if(i < argc) { if(i < argc) {
......
#include "image_manager.h" #include "image_manager.h"
#include "game.h"
namespace ygo { namespace ygo {
...@@ -7,6 +8,8 @@ ImageManager imageManager; ...@@ -7,6 +8,8 @@ ImageManager imageManager;
bool ImageManager::Initial() { bool ImageManager::Initial() {
tCover[0] = driver->getTexture("textures/cover.jpg"); tCover[0] = driver->getTexture("textures/cover.jpg");
tCover[1] = driver->getTexture("textures/cover2.jpg"); tCover[1] = driver->getTexture("textures/cover2.jpg");
if(!tCover[1])
tCover[1] = tCover[0];
tUnknown = driver->getTexture("textures/unknown.jpg"); tUnknown = driver->getTexture("textures/unknown.jpg");
tAct = driver->getTexture("textures/act.png"); tAct = driver->getTexture("textures/act.png");
tAttack = driver->getTexture("textures/attack.png"); tAttack = driver->getTexture("textures/attack.png");
...@@ -18,6 +21,7 @@ bool ImageManager::Initial() { ...@@ -18,6 +21,7 @@ bool ImageManager::Initial() {
tMask = driver->getTexture("textures/mask.png"); tMask = driver->getTexture("textures/mask.png");
tEquip = driver->getTexture("textures/equip.png"); tEquip = driver->getTexture("textures/equip.png");
tTarget = driver->getTexture("textures/target.png"); tTarget = driver->getTexture("textures/target.png");
tChainTarget = driver->getTexture("textures/chaintarget.png");
tLim = driver->getTexture("textures/lim.png"); tLim = driver->getTexture("textures/lim.png");
tOT = driver->getTexture("textures/ot.png"); tOT = driver->getTexture("textures/ot.png");
tHand[0] = driver->getTexture("textures/f1.jpg"); tHand[0] = driver->getTexture("textures/f1.jpg");
...@@ -25,9 +29,15 @@ bool ImageManager::Initial() { ...@@ -25,9 +29,15 @@ bool ImageManager::Initial() {
tHand[2] = driver->getTexture("textures/f3.jpg"); tHand[2] = driver->getTexture("textures/f3.jpg");
tBackGround = driver->getTexture("textures/bg.jpg"); tBackGround = driver->getTexture("textures/bg.jpg");
tBackGround_menu = driver->getTexture("textures/bg_menu.jpg"); tBackGround_menu = driver->getTexture("textures/bg_menu.jpg");
if(!tBackGround_menu)
tBackGround_menu = tBackGround;
tBackGround_deck = driver->getTexture("textures/bg_deck.jpg"); tBackGround_deck = driver->getTexture("textures/bg_deck.jpg");
tField = driver->getTexture("textures/field3.png"); if(!tBackGround_deck)
tFieldTransparent = driver->getTexture("textures/field-transparent3.png"); tBackGround_deck = tBackGround;
tField[0] = driver->getTexture("textures/field2.png");
tFieldTransparent[0] = driver->getTexture("textures/field-transparent2.png");
tField[1] = driver->getTexture("textures/field3.png");
tFieldTransparent[1] = driver->getTexture("textures/field-transparent3.png");
return true; return true;
} }
void ImageManager::SetDevice(irr::IrrlichtDevice* dev) { void ImageManager::SetDevice(irr::IrrlichtDevice* dev) {
...@@ -54,6 +64,100 @@ void ImageManager::RemoveTexture(int code) { ...@@ -54,6 +64,100 @@ void ImageManager::RemoveTexture(int code) {
tMap.erase(tit); tMap.erase(tit);
} }
} }
// function by Warr1024, from https://github.com/minetest/minetest/issues/2419 , modified
void imageScaleNNAA(irr::video::IImage *src, irr::video::IImage *dest)
{
double sx, sy, minsx, maxsx, minsy, maxsy, area, ra, ga, ba, aa, pw, ph, pa;
u32 dy, dx;
irr::video::SColor pxl;
// Cache rectsngle boundaries.
double sw = src->getDimension().Width * 1.0;
double sh = src->getDimension().Height * 1.0;
// Walk each destination image pixel.
// Note: loop y around x for better cache locality.
irr::core::dimension2d<u32> dim = dest->getDimension();
for(dy = 0; dy < dim.Height; dy++)
for(dx = 0; dx < dim.Width; dx++) {
// Calculate floating-point source rectangle bounds.
minsx = dx * sw / dim.Width;
maxsx = minsx + sw / dim.Width;
minsy = dy * sh / dim.Height;
maxsy = minsy + sh / dim.Height;
// Total area, and integral of r, g, b values over that area,
// initialized to zero, to be summed up in next loops.
area = 0;
ra = 0;
ga = 0;
ba = 0;
aa = 0;
// Loop over the integral pixel positions described by those bounds.
for(sy = floor(minsy); sy < maxsy; sy++)
for(sx = floor(minsx); sx < maxsx; sx++) {
// Calculate width, height, then area of dest pixel
// that's covered by this source pixel.
pw = 1;
if(minsx > sx)
pw += sx - minsx;
if(maxsx < (sx + 1))
pw += maxsx - sx - 1;
ph = 1;
if(minsy > sy)
ph += sy - minsy;
if(maxsy < (sy + 1))
ph += maxsy - sy - 1;
pa = pw * ph;
// Get source pixel and add it to totals, weighted
// by covered area and alpha.
pxl = src->getPixel((u32)sx, (u32)sy);
area += pa;
ra += pa * pxl.getRed();
ga += pa * pxl.getGreen();
ba += pa * pxl.getBlue();
aa += pa * pxl.getAlpha();
}
// Set the destination image pixel to the average color.
if(area > 0) {
pxl.setRed(ra / area + 0.5);
pxl.setGreen(ga / area + 0.5);
pxl.setBlue(ba / area + 0.5);
pxl.setAlpha(aa / area + 0.5);
} else {
pxl.setRed(0);
pxl.setGreen(0);
pxl.setBlue(0);
pxl.setAlpha(0);
}
dest->setPixel(dx, dy, pxl);
}
}
irr::video::ITexture* ImageManager::GetTextureFromFile(char* file, s32 width, s32 height) {
if(mainGame->gameConf.use_image_scale) {
irr::video::ITexture* texture;
irr::video::IImage* srcimg = driver->createImageFromFile(file);
if(srcimg == NULL)
return NULL;
if(srcimg->getDimension() == irr::core::dimension2d<u32>(width, height)) {
texture = driver->addTexture(file, srcimg);
} else {
video::IImage *destimg = driver->createImage(srcimg->getColorFormat(), irr::core::dimension2d<u32>(width, height));
imageScaleNNAA(srcimg, destimg);
texture = driver->addTexture(file, destimg);
destimg->drop();
}
srcimg->drop();
return texture;
} else {
return driver->getTexture(file);
}
}
irr::video::ITexture* ImageManager::GetTexture(int code) { irr::video::ITexture* ImageManager::GetTexture(int code) {
if(code == 0) if(code == 0)
return tUnknown; return tUnknown;
...@@ -61,23 +165,22 @@ irr::video::ITexture* ImageManager::GetTexture(int code) { ...@@ -61,23 +165,22 @@ irr::video::ITexture* ImageManager::GetTexture(int code) {
if(tit == tMap.end()) { if(tit == tMap.end()) {
char file[256]; char file[256];
sprintf(file, "expansions/pics/%d.jpg", code); sprintf(file, "expansions/pics/%d.jpg", code);
irr::video::ITexture* img = driver->getTexture(file); irr::video::ITexture* img = GetTextureFromFile(file, CARD_IMG_WIDTH, CARD_IMG_HEIGHT);
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/%d.jpg", code); sprintf(file, "pics/%d.jpg", code);
img = driver->getTexture(file); img = GetTextureFromFile(file, CARD_IMG_WIDTH, CARD_IMG_HEIGHT);
} }
if(img == NULL) { if(img == NULL && !mainGame->gameConf.use_image_scale) {
tMap[code] = NULL; tMap[code] = NULL;
return GetTextureThumb(code); return GetTextureThumb(code);
} else {
tMap[code] = img;
return img;
} }
tMap[code] = img;
return (img == NULL) ? tUnknown : img;
} }
if(tit->second) if(tit->second)
return tit->second; return tit->second;
else else
return GetTextureThumb(code); return mainGame->gameConf.use_image_scale ? tUnknown : GetTextureThumb(code);
} }
irr::video::ITexture* ImageManager::GetTextureThumb(int code) { irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
if(code == 0) if(code == 0)
...@@ -86,18 +189,21 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) { ...@@ -86,18 +189,21 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
if(tit == tThumb.end()) { if(tit == tThumb.end()) {
char file[256]; char file[256];
sprintf(file, "expansions/pics/thumbnail/%d.jpg", code); sprintf(file, "expansions/pics/thumbnail/%d.jpg", code);
irr::video::ITexture* img = driver->getTexture(file); irr::video::ITexture* img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT);
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/thumbnail/%d.jpg", code); sprintf(file, "pics/thumbnail/%d.jpg", code);
img = driver->getTexture(file); img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT);
} }
if(img == NULL) { if(img == NULL && mainGame->gameConf.use_image_scale) {
tThumb[code] = NULL; sprintf(file, "expansions/pics/%d.jpg", code);
return tUnknown; img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT);
} else { if(img == NULL) {
tThumb[code] = img; sprintf(file, "pics/%d.jpg", code);
return img; img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT);
}
} }
tThumb[code] = img;
return (img == NULL) ? tUnknown : img;
} }
if(tit->second) if(tit->second)
return tit->second; return tit->second;
...@@ -111,18 +217,18 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) { ...@@ -111,18 +217,18 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) {
if(tit == tFields.end()) { if(tit == tFields.end()) {
char file[256]; char file[256];
sprintf(file, "expansions/pics/field/%d.png", code); sprintf(file, "expansions/pics/field/%d.png", code);
irr::video::ITexture* img = driver->getTexture(file); irr::video::ITexture* img = GetTextureFromFile(file, 512, 512);
if(img == NULL) { if(img == NULL) {
sprintf(file, "expansions/pics/field/%d.jpg", code); sprintf(file, "expansions/pics/field/%d.jpg", code);
img = driver->getTexture(file); img = GetTextureFromFile(file, 512, 512);
} }
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/field/%d.png", code); sprintf(file, "pics/field/%d.png", code);
img = driver->getTexture(file); img = GetTextureFromFile(file, 512, 512);
} }
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/field/%d.jpg", code); sprintf(file, "pics/field/%d.jpg", code);
img = driver->getTexture(file); img = GetTextureFromFile(file, 512, 512);
if(img == NULL) { if(img == NULL) {
tFields[code] = NULL; tFields[code] = NULL;
return NULL; return NULL;
......
...@@ -13,6 +13,7 @@ public: ...@@ -13,6 +13,7 @@ public:
void SetDevice(irr::IrrlichtDevice* dev); void SetDevice(irr::IrrlichtDevice* dev);
void ClearTexture(); void ClearTexture();
void RemoveTexture(int code); void RemoveTexture(int code);
irr::video::ITexture* GetTextureFromFile(char* file, s32 width, s32 height);
irr::video::ITexture* GetTexture(int code); irr::video::ITexture* GetTexture(int code);
irr::video::ITexture* GetTextureThumb(int code); irr::video::ITexture* GetTextureThumb(int code);
irr::video::ITexture* GetTextureField(int code); irr::video::ITexture* GetTextureField(int code);
...@@ -34,14 +35,15 @@ public: ...@@ -34,14 +35,15 @@ public:
irr::video::ITexture* tMask; irr::video::ITexture* tMask;
irr::video::ITexture* tEquip; irr::video::ITexture* tEquip;
irr::video::ITexture* tTarget; irr::video::ITexture* tTarget;
irr::video::ITexture* tChainTarget;
irr::video::ITexture* tLim; irr::video::ITexture* tLim;
irr::video::ITexture* tOT; irr::video::ITexture* tOT;
irr::video::ITexture* tHand[3]; irr::video::ITexture* tHand[3];
irr::video::ITexture* tBackGround; irr::video::ITexture* tBackGround;
irr::video::ITexture* tBackGround_menu; irr::video::ITexture* tBackGround_menu;
irr::video::ITexture* tBackGround_deck; irr::video::ITexture* tBackGround_deck;
irr::video::ITexture* tField; irr::video::ITexture* tField[2];
irr::video::ITexture* tFieldTransparent; irr::video::ITexture* tFieldTransparent[2];
}; };
extern ImageManager imageManager; extern ImageManager imageManager;
......
...@@ -183,44 +183,64 @@ Materials::Materials() { ...@@ -183,44 +183,64 @@ Materials::Materials() {
iRectangle[5] = 3; iRectangle[5] = 3;
SetS3DVertex(vFieldDeck[0], 6.9f, 2.7f, 7.7f, 3.9f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldDeck[0], 6.9f, 2.7f, 7.7f, 3.9f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldGrave[0], 6.9f, 0.1f, 7.7f, 1.3f, 0, 1, 0, 0, 0, 0); //grave
SetS3DVertex(vFieldGrave[0][0], 6.9f, 0.1f, 7.7f, 1.3f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldGrave[0][1], 6.9f, 1.4f, 7.7f, 2.6f, 0, 1, 0, 0, 0, 0);
//extra
SetS3DVertex(vFieldExtra[0], 0.2f, 2.7f, 1.0f, 3.9f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldExtra[0], 0.2f, 2.7f, 1.0f, 3.9f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldRemove[0], 7.9f, 0.1f, 8.7f, 1.3f, 0, 1, 0, 0, 0, 0); //remove
SetS3DVertex(vFieldRemove[0][0], 7.9f, 0.1f, 8.7f, 1.3f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldRemove[0][1], 6.9f, 0.1f, 7.7f, 1.3f, 0, 1, 0, 0, 0, 0);
for(int i = 0; i < 5; ++i) for(int i = 0; i < 5; ++i)
SetS3DVertex(vFieldMzone[0][i], 1.2f + i * 1.1f, 0.8f, 2.3f + i * 1.1f, 2.0f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldMzone[0][i], 1.2f + i * 1.1f, 0.8f, 2.3f + i * 1.1f, 2.0f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldMzone[0][5], 2.3f, -0.6f, 3.4f, 0.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldMzone[0][5], 2.3f, -0.6f, 3.4f, 0.6f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldMzone[0][6], 4.5f, -0.6f, 5.6f, 0.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldMzone[0][6], 4.5f, -0.6f, 5.6f, 0.6f, 0, 1, 0, 0, 0, 0);
for(int i = 0; i < 5; ++i) for (int i = 0; i < 5; ++i) {
SetS3DVertex(vFieldSzone[0][i], 1.2f + i * 1.1f, 2.0f, 2.3f + i * 1.1f, 3.2f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[0][i][0], 1.2f + i * 1.1f, 2.0f, 2.3f + i * 1.1f, 3.2f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[0][i][1], 1.2f + i * 1.1f, 2.0f, 2.3f + i * 1.1f, 3.2f, 0, 1, 0, 0, 0, 0);
}
//field //field
SetS3DVertex(vFieldSzone[0][5], 0.2f, 0.1f, 1.0f, 1.3f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[0][5][0], 0.2f, 0.1f, 1.0f, 1.3f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[0][5][1], 0.2f, 1.4f, 1.0f, 2.6f, 0, 1, 0, 0, 0, 0);
//LScale //LScale
SetS3DVertex(vFieldSzone[0][6], 0.2f, 1.4f, 1.0f, 2.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[0][6][0], 0.2f, 1.4f, 1.0f, 2.6f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[0][6][1], 0.2f, 0.1f, 1.0f, 1.3f, 0, 1, 0, 0, 0, 0);
//RScale //RScale
SetS3DVertex(vFieldSzone[0][7], 6.9f, 1.4f, 7.7f, 2.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[0][7][0], 6.9f, 1.4f, 7.7f, 2.6f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[0][7][1], 7.9f, 0.1f, 8.7f, 1.3f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldDeck[1], 1.0f, -2.7f, 0.2f, -3.9f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldDeck[1], 1.0f, -2.7f, 0.2f, -3.9f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldGrave[1], 1.0f, -0.1f, 0.2f, -1.3f, 0, 1, 0, 0, 0, 0); //grave
SetS3DVertex(vFieldGrave[1][0], 1.0f, -0.1f, 0.2f, -1.3f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldGrave[1][1], 1.0f, -1.4f, 0.2f, -2.6f, 0, 1, 0, 0, 0, 0);
//extra
SetS3DVertex(vFieldExtra[1], 7.7f, -2.7f, 6.9f, -3.9f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldExtra[1], 7.7f, -2.7f, 6.9f, -3.9f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldRemove[1], 0.0f, -0.1f, -0.8f, -1.3f, 0, 1, 0, 0, 0, 0); //remove
SetS3DVertex(vFieldRemove[1][0], 0.0f, -0.1f, -0.8f, -1.3f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldRemove[1][1], 1.0f, -0.1f, 0.2f, -1.3f, 0, 1, 0, 0, 0, 0);
for(int i = 0; i < 5; ++i) for(int i = 0; i < 5; ++i)
SetS3DVertex(vFieldMzone[1][i], 6.7f - i * 1.1f, -0.8f, 5.6f - i * 1.1f, -2.0f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldMzone[1][i], 6.7f - i * 1.1f, -0.8f, 5.6f - i * 1.1f, -2.0f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldMzone[1][5], 5.6f, 0.6f, 4.5f, -0.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldMzone[1][5], 5.6f, 0.6f, 4.5f, -0.6f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldMzone[1][6], 3.4f, 0.6f, 2.3f, -0.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldMzone[1][6], 3.4f, 0.6f, 2.3f, -0.6f, 0, 1, 0, 0, 0, 0);
for(int i = 0; i < 5; ++i) for (int i = 0; i < 5; ++i) {
SetS3DVertex(vFieldSzone[1][i], 6.7f - i * 1.1f, -2.0f, 5.6f - i * 1.1f, -3.2f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[1][i][0], 6.7f - i * 1.1f, -2.0f, 5.6f - i * 1.1f, -3.2f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[1][i][1], 6.7f - i * 1.1f, -2.0f, 5.6f - i * 1.1f, -3.2f, 0, 1, 0, 0, 0, 0);
}
//field //field
SetS3DVertex(vFieldSzone[1][5], 7.7f, -0.1f, 6.9f, -1.3f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[1][5][0], 7.7f, -0.1f, 6.9f, -1.3f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[1][5][1], 7.7f, -1.4f, 6.9f, -2.6f, 0, 1, 0, 0, 0, 0);
//LScale //LScale
SetS3DVertex(vFieldSzone[1][6], 7.7f, -1.4f, 6.9f, -2.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[1][6][0], 7.7f, -1.4f, 6.9f, -2.6f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[1][6][1], 7.7f, -0.1f, 6.9f, -1.3f, 0, 1, 0, 0, 0, 0);
//RScale //RScale
SetS3DVertex(vFieldSzone[1][7], 1.0f, -1.4f, 0.2f, -2.6f, 0, 1, 0, 0, 0, 0); SetS3DVertex(vFieldSzone[1][7][0], 1.0f, -1.4f, 0.2f, -2.6f, 0, 1, 0, 0, 0, 0);
SetS3DVertex(vFieldSzone[1][7][1], 0.0f, -0.1f, -0.8f, -1.3f, 0, 1, 0, 0, 0, 0);
//conti_act //conti_act
vFieldContiAct[0] = vector3df(-0.8f, 0.1f, 0.0f); vFieldContiAct[0] = vector3df(3.5f, -0.6f, 0.0f);
vFieldContiAct[1] = vector3df(0.0f, 0.1f, 0.0f); vFieldContiAct[1] = vector3df(4.4f, -0.6f, 0.0f);
vFieldContiAct[2] = vector3df(-0.8f, 1.3f, 0.0f); vFieldContiAct[2] = vector3df(3.5f, 0.6f, 0.0f);
vFieldContiAct[3] = vector3df(0.0f, 1.3f, 0.0f); vFieldContiAct[3] = vector3df(4.4f, 0.6f, 0.0f);
for(int i = 0; i < 40; ++i) for(int i = 0; i < 40; ++i)
......
...@@ -21,11 +21,11 @@ public: ...@@ -21,11 +21,11 @@ public:
S3DVertex vFieldSpell2[4]; S3DVertex vFieldSpell2[4];
//S3DVertex vBackLine[76]; //S3DVertex vBackLine[76];
S3DVertex vFieldDeck[2][4]; S3DVertex vFieldDeck[2][4];
S3DVertex vFieldGrave[2][4]; S3DVertex vFieldGrave[2][2][4];
S3DVertex vFieldExtra[2][4]; S3DVertex vFieldExtra[2][4];
S3DVertex vFieldRemove[2][4]; S3DVertex vFieldRemove[2][2][4];
S3DVertex vFieldMzone[2][7][4]; S3DVertex vFieldMzone[2][7][4];
S3DVertex vFieldSzone[2][8][4]; S3DVertex vFieldSzone[2][8][2][4];
irr::core::vector3df vFieldContiAct[4]; irr::core::vector3df vFieldContiAct[4];
S3DVertex vArrow[40]; S3DVertex vArrow[40];
SColor c2d[4]; SColor c2d[4];
......
...@@ -10,6 +10,21 @@ ...@@ -10,6 +10,21 @@
namespace ygo { namespace ygo {
void UpdateDeck() {
BufferIO::CopyWStr(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()),
mainGame->gameConf.lastdeck, 64);
char deckbuf[1024];
char* pdeck = deckbuf;
BufferIO::WriteInt32(pdeck, deckManager.current_deck.main.size() + deckManager.current_deck.extra.size());
BufferIO::WriteInt32(pdeck, deckManager.current_deck.side.size());
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.main[i]->first);
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.extra[i]->first);
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.side[i]->first);
DuelClient::SendBufferToServer(CTOS_UPDATE_DECK, deckbuf, pdeck - deckbuf);
}
bool MenuHandler::OnEvent(const irr::SEvent& event) { bool MenuHandler::OnEvent(const irr::SEvent& event) {
switch(event.EventType) { switch(event.EventType) {
case irr::EET_GUI_EVENT: { case irr::EET_GUI_EVENT: {
...@@ -108,6 +123,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -108,6 +123,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_HP_DUELIST: { case BUTTON_HP_DUELIST: {
mainGame->cbDeckSelect->setEnabled(true);
DuelClient::SendPacketToServer(CTOS_HS_TODUELIST); DuelClient::SendPacketToServer(CTOS_HS_TODUELIST);
break; break;
} }
...@@ -127,10 +143,22 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -127,10 +143,22 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
DuelClient::SendPacketToServer(CTOS_HS_KICK, csk); DuelClient::SendPacketToServer(CTOS_HS_KICK, csk);
break; break;
} }
case BUTTON_HP_START: { case BUTTON_HP_READY: {
if(!mainGame->chkHostPrepReady[0]->isChecked() if(mainGame->cbDeckSelect->getSelected() == -1 ||
|| !mainGame->chkHostPrepReady[1]->isChecked()) !deckManager.LoadDeck(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()))) {
break; break;
}
UpdateDeck();
DuelClient::SendPacketToServer(CTOS_HS_READY);
mainGame->cbDeckSelect->setEnabled(false);
break;
}
case BUTTON_HP_NOTREADY: {
DuelClient::SendPacketToServer(CTOS_HS_NOTREADY);
mainGame->cbDeckSelect->setEnabled(true);
break;
}
case BUTTON_HP_START: {
DuelClient::SendPacketToServer(CTOS_HS_START); DuelClient::SendPacketToServer(CTOS_HS_START);
break; break;
} }
...@@ -185,9 +213,6 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -185,9 +213,6 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->btnReplayStep->setVisible(false); mainGame->btnReplayStep->setVisible(false);
mainGame->btnReplayUndo->setVisible(false); mainGame->btnReplayUndo->setVisible(false);
mainGame->wPhase->setVisible(true); mainGame->wPhase->setVisible(true);
mainGame->dField.panel = 0;
mainGame->dField.hovered_card = 0;
mainGame->dField.clicked_card = 0;
mainGame->dField.Clear(); mainGame->dField.Clear();
mainGame->HideElement(mainGame->wReplay); mainGame->HideElement(mainGame->wReplay);
mainGame->device->setEventReceiver(&mainGame->dField); mainGame->device->setEventReceiver(&mainGame->dField);
...@@ -243,43 +268,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -243,43 +268,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->ebDeckname->setText(L""); mainGame->ebDeckname->setText(L"");
} }
mainGame->HideElement(mainGame->wMainMenu); mainGame->HideElement(mainGame->wMainMenu);
mainGame->is_building = true; mainGame->deckBuilder.Initialize();
mainGame->is_siding = false;
mainGame->wInfos->setVisible(true);
mainGame->wCardImg->setVisible(true);
mainGame->wDeckEdit->setVisible(true);
mainGame->wFilter->setVisible(true);
mainGame->wSort->setVisible(true);
mainGame->btnLeaveGame->setVisible(true);
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1306));
mainGame->btnSideOK->setVisible(false);
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;
mainGame->cbDBLFList->setSelected(0);
mainGame->cbCardType->setSelected(0);
mainGame->cbCardType2->setSelected(0);
mainGame->cbAttribute->setSelected(0);
mainGame->cbRace->setSelected(0);
mainGame->ebAttack->setText(L"");
mainGame->ebDefense->setText(L"");
mainGame->ebStar->setText(L"");
mainGame->ebScale->setText(L"");
mainGame->cbCardType2->setEnabled(false);
mainGame->cbAttribute->setEnabled(false);
mainGame->cbRace->setEnabled(false);
mainGame->ebAttack->setEnabled(false);
mainGame->ebDefense->setEnabled(false);
mainGame->ebStar->setEnabled(false);
mainGame->ebScale->setEnabled(false);
mainGame->deckBuilder.filter_effect = 0;
mainGame->deckBuilder.result_string[0] = L'0';
mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear();
mainGame->deckBuilder.is_draging = false;
mainGame->deckBuilder.is_deleting = false;
mainGame->deckBuilder.is_clearing = false;
mainGame->device->setEventReceiver(&mainGame->deckBuilder);
for(int i = 0; i < 32; ++i)
mainGame->chkCategory[i]->setChecked(false);
break; break;
} }
} }
...@@ -313,11 +302,11 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -313,11 +302,11 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
myswprintf(infobuf, L"%d/%d/%d %02d:%02d:%02d\n", st->tm_year + 1900, st->tm_mon + 1, st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec); myswprintf(infobuf, L"%d/%d/%d %02d:%02d:%02d\n", st->tm_year + 1900, st->tm_mon + 1, st->tm_mday, st->tm_hour, st->tm_min, st->tm_sec);
repinfo.append(infobuf); repinfo.append(infobuf);
wchar_t namebuf[4][20]; wchar_t namebuf[4][20];
BufferIO::CopyWStr((unsigned short*)&ReplayMode::cur_replay.replay_data[0], namebuf[0], 20); ReplayMode::cur_replay.ReadName(namebuf[0]);
BufferIO::CopyWStr((unsigned short*)&ReplayMode::cur_replay.replay_data[40], namebuf[1], 20); ReplayMode::cur_replay.ReadName(namebuf[1]);
if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG) { if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG) {
BufferIO::CopyWStr((unsigned short*)&ReplayMode::cur_replay.replay_data[80], namebuf[2], 20); ReplayMode::cur_replay.ReadName(namebuf[2]);
BufferIO::CopyWStr((unsigned short*)&ReplayMode::cur_replay.replay_data[120], namebuf[3], 20); ReplayMode::cur_replay.ReadName(namebuf[3]);
} }
if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG) if(ReplayMode::cur_replay.pheader.flag & REPLAY_TAG)
myswprintf(infobuf, L"%ls\n%ls\n===VS===\n%ls\n%ls\n", namebuf[0], namebuf[1], namebuf[2], namebuf[3]); myswprintf(infobuf, L"%ls\n%ls\n===VS===\n%ls\n%ls\n", namebuf[0], namebuf[1], namebuf[2], namebuf[3]);
...@@ -343,19 +332,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -343,19 +332,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false); static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false);
break; break;
} }
BufferIO::CopyWStr(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()), UpdateDeck();
mainGame->gameConf.lastdeck, 64);
char deckbuf[1024];
char* pdeck = deckbuf;
BufferIO::WriteInt32(pdeck, deckManager.current_deck.main.size() + deckManager.current_deck.extra.size());
BufferIO::WriteInt32(pdeck, deckManager.current_deck.side.size());
for(size_t i = 0; i < deckManager.current_deck.main.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.main[i]->first);
for(size_t i = 0; i < deckManager.current_deck.extra.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.extra[i]->first);
for(size_t i = 0; i < deckManager.current_deck.side.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.side[i]->first);
DuelClient::SendBufferToServer(CTOS_UPDATE_DECK, deckbuf, pdeck - deckbuf);
DuelClient::SendPacketToServer(CTOS_HS_READY); DuelClient::SendPacketToServer(CTOS_HS_READY);
mainGame->cbDeckSelect->setEnabled(false); mainGame->cbDeckSelect->setEnabled(false);
} else { } else {
......
...@@ -159,18 +159,15 @@ bool Replay::OpenReplay(const wchar_t* name) { ...@@ -159,18 +159,15 @@ bool Replay::OpenReplay(const wchar_t* name) {
} }
if(!fp) if(!fp)
return false; return false;
fseek(fp, 0, SEEK_END);
comp_size = ftell(fp) - sizeof(pheader);
fseek(fp, 0, SEEK_SET);
fread(&pheader, sizeof(pheader), 1, fp); fread(&pheader, sizeof(pheader), 1, fp);
if(pheader.flag & REPLAY_COMPRESSED) { if(pheader.flag & REPLAY_COMPRESSED) {
fread(comp_data, 0x1000, 1, fp); comp_size = fread(comp_data, 1, 0x1000, fp);
fclose(fp); fclose(fp);
replay_size = pheader.datasize; replay_size = pheader.datasize;
if(LzmaUncompress(replay_data, &replay_size, comp_data, &comp_size, pheader.props, 5) != SZ_OK) if(LzmaUncompress(replay_data, &replay_size, comp_data, &comp_size, pheader.props, 5) != SZ_OK)
return false; return false;
} else { } else {
fread(replay_data, 0x20000, 1, fp); comp_size = fread(replay_data, 1, 0x20000, fp);
fclose(fp); fclose(fp);
replay_size = comp_size; replay_size = comp_size;
} }
...@@ -205,6 +202,13 @@ bool Replay::ReadNextResponse(unsigned char resp[64]) { ...@@ -205,6 +202,13 @@ bool Replay::ReadNextResponse(unsigned char resp[64]) {
pdata += len; pdata += len;
return true; return true;
} }
void Replay::ReadName(wchar_t* data) {
if(!is_replaying)
return;
unsigned short buffer[20];
ReadData(buffer, 40);
BufferIO::CopyWStr(buffer, data, 20);
}
void Replay::ReadData(void* data, unsigned int length) { void Replay::ReadData(void* data, unsigned int length) {
if(!is_replaying) if(!is_replaying)
return; return;
......
...@@ -36,6 +36,7 @@ public: ...@@ -36,6 +36,7 @@ public:
bool OpenReplay(const wchar_t* name); bool OpenReplay(const wchar_t* name);
static bool CheckReplay(const wchar_t* name); static bool CheckReplay(const wchar_t* name);
bool ReadNextResponse(unsigned char resp[64]); bool ReadNextResponse(unsigned char resp[64]);
void ReadName(wchar_t* data);
void ReadHeader(ReplayHeader& header); void ReadHeader(ReplayHeader& header);
void ReadData(void* data, unsigned int length); void ReadData(void* data, unsigned int length);
int ReadInt32(); int ReadInt32();
......
...@@ -61,16 +61,16 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -61,16 +61,16 @@ int ReplayMode::ReplayThread(void* param) {
int seed = rh.seed; int seed = rh.seed;
rnd.reset(seed); rnd.reset(seed);
if(rh.flag & REPLAY_TAG) { if(rh.flag & REPLAY_TAG) {
cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadName(mainGame->dInfo.hostname);
cur_replay.ReadData(mainGame->dInfo.hostname_tag, 40); cur_replay.ReadName(mainGame->dInfo.hostname_tag);
cur_replay.ReadData(mainGame->dInfo.clientname_tag, 40); cur_replay.ReadName(mainGame->dInfo.clientname_tag);
cur_replay.ReadData(mainGame->dInfo.clientname, 40); cur_replay.ReadName(mainGame->dInfo.clientname);
mainGame->dInfo.isTag = true; mainGame->dInfo.isTag = true;
mainGame->dInfo.tag_player[0] = false; mainGame->dInfo.tag_player[0] = false;
mainGame->dInfo.tag_player[1] = false; mainGame->dInfo.tag_player[1] = false;
} else { } else {
cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadName(mainGame->dInfo.hostname);
cur_replay.ReadData(mainGame->dInfo.clientname, 40); cur_replay.ReadName(mainGame->dInfo.clientname);
} }
set_script_reader(default_script_reader); set_script_reader(default_script_reader);
set_card_reader((card_reader)DataManager::CardReader); set_card_reader((card_reader)DataManager::CardReader);
...@@ -80,6 +80,8 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -80,6 +80,8 @@ int ReplayMode::ReplayThread(void* param) {
int start_hand = cur_replay.ReadInt32(); int start_hand = cur_replay.ReadInt32();
int draw_count = cur_replay.ReadInt32(); int draw_count = cur_replay.ReadInt32();
int opt = cur_replay.ReadInt32(); int opt = cur_replay.ReadInt32();
int duel_rule = opt >> 16;
mainGame->dInfo.duel_rule = duel_rule;
set_player_info(pduel, 0, start_lp, start_hand, draw_count); set_player_info(pduel, 0, start_lp, start_hand, draw_count);
set_player_info(pduel, 1, start_lp, start_hand, draw_count); set_player_info(pduel, 1, start_lp, start_hand, draw_count);
mainGame->dInfo.lp[0] = start_lp; mainGame->dInfo.lp[0] = start_lp;
...@@ -183,6 +185,7 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -183,6 +185,7 @@ int ReplayMode::ReplayThread(void* param) {
mainGame->closeDoneSignal.Wait(); mainGame->closeDoneSignal.Wait();
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->ShowElement(mainGame->wReplay); mainGame->ShowElement(mainGame->wReplay);
mainGame->stTip->setVisible(false);
mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
if(exit_on_return) if(exit_on_return)
...@@ -193,9 +196,6 @@ int ReplayMode::ReplayThread(void* param) { ...@@ -193,9 +196,6 @@ int ReplayMode::ReplayThread(void* param) {
void ReplayMode::Restart(bool refresh) { void ReplayMode::Restart(bool refresh) {
end_duel(pduel); end_duel(pduel);
mainGame->dInfo.isStarted = false; mainGame->dInfo.isStarted = false;
mainGame->dField.panel = 0;
mainGame->dField.hovered_card = 0;
mainGame->dField.clicked_card = 0;
mainGame->dField.Clear(); mainGame->dField.Clear();
//mainGame->device->setEventReceiver(&mainGame->dField); //mainGame->device->setEventReceiver(&mainGame->dField);
cur_replay.Rewind(); cur_replay.Rewind();
...@@ -205,16 +205,16 @@ void ReplayMode::Restart(bool refresh) { ...@@ -205,16 +205,16 @@ void ReplayMode::Restart(bool refresh) {
int seed = rh.seed; int seed = rh.seed;
rnd.reset(seed); rnd.reset(seed);
if(rh.flag & REPLAY_TAG) { if(rh.flag & REPLAY_TAG) {
cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadName(mainGame->dInfo.hostname);
cur_replay.ReadData(mainGame->dInfo.hostname_tag, 40); cur_replay.ReadName(mainGame->dInfo.hostname_tag);
cur_replay.ReadData(mainGame->dInfo.clientname_tag, 40); cur_replay.ReadName(mainGame->dInfo.clientname_tag);
cur_replay.ReadData(mainGame->dInfo.clientname, 40); cur_replay.ReadName(mainGame->dInfo.clientname);
mainGame->dInfo.isTag = true; mainGame->dInfo.isTag = true;
mainGame->dInfo.tag_player[0] = false; mainGame->dInfo.tag_player[0] = false;
mainGame->dInfo.tag_player[1] = false; mainGame->dInfo.tag_player[1] = false;
} else { } else {
cur_replay.ReadData(mainGame->dInfo.hostname, 40); cur_replay.ReadName(mainGame->dInfo.hostname);
cur_replay.ReadData(mainGame->dInfo.clientname, 40); cur_replay.ReadName(mainGame->dInfo.clientname);
} }
//set_card_reader((card_reader)DataManager::CardReader); //set_card_reader((card_reader)DataManager::CardReader);
//set_message_handler((message_handler)MessageHandler); //set_message_handler((message_handler)MessageHandler);
...@@ -373,7 +373,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -373,7 +373,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
} }
case MSG_SELECT_EFFECTYN: { case MSG_SELECT_EFFECTYN: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 8; pbuf += 12;
return ReadReplayResponse(); return ReadReplayResponse();
} }
case MSG_SELECT_YESNO: { case MSG_SELECT_YESNO: {
...@@ -752,6 +752,15 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -752,6 +752,15 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
DuelClient::ClientAnalyze(offset, pbuf - offset); DuelClient::ClientAnalyze(offset, pbuf - offset);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
return ReadReplayResponse();
}
case MSG_HAND_RES: {
pbuf += 1;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
......
...@@ -269,6 +269,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -269,6 +269,7 @@ void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
ready[dp->type] = is_ready; ready[dp->type] = is_ready;
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | (is_ready ? PLAYERCHANGE_READY : PLAYERCHANGE_NOTREADY); scpc.status = (dp->type << 4) | (is_ready ? PLAYERCHANGE_READY : PLAYERCHANGE_NOTREADY);
NetServer::SendPacketToPlayer(players[dp->type], STOC_HS_PLAYER_CHANGE, scpc);
if(players[1 - dp->type]) if(players[1 - dp->type])
NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
...@@ -412,7 +413,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -412,7 +413,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
pduel = create_duel(rnd.rand()); pduel = create_duel(rnd.rand());
set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count);
set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count);
int opt = ((int)host_info.duel_rule + 1) << 16; int opt = (int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck) if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE; opt |= DUEL_PSEUDO_SHUFFLE;
last_replay.WriteInt32(host_info.start_lp, false); last_replay.WriteInt32(host_info.start_lp, false);
...@@ -651,7 +652,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -651,7 +652,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
} }
case MSG_SELECT_EFFECTYN: { case MSG_SELECT_EFFECTYN: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 8; pbuf += 12;
WaitforResponse(player); WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1; return 1;
...@@ -1278,6 +1279,20 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1278,6 +1279,20 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_HAND_RES: {
pbuf += 1;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
for (auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
......
...@@ -57,8 +57,13 @@ int SingleMode::SinglePlayThread(void* param) { ...@@ -57,8 +57,13 @@ int SingleMode::SinglePlayThread(void* param) {
mainGame->dInfo.clientname[0] = 0; mainGame->dInfo.clientname[0] = 0;
mainGame->dInfo.turn = 0; mainGame->dInfo.turn = 0;
if(!preload_script(pduel, fname2, slen)) { if(!preload_script(pduel, fname2, slen)) {
end_duel(pduel); wchar_t fname[256];
return 0; myswprintf(fname, L"./single/%ls", open_file_name);
slen = BufferIO::EncodeUTF8(fname, fname2);
if(!preload_script(pduel, fname2, slen)) {
end_duel(pduel);
return 0;
}
} }
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->HideElement(mainGame->wSinglePlay); mainGame->HideElement(mainGame->wSinglePlay);
...@@ -73,9 +78,6 @@ int SingleMode::SinglePlayThread(void* param) { ...@@ -73,9 +78,6 @@ int SingleMode::SinglePlayThread(void* param) {
mainGame->stText->setText(L""); mainGame->stText->setText(L"");
mainGame->scrCardText->setVisible(false); mainGame->scrCardText->setVisible(false);
mainGame->wPhase->setVisible(true); mainGame->wPhase->setVisible(true);
mainGame->dField.panel = 0;
mainGame->dField.hovered_card = 0;
mainGame->dField.clicked_card = 0;
mainGame->dField.Clear(); mainGame->dField.Clear();
mainGame->dInfo.isFirst = true; mainGame->dInfo.isFirst = true;
mainGame->dInfo.isStarted = true; mainGame->dInfo.isStarted = true;
...@@ -107,6 +109,7 @@ int SingleMode::SinglePlayThread(void* param) { ...@@ -107,6 +109,7 @@ int SingleMode::SinglePlayThread(void* param) {
mainGame->closeDoneSignal.Wait(); mainGame->closeDoneSignal.Wait();
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->ShowElement(mainGame->wSinglePlay); mainGame->ShowElement(mainGame->wSinglePlay);
mainGame->stTip->setVisible(false);
mainGame->device->setEventReceiver(&mainGame->menuHandler); mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->gMutex.Unlock(); mainGame->gMutex.Unlock();
if(exit_on_return) if(exit_on_return)
...@@ -181,7 +184,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -181,7 +184,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
} }
case MSG_SELECT_EFFECTYN: { case MSG_SELECT_EFFECTYN: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 8; pbuf += 12;
DuelClient::ClientAnalyze(offset, pbuf - offset); DuelClient::ClientAnalyze(offset, pbuf - offset);
if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) { if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->singleSignal.Reset(); mainGame->singleSignal.Reset();
...@@ -582,6 +585,19 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -582,6 +585,19 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
DuelClient::ClientAnalyze(offset, pbuf - offset); DuelClient::ClientAnalyze(offset, pbuf - offset);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
if(!DuelClient::ClientAnalyze(offset, pbuf - offset)) {
mainGame->singleSignal.Reset();
mainGame->singleSignal.Wait();
}
break;
}
case MSG_HAND_RES: {
pbuf += 1;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
...@@ -645,6 +661,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -645,6 +661,7 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
case MSG_RELOAD_FIELD: { case MSG_RELOAD_FIELD: {
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->dField.Clear(); mainGame->dField.Clear();
mainGame->dInfo.duel_rule = BufferIO::ReadInt8(pbuf);
int val = 0; int val = 0;
for(int p = 0; p < 2; ++p) { for(int p = 0; p < 2; ++p) {
mainGame->dInfo.lp[p] = BufferIO::ReadInt32(pbuf); mainGame->dInfo.lp[p] = BufferIO::ReadInt32(pbuf);
...@@ -824,15 +841,10 @@ byte* SingleMode::ScriptReader(const char* script_name, int* slen) { ...@@ -824,15 +841,10 @@ byte* SingleMode::ScriptReader(const char* script_name, int* slen) {
#endif #endif
if(!fp) if(!fp)
return 0; return 0;
fseek(fp, 0, SEEK_END); int len = fread(buffer, 1, sizeof(buffer), fp);
unsigned int len = ftell(fp);
if(len > sizeof(buffer)) {
fclose(fp);
return 0;
}
fseek(fp, 0, SEEK_SET);
fread(buffer, len, 1, fp);
fclose(fp); fclose(fp);
if(len >= sizeof(buffer))
return 0;
*slen = len; *slen = len;
return buffer; return buffer;
} }
......
...@@ -240,7 +240,7 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) { ...@@ -240,7 +240,7 @@ void TagDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | (is_ready ? PLAYERCHANGE_READY : PLAYERCHANGE_NOTREADY); scpc.status = (dp->type << 4) | (is_ready ? PLAYERCHANGE_READY : PLAYERCHANGE_NOTREADY);
for(int i = 0; i < 4; ++i) for(int i = 0; i < 4; ++i)
if(players[i] && players[i] != dp) if(players[i])
NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[i], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
...@@ -382,7 +382,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -382,7 +382,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
pduel = create_duel(rnd.rand()); pduel = create_duel(rnd.rand());
set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 0, host_info.start_lp, host_info.start_hand, host_info.draw_count);
set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count); set_player_info(pduel, 1, host_info.start_lp, host_info.start_hand, host_info.draw_count);
int opt = ((int)host_info.duel_rule + 1) << 16; int opt = (int)host_info.duel_rule << 16;
if(host_info.no_shuffle_deck) if(host_info.no_shuffle_deck)
opt |= DUEL_PSEUDO_SHUFFLE; opt |= DUEL_PSEUDO_SHUFFLE;
opt |= DUEL_TAG_MODE; opt |= DUEL_TAG_MODE;
...@@ -584,7 +584,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -584,7 +584,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
} }
case MSG_SELECT_EFFECTYN: { case MSG_SELECT_EFFECTYN: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 8; pbuf += 12;
WaitforResponse(player); WaitforResponse(player);
NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset); NetServer::SendBufferToPlayer(cur_player[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1; return 1;
...@@ -1317,6 +1317,22 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1317,6 +1317,22 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit); NetServer::ReSendToPlayer(*oit);
break; break;
} }
case MSG_ROCK_PAPER_SCISSORS: {
player = BufferIO::ReadInt8(pbuf);
WaitforResponse(player);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
return 1;
}
case MSG_HAND_RES: {
pbuf += 1;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
NetServer::ReSendToPlayer(players[2]);
NetServer::ReSendToPlayer(players[3]);
for (auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_ANNOUNCE_RACE: { case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf); player = BufferIO::ReadInt8(pbuf);
pbuf += 5; pbuf += 5;
......
This diff is collapsed.
Subproject commit 48300a55945a005f32d4e6cd4bcab271a5ff33f6 Subproject commit 1f1d9cba25969e85760185a3fbb6f2070beba1aa
Subproject commit d8436e71a911d62424fab83a06380ae06b8fca9a Subproject commit 0f2bb610e85d5d61faefbf91c6f4c5aa4e52ec3c
This diff is collapsed.
...@@ -11,7 +11,8 @@ numfont = c:/windows/fonts/arialbd.ttf ...@@ -11,7 +11,8 @@ numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911 serverport = 7911
lasthost = 127.0.0.1 lasthost = 127.0.0.1
lastport = 7911 lastport = 7911
autopos = 1 automonsterpos = 0
autospellpos = 1
randompos = 0 randompos = 0
autochain = 0 autochain = 0
waitchain = 0 waitchain = 0
...@@ -23,3 +24,6 @@ hide_hint_button = 1 ...@@ -23,3 +24,6 @@ hide_hint_button = 1
control_mode = 0 control_mode = 0
draw_field_spell = 1 draw_field_spell = 1
separate_clear_button = 1 separate_clear_button = 1
#auto_search_limit >= 0: Start search automatically when the user enters N chars.
auto_search_limit = -1
ignore_deck_changes = 0
textures/field-transparent3.png

321 KB | W: | H:

textures/field-transparent3.png

15.9 KB | W: | H:

textures/field-transparent3.png
textures/field-transparent3.png
textures/field-transparent3.png
textures/field-transparent3.png
  • 2-up
  • Swipe
  • Onion skin
textures/field3.png

323 KB | W: | H:

textures/field3.png

18.4 KB | W: | H:

textures/field3.png
textures/field3.png
textures/field3.png
textures/field3.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