Commit f02cefe0 authored by argon.sun's avatar argon.sun

match

parent fa14238e
......@@ -4,6 +4,7 @@
#include "deck_manager.h"
#include "image_manager.h"
#include "game.h"
#include "duelclient.h"
#include <algorithm>
namespace ygo {
......@@ -282,6 +283,25 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wCategories);
break;
}
case BUTTON_SIDE_OK: {
if(deckManager.current_deck.main.size() != pre_mainc || deckManager.current_deck.extra.size() != pre_extrac
|| deckManager.current_deck.side.size() != pre_sidec) {
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1410));
break;
}
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(int i = 0; i < deckManager.current_deck.main.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.main[i]->first);
for(int i = 0; i < deckManager.current_deck.extra.size(); ++i)
BufferIO::WriteInt32(pdeck, deckManager.current_deck.extra[i]->first);
for(int 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);
break;
}
}
break;
}
......@@ -425,25 +445,87 @@ bool DeckBuilder::OnEvent(const irr::SEvent& event) {
if(!is_draging)
break;
is_draging = false;
if((hovered_pos == 1 && (draging_pointer->second.type & 0x802040)) || (hovered_pos == 2 && !(draging_pointer->second.type & 0x802040)))
hovered_pos = 0;
if((hovered_pos == 1 || (hovered_pos == 0 && click_pos == 1)) && deckManager.current_deck.main.size() < 60) {
if(hovered_seq < deckManager.current_deck.main.size())
deckManager.current_deck.main.insert(deckManager.current_deck.main.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.main.push_back(draging_pointer);
} else if((hovered_pos == 2 || (hovered_pos == 0 && click_pos == 2)) && deckManager.current_deck.extra.size() < 15) {
if(hovered_seq < deckManager.current_deck.extra.size())
deckManager.current_deck.extra.insert(deckManager.current_deck.extra.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.extra.push_back(draging_pointer);
} else if((hovered_pos == 3 || (hovered_pos == 0 && click_pos == 3)) && deckManager.current_deck.side.size() < 15) {
if(hovered_seq < deckManager.current_deck.side.size())
deckManager.current_deck.side.insert(deckManager.current_deck.side.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.side.push_back(draging_pointer);
if(!mainGame->is_siding) {
if((hovered_pos == 1 && (draging_pointer->second.type & 0x802040)) || (hovered_pos == 2 && !(draging_pointer->second.type & 0x802040)))
hovered_pos = 0;
if((hovered_pos == 1 || (hovered_pos == 0 && click_pos == 1)) && deckManager.current_deck.main.size() < 60) {
if(hovered_seq < deckManager.current_deck.main.size() && hovered_pos)
deckManager.current_deck.main.insert(deckManager.current_deck.main.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.main.push_back(draging_pointer);
} else if((hovered_pos == 2 || (hovered_pos == 0 && click_pos == 2)) && deckManager.current_deck.extra.size() < 15) {
if(hovered_seq < deckManager.current_deck.extra.size() && hovered_pos)
deckManager.current_deck.extra.insert(deckManager.current_deck.extra.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.extra.push_back(draging_pointer);
} else if((hovered_pos == 3 || (hovered_pos == 0 && click_pos == 3)) && deckManager.current_deck.side.size() < 15) {
if(hovered_seq < deckManager.current_deck.side.size() && hovered_pos)
deckManager.current_deck.side.insert(deckManager.current_deck.side.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.side.push_back(draging_pointer);
}
} else {
if((hovered_pos == 1 && (draging_pointer->second.type & 0x802040)) || (hovered_pos == 2 && !(draging_pointer->second.type & 0x802040))
|| hovered_pos == 4) {
if(click_pos == 1)
deckManager.current_deck.main.push_back(draging_pointer);
else if(click_pos == 2)
deckManager.current_deck.extra.push_back(draging_pointer);
else if(click_pos == 3)
deckManager.current_deck.side.push_back(draging_pointer);
break;
}
if(hovered_pos == 1) {
if(click_pos == 1) {
if(hovered_seq < deckManager.current_deck.main.size())
deckManager.current_deck.main.insert(deckManager.current_deck.main.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.main.push_back(draging_pointer);
} else if(hovered_seq < deckManager.current_deck.main.size()) {
deckManager.current_deck.side.push_back(deckManager.current_deck.main[hovered_seq]);
deckManager.current_deck.main[hovered_seq] = draging_pointer;
} else
deckManager.current_deck.side.push_back(draging_pointer);
} else if(hovered_pos == 2) {
if(click_pos == 2) {
if(hovered_seq < deckManager.current_deck.main.size())
deckManager.current_deck.extra.insert(deckManager.current_deck.extra.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.extra.push_back(draging_pointer);
} else if(hovered_seq < deckManager.current_deck.extra.size()) {
deckManager.current_deck.side.push_back(deckManager.current_deck.extra[hovered_seq]);
deckManager.current_deck.extra[hovered_seq] = draging_pointer;
} else
deckManager.current_deck.side.push_back(draging_pointer);
} else if(hovered_pos == 3 || (hovered_pos == 0 && click_pos == 3)) {
if(click_pos == 3) {
if(hovered_seq < deckManager.current_deck.side.size())
deckManager.current_deck.extra.insert(deckManager.current_deck.side.begin() + hovered_seq, draging_pointer);
else deckManager.current_deck.side.push_back(draging_pointer);
} else if(hovered_seq < deckManager.current_deck.side.size()) {
auto swaping_pointer = deckManager.current_deck.side[hovered_seq];
if(click_pos == 1) {
if(swaping_pointer->second.type & 0x802040)
deckManager.current_deck.main.push_back(draging_pointer);
else {
deckManager.current_deck.main.push_back(swaping_pointer);
deckManager.current_deck.side[hovered_seq] = draging_pointer;
}
} else {
if(!(swaping_pointer->second.type & 0x802040))
deckManager.current_deck.extra.push_back(draging_pointer);
else {
deckManager.current_deck.extra.push_back(swaping_pointer);
deckManager.current_deck.side[hovered_seq] = draging_pointer;
}
}
} else {
if(click_pos == 1)
deckManager.current_deck.main.push_back(draging_pointer);
else
deckManager.current_deck.extra.push_back(draging_pointer);
}
}
}
break;
}
case irr::EMIE_RMOUSE_LEFT_UP: {
if(mainGame->wCategories->isVisible())
if(mainGame->wCategories->isVisible() || mainGame->is_siding)
break;
if(hovered_pos == 0 || hovered_seq == -1)
break;
......
......@@ -33,6 +33,9 @@ public:
bool is_draging;
int dragx;
int dragy;
int pre_mainc;
int pre_extrac;
int pre_sidec;
code_pointer draging_pointer;
std::unordered_map<int, int>* filterList;
......
......@@ -117,7 +117,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1400));
mainGame->gMutex.Unlock();
} else if(connect_state == 2) {
if(!mainGame->dInfo.isStarted) {
if(!mainGame->dInfo.isStarted && !mainGame->is_building) {
mainGame->btnCreateHost->setEnabled(true);
mainGame->btnJoinHost->setEnabled(true);
mainGame->btnJoinCancel->setEnabled(true);
......@@ -132,18 +132,14 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
mainGame->gMutex.Unlock();
} else {
mainGame->gMutex.Lock();
mainGame->stMessage->setText(dataManager.GetSysString(1502));
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1502));
mainGame->btnCreateHost->setEnabled(true);
mainGame->btnJoinHost->setEnabled(true);
mainGame->btnJoinCancel->setEnabled(true);
mainGame->gMutex.Unlock();
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->gMutex.Lock();
mainGame->CloseDuelWindow();
mainGame->gMutex.Unlock();
mainGame->dInfo.isStarted = false;
mainGame->is_building = false;
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->ShowElement(mainGame->wLanWindow);
}
......@@ -198,6 +194,12 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->gMutex.Unlock();
break;
}
case ERRMSG_SIDEERROR: {
mainGame->gMutex.Lock();
mainGame->env->addMessageBox(L"", dataManager.GetSysString(1408));
mainGame->gMutex.Unlock();
break;
}
}
break;
}
......@@ -222,6 +224,35 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
case STOC_TP_RESULT: {
break;
}
case STOC_CHANGE_SIDE: {
mainGame->gMutex.Lock();
mainGame->dInfo.isStarted = false;
mainGame->dField.Clear();
mainGame->is_building = true;
mainGame->is_siding = true;
mainGame->wPhase->setVisible(false);
mainGame->wDeckEdit->setVisible(false);
mainGame->wFilter->setVisible(false);
mainGame->btnSideOK->setVisible(true);
mainGame->deckBuilder.result_string[0] = L'0';
mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear();
mainGame->deckBuilder.is_draging = false;
mainGame->deckBuilder.pre_mainc = deckManager.current_deck.main.size();
mainGame->deckBuilder.pre_extrac = deckManager.current_deck.extra.size();
mainGame->deckBuilder.pre_sidec = deckManager.current_deck.side.size();
mainGame->device->setEventReceiver(&mainGame->deckBuilder);
mainGame->gMutex.Unlock();
break;
}
case STOC_WAITING_SIDE: {
mainGame->gMutex.Lock();
mainGame->dField.Clear();
mainGame->stHintMsg->setText(dataManager.GetSysString(1409));
mainGame->stHintMsg->setVisible(true);
mainGame->gMutex.Unlock();
break;
}
case STOC_JOIN_GAME: {
STOC_JoinGame* pkt = (STOC_JoinGame*)pdata;
std::wstring str;
......@@ -252,6 +283,14 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf);
}
mainGame->gMutex.Lock();
mainGame->deckBuilder.filterList = 0;
for(auto lit = deckManager._lfList.begin(); lit != deckManager._lfList.end(); ++lit)
if(lit->hash == pkt->info.lflist)
mainGame->deckBuilder.filterList = lit->content;
if(mainGame->deckBuilder.filterList == 0)
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;
mainGame->stHostSingleDuelist[0]->setText(L"");
mainGame->stHostSingleDuelist[1]->setText(L"");
mainGame->SetStaticText(mainGame->stHostSingleRule, 180, mainGame->guiFont, (wchar_t*)str.c_str());
mainGame->RefreshDeck(mainGame->cbDeckSelect);
if(mainGame->wCreateHost->isVisible())
......@@ -297,9 +336,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->gMutex.Lock();
mainGame->dField.Clear();
mainGame->dInfo.isStarted = true;
mainGame->is_building = false;
mainGame->wCardImg->setVisible(true);
mainGame->wInfos->setVisible(true);
mainGame->wPhase->setVisible(true);
mainGame->btnSideOK->setVisible(false);
mainGame->device->setEventReceiver(&mainGame->dField);
if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostSingleDuelist[0]->getText(), mainGame->dInfo.hostname, 20);
......
......@@ -109,7 +109,7 @@ bool Game::Initialize() {
env->addStaticText(dataManager.GetSysString(1227), rect<s32>(20, 90, 220, 110), false, false, wCreateHost);
cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost);
cbMatchMode->addItem(dataManager.GetSysString(1244));
//cbMatchMode->addItem(dataManager.GetSysString(1245));
cbMatchMode->addItem(dataManager.GetSysString(1245));
chkEnablePriority = env->addCheckBox(false, rect<s32>(20, 150, 360, 170), wCreateHost, -1, dataManager.GetSysString(1236));
env->addStaticText(dataManager.GetSysString(1228), rect<s32>(20, 120, 320, 140), false, false, wCreateHost);
chkNoCheckDeck = env->addCheckBox(false, rect<s32>(20, 180, 170, 200), wCreateHost, -1, dataManager.GetSysString(1229));
......@@ -351,6 +351,8 @@ bool Game::Initialize() {
btnClearDeck = env->addButton(rect<s32>(225, 95, 290, 116), wDeckEdit, BUTTON_CLEAR_DECK, dataManager.GetSysString(1304));
btnSortDeck = env->addButton(rect<s32>(155, 95, 220, 116), wDeckEdit, BUTTON_SORT_DECK, dataManager.GetSysString(1305));
btnDBExit = env->addButton(rect<s32>(10, 95, 90, 116), wDeckEdit, BUTTON_DBEXIT, dataManager.GetSysString(1306));
btnSideOK = env->addButton(rect<s32>(510, 40, 820, 80), 0, BUTTON_SIDE_OK, dataManager.GetSysString(1334));
btnSideOK->setVisible(false);
//filters
wFilter = env->addStaticText(L"", rect<s32>(610, 8, 1020, 130), true, false, 0, -1, true);
wFilter->setVisible(false);
......@@ -760,6 +762,7 @@ void Game::CloseDuelWindow() {
wQuery->setVisible(false);
wReplayControl->setVisible(false);
stHintMsg->setVisible(false);
btnSideOK->setVisible(false);
lstLog->clear();
logParam.clear();
ClearTextures();
......
......@@ -108,7 +108,8 @@ public:
bool ignore_chain;
bool is_building;
bool is_siding;
ClientField dField;
DeckBuilder deckBuilder;
MenuHandler menuHandler;
......@@ -274,6 +275,7 @@ public:
irr::gui::IGUIButton* btnSaveDeck;
irr::gui::IGUIButton* btnSaveDeckAs;
irr::gui::IGUIButton* btnDBExit;
irr::gui::IGUIButton* btnSideOK;
irr::gui::IGUIEditBox* ebDeckname;
//filter
irr::gui::IGUIStaticText* wFilter;
......@@ -395,6 +397,7 @@ extern Game* mainGame;
#define BUTTON_SAVE_DECK_AS 305
#define BUTTON_DBEXIT 306
#define BUTTON_SORT_DECK 307
#define BUTTON_SIDE_OK 308
#define COMBOBOX_MAINTYPE 310
#define BUTTON_EFFECT_FILTER 311
#define BUTTON_START_FILTER 312
......
......@@ -154,10 +154,12 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
deckManager.LoadDeck(mainGame->cbDBDecks->getItem(mainGame->cbDBDecks->getSelected()));
mainGame->HideElement(mainGame->wMainMenu);
mainGame->is_building = true;
mainGame->is_siding = false;
mainGame->wInfos->setVisible(true);
mainGame->wCardImg->setVisible(true);
mainGame->wDeckEdit->setVisible(true);
mainGame->wFilter->setVisible(true);
mainGame->btnSideOK->setVisible(false);
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;
mainGame->cbDBLFList->setSelected(0);
mainGame->cbCardType->setSelected(0);
......
......@@ -205,9 +205,9 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
return;
CTOS_CreateGame* pkt = (CTOS_CreateGame*)pdata;
if(pkt->info.mode == MODE_SINGLE) {
duel_mode = new SingleDuel;
} else if(pkt->info.mode == MODE_SINGLE) {
duel_mode = new SingleDuel;
duel_mode = new SingleDuel(false);
} else if(pkt->info.mode == MODE_MATCH) {
duel_mode = new SingleDuel(true);
}
if(pkt->info.rule > 3)
pkt->info.rule = 0;
......
......@@ -163,6 +163,8 @@ public:
#define STOC_SELECT_TP 0x4
#define STOC_HAND_RESULT 0x5
#define STOC_TP_RESULT 0x6
#define STOC_CHANGE_SIDE 0x7
#define STOC_WAITING_SIDE 0x8
#define STOC_CREATE_GAME 0x11
#define STOC_JOIN_GAME 0x12
#define STOC_TYPE_CHANGE 0x13
......@@ -181,6 +183,7 @@ public:
#define ERRMSG_JOINERROR 0x1
#define ERRMSG_DECKERROR 0x2
#define ERRMSG_SIDEERROR 0x3
#define MODE_SINGLE 0x0
#define MODE_MATCH 0x1
......
......@@ -8,11 +8,14 @@
namespace ygo {
SingleDuel::SingleDuel() {
SingleDuel::SingleDuel(bool is_match) {
match_mode = is_match;
for(int i = 0; i < 2; ++i) {
players[i] = 0;
ready[i] = false;
}
duel_count = 0;
memset(match_result, 0, 3);
}
SingleDuel::~SingleDuel() {
}
......@@ -221,12 +224,29 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
LeaveGame(players[pos]);
}
void SingleDuel::UpdateDeck(DuelPlayer* dp, void* pdata) {
if(dp->type > 1)
if(dp->type > 1 || ready[dp->type])
return;
char* deckbuf = (char*)pdata;
int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf);
deckManager.LoadDeck(pdeck[dp->type], (int*)deckbuf, mainc, sidec);
if(duel_count == 0) {
deckManager.LoadDeck(pdeck[dp->type], (int*)deckbuf, mainc, sidec);
} else {
if(deckManager.LoadSide(pdeck[dp->type], (int*)deckbuf, mainc, sidec)) {
ready[dp->type] = true;
NetServer::SendPacketToPlayer(dp, STOC_DUEL_START);
if(ready[0] && ready[1]) {
NetServer::SendPacketToPlayer(players[tp_player], STOC_SELECT_TP);
players[1 - tp_player]->state = 0xff;
players[tp_player]->state = CTOS_TP_RESULT;
}
} else {
STOC_ErrorMsg scem;
scem.msg = ERRMSG_SIDEERROR;
scem.code = 0;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
}
}
}
void SingleDuel::StartDuel(DuelPlayer* dp) {
if(dp != host_player)
......@@ -274,12 +294,14 @@ void SingleDuel::HandResult(DuelPlayer* dp, unsigned char res) {
|| (hand_result[0] == 2 && hand_result[1] == 3)
|| (hand_result[0] == 3 && hand_result[1] == 1)) {
NetServer::SendPacketToPlayer(players[1], CTOS_TP_RESULT);
tp_player = 1;
players[0]->state = 0xff;
players[1]->state = CTOS_TP_RESULT;
} else {
NetServer::SendPacketToPlayer(players[0], CTOS_TP_RESULT);
players[1]->state = 0xff;
players[0]->state = CTOS_TP_RESULT;
tp_player = 0;
}
}
}
......@@ -288,6 +310,8 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
return;
bool swapped = false;
mtrandom rnd;
pplayer[0] = players[0];
pplayer[1] = players[1];
if((tp && dp->type == 1) || (!tp && dp->type == 0)) {
DuelPlayer* p = players[0];
players[0] = players[1];
......@@ -398,8 +422,37 @@ void SingleDuel::Process() {
}
}
if(stop == 2) {
EndDuel();
NetServer::StopServer();
if(!match_mode) {
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::StopServer();
} else {
int winc[3] = {0, 0, 0};
for(int i = 0; i < duel_count; ++i)
winc[match_result[i]]++;
if(winc[0] == 2 || (winc[0] == 1 && winc[2] == 2)) {
} else if(winc[1] == 2 || (winc[1] == 1 && winc[2] == 2)) {
} else if(winc[2] == 3 || (winc[0] == 1 && winc[1] == 1 && winc[2] == 1)) {
} else {
if(players[0] != pplayer[0]) {
players[0] = pplayer[0];
players[1] = pplayer[1];
Deck d = pdeck[0];
pdeck[0] = pdeck[1];
pdeck[1] = d;
}
ready[0] = false;
ready[1] = false;
players[0]->state = CTOS_UPDATE_DECK;
players[1]->state = CTOS_UPDATE_DECK;
NetServer::SendPacketToPlayer(players[0], STOC_CHANGE_SIDE);
NetServer::SendPacketToPlayer(players[1], STOC_CHANGE_SIDE);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendPacketToPlayer(*oit, STOC_WAITING_SIDE);
}
}
}
}
int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
......@@ -444,6 +497,16 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
type = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, offset, pbuf - offset);
if(player > 1) {
match_result[duel_count++] = 2;
tp_player = 1 - tp_player;
} else if(players[player] == pplayer[player]) {
match_result[duel_count++] = player;
tp_player = 1 - player;
} else {
match_result[duel_count++] = 1 - player;
tp_player = player;
}
EndDuel();
return 2;
}
......@@ -1116,10 +1179,6 @@ void SingleDuel::EndDuel() {
memcpy(pbuf, last_replay.comp_data, last_replay.comp_size);
NetServer::SendBufferToPlayer(players[0], STOC_REPLAY, replaybuf, sizeof(ReplayHeader) + last_replay.comp_size);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
NetServer::SendPacketToPlayer(players[0], STOC_DUEL_END);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
end_duel(pduel);
......
......@@ -9,7 +9,7 @@ namespace ygo {
class SingleDuel: public DuelMode {
public:
SingleDuel();
SingleDuel(bool is_match);
virtual ~SingleDuel();
virtual void JoinGame(DuelPlayer* dp, void* pdata, bool is_creater);
virtual void LeaveGame(DuelPlayer* dp);
......@@ -38,12 +38,17 @@ public:
protected:
DuelPlayer* players[2];
DuelPlayer* pplayer[2];
bool ready[2];
Deck pdeck[2];
unsigned char hand_result[2];
unsigned char last_response;
std::set<DuelPlayer*> observers;
Replay last_replay;
bool match_mode;
unsigned char duel_count;
unsigned char tp_player;
unsigned char match_result[3];
};
}
......
......@@ -27,7 +27,7 @@ end
function c21143940.activate(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if not tc:IsRelateToEffect(e) then return end
Duel.SendtoGrave(tc,REASON_EFFECT)
if Duel.SendtoGrave(tc,REASON_EFFECT)==0 then return end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SPSUMMON)
local sg=Duel.SelectMatchingCard(tp,c21143940.tfilter,tp,LOCATION_EXTRA,0,1,1,nil,tc:GetAttribute(),e,tp)
if sg:GetCount()>0 then
......
......@@ -32,7 +32,7 @@ function c39512984.splimit(e,se,sp,st)
return not e:GetHandler():IsLocation(LOCATION_EXTRA) or bit.band(st,SUMMON_TYPE_FUSION)==SUMMON_TYPE_FUSION
end
function c39512984.atkup(e,c)
return Duel.GetMatchingGroupCount(Card.IsSetCard,c:GetControler(),LOCATION_GRAVE,0,nil,0x1047)*100
return Duel.GetMatchingGroupCount(Card.IsSetCard,c:GetControler(),LOCATION_GRAVE,0,nil,0x47)*100
end
function c39512984.filter(c)
return c:IsLevelBelow(7) and c:IsSetCard(0x1047) and c:IsType(TYPE_FUSION) and c:IsAbleToRemoveAsCost()
......
......@@ -282,6 +282,7 @@
!system 1331 额外卡组:
!system 1332 副卡组:
!system 1333 搜索结果:
!system 1334 副卡组更换完成
!system 1340 是否保存录像?
!system 1341 保存
!system 1342 录像文件:
......@@ -303,6 +304,9 @@
!system 1405 主机拒绝了连接。
!system 1406 无效卡组。
!system 1407 「%ls」的数量不符合当前设定。
!system 1408 更换副卡组失败。
!system 1409 等待更换副卡组中...
!system 1410 卡组数量与先前不符合。
!system 1500 决斗结束。
!system 1501 录像结束。
!system 1502 连接已断开。
......
......@@ -7,5 +7,5 @@ lastdeck = tgagent
textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911
lastip = 192.168.2.100
lastip = 192.168.3.235
lastport = 7911
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