Commit 731cb247 authored by mercury233's avatar mercury233
parents 68241602 9f33aab3
## ygopro(server)
一个linux版的ygopro服务端,基于mycard代码修改。
现用于[YGOPRO 233服](http://mercury233.me/ygosrv233/)
一个linux版的ygopro服务端。
###编译
* 需要以下组件
* premake4
* freetype
* libevent
* sqlite3
* irrlicht1.8
* lua5.2
* libGL
* libGLU
* gcc
* 可参考 https://github.com/mycard/mycard.github.io/tree/master/server 中的脚本
* 可参考 https://github.com/mercury233/ygopro-server/wiki 中的脚本
###运行
* 使用[ygopro-server-lite](https://github.com/mercury233/ygopro-server)运行
......
No preview for this file type
......@@ -263,11 +263,9 @@ bool ClientCard::deck_sort_def(code_pointer p1, code_pointer p2) {
return p1->first < p2->first;
}
bool ClientCard::deck_sort_name(code_pointer p1, code_pointer p2) {
CardString cstr1;
CardString cstr2;
dataManager.GetString(p1->second.code, &cstr1);
dataManager.GetString(p2->second.code, &cstr2);
int res = wcscmp(cstr1.name, cstr2.name);
const wchar_t* name1 = dataManager.GetName(p1->first);
const wchar_t* name2 = dataManager.GetName(p2->first);
int res = wcscmp(name1, name2);
if(res != 0)
return res < 0;
return p1->first < p2->first;
......
......@@ -41,7 +41,7 @@ struct CardString {
wchar_t* text;
wchar_t* desc[16];
};
typedef std::unordered_map<unsigned int, CardDataC>::iterator code_pointer;
typedef std::unordered_map<unsigned int, CardDataC>::const_iterator code_pointer;
class ClientCard {
public:
......
......@@ -380,6 +380,7 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
mainGame->btnCardSelect[i]->setPressed(false);
mainGame->btnCardSelect[i]->setVisible(true);
if(mainGame->dInfo.curMsg != MSG_SORT_CHAIN && mainGame->dInfo.curMsg != MSG_SORT_CARD) {
wchar_t formatBuffer[2048];
if(chain && selectable_cards[i]->is_conti && !selectable_cards[i]->code)
myswprintf(formatBuffer, L"%ls", DataManager::unknown_string);
else if(selectable_cards[i]->location == LOCATION_OVERLAY)
......@@ -397,12 +398,14 @@ void ClientField::ShowSelectCard(bool buttonok, bool chain) {
mainGame->stCardPos[i]->setBackgroundColor(0xffd0d0d0);
else mainGame->stCardPos[i]->setBackgroundColor(0xffffffff);
} else {
if(selectable_cards[i]->controler)
if((selectable_cards[i]->controler)
|| ((selectable_cards[i]->location & (LOCATION_EXTRA + LOCATION_REMOVED)) && (selectable_cards[i]->position & POS_FACEDOWN)))
mainGame->stCardPos[i]->setBackgroundColor(0xffd0d0d0);
else mainGame->stCardPos[i]->setBackgroundColor(0xffffffff);
}
} else {
if(sort_list[i]) {
wchar_t formatBuffer[2048];
myswprintf(formatBuffer, L"%d", sort_list[i]);
mainGame->stCardPos[i]->setText(formatBuffer);
} else mainGame->stCardPos[i]->setText(L"");
......@@ -447,6 +450,7 @@ void ClientField::ShowChainCard() {
mainGame->btnCardSelect[i]->setRelativePosition(rect<s32>(startpos + i * 125, 55, startpos + 120 + i * 125, 225));
mainGame->btnCardSelect[i]->setPressed(false);
mainGame->btnCardSelect[i]->setVisible(true);
wchar_t formatBuffer[2048];
myswprintf(formatBuffer, L"%ls[%d]", dataManager.FormatLocation(selectable_cards[i]->location, selectable_cards[i]->sequence),
selectable_cards[i]->sequence + 1);
mainGame->stCardPos[i]->setText(formatBuffer);
......@@ -501,6 +505,7 @@ void ClientField::ShowLocationCard() {
mainGame->btnCardDisplay[i]->setRelativePosition(rect<s32>(startpos + i * 125, 55, startpos + 120 + i * 125, 225));
mainGame->btnCardDisplay[i]->setPressed(false);
mainGame->btnCardDisplay[i]->setVisible(true);
wchar_t formatBuffer[2048];
if(display_cards[i]->location == LOCATION_OVERLAY)
myswprintf(formatBuffer, L"%ls[%d](%d)",
dataManager.FormatLocation(display_cards[i]->overlayTarget->location, display_cards[i]->overlayTarget->sequence),
......@@ -516,7 +521,8 @@ void ClientField::ShowLocationCard() {
mainGame->stDisplayPos[i]->setBackgroundColor(0xffd0d0d0);
else mainGame->stDisplayPos[i]->setBackgroundColor(0xffffffff);
} else {
if(display_cards[i]->controler)
if((display_cards[i]->controler)
|| ((display_cards[i]->location & (LOCATION_EXTRA + LOCATION_REMOVED)) && (display_cards[i]->position & POS_FACEDOWN)))
mainGame->stDisplayPos[i]->setBackgroundColor(0xffd0d0d0);
else mainGame->stDisplayPos[i]->setBackgroundColor(0xffffffff);
}
......
......@@ -66,6 +66,7 @@ public:
std::vector<ClientCard*> selectsum_all;
std::vector<ClientCard*> display_cards;
std::vector<int> sort_list;
std::map<int, int> player_desc_hints[2];
bool grave_act;
bool remove_act;
bool deck_act;
......@@ -115,11 +116,11 @@ public:
int command_location;
size_t command_sequence;
ClientCard* hovered_card;
int hovered_player;
ClientCard* clicked_card;
ClientCard* command_card;
ClientCard* highlighting_card;
int list_command;
wchar_t formatBuffer[2048];
virtual bool OnEvent(const irr::SEvent& event);
void GetHoverField(int x, int y);
......
......@@ -72,8 +72,6 @@ bool DataManager::LoadStrings(const char* file) {
FILE* fp = fopen(file, "r");
if(!fp)
return false;
for(int i = 0; i < 2048; ++i)
_sysStrings[i] = 0;
char linebuf[256];
char strbuf[256];
int value;
......
......@@ -827,6 +827,10 @@ void DeckBuilder::FilterCards() {
continue;
if(filter_lm == 5 && data.ot != 2)
continue;
if(filter_lm == 6 && data.ot != 3)
continue;
if(filter_lm == 7 && data.ot != 4)
continue;
}
if(pstr) {
if(pstr[0] == L'$') {
......@@ -892,29 +896,28 @@ void DeckBuilder::ClearFilter() {
mainGame->chkCategory[i]->setChecked(false);
}
void DeckBuilder::SortList() {
auto left = results.begin();
const wchar_t* pstr = mainGame->ebCardName->getText();
for(auto it = results.begin(); it != results.end(); ++it) {
if(wcscmp(pstr, dataManager.GetName((*it)->first)) == 0) {
std::iter_swap(left, it);
++left;
}
}
switch(mainGame->cbSortType->getSelected()) {
case 0:
std::sort(results.begin(), results.end(), ClientCard::deck_sort_lv);
std::sort(left, results.end(), ClientCard::deck_sort_lv);
break;
case 1:
std::sort(results.begin(), results.end(), ClientCard::deck_sort_atk);
std::sort(left, results.end(), ClientCard::deck_sort_atk);
break;
case 2:
std::sort(results.begin(), results.end(), ClientCard::deck_sort_def);
std::sort(left, results.end(), ClientCard::deck_sort_def);
break;
case 3:
std::sort(results.begin(), results.end(), ClientCard::deck_sort_name);
std::sort(left, results.end(), ClientCard::deck_sort_name);
break;
}
const wchar_t* pstr = mainGame->ebCardName->getText();
for (size_t i = 0, pos = 0; i < results.size(); ++i){
code_pointer ptr = results[i];
if (wcscmp(pstr, dataManager.GetName(ptr->first))==0) {
results.insert(results.begin() + pos, ptr);
results.erase(results.begin() + i + 1);
pos++;
}
}
}
}
......@@ -2977,6 +2977,20 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
}
return true;
}
case MSG_PLAYER_HINT: {
int player = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
int chtype = BufferIO::ReadInt8(pbuf);
int value = BufferIO::ReadInt32(pbuf);
auto& player_desc_hints = mainGame->dField.player_desc_hints[player];
if(chtype == PHINT_DESC_ADD) {
player_desc_hints[value]++;
} else if(chtype == PHINT_DESC_REMOVE) {
player_desc_hints[value]--;
if(player_desc_hints[value] == 0)
player_desc_hints.erase(value);
}
return true;
}
case MSG_MATCH_KILL: {
match_kill = BufferIO::ReadInt32(pbuf);
return true;
......
This diff is collapsed.
......@@ -5,23 +5,4 @@
#include "game.h"
#include "client_card.h"
namespace ygo {
class EventHandler : public irr::IEventReceiver {
public:
virtual bool OnEvent(const irr::SEvent& event);
void GetHoverField(int x, int y);
void ShowMenu(int flag, int x, int y);
irr::gui::IGUIElement* panel;
int hovered_controler;
int hovered_location;
int hovered_sequence;
ClientCard* hovered_card;
ClientCard* clicked_card;
wchar_t formatBuffer[256];
};
}
#endif //EVENT_HANDLER_H
......@@ -106,6 +106,7 @@ bool Game::Initialize() {
if(!dataManager.LoadStrings("strings.conf"))
return false;
RefreshExpansionDB();
dataManager.LoadStrings("./expansions/strings.conf");
env = device->getGUIEnvironment();
numFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 16);
adFont = irr::gui::CGUITTFont::createTTFont(env, gameConf.numfont, 12);
......@@ -485,6 +486,8 @@ bool Game::Initialize() {
cbLimit->addItem(dataManager.GetSysString(1318));
cbLimit->addItem(dataManager.GetSysString(1240));
cbLimit->addItem(dataManager.GetSysString(1241));
cbLimit->addItem(dataManager.GetSysString(1242));
cbLimit->addItem(dataManager.GetSysString(1243));
env->addStaticText(dataManager.GetSysString(1319), rect<s32>(10, 22 + 50 / 6, 70, 42 + 50 / 6), false, false, wFilter);
cbAttribute = env->addComboBox(rect<s32>(60, 20 + 50 / 6, 190, 40 + 50 / 6), wFilter, -1);
cbAttribute->setMaxSelectionRows(10);
......
......@@ -512,7 +512,7 @@ extern unsigned char draw_count;
#define BUTTON_SAVE_DECK 304
#define BUTTON_SAVE_DECK_AS 305
#define BUTTON_DELETE_DECK 306
#define BUTTON_DBEXIT 307
//#define BUTTON_DBEXIT 307
#define BUTTON_SORT_DECK 308
#define BUTTON_SIDE_OK 309
#define BUTTON_SHUFFLE_DECK 310
......
......@@ -765,6 +765,11 @@ bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_PLAYER_HINT: {
pbuf += 6;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_MATCH_KILL: {
pbuf += 4;
break;
......
......@@ -1340,6 +1340,14 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_PLAYER_HINT: {
pbuf += 6;
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_MATCH_KILL: {
int code = BufferIO::ReadInt32(pbuf);
if(match_mode) {
......
......@@ -601,6 +601,11 @@ bool SingleMode::SinglePlayAnalyze(char* msg, unsigned int len) {
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_PLAYER_HINT: {
pbuf += 6;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_TAG_SWAP: {
player = pbuf[0];
pbuf += pbuf[2] * 4 + pbuf[4] * 4 + 9;
......
......@@ -748,7 +748,7 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_CONFIRM_CARDS: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
if(pbuf[5] == LOCATION_HAND) {
if(pbuf[5] != LOCATION_DECK) {
pbuf += count * 7;
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
......@@ -1385,6 +1385,16 @@ int TagDuel::Analyze(char* msgbuffer, unsigned int len) {
NetServer::ReSendToPlayer(*oit);
break;
}
case MSG_PLAYER_HINT: {
pbuf += 6;
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_TAG_SWAP: {
player = BufferIO::ReadInt8(pbuf);
/*int mcount = */BufferIO::ReadInt8(pbuf);
......
#[2016.7][2016.4][2016.1][2015.10][2015.4][2015.1][2014.10][2014.7][2014.4][2014.2][2013.9][2016.4 TCG][2015.11 TCG][2015.7 TCG][2015.4 TCG][2015.1 TCG][2014.10 TCG][2014.7 TCG][2014.4 TCG][2014.1.1 TCG][2013.10.11 TCG][2013.3.1][2012.9.1][2012.3.1][2011.9.1]
#[2016.7][2016.4][2016.1][2015.10][2015.4][2015.1][2014.10][2014.7][2014.4][2014.2][2013.9][2016.8 TCG][2016.4 TCG][2015.11 TCG][2015.7 TCG][2015.4 TCG][2015.1 TCG][2014.10 TCG][2014.7 TCG][2014.4 TCG][2014.1.1 TCG][2013.10.11 TCG][2013.3.1][2012.9.1][2012.3.1][2011.9.1]
!2016.7
#forbidden
20663556 0 --イレカエル
......@@ -1664,6 +1664,185 @@
53582587 2 --激流葬
29401950 2 --奈落の落とし穴
!2016.8 TCG
#forbidden
27279764 0 --アポクリフォート・キラー
20663556 0 --イレカエル
44910027 0 --ヴィクトリー・ドラゴン
20366274 0 --エルシャドール・ネフィリム
40044918 0 --E·HERO エアーマン
53804307 0 --焔征竜-ブラスター
68819554 0 --Emダメージ・ジャグラー
07563579 0 --Emヒグルミ
17330916 0 --EMモンキーボード
82301904 0 --混沌帝龍 -終焉の使者-
79106360 0 --カオスポッド
90411554 0 --巌征竜-レドックス
08903700 0 --儀式魔人リリーサー
26202165 0 --クリッター
78010363 0 --黒き森のウィッチ
34124316 0 --サイバーポッド
21593977 0 --処刑人-マキュラ
81122844 0 --発条空母ゼンマイティ
56570271 0 --DHERO ディスクガイ
69015963 0 --デビル·フランケン
18326736 0 --星守の騎士 プトレマイオス
33184167 0 --同族感染ウィルス
90307777 0 --影霊衣の術士 シュリット
54719828 0 --No.16 色の支配者ショック·ルーラー
26400609 0 --瀑征竜-タイダル
78706415 0 --ファイバーポッド
93369354 0 --フィッシュボーグ-ガンナー
50321796 0 --氷結界の龍 ブリューナク
34206604 0 --魔導サイエンティスト
33508719 0 --メタモルポット
96782886 0 --メンタルマスター
03078576 0 --八汰烏
34086406 0 --ラヴァルバル·チェイン
89399912 0 --嵐征竜-テンペスト
46772449 0 --励輝士 ヴェルズビュート
14878871 0 --レスキューキャット
41482598 0 --悪夢の蜃気楼
44763025 0 --いたずら好きな双子悪魔
19613556 0 --大嵐
17375316 0 --押収
35059553 0 --カイザーコロシアム
74191942 0 --苦渋の選択
42829885 0 --強引な番兵
45986603 0 --強奪
55144522 0 --強欲な壺
04031928 0 --心変わり
23557835 0 --次元融合
83764718 0 --死者蘇生
57953380 0 --生還の宝札
87910978 0 --洗脳-ブレインコントロール
60682203 0 --大寒波
67616300 0 --チキンレース
48130397 0 --超融合
67169062 0 --貪欲な壺
27770341 0 --超再生能力
69243953 0 --蝶の短剣-エルマ
72892473 0 --手札抹殺
79571449 0 --天使の施し
42703248 0 --ハリケーン
18144506 0 --ハーピィの羽根帚
70828912 0 --早すぎた埋葬
34906152 0 --マスドライバー
46448938 0 --魔導書の神判
77565204 0 --未来融合-フューチャー·フュージョン
27970830 0 --六武の門
46411259 0 --突然変異
31222701 0 --揺れる眼差し
85602018 0 --遺言状
27174286 0 --異次元からの帰還
61740673 0 --王宮の勅命
93016201 0 --王宮の弾圧
41420027 0 --神の宣告
57585212 0 --自爆スイッチ
03280747 0 --第六感
64697231 0 --ダスト·シュート
35316708 0 --刻の封印
80604091 0 --血の代償
28566710 0 --ラストバトル!
#limit
85103922 1 --アーティファクト-モラルタ
64034255 1 --A·ジェネクス·バードマン
45222299 1 --イビリチュア·ガストクラーケ
11877465 1 --イビリチュア·マインドオーガス
99177923 1 --インフェルニティ·デーモン
68184115 1 --甲虫装機 ダンセル
69207766 1 --甲虫装機 ホーネット
27552504 1 --永遠の淑女 ベアトリーチェ
40318957 1 --EMドクロバット・ジョーカー
72989439 1 --カオス·ソルジャー -開闢の使者-
17412721 1 --旧神ノーデン
65518099 1 --クリフォート・ツール
72714461 1 --慧眼の魔術師
55885348 1 --Kozmo Dark Destroyer
12580477 1 --サンダー·ボルト
78868119 1 --深海のディーヴァ
48063985 1 --聖霊獣騎 カンナホーク
65192027 1 --ダーク·アームド·ドラゴン
15341821 1 --ダンディライオン
90953320 1 --TG ハイパー·ライブラリアン
96570609 1 --天帝アイテール
16226786 1 --深淵の暗殺者
80344569 1 --N·グラン·モール
18239909 1 --爆竜剣士イグニスターP
57143342 1 --彼岸の悪鬼 ガトルホッグ
20758643 1 --彼岸の悪鬼 グラバースニッチ
70583986 1 --氷結界の虎王ドゥローレン
52687916 1 --氷結界の龍 トリシューラ
33396948 1 --封印されしエクゾディア
07902349 1 --封印されし者の左腕
70903634 1 --封印されし者の右腕
44519536 1 --封印されし者の左足
08124921 1 --封印されし者の右足
26674724 1 --ブリューナクの影霊衣
10802915 1 --魔界発現世行きデスガイド
31178212 1 --マジェスペクター・ユニコーン
41386308 1 --マスマティシャン
89463537 1 --ユニコールの影霊衣
92746535 1 --竜剣士ラスターP
85138716 1 --レスキューラビット
88264978 1 --レッドアイズ·ダークネスメタルドラゴン
48976825 1 --異次元からの埋葬
33782437 1 --一時休戦
66957584 1 --インフェルニティガン
06417578 1 --神の写し身との接触
72405967 1 --王家の生け贄
81439173 1 --おろかな埋葬
96729612 1 --儀式の準備
67723438 1 --緊急テレポート
45305419 1 --継承の印
17639150 1 --機殻の生贄
95308449 1 --終焉のカウントダウン
74845897 1 --真炎の爆発
37520316 1 --精神操作
32807846 1 --増援
54447022 1 --ソウル・チャージ
14087893 1 --月の書
81674782 1 --次元の裂け目
79844764 1 --帝王の烈旋
70368879 1 --成金ゴブリン
22842126 1 --汎神の帝王
53208660 1 --ペンデュラム・コール
15854426 1 --霞の谷の神風
58577036 1 --名推理
43040603 1 --モンスターゲート
23171610 1 --リミッター解除
14733538 1 --竜呼相打つ
02295440 1 --ワン·フォー·ワン
09059700 1 --インフェルニティ・バリア
05851097 1 --虚無空間
84749824 1 --神の警告
94192409 1 --強制脱出装置
53582587 1 --激流葬
82732705 1 --スキルドレイン
73599290 1 --ソウルドレイン
29401950 1 --奈落の落とし穴
83555666 1 --破壊輪
17078030 1 --光の護封壁
30241314 1 --マクロコスモス
32723153 1 --マジカル·エクスプロージョン
54974237 1 --闇のデッキ破壊ウイルス
#semi limit
37742478 2 --オネスト
85087012 2 --カードガンナー
74311226 2 --海皇の竜騎隊
00423585 2 --召喚僧サモンプリースト
59297550 2 --ゼンマイマジシャン
23434538 2 --増殖するG
14943837 2 --デブリ·ドラゴン
28297833 2 --ネクロフェイス
71564252 2 --ライオウ
94886282 2 --光の援軍
53129443 2 --ブラック·ホール
62265044 2 --竜の渓谷
91623717 2 --連鎖爆撃
29843091 2 --おジャマトリオ
36468556 2 --停戦協定
!2016.4 TCG
#forbidden
27279764 0 --アポクリフォート・キラー
......
Subproject commit ab9650d44585f01c2d95e64ff3047c12ca5ea2f3
Subproject commit bdfe3d7c4db18f1b66f0cab7874108411571bff2
Subproject commit 29da47a42accea0b27aa3b086c6e013576d8e547
Subproject commit 4a077c3c17def513f17d8a48d4d475714c2cc0ba
......@@ -257,7 +257,7 @@
!system 1240 OCG
!system 1241 TCG
!system 1242 OCG&TCG
!system 1243 专有卡禁止
!system 1243 自定义卡片
!system 1244 单局模式
!system 1245 比赛模式
!system 1246 TAG
......@@ -469,7 +469,7 @@
!setname 0x1 正义盟军 AOJ
!setname 0x2 次世代 ジェネクス
!setname 0x1002 真次世代 レアル·ジェネクス
!setname 0x2002 盟军·次世代 A・ジェネクス
#!setname 0x2002 盟军·次世代 A・ジェネクス
#setname 0x3 N/A
!setname 0x4 亚马逊 アマゾネス
!setname 0x5 秘仪之力 アルカナフォース
......
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