Commit 8b987b97 authored by mercury233's avatar mercury233

Merge branch 'master' of https://github.com/Fluorohydride/ygopro

parents 56cb90aa a2aac58a
# ygopro ## YGOPro
[![Build Status](https://travis-ci.org/moecube/ygopro.svg?branch=master)](https://travis-ci.org/moecube/ygopro) [![Build status](https://ci.appveyor.com/api/projects/status/qgkqi6o0wq7qn922?svg=true)](https://ci.appveyor.com/project/zh99998/ygopro) [![Build Status](https://travis-ci.org/moecube/ygopro.svg?branch=master)](https://travis-ci.org/moecube/ygopro) [![Build status](https://ci.appveyor.com/api/projects/status/qgkqi6o0wq7qn922?svg=true)](https://ci.appveyor.com/project/zh99998/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)
###Keys: ### Keys:
* 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.
###Color in card list: ### Color in card list:
####Background: #### Background:
* White = your card, Grey = your opponent's card * White = your card, Grey = your opponent's card
####Text: #### Text:
Cards in deck, extra deck and banished zone: Cards in deck, extra deck and banished zone:
* Black = face-up, Blue = face-down * Black = face-up, Blue = face-down
Xyz materials: Xyz materials:
* Black = default, Blue = the owner of the xyz material is different from its controller * Black = default, Blue = the owner of the xyz material is different from its controller
###Sequence: ### Sequence:
* 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:
* All numeric textboxs: They support >, =, <, >=, <= signs. * All numeric textboxs: They support >, =, <, >=, <= signs.
* 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).
......
...@@ -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;
...@@ -27,6 +28,7 @@ ClientCard::ClientCard() { ...@@ -27,6 +28,7 @@ ClientCard::ClientCard() {
alias = 0; alias = 0;
level = 0; level = 0;
rank = 0; rank = 0;
link = 0;
race = 0; race = 0;
attribute = 0; attribute = 0;
attack = 0; attack = 0;
...@@ -35,11 +37,13 @@ ClientCard::ClientCard() { ...@@ -35,11 +37,13 @@ ClientCard::ClientCard() {
base_defense = 0; base_defense = 0;
lscale = 0; lscale = 0;
rscale = 0; rscale = 0;
link_marker = 0;
cHint = 0; cHint = 0;
chValue = 0; chValue = 0;
atkstring[0] = 0; atkstring[0] = 0;
defstring[0] = 0; defstring[0] = 0;
lvstring[0] = 0; lvstring[0] = 0;
linkstring[0] = 0;
rscstring[0] = 0; rscstring[0] = 0;
lscstring[0] = 0; lscstring[0] = 0;
overlayTarget = 0; overlayTarget = 0;
...@@ -101,7 +105,10 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -101,7 +105,10 @@ void ClientCard::UpdateInfo(char* buf) {
} }
if(flag & QUERY_DEFENSE) { if(flag & QUERY_DEFENSE) {
defense = BufferIO::ReadInt32(buf); defense = BufferIO::ReadInt32(buf);
if(defense < 0) { if(type & TYPE_LINK) {
defstring[0] = '-';
defstring[1] = 0;
} else if(defense < 0) {
defstring[0] = '?'; defstring[0] = '?';
defstring[1] = 0; defstring[1] = 0;
} else } else
...@@ -162,6 +169,17 @@ void ClientCard::UpdateInfo(char* buf) { ...@@ -162,6 +169,17 @@ void ClientCard::UpdateInfo(char* buf) {
rscale = BufferIO::ReadInt32(buf); rscale = BufferIO::ReadInt32(buf);
myswprintf(rscstring, L"%d", rscale); myswprintf(rscstring, L"%d", rscale);
} }
if(flag & QUERY_LINK) {
pdata = BufferIO::ReadInt32(buf);
if (link != (unsigned int)pdata) {
link = pdata;
}
myswprintf(linkstring, L"L\x2012%d", link);
pdata = BufferIO::ReadInt32(buf);
if (link_marker != (unsigned int)pdata) {
link_marker = pdata;
}
}
} }
void ClientCard::ClearTarget() { void ClientCard::ClearTarget() {
for(auto cit = cardTarget.begin(); cit != cardTarget.end(); ++cit) { for(auto cit = cardTarget.begin(); cit != cardTarget.end(); ++cit) {
...@@ -197,8 +215,8 @@ bool ClientCard::deck_sort_lv(code_pointer p1, code_pointer p2) { ...@@ -197,8 +215,8 @@ bool ClientCard::deck_sort_lv(code_pointer p1, code_pointer p2) {
if((p1->second.type & 0x7) != (p2->second.type & 0x7)) if((p1->second.type & 0x7) != (p2->second.type & 0x7))
return (p1->second.type & 0x7) < (p2->second.type & 0x7); return (p1->second.type & 0x7) < (p2->second.type & 0x7);
if((p1->second.type & 0x7) == 1) { if((p1->second.type & 0x7) == 1) {
int type1 = (p1->second.type & 0x8020c0) ? (p1->second.type & 0x8020c1) : (p1->second.type & 0x31); int type1 = (p1->second.type & 0x48020c0) ? (p1->second.type & 0x48020c1) : (p1->second.type & 0x31);
int type2 = (p2->second.type & 0x8020c0) ? (p2->second.type & 0x8020c1) : (p2->second.type & 0x31); int type2 = (p2->second.type & 0x48020c0) ? (p2->second.type & 0x48020c1) : (p2->second.type & 0x31);
if(type1 != type2) if(type1 != type2)
return type1 < type2; return type1 < type2;
if(p1->second.level != p2->second.level) if(p1->second.level != p2->second.level)
...@@ -223,8 +241,8 @@ bool ClientCard::deck_sort_atk(code_pointer p1, code_pointer p2) { ...@@ -223,8 +241,8 @@ bool ClientCard::deck_sort_atk(code_pointer p1, code_pointer p2) {
return p1->second.defense > p2->second.defense; return p1->second.defense > p2->second.defense;
if(p1->second.level != p2->second.level) if(p1->second.level != p2->second.level)
return p1->second.level > p2->second.level; return p1->second.level > p2->second.level;
int type1 = (p1->second.type & 0x8020c0) ? (p1->second.type & 0x8020c1) : (p1->second.type & 0x31); int type1 = (p1->second.type & 0x48020c0) ? (p1->second.type & 0x48020c1) : (p1->second.type & 0x31);
int type2 = (p2->second.type & 0x8020c0) ? (p2->second.type & 0x8020c1) : (p2->second.type & 0x31); int type2 = (p2->second.type & 0x48020c0) ? (p2->second.type & 0x48020c1) : (p2->second.type & 0x31);
if(type1 != type2) if(type1 != type2)
return type1 < type2; return type1 < type2;
return p1->first < p2->first; return p1->first < p2->first;
...@@ -243,8 +261,8 @@ bool ClientCard::deck_sort_def(code_pointer p1, code_pointer p2) { ...@@ -243,8 +261,8 @@ bool ClientCard::deck_sort_def(code_pointer p1, code_pointer p2) {
return p1->second.attack > p2->second.attack; return p1->second.attack > p2->second.attack;
if(p1->second.level != p2->second.level) if(p1->second.level != p2->second.level)
return p1->second.level > p2->second.level; return p1->second.level > p2->second.level;
int type1 = (p1->second.type & 0x8020c0) ? (p1->second.type & 0x8020c1) : (p1->second.type & 0x31); int type1 = (p1->second.type & 0x48020c0) ? (p1->second.type & 0x48020c1) : (p1->second.type & 0x31);
int type2 = (p2->second.type & 0x8020c0) ? (p2->second.type & 0x8020c1) : (p2->second.type & 0x31); int type2 = (p2->second.type & 0x48020c0) ? (p2->second.type & 0x48020c1) : (p2->second.type & 0x31);
if(type1 != type2) if(type1 != type2)
return type1 < type2; return type1 < type2;
return p1->first < p2->first; return p1->first < p2->first;
......
...@@ -20,6 +20,7 @@ struct CardData { ...@@ -20,6 +20,7 @@ struct CardData {
int defense; int defense;
unsigned int lscale; unsigned int lscale;
unsigned int rscale; unsigned int rscale;
unsigned int link_marker;
}; };
struct CardDataC { struct CardDataC {
unsigned int code; unsigned int code;
...@@ -33,6 +34,7 @@ struct CardDataC { ...@@ -33,6 +34,7 @@ struct CardDataC {
int defense; int defense;
unsigned int lscale; unsigned int lscale;
unsigned int rscale; unsigned int rscale;
unsigned int link_marker;
unsigned int ot; unsigned int ot;
unsigned int category; unsigned int category;
}; };
...@@ -45,7 +47,6 @@ typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer ...@@ -45,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;
...@@ -61,6 +62,7 @@ public: ...@@ -61,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;
...@@ -69,6 +71,7 @@ public: ...@@ -69,6 +71,7 @@ public:
u32 type; u32 type;
u32 level; u32 level;
u32 rank; u32 rank;
u32 link;
u32 attribute; u32 attribute;
u32 race; u32 race;
s32 attack; s32 attack;
...@@ -77,6 +80,7 @@ public: ...@@ -77,6 +80,7 @@ public:
s32 base_defense; s32 base_defense;
u32 lscale; u32 lscale;
u32 rscale; u32 rscale;
u32 link_marker;
u32 reason; u32 reason;
u32 select_seq; u32 select_seq;
u8 owner; u8 owner;
...@@ -102,6 +106,7 @@ public: ...@@ -102,6 +106,7 @@ public:
wchar_t atkstring[16]; wchar_t atkstring[16];
wchar_t defstring[16]; wchar_t defstring[16];
wchar_t lvstring[16]; wchar_t lvstring[16];
wchar_t linkstring[16];
wchar_t lscstring[16]; wchar_t lscstring[16];
wchar_t rscstring[16]; wchar_t rscstring[16];
......
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 {
...@@ -128,10 +130,12 @@ public: ...@@ -128,10 +130,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;
}; };
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
#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>
......
...@@ -31,6 +31,11 @@ bool DataManager::LoadDB(const char* file) { ...@@ -31,6 +31,11 @@ bool DataManager::LoadDB(const char* file) {
cd.type = sqlite3_column_int(pStmt, 4); cd.type = sqlite3_column_int(pStmt, 4);
cd.attack = sqlite3_column_int(pStmt, 5); cd.attack = sqlite3_column_int(pStmt, 5);
cd.defense = sqlite3_column_int(pStmt, 6); cd.defense = sqlite3_column_int(pStmt, 6);
if(cd.type & TYPE_LINK) {
cd.link_marker = cd.defense;
cd.defense = 0;
} else
cd.link_marker = 0;
unsigned int level = sqlite3_column_int(pStmt, 7); unsigned int level = sqlite3_column_int(pStmt, 7);
cd.level = level & 0xff; cd.level = level & 0xff;
cd.lscale = (level >> 24) & 0xff; cd.lscale = (level >> 24) & 0xff;
...@@ -84,28 +89,20 @@ bool DataManager::LoadStrings(const char* file) { ...@@ -84,28 +89,20 @@ bool DataManager::LoadStrings(const char* file) {
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);
...@@ -170,33 +167,35 @@ const wchar_t* DataManager::GetDesc(int strCode) { ...@@ -170,33 +167,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;
...@@ -267,7 +266,7 @@ const wchar_t* DataManager::FormatType(int type) { ...@@ -267,7 +266,7 @@ const wchar_t* DataManager::FormatType(int type) {
wchar_t* p = tpBuffer; wchar_t* p = tpBuffer;
unsigned filter = 1; unsigned filter = 1;
int i = 1050; int i = 1050;
for(; filter != 0x4000000; filter <<= 1, ++i) { for(; filter != 0x8000000; filter <<= 1, ++i) {
if(type & filter) { if(type & filter) {
BufferIO::CopyWStrRef(GetSysString(i), p, 16); BufferIO::CopyWStrRef(GetSysString(i), p, 16);
*p = L'|'; *p = L'|';
...@@ -285,7 +284,7 @@ const wchar_t* DataManager::FormatSetName(unsigned long long setcode) { ...@@ -285,7 +284,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;
} }
...@@ -296,6 +295,27 @@ const wchar_t* DataManager::FormatSetName(unsigned long long setcode) { ...@@ -296,6 +295,27 @@ const wchar_t* DataManager::FormatSetName(unsigned long long setcode) {
return unknown_string; return unknown_string;
return scBuffer; return scBuffer;
} }
const wchar_t* DataManager::FormatLinkMarker(int link_marker) {
wchar_t* p = lmBuffer;
*p = 0;
if(link_marker & LINK_MARKER_TOP_LEFT)
BufferIO::CopyWStrRef(L"[\u2196]", p, 4);
if(link_marker & LINK_MARKER_TOP)
BufferIO::CopyWStrRef(L"[\u2191]", p, 4);
if(link_marker & LINK_MARKER_TOP_RIGHT)
BufferIO::CopyWStrRef(L"[\u2197]", p, 4);
if(link_marker & LINK_MARKER_LEFT)
BufferIO::CopyWStrRef(L"[\u2190]", p, 4);
if(link_marker & LINK_MARKER_RIGHT)
BufferIO::CopyWStrRef(L"[\u2192]", p, 4);
if(link_marker & LINK_MARKER_BOTTOM_LEFT)
BufferIO::CopyWStrRef(L"[\u2199]", p, 4);
if(link_marker & LINK_MARKER_BOTTOM)
BufferIO::CopyWStrRef(L"[\u2193]", p, 4);
if(link_marker & LINK_MARKER_BOTTOM_RIGHT)
BufferIO::CopyWStrRef(L"[\u2198]", p, 4);
return lmBuffer;
}
int DataManager::CardReader(int code, void* pData) { int DataManager::CardReader(int code, void* pData) {
if(!dataManager.GetData(code, (CardData*)pData)) if(!dataManager.GetData(code, (CardData*)pData))
memset(pData, 0, sizeof(CardData)); memset(pData, 0, sizeof(CardData));
......
...@@ -31,20 +31,22 @@ public: ...@@ -31,20 +31,22 @@ public:
const wchar_t* FormatRace(int race); const wchar_t* FormatRace(int race);
const wchar_t* FormatType(int type); const wchar_t* FormatType(int type);
const wchar_t* FormatSetName(unsigned long long setcode); const wchar_t* FormatSetName(unsigned long long setcode);
const wchar_t* FormatLinkMarker(int link_marker);
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];
wchar_t racBuffer[128]; wchar_t racBuffer[128];
wchar_t tpBuffer[128]; wchar_t tpBuffer[128];
wchar_t scBuffer[128]; wchar_t scBuffer[128];
wchar_t lmBuffer[32];
static wchar_t strBuffer[4096]; static wchar_t strBuffer[4096];
static const wchar_t* unknown_string; static const wchar_t* unknown_string;
......
This diff is collapsed.
...@@ -11,11 +11,25 @@ namespace ygo { ...@@ -11,11 +11,25 @@ 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 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,7 +43,9 @@ public: ...@@ -29,7 +43,9 @@ 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;
...@@ -41,8 +57,9 @@ public: ...@@ -41,8 +57,9 @@ public:
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;
......
...@@ -84,7 +84,7 @@ int DeckManager::CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_ ...@@ -84,7 +84,7 @@ int DeckManager::CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_
code_pointer cit = deck.main[i]; code_pointer cit = deck.main[i];
if((!allow_ocg && (cit->second.ot == 0x1)) || (!allow_tcg && (cit->second.ot == 0x2))) if((!allow_ocg && (cit->second.ot == 0x1)) || (!allow_tcg && (cit->second.ot == 0x2)))
return cit->first; return cit->first;
if(cit->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_TOKEN)) if(cit->second.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_TOKEN | TYPE_LINK))
return 1; return 1;
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
ccount[code]++; ccount[code]++;
...@@ -127,7 +127,7 @@ void DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) { ...@@ -127,7 +127,7 @@ void DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) {
continue; continue;
if(cd.type & TYPE_TOKEN) if(cd.type & TYPE_TOKEN)
continue; continue;
else if(cd.type & 0x802040 && deck.extra.size() < 15) { else if(cd.type & (TYPE_FUSION | TYPE_SYNCHRO | TYPE_XYZ | TYPE_LINK) && deck.extra.size() < 15) {
deck.extra.push_back(dataManager.GetCodePointer(code)); //verified by GetData() deck.extra.push_back(dataManager.GetCodePointer(code)); //verified by GetData()
} else if(deck.main.size() < 60) { } else if(deck.main.size() < 60) {
deck.main.push_back(dataManager.GetCodePointer(code)); deck.main.push_back(dataManager.GetCodePointer(code));
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -25,7 +25,8 @@ struct Config { ...@@ -25,7 +25,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 +37,8 @@ struct Config { ...@@ -36,6 +37,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 +51,7 @@ struct DuelInfo { ...@@ -48,6 +51,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,11 +92,15 @@ public: ...@@ -88,11 +92,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 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);
...@@ -103,6 +111,7 @@ public: ...@@ -103,6 +111,7 @@ public:
void SaveConfig(); void SaveConfig();
void ShowCardInfo(int code); void ShowCardInfo(int code);
void AddChatMsg(wchar_t* msg, int player); void AddChatMsg(wchar_t* msg, int player);
void AddDebugMsg(char* msgbuf);
void ClearTextures(); void ClearTextures();
void CloseDuelWindow(); void CloseDuelWindow();
...@@ -196,12 +205,15 @@ public: ...@@ -196,12 +205,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;
...@@ -235,7 +247,7 @@ public: ...@@ -235,7 +247,7 @@ public:
irr::gui::IGUIEditBox* ebDrawCount; irr::gui::IGUIEditBox* ebDrawCount;
irr::gui::IGUIEditBox* ebServerName; irr::gui::IGUIEditBox* ebServerName;
irr::gui::IGUIEditBox* ebServerPass; irr::gui::IGUIEditBox* ebServerPass;
irr::gui::IGUICheckBox* chkEnablePriority; irr::gui::IGUIComboBox* cbDuelRule;
irr::gui::IGUICheckBox* chkNoCheckDeck; irr::gui::IGUICheckBox* chkNoCheckDeck;
irr::gui::IGUICheckBox* chkNoShuffleDeck; irr::gui::IGUICheckBox* chkNoShuffleDeck;
irr::gui::IGUIButton* btnHostConfirm; irr::gui::IGUIButton* btnHostConfirm;
...@@ -344,9 +356,7 @@ public: ...@@ -344,9 +356,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;
...@@ -381,6 +391,10 @@ public: ...@@ -381,6 +391,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;
...@@ -399,6 +413,8 @@ public: ...@@ -399,6 +413,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;
...@@ -496,6 +512,7 @@ extern Game* mainGame; ...@@ -496,6 +512,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
...@@ -518,11 +535,12 @@ extern Game* mainGame; ...@@ -518,11 +535,12 @@ extern Game* mainGame;
#define BUTTON_SIDE_OK 309 #define BUTTON_SIDE_OK 309
#define BUTTON_SHUFFLE_DECK 310 #define BUTTON_SHUFFLE_DECK 310
#define COMBOBOX_MAINTYPE 311 #define COMBOBOX_MAINTYPE 311
#define BUTTON_EFFECT_FILTER 312 #define COMBOBOX_SECONDTYPE 312
#define BUTTON_START_FILTER 313 #define BUTTON_EFFECT_FILTER 313
#define SCROLL_FILTER 314 #define BUTTON_START_FILTER 314
#define EDITBOX_KEYWORD 315 #define SCROLL_FILTER 315
#define BUTTON_CLEAR_FILTER 316 #define EDITBOX_KEYWORD 316
#define BUTTON_CLEAR_FILTER 317
#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
...@@ -534,5 +552,11 @@ extern Game* mainGame; ...@@ -534,5 +552,11 @@ 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 BUTTON_MARKS_FILTER 380
#define BUTTON_MARKERS_OK 381
#define DEFAULT_DUEL_RULE 4
#endif // GAME_H #endif // GAME_H
...@@ -94,12 +94,12 @@ int main(int argc, char* argv[]) { ...@@ -94,12 +94,12 @@ 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], "-j")) { // Join host
exit_on_return = !keep_on_return;
ClickButton(ygo::mainGame->btnLanMode);
ClickButton(ygo::mainGame->btnJoinHost);
break;
} else if(!strcmp(argv[i], "-d")) { // Deck } 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; exit_on_return = !keep_on_return;
if(i < argc) { if(i < argc) {
open_file = true; open_file = true;
...@@ -107,6 +107,17 @@ int main(int argc, char* argv[]) { ...@@ -107,6 +107,17 @@ int main(int argc, char* argv[]) {
} }
ClickButton(ygo::mainGame->btnDeckEdit); ClickButton(ygo::mainGame->btnDeckEdit);
break; 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
exit_on_return = !keep_on_return;
ClickButton(ygo::mainGame->btnLanMode);
ClickButton(ygo::mainGame->btnJoinHost);
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) {
......
...@@ -7,6 +7,8 @@ ImageManager imageManager; ...@@ -7,6 +7,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 +20,7 @@ bool ImageManager::Initial() { ...@@ -18,6 +20,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 +28,15 @@ bool ImageManager::Initial() { ...@@ -25,9 +28,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/field2.png"); if(!tBackGround_deck)
tFieldTransparent = driver->getTexture("textures/field-transparent2.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) {
......
...@@ -34,14 +34,15 @@ public: ...@@ -34,14 +34,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;
......
This diff is collapsed.
...@@ -19,12 +19,18 @@ public: ...@@ -19,12 +19,18 @@ public:
S3DVertex vFieldSpell[4]; S3DVertex vFieldSpell[4];
S3DVertex vFieldSpell1[4]; S3DVertex vFieldSpell1[4];
S3DVertex vFieldSpell2[4]; S3DVertex vFieldSpell2[4];
S3DVertex vBackLine[76]; //S3DVertex vBackLine[76];
S3DVertex vFields[140]; S3DVertex vFieldDeck[2][4];
S3DVertex vFieldGrave[2][2][4];
S3DVertex vFieldExtra[2][4];
S3DVertex vFieldRemove[2][2][4];
S3DVertex vFieldMzone[2][7][4];
S3DVertex vFieldSzone[2][8][2][4];
irr::core::vector3df vFieldContiAct[4];
S3DVertex vArrow[40]; S3DVertex vArrow[40];
SColor c2d[4]; SColor c2d[4];
u16 iRectangle[6]; u16 iRectangle[6];
u16 iBackLine[116]; //u16 iBackLine[116];
u16 iArrow[40]; u16 iArrow[40];
irr::video::SMaterial mCard; irr::video::SMaterial mCard;
irr::video::SMaterial mTexture; irr::video::SMaterial mTexture;
......
...@@ -108,6 +108,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -108,6 +108,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;
} }
...@@ -243,43 +244,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -243,43 +244,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;
} }
} }
......
...@@ -15,7 +15,7 @@ struct HostInfo { ...@@ -15,7 +15,7 @@ struct HostInfo {
unsigned int lflist; unsigned int lflist;
unsigned char rule; unsigned char rule;
unsigned char mode; unsigned char mode;
bool enable_priority; unsigned char duel_rule;
bool no_check_deck; bool no_check_deck;
bool no_shuffle_deck; bool no_shuffle_deck;
unsigned int start_lp; unsigned int start_lp;
......
...@@ -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;
...@@ -743,6 +745,15 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -743,6 +745,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;
...@@ -811,7 +822,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) { ...@@ -811,7 +822,7 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
return true; return true;
} }
void ReplayMode::ReplayRefresh(int flag) { void ReplayMode::ReplayRefresh(int flag) {
unsigned char queryBuffer[0x2000]; unsigned char queryBuffer[0x4000];
/*int len = */query_field_card(pduel, 0, LOCATION_MZONE, flag, queryBuffer, 0); /*int len = */query_field_card(pduel, 0, LOCATION_MZONE, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_MZONE, (char*)queryBuffer); mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_MZONE, (char*)queryBuffer);
/*len = */query_field_card(pduel, 1, LOCATION_MZONE, flag, queryBuffer, 0); /*len = */query_field_card(pduel, 1, LOCATION_MZONE, flag, queryBuffer, 0);
...@@ -846,7 +857,7 @@ void ReplayMode::ReplayRefreshExtra(int player, int flag) { ...@@ -846,7 +857,7 @@ void ReplayMode::ReplayRefreshExtra(int player, int flag) {
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(player), LOCATION_EXTRA, (char*)queryBuffer); mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(player), LOCATION_EXTRA, (char*)queryBuffer);
} }
void ReplayMode::ReplayRefreshSingle(int player, int location, int sequence, int flag) { void ReplayMode::ReplayRefreshSingle(int player, int location, int sequence, int flag) {
unsigned char queryBuffer[0x2000]; unsigned char queryBuffer[0x4000];
/*int len = */query_card(pduel, player, location, sequence, flag, queryBuffer, 0); /*int len = */query_card(pduel, player, location, sequence, flag, queryBuffer, 0);
mainGame->dField.UpdateCard(mainGame->LocalPlayer(player), location, sequence, (char*)queryBuffer); mainGame->dField.UpdateCard(mainGame->LocalPlayer(player), location, sequence, (char*)queryBuffer);
} }
...@@ -855,17 +866,7 @@ int ReplayMode::MessageHandler(long fduel, int type) { ...@@ -855,17 +866,7 @@ int ReplayMode::MessageHandler(long fduel, int type) {
return 0; return 0;
char msgbuf[1024]; char msgbuf[1024];
get_log_message(fduel, (byte*)msgbuf); get_log_message(fduel, (byte*)msgbuf);
if(enable_log == 1) { mainGame->AddDebugMsg(msgbuf);
wchar_t wbuf[1024];
BufferIO::DecodeUTF8(msgbuf, wbuf);
mainGame->AddChatMsg(wbuf, 9);
} else if(enable_log == 2) {
FILE* fp = fopen("error.log", "at");
if(!fp)
return 0;
fprintf(fp, "[Script error:] %s\n", msgbuf);
fclose(fp);
}
return 0; return 0;
} }
......
...@@ -37,12 +37,12 @@ public: ...@@ -37,12 +37,12 @@ public:
static void Undo(); static void Undo();
static bool ReplayAnalyze(char* msg, unsigned int len); static bool ReplayAnalyze(char* msg, unsigned int len);
static void ReplayRefresh(int flag = 0x781fff); static void ReplayRefresh(int flag = 0xf81fff);
static void ReplayRefreshHand(int player, int flag = 0x781fff); static void ReplayRefreshHand(int player, int flag = 0x781fff);
static void ReplayRefreshGrave(int player, int flag = 0x181fff); static void ReplayRefreshGrave(int player, int flag = 0x181fff);
static void ReplayRefreshDeck(int player, int flag = 0x181fff); static void ReplayRefreshDeck(int player, int flag = 0x181fff);
static void ReplayRefreshExtra(int player, int flag = 0x181fff); static void ReplayRefreshExtra(int player, int flag = 0x181fff);
static void ReplayRefreshSingle(int player, int location, int sequence, int flag = 0x781fff); static void ReplayRefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static int MessageHandler(long fduel, int type); static int MessageHandler(long fduel, int type);
}; };
......
...@@ -412,9 +412,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -412,9 +412,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 = 0; int opt = (int)host_info.duel_rule << 16;
if(host_info.enable_priority)
opt |= DUEL_OBSOLETE_RULING;
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);
...@@ -1252,6 +1250,20 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1252,6 +1250,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;
...@@ -1476,17 +1488,7 @@ int SingleDuel::MessageHandler(long fduel, int type) { ...@@ -1476,17 +1488,7 @@ int SingleDuel::MessageHandler(long fduel, int type) {
return 0; return 0;
char msgbuf[1024]; char msgbuf[1024];
get_log_message(fduel, (byte*)msgbuf); get_log_message(fduel, (byte*)msgbuf);
if(enable_log == 1) { mainGame->AddDebugMsg(msgbuf);
wchar_t wbuf[1024];
BufferIO::DecodeUTF8(msgbuf, wbuf);
mainGame->AddChatMsg(wbuf, 9);
} else if(enable_log == 2) {
FILE* fp = fopen("error.log", "at");
if(!fp)
return 0;
fprintf(fp, "[Script error:] %s\n", msgbuf);
fclose(fp);
}
return 0; return 0;
} }
void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) { void SingleDuel::SingleTimer(evutil_socket_t fd, short events, void* arg) {
......
...@@ -31,12 +31,12 @@ public: ...@@ -31,12 +31,12 @@ public:
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
void RefreshMzone(int player, int flag = 0x81fff, int use_cache = 1); void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1);
void RefreshSzone(int player, int flag = 0x681fff, int use_cache = 1); void RefreshSzone(int player, int flag = 0x681fff, int use_cache = 1);
void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1); void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1);
void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1); void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1); void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshSingle(int player, int location, int sequence, int flag = 0x781fff); void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static int MessageHandler(long fduel, int type); static int MessageHandler(long fduel, int type);
static void SingleTimer(evutil_socket_t fd, short events, void* arg); static void SingleTimer(evutil_socket_t fd, short events, void* arg);
......
...@@ -11,7 +11,7 @@ long SingleMode::pduel = 0; ...@@ -11,7 +11,7 @@ long SingleMode::pduel = 0;
bool SingleMode::is_closing = false; bool SingleMode::is_closing = false;
bool SingleMode::is_continuing = false; bool SingleMode::is_continuing = false;
byte buffer[0x10000]; static byte buffer[0x20000];
bool SingleMode::StartPlay() { bool SingleMode::StartPlay() {
Thread::NewThread(SinglePlayThread, 0); Thread::NewThread(SinglePlayThread, 0);
...@@ -56,10 +56,15 @@ int SingleMode::SinglePlayThread(void* param) { ...@@ -56,10 +56,15 @@ int SingleMode::SinglePlayThread(void* param) {
BufferIO::CopyWStr(mainGame->ebNickName->getText(), mainGame->dInfo.hostname, 20); BufferIO::CopyWStr(mainGame->ebNickName->getText(), mainGame->dInfo.hostname, 20);
mainGame->dInfo.clientname[0] = 0; mainGame->dInfo.clientname[0] = 0;
mainGame->dInfo.turn = 0; mainGame->dInfo.turn = 0;
if(!preload_script(pduel, fname2, slen)) {
wchar_t fname[256];
myswprintf(fname, L"./single/%ls", open_file_name);
slen = BufferIO::EncodeUTF8(fname, fname2);
if(!preload_script(pduel, fname2, slen)) { if(!preload_script(pduel, fname2, slen)) {
end_duel(pduel); end_duel(pduel);
return 0; return 0;
} }
}
mainGame->gMutex.Lock(); mainGame->gMutex.Lock();
mainGame->HideElement(mainGame->wSinglePlay); mainGame->HideElement(mainGame->wSinglePlay);
mainGame->wCardImg->setVisible(true); mainGame->wCardImg->setVisible(true);
...@@ -569,6 +574,19 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -569,6 +574,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;
...@@ -632,11 +650,12 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) { ...@@ -632,11 +650,12 @@ 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);
myswprintf(mainGame->dInfo.strLP[p], L"%d", mainGame->dInfo.lp[p]); myswprintf(mainGame->dInfo.strLP[p], L"%d", mainGame->dInfo.lp[p]);
for(int seq = 0; seq < 5; ++seq) { for(int seq = 0; seq < 7; ++seq) {
val = BufferIO::ReadInt8(pbuf); val = BufferIO::ReadInt8(pbuf);
if(val) { if(val) {
ClientCard* ccard = new ClientCard; ClientCard* ccard = new ClientCard;
...@@ -770,7 +789,7 @@ void SingleMode::SinglePlayRefreshSingle(int player, int location, int sequence, ...@@ -770,7 +789,7 @@ void SingleMode::SinglePlayRefreshSingle(int player, int location, int sequence,
} }
void SingleMode::SinglePlayReload() { void SingleMode::SinglePlayReload() {
unsigned char queryBuffer[0x2000]; unsigned char queryBuffer[0x2000];
unsigned int flag = 0x7fdfff; unsigned int flag = 0xffdfff;
/*int len = */query_field_card(pduel, 0, LOCATION_MZONE, flag, queryBuffer, 0); /*int len = */query_field_card(pduel, 0, LOCATION_MZONE, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_MZONE, (char*)queryBuffer); mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_MZONE, (char*)queryBuffer);
/*len = */query_field_card(pduel, 1, LOCATION_MZONE, flag, queryBuffer, 0); /*len = */query_field_card(pduel, 1, LOCATION_MZONE, flag, queryBuffer, 0);
...@@ -813,7 +832,7 @@ byte* SingleMode::ScriptReader(const char* script_name, int* slen) { ...@@ -813,7 +832,7 @@ byte* SingleMode::ScriptReader(const char* script_name, int* slen) {
return 0; return 0;
fseek(fp, 0, SEEK_END); fseek(fp, 0, SEEK_END);
unsigned int len = ftell(fp); unsigned int len = ftell(fp);
if(len > 0x10000) { if(len > sizeof(buffer)) {
fclose(fp); fclose(fp);
return 0; return 0;
} }
...@@ -828,17 +847,7 @@ int SingleMode::MessageHandler(long fduel, int type) { ...@@ -828,17 +847,7 @@ int SingleMode::MessageHandler(long fduel, int type) {
return 0; return 0;
char msgbuf[1024]; char msgbuf[1024];
get_log_message(fduel, (byte*)msgbuf); get_log_message(fduel, (byte*)msgbuf);
if(enable_log == 1) { mainGame->AddDebugMsg(msgbuf);
wchar_t wbuf[1024];
BufferIO::DecodeUTF8(msgbuf, wbuf);
mainGame->AddChatMsg(wbuf, 9);
} else if(enable_log == 2) {
FILE* fp = fopen("error.log", "at");
if(!fp)
return 0;
fprintf(fp, "[Script error:] %s\n", msgbuf);
fclose(fp);
}
return 0; return 0;
} }
......
...@@ -21,12 +21,12 @@ public: ...@@ -21,12 +21,12 @@ public:
static int SinglePlayThread(void* param); static int SinglePlayThread(void* param);
static bool SinglePlayAnalyze(char* msg, unsigned int len); static bool SinglePlayAnalyze(char* msg, unsigned int len);
static void SinglePlayRefresh(int flag = 0x781fff); static void SinglePlayRefresh(int flag = 0xf81fff);
static void SinglePlayRefreshHand(int player, int flag = 0x781fff); static void SinglePlayRefreshHand(int player, int flag = 0x781fff);
static void SinglePlayRefreshGrave(int player, int flag = 0x181fff); static void SinglePlayRefreshGrave(int player, int flag = 0x181fff);
static void SinglePlayRefreshDeck(int player, int flag = 0x181fff); static void SinglePlayRefreshDeck(int player, int flag = 0x181fff);
static void SinglePlayRefreshExtra(int player, int flag = 0x181fff); static void SinglePlayRefreshExtra(int player, int flag = 0x181fff);
static void SinglePlayRefreshSingle(int player, int location, int sequence, int flag = 0x781fff); static void SinglePlayRefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static void SinglePlayReload(); static void SinglePlayReload();
static byte* ScriptReader(const char* script_name, int* slen); static byte* ScriptReader(const char* script_name, int* slen);
......
...@@ -382,9 +382,7 @@ void TagDuel::TPResult(DuelPlayer* dp, unsigned char tp) { ...@@ -382,9 +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 = 0; int opt = (int)host_info.duel_rule << 16;
if(host_info.enable_priority)
opt |= DUEL_OBSOLETE_RULING;
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;
...@@ -1291,6 +1289,22 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) { ...@@ -1291,6 +1289,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;
...@@ -1583,17 +1597,7 @@ int TagDuel::MessageHandler(long fduel, int type) { ...@@ -1583,17 +1597,7 @@ int TagDuel::MessageHandler(long fduel, int type) {
return 0; return 0;
char msgbuf[1024]; char msgbuf[1024];
get_log_message(fduel, (byte*)msgbuf); get_log_message(fduel, (byte*)msgbuf);
if(enable_log == 1) { mainGame->AddDebugMsg(msgbuf);
wchar_t wbuf[1024];
BufferIO::DecodeUTF8(msgbuf, wbuf);
mainGame->AddChatMsg(wbuf, 9);
} else if(enable_log == 2) {
FILE* fp = fopen("error.log", "at");
if(!fp)
return 0;
fprintf(fp, "[Script error:] %s\n", msgbuf);
fclose(fp);
}
return 0; return 0;
} }
void TagDuel::TagTimer(evutil_socket_t fd, short events, void* arg) { void TagDuel::TagTimer(evutil_socket_t fd, short events, void* arg) {
......
...@@ -31,12 +31,12 @@ public: ...@@ -31,12 +31,12 @@ public:
void DuelEndProc(); void DuelEndProc();
void WaitforResponse(int playerid); void WaitforResponse(int playerid);
void RefreshMzone(int player, int flag = 0x81fff, int use_cache = 1); void RefreshMzone(int player, int flag = 0x881fff, int use_cache = 1);
void RefreshSzone(int player, int flag = 0x681fff, int use_cache = 1); void RefreshSzone(int player, int flag = 0x681fff, int use_cache = 1);
void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1); void RefreshHand(int player, int flag = 0x781fff, int use_cache = 1);
void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1); void RefreshGrave(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1); void RefreshExtra(int player, int flag = 0x81fff, int use_cache = 1);
void RefreshSingle(int player, int location, int sequence, int flag = 0x781fff); void RefreshSingle(int player, int location, int sequence, int flag = 0xf81fff);
static int MessageHandler(long fduel, int type); static int MessageHandler(long fduel, int type);
static void TagTimer(evutil_socket_t fd, short events, void* arg); static void TagTimer(evutil_socket_t fd, short events, void* arg);
......
This diff is collapsed.
Subproject commit 8f6052181238b2e544ca36b970582a6963ce36f4 Subproject commit 45f3eb3d39e53bd7b8861aa12b7857e667fb9c51
Subproject commit 5bac33f528c7838f1909fd4e460d1b9d5308bdf8 Subproject commit 1a2e492ed3ab40c74cb849af2bf19ad807681fc4
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 = 0 ...@@ -23,3 +24,6 @@ hide_hint_button = 0
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
prompt_to_discard_deck_changes = 1
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