Commit 1b5e954f authored by argon.sun's avatar argon.sun

new script & recon

parent b48ae168
This diff is collapsed.
...@@ -47,55 +47,76 @@ void DeckManager::LoadLFList() { ...@@ -47,55 +47,76 @@ void DeckManager::LoadLFList() {
linebuf[p] = 0; linebuf[p] = 0;
count = atoi(&linebuf[sa]); count = atoi(&linebuf[sa]);
(*cur->content)[code] = count; (*cur->content)[code] = count;
cur->hash = cur->hash ^ ((code<<18) | (code>>14)) ^ ((code<<(27+count)) | (code>>(5-count))); cur->hash = cur->hash ^ ((code << 18) | (code >> 14)) ^ ((code << (27 + count)) | (code >> (5 - count)));
} }
fclose(fp); fclose(fp);
} }
LFList nolimit; LFList nolimit;
myswprintf(nolimit.listName, L"无限制"); myswprintf(nolimit.listName, L"N/A");
nolimit.hash = 0; nolimit.hash = 0;
nolimit.content = new std::unordered_map<int, int>; nolimit.content = new std::unordered_map<int, int>;
_lfList.push_back(nolimit); _lfList.push_back(nolimit);
} }
bool DeckManager::CheckLFList(Deck& deck, int lfindex) { wchar_t* DeckManager::GetLFListName(int lfhash) {
std::unordered_map<int, int>* list = 0;
for(int i = 0; i < _lfList.size(); ++i) {
if(_lfList[i].hash == lfhash) {
return _lfList[i].listName;
}
}
return (wchar_t*)dataManager.unknown_string;
}
int DeckManager::CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg) {
std::unordered_map<int, int> ccount; std::unordered_map<int, int> ccount;
std::unordered_map<int, int>* list = _lfList[lfindex].content; std::unordered_map<int, int>* list = 0;
for(int i = 0; i < _lfList.size(); ++i) {
if(_lfList[i].hash == lfhash) {
list = _lfList[i].content;
break;
}
}
if(!list)
return 0;
int dc = 0, dec = 0; int dc = 0, dec = 0;
if(deck.main.size() < 40 || deck.main.size() > 60 || deck.extra.size() > 15 || deck.side.size() > 15) if(deck.main.size() < 40 || deck.main.size() > 60 || deck.extra.size() > 15 || deck.side.size() > 15)
return false; return 1;
for(int i = 0; i < deck.main.size(); ++i) { for(int i = 0; i < deck.main.size(); ++i) {
code_pointer cit = dataManager.GetCodePointer(deck.main[i]->first); code_pointer cit = deck.main[i];
if((!allow_ocg && (cit->second.ot & 0x1)) || (!allow_ocg && (cit->second.ot & 0x2)))
return cit->first;
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
ccount[code]++; ccount[code]++;
dc = ccount[code]; dc = ccount[code];
auto it = list->find(code); auto it = list->find(code);
if(dc > 3 || (it != list->end() && dc > it->second)) if(dc > 3 || (it != list->end() && dc > it->second))
return false; return cit->first;
} }
for(int i = 0; i < deck.extra.size(); ++i) { for(int i = 0; i < deck.extra.size(); ++i) {
code_pointer cit = dataManager.GetCodePointer(deck.extra[i]->first); code_pointer cit = deck.extra[i];
if((!allow_ocg && (cit->second.ot & 0x1)) || (!allow_ocg && (cit->second.ot & 0x2)))
return cit->first;
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
ccount[code]++; ccount[code]++;
dc = ccount[code]; dc = ccount[code];
auto it = list->find(code); auto it = list->find(code);
if(dc > 3 || (it != list->end() && dc > it->second)) if(dc > 3 || (it != list->end() && dc > it->second))
return false; return cit->first;
} }
for(int i = 0; i < deck.side.size(); ++i) { for(int i = 0; i < deck.side.size(); ++i) {
code_pointer cit = dataManager.GetCodePointer(deck.side[i]->first); code_pointer cit = deck.side[i];
if((!allow_ocg && (cit->second.ot & 0x1)) || (!allow_ocg && (cit->second.ot & 0x2)))
return cit->first;
int code = cit->second.alias ? cit->second.alias : cit->first; int code = cit->second.alias ? cit->second.alias : cit->first;
ccount[code]++; ccount[code]++;
dc = ccount[code]; dc = ccount[code];
auto it = list->find(code); auto it = list->find(code);
if(dc > 3 || (it != list->end() && dc > it->second)) if(dc > 3 || (it != list->end() && dc > it->second))
return false; return cit->first;
} }
return true; return 0;
} }
void DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) { void DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) {
deck.main.clear(); deck.clear();
deck.extra.clear();
deck.side.clear();
int code; int code;
CardData cd; CardData cd;
for(int i = 0; i < mainc; ++i) { for(int i = 0; i < mainc; ++i) {
...@@ -120,7 +141,29 @@ void DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) { ...@@ -120,7 +141,29 @@ void DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) {
deck.side.push_back(dataManager.GetCodePointer(code)); deck.side.push_back(dataManager.GetCodePointer(code));
} }
} }
bool DeckManager::LoadSide(Deck& deck, int* dbuf, int mainc, int sidec) {
std::unordered_map<int, int> pcount;
std::unordered_map<int, int> ncount;
for(int i = 0; i < deck.main.size(); ++i)
pcount[deck.main[i]->first]++;
for(int i = 0; i < deck.extra.size(); ++i)
pcount[deck.extra[i]->first]++;
for(int i = 0; i < deck.side.size(); ++i)
pcount[deck.side[i]->first]++;
Deck ndeck;
LoadDeck(ndeck, dbuf, mainc, sidec);
for(int i = 0; i < ndeck.main.size(); ++i)
ncount[ndeck.main[i]->first]++;
for(int i = 0; i < ndeck.extra.size(); ++i)
ncount[ndeck.extra[i]->first]++;
for(int i = 0; i < ndeck.side.size(); ++i)
ncount[ndeck.side[i]->first]++;
for(auto cdit = ncount.begin(); cdit != ncount.end(); ++cdit)
if(cdit->second != pcount[cdit->first])
return false;
deck = ndeck;
return true;
}
bool DeckManager::LoadDeck(const wchar_t* file) { bool DeckManager::LoadDeck(const wchar_t* file) {
int sp = 0, ct = 0, mainc = 0, sidec = 0, code; int sp = 0, ct = 0, mainc = 0, sidec = 0, code;
wchar_t deck[64]; wchar_t deck[64];
...@@ -158,7 +201,7 @@ bool DeckManager::LoadDeck(const wchar_t* file) { ...@@ -158,7 +201,7 @@ bool DeckManager::LoadDeck(const wchar_t* file) {
else mainc++; else mainc++;
} }
fclose(fp); fclose(fp);
LoadDeck(deckhost, cardlist, mainc, sidec); LoadDeck(current_deck, cardlist, mainc, sidec);
return true; return true;
} }
void DeckManager::SaveDeck(Deck& deck, const wchar_t* name) { void DeckManager::SaveDeck(Deck& deck, const wchar_t* name) {
......
...@@ -17,17 +17,29 @@ struct Deck { ...@@ -17,17 +17,29 @@ struct Deck {
std::vector<code_pointer> main; std::vector<code_pointer> main;
std::vector<code_pointer> extra; std::vector<code_pointer> extra;
std::vector<code_pointer> side; std::vector<code_pointer> side;
Deck() {}
Deck(const Deck& ndeck) {
main = ndeck.main;
extra = ndeck.extra;
side = ndeck.side;
}
void clear() {
main.clear();
extra.clear();
side.clear();
}
}; };
class DeckManager { class DeckManager {
public: public:
Deck deckhost; Deck current_deck;
Deck deckclient;
std::vector<LFList> _lfList; std::vector<LFList> _lfList;
void LoadLFList(); void LoadLFList();
bool CheckLFList(Deck& deck, int lfindex); wchar_t* GetLFListName(int lfhash);
int CheckLFList(Deck& deck, int lfhash, bool allow_ocg, bool allow_tcg);
void LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec); void LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
bool LoadDeck(const wchar_t* file); bool LoadDeck(const wchar_t* file);
void SaveDeck(Deck& deck, const wchar_t* name); void SaveDeck(Deck& deck, const wchar_t* name);
}; };
......
...@@ -614,21 +614,21 @@ void Game::DrawDeckBd() { ...@@ -614,21 +614,21 @@ void Game::DrawDeckBd() {
driver->draw2DRectangleOutline(recti(309, 136, 410, 157)); driver->draw2DRectangleOutline(recti(309, 136, 410, 157));
textFont->draw(dataManager.GetSysString(1330), recti(314, 136, 409, 156), 0xff000000, false, true); textFont->draw(dataManager.GetSysString(1330), recti(314, 136, 409, 156), 0xff000000, false, true);
textFont->draw(dataManager.GetSysString(1330), recti(315, 137, 410, 157), 0xffffffff, false, true); textFont->draw(dataManager.GetSysString(1330), recti(315, 137, 410, 157), 0xffffffff, false, true);
numFont->draw(dataManager.numStrings[deckManager.deckhost.main.size()], recti(379, 137, 439, 157), 0xff000000, false, true); numFont->draw(dataManager.numStrings[deckManager.current_deck.main.size()], recti(379, 137, 439, 157), 0xff000000, false, true);
numFont->draw(dataManager.numStrings[deckManager.deckhost.main.size()], recti(380, 138, 440, 158), 0xffffffff, false, true); numFont->draw(dataManager.numStrings[deckManager.current_deck.main.size()], recti(380, 138, 440, 158), 0xffffffff, false, true);
driver->draw2DRectangle(recti(310, 160, 797, 436), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(recti(310, 160, 797, 436), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(recti(309, 159, 797, 436)); driver->draw2DRectangleOutline(recti(309, 159, 797, 436));
int lx; int lx;
float dx; float dx;
if(deckManager.deckhost.main.size() <= 40) { if(deckManager.current_deck.main.size() <= 40) {
dx = 436.0f / 9; dx = 436.0f / 9;
lx = 10; lx = 10;
} else { } else {
lx = (deckManager.deckhost.main.size() - 41) / 4 + 11; lx = (deckManager.current_deck.main.size() - 41) / 4 + 11;
dx = 436.0f / (lx - 1); dx = 436.0f / (lx - 1);
} }
for(int i = 0; i < deckManager.deckhost.main.size(); ++i) { for(int i = 0; i < deckManager.current_deck.main.size(); ++i) {
DrawThumb(deckManager.deckhost.main[i]->first, position2di(314 + (i % lx) * dx, 164 + (i / lx) * 68), deckBuilder.filterList); DrawThumb(deckManager.current_deck.main[i]->first, position2di(314 + (i % lx) * dx, 164 + (i / lx) * 68), deckBuilder.filterList);
if(deckBuilder.hovered_pos == 1 && deckBuilder.hovered_seq == i) if(deckBuilder.hovered_pos == 1 && deckBuilder.hovered_seq == i)
driver->draw2DRectangleOutline(recti(313 + (i % lx) * dx, 163 + (i / lx) * 68, 359 + (i % lx) * dx, 228 + (i / lx) * 68)); driver->draw2DRectangleOutline(recti(313 + (i % lx) * dx, 163 + (i / lx) * 68, 359 + (i % lx) * dx, 228 + (i / lx) * 68));
} }
...@@ -637,15 +637,15 @@ void Game::DrawDeckBd() { ...@@ -637,15 +637,15 @@ void Game::DrawDeckBd() {
driver->draw2DRectangleOutline(recti(309, 439, 410, 460)); driver->draw2DRectangleOutline(recti(309, 439, 410, 460));
textFont->draw(dataManager.GetSysString(1331), recti(314, 439, 409, 459), 0xff000000, false, true); textFont->draw(dataManager.GetSysString(1331), recti(314, 439, 409, 459), 0xff000000, false, true);
textFont->draw(dataManager.GetSysString(1331), recti(315, 440, 410, 460), 0xffffffff, false, true); textFont->draw(dataManager.GetSysString(1331), recti(315, 440, 410, 460), 0xffffffff, false, true);
numFont->draw(dataManager.numStrings[deckManager.deckhost.extra.size()], recti(379, 440, 439, 460), 0xff000000, false, true); numFont->draw(dataManager.numStrings[deckManager.current_deck.extra.size()], recti(379, 440, 439, 460), 0xff000000, false, true);
numFont->draw(dataManager.numStrings[deckManager.deckhost.extra.size()], recti(380, 441, 440, 461), 0xffffffff, false, true); numFont->draw(dataManager.numStrings[deckManager.current_deck.extra.size()], recti(380, 441, 440, 461), 0xffffffff, false, true);
driver->draw2DRectangle(recti(310, 463, 797, 533), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(recti(310, 463, 797, 533), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(recti(309, 462, 797, 533)); driver->draw2DRectangleOutline(recti(309, 462, 797, 533));
if(deckManager.deckhost.extra.size() <= 10) if(deckManager.current_deck.extra.size() <= 10)
dx = 436.0f / 9; dx = 436.0f / 9;
else dx = 436.0f / (deckManager.deckhost.extra.size() - 1); else dx = 436.0f / (deckManager.current_deck.extra.size() - 1);
for(int i = 0; i < deckManager.deckhost.extra.size(); ++i) { for(int i = 0; i < deckManager.current_deck.extra.size(); ++i) {
DrawThumb(deckManager.deckhost.extra[i]->first, position2di(314 + i * dx, 466), deckBuilder.filterList); DrawThumb(deckManager.current_deck.extra[i]->first, position2di(314 + i * dx, 466), deckBuilder.filterList);
if(deckBuilder.hovered_pos == 2 && deckBuilder.hovered_seq == i) if(deckBuilder.hovered_pos == 2 && deckBuilder.hovered_seq == i)
driver->draw2DRectangleOutline(recti(313 + i * dx, 465, 359 + i * dx, 531)); driver->draw2DRectangleOutline(recti(313 + i * dx, 465, 359 + i * dx, 531));
} }
...@@ -654,15 +654,15 @@ void Game::DrawDeckBd() { ...@@ -654,15 +654,15 @@ void Game::DrawDeckBd() {
driver->draw2DRectangleOutline(recti(309, 536, 410, 557)); driver->draw2DRectangleOutline(recti(309, 536, 410, 557));
textFont->draw(dataManager.GetSysString(1332), recti(314, 536, 409, 556), 0xff000000, false, true); textFont->draw(dataManager.GetSysString(1332), recti(314, 536, 409, 556), 0xff000000, false, true);
textFont->draw(dataManager.GetSysString(1332), recti(315, 537, 410, 557), 0xffffffff, false, true); textFont->draw(dataManager.GetSysString(1332), recti(315, 537, 410, 557), 0xffffffff, false, true);
numFont->draw(dataManager.numStrings[deckManager.deckhost.side.size()], recti(379, 537, 439, 557), 0xff000000, false, true); numFont->draw(dataManager.numStrings[deckManager.current_deck.side.size()], recti(379, 537, 439, 557), 0xff000000, false, true);
numFont->draw(dataManager.numStrings[deckManager.deckhost.side.size()], recti(380, 538, 440, 558), 0xffffffff, false, true); numFont->draw(dataManager.numStrings[deckManager.current_deck.side.size()], recti(380, 538, 440, 558), 0xffffffff, false, true);
driver->draw2DRectangle(recti(310, 560, 797, 630), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000); driver->draw2DRectangle(recti(310, 560, 797, 630), 0x400000ff, 0x400000ff, 0x40000000, 0x40000000);
driver->draw2DRectangleOutline(recti(309, 559, 797, 630)); driver->draw2DRectangleOutline(recti(309, 559, 797, 630));
if(deckManager.deckhost.side.size() <= 10) if(deckManager.current_deck.side.size() <= 10)
dx = 436.0f / 9; dx = 436.0f / 9;
else dx = 436.0f / (deckManager.deckhost.side.size() - 1); else dx = 436.0f / (deckManager.current_deck.side.size() - 1);
for(int i = 0; i < deckManager.deckhost.side.size(); ++i) { for(int i = 0; i < deckManager.current_deck.side.size(); ++i) {
DrawThumb(deckManager.deckhost.side[i]->first, position2di(314 + i * dx, 564), deckBuilder.filterList); DrawThumb(deckManager.current_deck.side[i]->first, position2di(314 + i * dx, 564), deckBuilder.filterList);
if(deckBuilder.hovered_pos == 3 && deckBuilder.hovered_seq == i) if(deckBuilder.hovered_pos == 3 && deckBuilder.hovered_seq == i)
driver->draw2DRectangleOutline(recti(313 + i * dx, 563, 359 + i * dx, 629)); driver->draw2DRectangleOutline(recti(313 + i * dx, 563, 359 + i * dx, 629));
} }
......
This diff is collapsed.
...@@ -96,16 +96,16 @@ bool Game::Initialize() { ...@@ -96,16 +96,16 @@ bool Game::Initialize() {
wCreateHost = env->addWindow(rect<s32>(320, 100, 700, 520), false, dataManager.GetSysString(1224)); wCreateHost = env->addWindow(rect<s32>(320, 100, 700, 520), false, dataManager.GetSysString(1224));
wCreateHost->getCloseButton()->setVisible(false); wCreateHost->getCloseButton()->setVisible(false);
wCreateHost->setVisible(false); wCreateHost->setVisible(false);
env->addStaticText(dataManager.GetSysString(1225), rect<s32>(20, 30, 220, 50), false, false, wCreateHost); env->addStaticText(dataManager.GetSysString(1226), rect<s32>(20, 30, 220, 50), false, false, wCreateHost);
cbRule = env->addComboBox(rect<s32>(140, 25, 300, 50), wCreateHost); cbLFlist = env->addComboBox(rect<s32>(140, 25, 300, 50), wCreateHost);
for(int i = 0; i < deckManager._lfList.size(); ++i)
cbLFlist->addItem(deckManager._lfList[i].listName, deckManager._lfList[i].hash);
env->addStaticText(dataManager.GetSysString(1225), rect<s32>(20, 60, 220, 80), false, false, wCreateHost);
cbRule = env->addComboBox(rect<s32>(140, 55, 300, 80), wCreateHost);
cbRule->addItem(dataManager.GetSysString(1240)); cbRule->addItem(dataManager.GetSysString(1240));
cbRule->addItem(dataManager.GetSysString(1241)); cbRule->addItem(dataManager.GetSysString(1241));
cbRule->addItem(dataManager.GetSysString(1242)); cbRule->addItem(dataManager.GetSysString(1242));
cbRule->addItem(dataManager.GetSysString(1243)); cbRule->addItem(dataManager.GetSysString(1243));
env->addStaticText(dataManager.GetSysString(1226), rect<s32>(20, 60, 220, 80), false, false, wCreateHost);
cbLFlist = env->addComboBox(rect<s32>(140, 55, 300, 80), wCreateHost);
for(int i = 0; i < deckManager._lfList.size(); ++i)
cbLFlist->addItem(deckManager._lfList[i].listName, deckManager._lfList[i].hash);
env->addStaticText(dataManager.GetSysString(1227), rect<s32>(20, 90, 220, 110), false, false, wCreateHost); 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 = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost);
cbMatchMode->addItem(dataManager.GetSysString(1244)); cbMatchMode->addItem(dataManager.GetSysString(1244));
......
#include "config.h" #include "config.h"
#include "game.h" #include "game.h"
#include <event2/thread.h>
int main() { int main() {
#ifdef _WIN32 #ifdef _WIN32
...@@ -7,7 +8,9 @@ int main() { ...@@ -7,7 +8,9 @@ int main() {
WSADATA wsaData; WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2); wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData); WSAStartup(wVersionRequested, &wsaData);
evthread_use_windows_threads();
#else #else
evthread_use_pthreads();
#endif //_WIN32 #endif //_WIN32
ygo::Game _game; ygo::Game _game;
ygo::mainGame = &_game; ygo::mainGame = &_game;
......
#include "match_duel.h"
#include "netserver.h"
namespace ygo {
void MatchDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
}
void MatchDuel::LeaveGame(DuelPlayer* dp) {
}
void MatchDuel::ToDuelist(DuelPlayer* dp) {
}
void MatchDuel::ToObserver(DuelPlayer* dp) {
}
void MatchDuel::PlayerReady(DuelPlayer* dp) {
}
void MatchDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
}
void MatchDuel::UpdateDeck(DuelPlayer* dp, void* pdata) {
}
void MatchDuel::StartDuel(DuelPlayer* dp) {
}
void MatchDuel::Process() {
}
void MatchDuel::EndDuel() {
}
}
#ifndef MATCH_DUEL_H
#define MATCH_DUEL_H
#include "config.h"
#include "network.h"
namespace ygo {
class MatchDuel: public DuelMode {
public:
virtual void JoinGame(DuelPlayer* dp, void* pdata, bool is_creater);
virtual void LeaveGame(DuelPlayer* dp);
virtual void ToDuelist(DuelPlayer* dp);
virtual void ToObserver(DuelPlayer* dp);
virtual void PlayerReady(DuelPlayer* dp);
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos);
virtual void UpdateDeck(DuelPlayer* dp, void* pdata);
virtual void StartDuel(DuelPlayer* dp);
virtual void Process();
virtual void EndDuel();
};
}
#endif //MATCH_DUEL_H
...@@ -28,7 +28,17 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -28,7 +28,17 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_JOIN_HOST: { case BUTTON_JOIN_HOST: {
if(DuelClient::StartClient(0xc0a80264, 7911, false)) { char ip[20];
int i = 0;
wchar_t* pstr = (wchar_t *)mainGame->ebJoinIP->getText();
while(*pstr && i < 16)
ip[i++] = *pstr++;
ip[i] = 0;
unsigned int remote_addr = htonl(inet_addr(ip));
unsigned int remote_port = _wtoi(mainGame->ebJoinPort->getText());
BufferIO::CopyWStr(mainGame->ebJoinIP->getText(), mainGame->gameConf.lastip, 20);
BufferIO::CopyWStr(mainGame->ebJoinPort->getText(), mainGame->gameConf.lastport, 20);
if(DuelClient::StartClient(remote_addr, remote_port, false)) {
mainGame->btnCreateHost->setEnabled(false); mainGame->btnCreateHost->setEnabled(false);
mainGame->btnJoinHost->setEnabled(false); mainGame->btnJoinHost->setEnabled(false);
mainGame->btnJoinCancel->setEnabled(false); mainGame->btnJoinCancel->setEnabled(false);
...@@ -46,9 +56,10 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -46,9 +56,10 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_HOST_CONFIRM: { case BUTTON_HOST_CONFIRM: {
BufferIO::CopyWStr(mainGame->ebServerName->getText(), mainGame->gameConf.gamename, 20);
if(!NetServer::StartServer(mainGame->gameConf.serverport)) if(!NetServer::StartServer(mainGame->gameConf.serverport))
break; break;
if(!DuelClient::StartClient(0xc0a80264, mainGame->gameConf.serverport)) { if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) {
NetServer::StopServer(); NetServer::StopServer();
break; break;
} }
...@@ -64,23 +75,34 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -64,23 +75,34 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break; break;
} }
case BUTTON_HS_DUELIST: { case BUTTON_HS_DUELIST: {
DuelClient::SendPacketToServer(CTOS_HS_TODUELIST);
break; break;
} }
case BUTTON_HS_OBSERVER: { case BUTTON_HS_OBSERVER: {
DuelClient::SendPacketToServer(CTOS_HS_TOOBSERVER);
break; break;
} }
case BUTTON_HS_KICK: { case BUTTON_HS_KICK: {
int id = caller - static_cast<IGUIElement*>(mainGame->btnHostSingleKick[0]); int id = caller - static_cast<IGUIElement*>(mainGame->btnHostSingleKick[0]);
CTOS_Kick csk;
if(id == 0) if(id == 0)
DuelClient::SendPacketToServer(CTOS_HS_KICK1); csk.pos = 0;
else else csk.pos = 1;
DuelClient::SendPacketToServer(CTOS_HS_KICK2); DuelClient::SendPacketToServer(CTOS_HS_KICK, csk);
break; break;
} }
case BUTTON_HS_START: { case BUTTON_HS_START: {
if(!mainGame->chkHostSingleReady[0]->isChecked()
|| !!mainGame->chkHostSingleReady[0]->isChecked())
break;
break; break;
} }
case BUTTON_HS_CANCEL: { case BUTTON_HS_CANCEL: {
DuelClient::StopClient();
mainGame->btnCreateHost->setEnabled(true);
mainGame->btnJoinHost->setEnabled(true);
mainGame->btnJoinCancel->setEnabled(true);
mainGame->HideElement(mainGame->wHostSingle, false, mainGame->wLanWindow);
break; break;
} }
case BUTTON_DECK_EDIT: { case BUTTON_DECK_EDIT: {
...@@ -199,7 +221,28 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) { ...@@ -199,7 +221,28 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(!caller->isEnabled()) if(!caller->isEnabled())
break; break;
mainGame->env->setFocus(mainGame->wHostSingle); mainGame->env->setFocus(mainGame->wHostSingle);
DuelClient::SendPacketToServer(CTOS_HS_READY); if(static_cast<irr::gui::IGUICheckBox*>(caller)->isChecked()) {
if(mainGame->cbDeckSelect->getSelected() == -1 ||
!deckManager.LoadDeck(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()))) {
static_cast<irr::gui::IGUICheckBox*>(caller)->setChecked(false);
break;
}
BufferIO::CopyWStr(mainGame->cbDeckSelect->getItem(mainGame->cbDeckSelect->getSelected()),
mainGame->gameConf.lastdeck, 20);
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);
DuelClient::SendPacketToServer(CTOS_HS_READY);
} else
DuelClient::SendPacketToServer(CTOS_HS_NOTREADY);
break; break;
} }
} }
......
#include "netserver.h" #include "netserver.h"
#include "single_duel.h" #include "single_duel.h"
#include "match_duel.h"
namespace ygo { namespace ygo {
std::unordered_map<bufferevent*, DuelPlayer> NetServer::users; std::unordered_map<bufferevent*, DuelPlayer> NetServer::users;
...@@ -17,11 +16,6 @@ bool NetServer::StartServer(unsigned short port) { ...@@ -17,11 +16,6 @@ bool NetServer::StartServer(unsigned short port) {
net_evbase = event_base_new(); net_evbase = event_base_new();
if(!net_evbase) if(!net_evbase)
return false; return false;
#ifdef _WIN32
evthread_use_windows_threads();
#else
evthread_use_pthreads();
#endif
sockaddr_in sin; sockaddr_in sin;
memset(&sin, 0, sizeof(sin)); memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
...@@ -29,8 +23,11 @@ bool NetServer::StartServer(unsigned short port) { ...@@ -29,8 +23,11 @@ bool NetServer::StartServer(unsigned short port) {
sin.sin_port = htons(port); sin.sin_port = htons(port);
listener = evconnlistener_new_bind(net_evbase, ServerAccept, NULL, listener = evconnlistener_new_bind(net_evbase, ServerAccept, NULL,
LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1, (sockaddr*)&sin, sizeof(sin)); LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1, (sockaddr*)&sin, sizeof(sin));
if(!listener) if(!listener) {
event_base_free(net_evbase);
net_evbase = 0;
return false; return false;
}
evconnlistener_set_error_cb(listener, ServerAcceptError); evconnlistener_set_error_cb(listener, ServerAcceptError);
Thread::NewThread(ServerThread, net_evbase); Thread::NewThread(ServerThread, net_evbase);
return true; return true;
...@@ -84,10 +81,14 @@ int NetServer::ServerThread(void* param) { ...@@ -84,10 +81,14 @@ int NetServer::ServerThread(void* param) {
bufferevent_disable(bit->first, EV_READ); bufferevent_disable(bit->first, EV_READ);
bufferevent_free(bit->first); bufferevent_free(bit->first);
} }
users.clear();
evconnlistener_free(listener);
event_base_free(net_evbase); event_base_free(net_evbase);
listener = 0;
net_evbase = 0; net_evbase = 0;
if(duel_mode) if(duel_mode)
delete duel_mode; delete duel_mode;
duel_mode = 0;
return 0; return 0;
} }
void NetServer::DisconnectPlayer(DuelPlayer* dp) { void NetServer::DisconnectPlayer(DuelPlayer* dp) {
...@@ -106,26 +107,30 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -106,26 +107,30 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
switch(pktType) { switch(pktType) {
case CTOS_RESPONSE: case CTOS_RESPONSE:
break; break;
case CTOS_CHANGEDECK: case CTOS_UPDATE_DECK: {
if(!dp->game || !duel_mode)
return;
duel_mode->UpdateDeck(dp, pdata);
break; break;
}
case CTOS_PLAYER_INFO: { case CTOS_PLAYER_INFO: {
CTOS_PlayerInfo* pkt = (CTOS_PlayerInfo*)pdata; CTOS_PlayerInfo* pkt = (CTOS_PlayerInfo*)pdata;
BufferIO::CopyWStr(pkt->name, dp->name, 20); BufferIO::CopyWStr(pkt->name, dp->name, 20);
break; break;
} }
case CTOS_CREATE_GAME: { case CTOS_CREATE_GAME: {
if(dp->game || duel_mode || len < sizeof(CTOS_CreateGame)) if(dp->game || duel_mode)
return; return;
CTOS_CreateGame* pkt = (CTOS_CreateGame*)pdata; CTOS_CreateGame* pkt = (CTOS_CreateGame*)pdata;
if(pkt->info.mode == MODE_SINGLE) { if(pkt->info.mode == MODE_SINGLE) {
duel_mode = new SingleDuel; duel_mode = new SingleDuel;
} else { } else if(pkt->info.mode == MODE_SINGLE) {
duel_mode = new MatchDuel; duel_mode = new SingleDuel;
} }
if(pkt->info.rule > 3) if(pkt->info.rule > 3)
pkt->info.rule = 0; pkt->info.rule = 0;
if(pkt->info.mode > 1) if(pkt->info.mode > 1)
pkt->info.rule = 0; pkt->info.mode = 0;
unsigned int hash = 0; unsigned int hash = 0;
for(auto lfit = deckManager._lfList.begin(); lfit != deckManager._lfList.end(); ++lfit) { for(auto lfit = deckManager._lfList.begin(); lfit != deckManager._lfList.end(); ++lfit) {
if(pkt->info.lflist == lfit->hash) { if(pkt->info.lflist == lfit->hash) {
...@@ -147,7 +152,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -147,7 +152,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode->JoinGame(dp, pdata, false); duel_mode->JoinGame(dp, pdata, false);
break; break;
} }
case CTOS_EXIT_GAME: { case CTOS_LEAVE_GAME: {
if(!duel_mode) if(!duel_mode)
break; break;
duel_mode->LeaveGame(dp); duel_mode->LeaveGame(dp);
...@@ -165,17 +170,18 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) { ...@@ -165,17 +170,18 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode->ToObserver(dp); duel_mode->ToObserver(dp);
break; break;
} }
case CTOS_HS_READY: { case CTOS_HS_READY:
case CTOS_HS_NOTREADY: {
if(!duel_mode || duel_mode->pduel) if(!duel_mode || duel_mode->pduel)
break; break;
duel_mode->PlayerReady(dp); duel_mode->PlayerReady(dp, CTOS_HS_NOTREADY - pktType);
break; break;
} }
case CTOS_HS_KICK1: case CTOS_HS_KICK: {
case CTOS_HS_KICK2: {
if(!duel_mode || duel_mode->pduel) if(!duel_mode || duel_mode->pduel)
break; break;
duel_mode->PlayerKick(dp, pktType - CTOS_HS_KICK1); CTOS_Kick* pkt = (CTOS_Kick*)pdata;
duel_mode->PlayerKick(dp, pkt->pos);
break; break;
} }
case CTOS_HS_START: { case CTOS_HS_START: {
......
...@@ -12,16 +12,16 @@ ...@@ -12,16 +12,16 @@
namespace ygo { namespace ygo {
struct HostInfo { struct HostInfo {
unsigned int lflist;
unsigned char rule; unsigned char rule;
unsigned char mode; unsigned char mode;
unsigned int lflist; bool enable_priority;
bool no_check_deck; bool no_check_deck;
bool no_shuffle_deck; bool no_shuffle_deck;
unsigned int start_lp; unsigned int start_lp;
unsigned char start_hand; unsigned char start_hand;
unsigned char draw_count; unsigned char draw_count;
}; };
struct HostPacket { struct HostPacket {
unsigned short identifier; unsigned short identifier;
unsigned short version; unsigned short version;
...@@ -29,15 +29,9 @@ struct HostPacket { ...@@ -29,15 +29,9 @@ struct HostPacket {
unsigned short port; unsigned short port;
HostInfo host; HostInfo host;
}; };
struct HostRequest { struct HostRequest {
unsigned short identifier; unsigned short identifier;
}; };
struct CTOS_Response {
};
struct CTOS_ChangeDeck {
};
struct CTOS_PlayerInfo { struct CTOS_PlayerInfo {
unsigned short name[20]; unsigned short name[20];
}; };
...@@ -50,8 +44,11 @@ struct CTOS_JoinGame { ...@@ -50,8 +44,11 @@ struct CTOS_JoinGame {
unsigned int gameid; unsigned int gameid;
unsigned short pass[20]; unsigned short pass[20];
}; };
struct STOC_DeckError { struct CTOS_Kick {
unsigned char reason; unsigned char pos;
};
struct STOC_ErrorMsg {
unsigned char msg;
unsigned int code; unsigned int code;
}; };
struct STOC_CreateGame { struct STOC_CreateGame {
...@@ -59,17 +56,13 @@ struct STOC_CreateGame { ...@@ -59,17 +56,13 @@ struct STOC_CreateGame {
}; };
struct STOC_JoinGame { struct STOC_JoinGame {
HostInfo info; HostInfo info;
};
struct STOC_TypeChange {
unsigned char type; unsigned char type;
}; };
struct STOC_ExitGame { struct STOC_ExitGame {
unsigned pos; unsigned pos;
}; };
struct STOC_JoinFail {
//0 - common error
//1 - password incorrect
//2 - host denied
unsigned int reason;
};
struct STOC_HS_PlayerEnter { struct STOC_HS_PlayerEnter {
unsigned short name[20]; unsigned short name[20];
unsigned char pos; unsigned char pos;
...@@ -113,7 +106,7 @@ public: ...@@ -113,7 +106,7 @@ public:
virtual void LeaveGame(DuelPlayer* dp) = 0; virtual void LeaveGame(DuelPlayer* dp) = 0;
virtual void ToDuelist(DuelPlayer* dp) = 0; virtual void ToDuelist(DuelPlayer* dp) = 0;
virtual void ToObserver(DuelPlayer* dp) = 0; virtual void ToObserver(DuelPlayer* dp) = 0;
virtual void PlayerReady(DuelPlayer* dp) = 0; virtual void PlayerReady(DuelPlayer* dp, bool is_ready) = 0;
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) = 0; virtual void PlayerKick(DuelPlayer* dp, unsigned char pos) = 0;
virtual void UpdateDeck(DuelPlayer* dp, void* pdata) = 0; virtual void UpdateDeck(DuelPlayer* dp, void* pdata) = 0;
virtual void StartDuel(DuelPlayer* dp) = 0; virtual void StartDuel(DuelPlayer* dp) = 0;
...@@ -146,24 +139,24 @@ public: ...@@ -146,24 +139,24 @@ public:
#define NETPLAYER_TYPE_OBSERVER 7 #define NETPLAYER_TYPE_OBSERVER 7
#define CTOS_RESPONSE 0x1 #define CTOS_RESPONSE 0x1
#define CTOS_CHANGEDECK 0x2 #define CTOS_UPDATE_DECK 0x2
#define CTOS_PLAYER_INFO 0x10 #define CTOS_PLAYER_INFO 0x10
#define CTOS_CREATE_GAME 0x11 #define CTOS_CREATE_GAME 0x11
#define CTOS_JOIN_GAME 0x12 #define CTOS_JOIN_GAME 0x12
#define CTOS_EXIT_GAME 0x13 #define CTOS_LEAVE_GAME 0x13
#define CTOS_HS_TODUELIST 0x20 #define CTOS_HS_TODUELIST 0x20
#define CTOS_HS_TOOBSERVER 0x21 #define CTOS_HS_TOOBSERVER 0x21
#define CTOS_HS_READY 0x22 #define CTOS_HS_READY 0x22
#define CTOS_HS_KICK1 0x23 #define CTOS_HS_NOTREADY 0x23
#define CTOS_HS_KICK2 0x24 #define CTOS_HS_KICK 0x24
#define CTOS_HS_START 0x25 #define CTOS_HS_START 0x25
#define STOC_GAME_MSG 0x1 #define STOC_GAME_MSG 0x1
#define STOC_DECK_ERROR 0x2 #define STOC_ERROR_MSG 0x2
#define STOC_CREATE_GAME 0x11 #define STOC_CREATE_GAME 0x11
#define STOC_JOIN_GAME 0x12 #define STOC_JOIN_GAME 0x12
#define STOC_EXIT_GAME 0x13 #define STOC_TYPE_CHANGE 0x13
#define STOC_JOIN_FAIL 0x14 #define STOC_LEAVE_GAME 0x14
#define STOC_GAME_START 0x15 #define STOC_GAME_START 0x15
#define STOC_HS_PLAYER_ENTER 0x20 #define STOC_HS_PLAYER_ENTER 0x20
#define STOC_HS_PLAYER_CHANGE 0x21 #define STOC_HS_PLAYER_CHANGE 0x21
...@@ -174,6 +167,9 @@ public: ...@@ -174,6 +167,9 @@ public:
#define PLAYERCHANGE_LEAVE 0x3 #define PLAYERCHANGE_LEAVE 0x3
#define PLAYERCHANGE_OBSERVE 0x4 #define PLAYERCHANGE_OBSERVE 0x4
#define ERRMSG_JOINERROR 0x1
#define ERRMSG_DECKERROR 0x2
#define MODE_SINGLE 0x0 #define MODE_SINGLE 0x0
#define MODE_MATCH 0x1 #define MODE_MATCH 0x1
#endif //NETWORK_H #endif //NETWORK_H
...@@ -6,19 +6,20 @@ namespace ygo { ...@@ -6,19 +6,20 @@ namespace ygo {
void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
if(!is_creater) { if(!is_creater) {
if(dp->game && dp->type != 0xff) { if(dp->game && dp->type != 0xff) {
STOC_JoinFail scjf; STOC_ErrorMsg scem;
scjf.reason = 0; scem.msg = ERRMSG_JOINERROR;
NetServer::SendPacketToPlayer(dp, STOC_JOIN_FAIL, scjf); scem.code = 0;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return; return;
} }
CTOS_JoinGame* pkt = (CTOS_JoinGame*)pdata; CTOS_JoinGame* pkt = (CTOS_JoinGame*)pdata;
wchar_t jpass[20]; wchar_t jpass[20];
for(int i = 0; i < 20; ++i) jpass[i] = pkt->pass[i]; BufferIO::CopyWStr(pkt->pass, jpass, 20);
jpass[20] = 0;
if(wcscmp(jpass, pass)) { if(wcscmp(jpass, pass)) {
STOC_JoinFail scjf; STOC_ErrorMsg scem;
scjf.reason = 1; scem.msg = ERRMSG_JOINERROR;
NetServer::SendPacketToPlayer(dp, STOC_JOIN_FAIL, scjf); scem.code = 1;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return; return;
} }
} }
...@@ -27,7 +28,8 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -27,7 +28,8 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
host_player = dp; host_player = dp;
STOC_JoinGame scjg; STOC_JoinGame scjg;
scjg.info = host_info; scjg.info = host_info;
scjg.type = (host_player == dp) ? 0x10 : 0; STOC_TypeChange sctc;
sctc.type = (host_player == dp) ? 0x10 : 0;
if(!players[0] || !players[1]) { if(!players[0] || !players[1]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20); BufferIO::CopyWStr(dp->name, scpe.name, 20);
...@@ -44,16 +46,16 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -44,16 +46,16 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
if(!players[0]) { if(!players[0]) {
players[0] = dp; players[0] = dp;
dp->type = NETPLAYER_TYPE_PLAYER1; dp->type = NETPLAYER_TYPE_PLAYER1;
scjg.type |= NETPLAYER_TYPE_PLAYER1; sctc.type |= NETPLAYER_TYPE_PLAYER1;
} else { } else {
players[1] = dp; players[1] = dp;
dp->type = NETPLAYER_TYPE_PLAYER2; dp->type = NETPLAYER_TYPE_PLAYER2;
scjg.type |= NETPLAYER_TYPE_PLAYER2; sctc.type |= NETPLAYER_TYPE_PLAYER2;
} }
} else { } else {
observers.insert(dp); observers.insert(dp);
dp->type = NETPLAYER_TYPE_OBSERVER; dp->type = NETPLAYER_TYPE_OBSERVER;
scjg.type |= NETPLAYER_TYPE_OBSERVER; sctc.type |= NETPLAYER_TYPE_OBSERVER;
STOC_HS_WatchChange scwc; STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size(); scwc.watch_count = observers.size();
if(players[0]) if(players[0])
...@@ -64,6 +66,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -64,6 +66,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc); NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
} }
NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg); NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg);
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
if(players[0]) { if(players[0]) {
STOC_HS_PlayerEnter scpe; STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[0]->name, scpe.name, 20); BufferIO::CopyWStr(players[0]->name, scpe.name, 20);
...@@ -93,7 +96,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) { ...@@ -93,7 +96,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
} }
} }
void SingleDuel::LeaveGame(DuelPlayer* dp) { void SingleDuel::LeaveGame(DuelPlayer* dp) {
if(dp == host_player){ if(dp == host_player) {
NetServer::StopServer(); NetServer::StopServer();
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) { } else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
if(!pduel) { if(!pduel) {
...@@ -113,26 +116,86 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) { ...@@ -113,26 +116,86 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
if(pduel) if(pduel)
NetServer::StopServer(); NetServer::StopServer();
else else {
ready[dp->type] = false;
NetServer::DisconnectPlayer(dp); NetServer::DisconnectPlayer(dp);
}
} }
} }
void SingleDuel::ToDuelist(DuelPlayer* dp) { void SingleDuel::ToDuelist(DuelPlayer* dp) {
if(dp->type != NETPLAYER_TYPE_OBSERVER) if(dp->type != NETPLAYER_TYPE_OBSERVER)
return; return;
if(players[0] && players[1])
return;
observers.erase(dp);
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
if(!players[0]) {
players[0] = dp;
dp->type = NETPLAYER_TYPE_PLAYER1;
scpe.pos = 0;
} else {
players[1] = dp;
dp->type = NETPLAYER_TYPE_PLAYER2;
scpe.pos = 1;
}
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
NetServer::SendPacketToPlayer(players[0], STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(players[0], STOC_HS_WATCH_CHANGE, scwc);
if(players[1]) {
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(players[1], STOC_HS_WATCH_CHANGE, scwc);
}
for(auto pit = observers.begin(); pit != observers.end(); ++pit) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_ENTER, scpe);
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
} }
void SingleDuel::ToObserver(DuelPlayer* dp) { void SingleDuel::ToObserver(DuelPlayer* dp) {
if(dp->type > 1) if(dp->type > 1)
return; return;
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_OBSERVE; scpc.status = (dp->type << 4) | PLAYERCHANGE_OBSERVE;
if(players[0])
NetServer::SendPacketToPlayer(players[0], STOC_HS_PLAYER_CHANGE, scpc);
if(players[1])
NetServer::SendPacketToPlayer(players[1], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
players[dp->type] = 0;
dp->type = NETPLAYER_TYPE_OBSERVER;
observers.insert(dp);
STOC_TypeChange sctc;
sctc.type = (dp == host_player ? 0x10 : 0) | dp->type;
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
} }
void SingleDuel::PlayerReady(DuelPlayer* dp) { void SingleDuel::PlayerReady(DuelPlayer* dp, bool is_ready) {
if(dp->type > 1) if(dp->type > 1)
return; return;
ready[dp->type] = !ready[dp->type] ; if(ready[dp->type] == is_ready)
return;
if(is_ready) {
bool allow_ocg = host_info.rule == 0 || host_info.rule == 2;
bool allow_tcg = host_info.rule == 1 || host_info.rule == 2;
int res = deckManager.CheckLFList(pdeck[dp->type], host_info.lflist, allow_ocg, allow_tcg);
if(res) {
STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | PLAYERCHANGE_NOTREADY;
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_CHANGE, scpc);
STOC_ErrorMsg scem;
scem.msg = ERRMSG_DECKERROR;
scem.code = res;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return;
}
}
ready[dp->type] = is_ready;
STOC_HS_PlayerChange scpc; STOC_HS_PlayerChange scpc;
scpc.status = (dp->type << 4) | (ready[dp->type] ? PLAYERCHANGE_READY : PLAYERCHANGE_NOTREADY); scpc.status = (dp->type << 4) | (is_ready ? PLAYERCHANGE_READY : PLAYERCHANGE_NOTREADY);
if(players[1 - dp->type]) if(players[1 - dp->type])
NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc); NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit) for(auto pit = observers.begin(); pit != observers.end(); ++pit)
...@@ -144,8 +207,16 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) { ...@@ -144,8 +207,16 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
LeaveGame(players[pos]); LeaveGame(players[pos]);
} }
void SingleDuel::UpdateDeck(DuelPlayer* dp, void* pdata) { void SingleDuel::UpdateDeck(DuelPlayer* dp, void* pdata) {
if(dp->type > 1)
return;
char* deckbuf = (char*)pdata;
int mainc = BufferIO::ReadInt32(deckbuf);
int sidec = BufferIO::ReadInt32(deckbuf);
deckManager.LoadDeck(pdeck[dp->type], (int*)deckbuf, mainc, sidec);
} }
void SingleDuel::StartDuel(DuelPlayer* dp) { void SingleDuel::StartDuel(DuelPlayer* dp) {
if(dp != host_player)
return;
} }
void SingleDuel::Process() { void SingleDuel::Process() {
} }
......
...@@ -12,7 +12,7 @@ public: ...@@ -12,7 +12,7 @@ public:
virtual void LeaveGame(DuelPlayer* dp); virtual void LeaveGame(DuelPlayer* dp);
virtual void ToDuelist(DuelPlayer* dp); virtual void ToDuelist(DuelPlayer* dp);
virtual void ToObserver(DuelPlayer* dp); virtual void ToObserver(DuelPlayer* dp);
virtual void PlayerReady(DuelPlayer* dp); virtual void PlayerReady(DuelPlayer* dp, bool ready);
virtual void PlayerKick(DuelPlayer* dp, unsigned char pos); virtual void PlayerKick(DuelPlayer* dp, unsigned char pos);
virtual void UpdateDeck(DuelPlayer* dp, void* pdata); virtual void UpdateDeck(DuelPlayer* dp, void* pdata);
virtual void StartDuel(DuelPlayer* dp); virtual void StartDuel(DuelPlayer* dp);
......
...@@ -310,8 +310,7 @@ int32 card::get_attack(uint8 swap) { ...@@ -310,8 +310,7 @@ int32 card::get_attack(uint8 swap) {
break; break;
case EFFECT_SET_ATTACK: case EFFECT_SET_ATTACK:
base = eset[i]->get_value(this); base = eset[i]->get_value(this);
if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) up = 0;
up = 0;
break; break;
case EFFECT_SET_ATTACK_FINAL: case EFFECT_SET_ATTACK_FINAL:
if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) { if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) {
...@@ -396,8 +395,7 @@ int32 card::get_defence(uint8 swap) { ...@@ -396,8 +395,7 @@ int32 card::get_defence(uint8 swap) {
break; break;
case EFFECT_SET_DEFENCE: case EFFECT_SET_DEFENCE:
base = eset[i]->get_value(this); base = eset[i]->get_value(this);
if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) up = 0;
up = 0;
break; break;
case EFFECT_SET_DEFENCE_FINAL: case EFFECT_SET_DEFENCE_FINAL:
if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) { if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) {
......
...@@ -218,6 +218,7 @@ struct processor { ...@@ -218,6 +218,7 @@ struct processor {
card* attack_target; card* attack_target;
card* sub_attack_target; card* sub_attack_target;
card* limit_tuner; card* limit_tuner;
uint8 attack_cancelable;
int32 battle_damage[2]; int32 battle_damage[2];
int32 summon_count[2]; int32 summon_count[2];
int32 spe_effect[2]; int32 spe_effect[2];
......
...@@ -496,15 +496,13 @@ int32 field::pay_lp_cost(uint32 step, uint8 playerid, uint32 cost) { ...@@ -496,15 +496,13 @@ int32 field::pay_lp_cost(uint32 step, uint8 playerid, uint32 cost) {
e.reason_player = playerid; e.reason_player = playerid;
core.select_options.clear(); core.select_options.clear();
core.select_effects.clear(); core.select_effects.clear();
if(val < player[playerid].lp) { if(val <= player[playerid].lp) {
core.select_options.push_back(11); core.select_options.push_back(11);
core.select_effects.push_back(0); core.select_effects.push_back(0);
} }
pair<effect_container::iterator, effect_container::iterator> pr; auto pr = effects.continuous_effect.equal_range(EFFECT_LPCOST_REPLACE);
pr = effects.continuous_effect.equal_range(EFFECT_LPCOST_REPLACE);
effect* peffect;
for (; pr.first != pr.second; ++pr.first) { for (; pr.first != pr.second; ++pr.first) {
peffect = pr.first->second; effect* peffect = pr.first->second;
if(peffect->is_activateable(peffect->get_handler_player(), e)) { if(peffect->is_activateable(peffect->get_handler_player(), e)) {
core.select_options.push_back(peffect->description); core.select_options.push_back(peffect->description);
core.select_effects.push_back(peffect); core.select_effects.push_back(peffect);
...@@ -2561,6 +2559,13 @@ int32 field::move_to_field(uint16 step, card * target, uint32 enable, uint32 ret ...@@ -2561,6 +2559,13 @@ int32 field::move_to_field(uint16 step, card * target, uint32 enable, uint32 ret
if(target->current.location & LOCATION_ONFIELD) if(target->current.location & LOCATION_ONFIELD)
target->reset(RESET_LEAVE, RESET_EVENT); target->reset(RESET_LEAVE, RESET_EVENT);
} }
} else {
if(target->turnid != infos.turn_id) {
target->set_status(STATUS_SUMMON_TURN, FALSE);
target->set_status(STATUS_SET_TURN, FALSE);
target->set_status(STATUS_FORM_CHANGED, FALSE);
target->set_status(STATUS_ATTACKED, FALSE);
}
} }
target->temp.sequence = seq; target->temp.sequence = seq;
if(location != LOCATION_MZONE) { if(location != LOCATION_MZONE) {
......
...@@ -2378,6 +2378,7 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2378,6 +2378,7 @@ int32 field::process_battle_command(uint16 step) {
core.to_m2 = FALSE; core.to_m2 = FALSE;
if(must_attack.size()) if(must_attack.size())
core.to_ep = FALSE; core.to_ep = FALSE;
core.attack_cancelable = TRUE;
add_process(PROCESSOR_SELECT_BATTLECMD, 0, 0, 0, infos.turn_player, 0); add_process(PROCESSOR_SELECT_BATTLECMD, 0, 0, 0, infos.turn_player, 0);
return FALSE; return FALSE;
} }
...@@ -2414,6 +2415,20 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2414,6 +2415,20 @@ int32 field::process_battle_command(uint16 step) {
core.attacker = core.attackable_cards[sel]; core.attacker = core.attackable_cards[sel];
core.attacker->set_status(STATUS_ATTACK_CANCELED, FALSE); core.attacker->set_status(STATUS_ATTACK_CANCELED, FALSE);
core.phase_action = TRUE; core.phase_action = TRUE;
effect_set eset;
filter_player_effect(infos.turn_player, EFFECT_ATTACK_COST, &eset, FALSE);
core.attacker->filter_effect(EFFECT_ATTACK_COST, &eset);
for(int32 i = 0; i < eset.count; ++i) {
pduel->lua->add_param(core.attacker, PARAM_TYPE_CARD);
pduel->lua->add_param(infos.turn_player, PARAM_TYPE_INT);
if(!eset[i]->check_value_condition(2))
continue;
if(eset[i]->cost) {
core.attack_cancelable = FALSE;
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, infos.turn_player, 0);
}
}
return FALSE; return FALSE;
} else { } else {
core.units.begin()->step = 29; core.units.begin()->step = 29;
...@@ -2459,7 +2474,7 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2459,7 +2474,7 @@ int32 field::process_battle_command(uint16 step) {
if(core.select_cards.size() == 1) if(core.select_cards.size() == 1)
returns.bvalue[1] = 0; returns.bvalue[1] = 0;
else else
add_process(MSG_SELECT_CARD, 0, 0, 0, 1 - infos.turn_player + 0x20000, 0x10001); add_process(MSG_SELECT_CARD, 0, 0, 0, 1 - infos.turn_player + (core.attack_cancelable ? 0x20000 : 0), 0x10001);
core.units.begin()->step = 5; core.units.begin()->step = 5;
return FALSE; return FALSE;
} }
...@@ -2477,12 +2492,12 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2477,12 +2492,12 @@ int32 field::process_battle_command(uint16 step) {
if(core.units.begin()->arg2) { if(core.units.begin()->arg2) {
if(core.select_cards.size() == 1) if(core.select_cards.size() == 1)
returns.bvalue[1] = 0; returns.bvalue[1] = 0;
else else
add_process(MSG_SELECT_CARD, 0, 0, 0, 1 - infos.turn_player + 0x20000, 0x10001); add_process(MSG_SELECT_CARD, 0, 0, 0, 1 - infos.turn_player + (core.attack_cancelable ? 0x20000 : 0), 0x10001);
core.units.begin()->step = 5; core.units.begin()->step = 5;
return FALSE; return FALSE;
} }
add_process(MSG_SELECT_CARD, 0, 0, 0, infos.turn_player + 0x20000, 0x10001); add_process(MSG_SELECT_CARD, 0, 0, 0, infos.turn_player + (core.attack_cancelable ? 0x20000 : 0), 0x10001);
core.units.begin()->step = 5; core.units.begin()->step = 5;
return FALSE; return FALSE;
} }
...@@ -2492,7 +2507,7 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2492,7 +2507,7 @@ int32 field::process_battle_command(uint16 step) {
return FALSE; return FALSE;
} else { } else {
if(core.select_cards.size()) if(core.select_cards.size())
add_process(MSG_SELECT_CARD, 0, 0, 0, infos.turn_player + 0x20000, 0x10001); add_process(MSG_SELECT_CARD, 0, 0, 0, infos.turn_player + (core.attack_cancelable ? 0x20000 : 0), 0x10001);
else else
core.units.begin()->step = -1; core.units.begin()->step = -1;
} }
...@@ -2507,26 +2522,10 @@ int32 field::process_battle_command(uint16 step) { ...@@ -2507,26 +2522,10 @@ int32 field::process_battle_command(uint16 step) {
core.attack_target = 0; core.attack_target = 0;
else else
core.attack_target = core.select_cards[returns.bvalue[1]]; core.attack_target = core.select_cards[returns.bvalue[1]];
//core.units.begin()->arg1 ---> is rollbacked
if(!core.units.begin()->arg1) {
//attack cost
effect_set eset;
filter_player_effect(infos.turn_player, EFFECT_ATTACK_COST, &eset, FALSE);
core.attacker->filter_effect(EFFECT_ATTACK_COST, &eset);
for(int32 i = 0; i < eset.count; ++i) {
pduel->lua->add_param(core.attacker, PARAM_TYPE_CARD);
pduel->lua->add_param(infos.turn_player, PARAM_TYPE_INT);
if(!eset[i]->check_value_condition(2))
continue;
if(eset[i]->cost) {
core.sub_solving_event.push_back(nil_event);
add_process(PROCESSOR_EXECUTE_OPERATION, 0, eset[i], 0, infos.turn_player, 0);
}
}
}
return FALSE; return FALSE;
} }
case 7: { case 7: {
core.attack_cancelable = TRUE;
core.sub_attacker = 0; core.sub_attacker = 0;
core.sub_attack_target = (card*)0xffffffff; core.sub_attack_target = (card*)0xffffffff;
core.attack_state[infos.turn_player] = TRUE; core.attack_state[infos.turn_player] = TRUE;
...@@ -3540,6 +3539,8 @@ int32 field::add_chain(uint16 step) { ...@@ -3540,6 +3539,8 @@ int32 field::add_chain(uint16 step) {
if(!(peffect->flag & EFFECT_FLAG_FIELD_ONLY) && peffect->handler->is_affected_by_effect(EFFECT_DISABLE_EFFECT)) if(!(peffect->flag & EFFECT_FLAG_FIELD_ONLY) && peffect->handler->is_affected_by_effect(EFFECT_DISABLE_EFFECT))
clit->flag |= CHAIN_DISABLE_EFFECT; clit->flag |= CHAIN_DISABLE_EFFECT;
clit->chain_type = peffect->handler->get_type(); clit->chain_type = peffect->handler->get_type();
if(clit->chain_type == TYPE_MONSTER + TYPE_TRAP)
clit->chain_type = TYPE_MONSTER;
clit->chain_count = core.current_chain.size() + 1; clit->chain_count = core.current_chain.size() + 1;
clit->target_cards = 0; clit->target_cards = 0;
clit->target_player = PLAYER_NONE; clit->target_player = PLAYER_NONE;
......
...@@ -12,7 +12,7 @@ function c11373345.initial_effect(c) ...@@ -12,7 +12,7 @@ function c11373345.initial_effect(c)
c:RegisterEffect(e1) c:RegisterEffect(e1)
end end
function c11373345.cfilter(c) function c11373345.cfilter(c)
return c:IsFaceup() and c:GetLevel()>=7 return c:IsFaceup() and c:IsLevelAbove(7)
end end
function c11373345.condition(e,tp,eg,ep,ev,re,r,rp) function c11373345.condition(e,tp,eg,ep,ev,re,r,rp)
return Duel.IsExistingMatchingCard(c11373345.cfilter,tp,LOCATION_ONFIELD,0,1,nil) return Duel.IsExistingMatchingCard(c11373345.cfilter,tp,LOCATION_ONFIELD,0,1,nil)
...@@ -28,7 +28,7 @@ function c11373345.cost(e,tp,eg,ep,ev,re,r,rp,chk) ...@@ -28,7 +28,7 @@ function c11373345.cost(e,tp,eg,ep,ev,re,r,rp,chk)
Duel.RegisterEffect(e1,tp) Duel.RegisterEffect(e1,tp)
end end
function c11373345.filter(c) function c11373345.filter(c)
return c:IsFaceup() and c:GetLevel()<=5 and c:IsDestructable() return c:IsFaceup() and c:IsLevelBelow(5) and c:IsDestructable()
end end
function c11373345.target(e,tp,eg,ep,ev,re,r,rp,chk) function c11373345.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(c11373345.filter,tp,0,LOCATION_MZONE,1,c) end if chk==0 then return Duel.IsExistingMatchingCard(c11373345.filter,tp,0,LOCATION_MZONE,1,c) end
......
...@@ -57,7 +57,7 @@ function c14017402.operation(e,tp,eg,ep,ev,re,r,rp) ...@@ -57,7 +57,7 @@ function c14017402.operation(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler() local c=e:GetHandler()
local tc=Duel.GetFirstTarget() local tc=Duel.GetFirstTarget()
if c:IsRelateToEffect(e) and c:IsFaceup() and tc:IsRelateToEffect(e) then if c:IsRelateToEffect(e) and c:IsFaceup() and tc:IsRelateToEffect(e) then
if Duel.Remove(tg,POS_FACEUP,REASON_EFFECT)~=1 then return end if Duel.Remove(tc,POS_FACEUP,REASON_EFFECT)~=1 then return end
local code=tc:GetOriginalCode() local code=tc:GetOriginalCode()
local reset_flag=RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END local reset_flag=RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END
c:CopyEffect(code, reset_flag, 1) c:CopyEffect(code, reset_flag, 1)
......
--スクリーン·オブ·レッド
function c18634367.initial_effect(c)
--activate
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
c:RegisterEffect(e1)
--cannot attack
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_FIELD)
e2:SetCode(EFFECT_CANNOT_ATTACK)
e2:SetRange(LOCATION_SZONE)
e2:SetTargetRange(0,LOCATION_MZONE)
c:RegisterEffect(e2)
--maintain
local e3=Effect.CreateEffect(c)
e3:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_CONTINUOUS)
e3:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE)
e3:SetCode(EVENT_PHASE+PHASE_END)
e3:SetRange(LOCATION_SZONE)
e3:SetCountLimit(1)
e3:SetOperation(c18634367.mtop)
c:RegisterEffect(e3)
--spsummon
local e4=Effect.CreateEffect(c)
e4:SetDescription(aux.Stringid(18634367,0))
e4:SetProperty(EFFECT_FLAG_CARD_TARGET)
e4:SetType(EFFECT_TYPE_QUICK_O)
e4:SetCode(EVENT_FREE_CHAIN)
e4:SetHintTiming(0,TIMING_END_PHASE)
e4:SetRange(LOCATION_SZONE)
e4:SetCondition(c18634367.spcon)
e4:SetTarget(c18634367.sptg)
e4:SetOperation(c18634367.spop)
c:RegisterEffect(e4)
end
function c18634367.mtop(e,tp,eg,ep,ev,re,r,rp)
if Duel.GetTurnPlayer()~=tp then return end
if Duel.GetLP(tp)>=1000 then
Duel.PayLPCost(tp,1000)
else
Duel.Destroy(e:GetHandler(),REASON_RULE)
end
end
function c18634367.cfilter(c)
return c:IsFaceup() and c:IsCode(70902743)
end
function c18634367.spcon(e,tp,eg,ep,ev,re,r,rp)
return not e:GetHandler():IsStatus(STATUS_CHAINING)
and Duel.IsExistingMatchingCard(c18634367.cfilter,tp,LOCATION_ONFIELD,LOCATION_ONFIELD,1,nil)
end
function c18634367.filter(c,e,tp)
return c:GetLevel()==1 and c:IsType(TYPE_TUNER) and c:IsCanBeSpecialSummoned(e,0,tp,false,false)
end
function c18634367.sptg(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsControler(tp) and chkc:IsLocation(LOCATION_GRAVE) and c18634367.filter(chkc,e,tp) end
if chk==0 then return e:GetHandler():IsDestructable() and Duel.GetLocationCount(tp,LOCATION_MZONE)~=0
and Duel.IsExistingTarget(c18634367.filter,tp,LOCATION_GRAVE,0,1,nil,e,tp) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SPSUMMON)
local g=Duel.SelectTarget(tp,c18634367.filter,tp,LOCATION_GRAVE,0,1,1,nil,e,tp)
Duel.SetOperationInfo(0,CATEGORY_DESTROY,e:GetHandler(),1,0,0)
Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,g,1,0,0)
end
function c18634367.spop(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
local tc=Duel.GetFirstTarget()
if c:IsRelateToEffect(e) and Duel.Destroy(c,REASON_EFFECT)~=0 and tc:IsRelateToEffect(e) then
Duel.SpecialSummon(tc,0,tp,tp,false,false,POS_FACEUP)
end
end
...@@ -24,11 +24,13 @@ function c19578592.initial_effect(c) ...@@ -24,11 +24,13 @@ function c19578592.initial_effect(c)
local e4=Effect.CreateEffect(c) local e4=Effect.CreateEffect(c)
e4:SetType(EFFECT_TYPE_SINGLE) e4:SetType(EFFECT_TYPE_SINGLE)
e4:SetCode(EFFECT_EQUIP_LIMIT) e4:SetCode(EFFECT_EQUIP_LIMIT)
e4:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
e4:SetValue(1) e4:SetValue(1)
c:RegisterEffect(e4) c:RegisterEffect(e4)
--damage --damage
local e5=Effect.CreateEffect(c) local e5=Effect.CreateEffect(c)
e5:SetDescription(aux.Stringid(19578592,0)) e5:SetDescription(aux.Stringid(19578592,0))
e5:SetCategory(CATEGORY_DAMAGE)
e5:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_F) e5:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_F)
e5:SetCode(EVENT_PHASE+PHASE_STANDBY) e5:SetCode(EVENT_PHASE+PHASE_STANDBY)
e5:SetRange(LOCATION_SZONE) e5:SetRange(LOCATION_SZONE)
......
--魔石術師 クルード
function c20630765.initial_effect(c)
c:SetCounterLimit(0x16,1)
--Add counter
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_CONTINUOUS+EFFECT_TYPE_FIELD)
e1:SetCode(EVENT_CHAIN_SOLVING)
e1:SetProperty(EFFECT_FLAG_DELAY)
e1:SetRange(LOCATION_MZONE)
e1:SetOperation(c20630765.ctop)
c:RegisterEffect(e1)
--attackup
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
e2:SetRange(LOCATION_MZONE)
e2:SetCode(EFFECT_UPDATE_DEFENCE)
e2:SetValue(c20630765.defup)
c:RegisterEffect(e2)
--destroy
local e3=Effect.CreateEffect(c)
e3:SetDescription(aux.Stringid(20630765,0))
e3:SetCategory(CATEGORY_REMOVE)
e3:SetType(EFFECT_TYPE_IGNITION)
e3:SetRange(LOCATION_MZONE)
e3:SetProperty(EFFECT_FLAG_CARD_TARGET)
e3:SetCost(c20630765.rmcost)
e3:SetTarget(c20630765.rmtg)
e3:SetOperation(c20630765.rmop)
c:RegisterEffect(e3)
end
function c20630765.ctop(e,tp,eg,ep,ev,re,r,rp)
local c=re:GetHandler()
if c:IsType(TYPE_MONSTER) and c~=e:GetHandler() then
e:GetHandler():AddCounter(0x16,1)
end
end
function c20630765.defup(e,c)
return c:GetCounter(0x16)*300
end
function c20630765.rmcost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsCanRemoveCounter(tp,1,0,0x16,1,REASON_COST) end
Duel.RemoveCounter(tp,1,0,0x16,1,REASON_COST)
end
function c20630765.rmtg(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsLocation(LOCATION_MZONE) and chkc:IsControler(1-tp) and chkc:IsAbleToRemove() end
if chk==0 then return Duel.IsExistingTarget(Card.IsAbleToRemove,tp,0,LOCATION_GRAVE,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_REMOVE)
local g=Duel.SelectTarget(tp,Card.IsAbleToRemove,tp,0,LOCATION_GRAVE,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_REMOVE,g,1,0,0)
end
function c20630765.rmop(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if tc:IsRelateToEffect(e) then
Duel.Remove(tc,POS_FACEUP,REASON_EFFECT)
end
end
...@@ -46,7 +46,7 @@ function c22201234.aop(e,tp,eg,ep,ev,re,r,rp) ...@@ -46,7 +46,7 @@ function c22201234.aop(e,tp,eg,ep,ev,re,r,rp)
end end
function c22201234.qcon(e,tp,eg,ep,ev,re,r,rp) function c22201234.qcon(e,tp,eg,ep,ev,re,r,rp)
local d=Duel.GetAttackTarget() local d=Duel.GetAttackTarget()
return d:IsFaceup() and d:IsSetCard(0x38) and d:IsControler(tp) return d:IsFaceup() and d:IsSetCard(0x38) and d:IsControler(tp) and not e:GetHandler():IsStatus(STATUS_CHAINING)
end end
function c22201234.qcost(e,tp,eg,ep,ev,re,r,rp,chk) function c22201234.qcost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsPlayerCanDiscardDeckAsCost(tp,2) end if chk==0 then return Duel.IsPlayerCanDiscardDeckAsCost(tp,2) end
......
--重機王ドボク·ザーク
function c29515122.initial_effect(c)
--xyz summon
aux.AddXyzProcedure(c,aux.FilterEqualFunction(Card.GetLevel,5),3)
c:EnableReviveLimit()
--destroy
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(29515122,0))
e1:SetCategory(CATEGORY_DESTROY+CATEGORY_DECKDES)
e1:SetType(EFFECT_TYPE_IGNITION)
e1:SetRange(LOCATION_MZONE)
e1:SetCountLimit(1)
e1:SetCost(c29515122.cost)
e1:SetTarget(c29515122.target)
e1:SetOperation(c29515122.operation)
c:RegisterEffect(e1)
end
function c29515122.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return e:GetHandler():CheckRemoveOverlayCard(tp,1,REASON_COST) end
e:GetHandler():RemoveOverlayCard(tp,1,1,REASON_COST)
end
function c29515122.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsPlayerCanDiscardDeck(1-tp,3) end
Duel.SetOperationInfo(0,CATEGORY_DECKDES,nil,0,1-tp,3)
end
function c29515122.cfilter(c)
return c:IsLocation(LOCATION_GRAVE) and c:IsType(TYPE_MONSTER)
end
function c29515122.operation(e,tp,eg,ep,ev,re,r,rp)
Duel.DiscardDeck(1-tp,3,REASON_EFFECT)
local g=Duel.GetOperatedGroup()
local ct=g:FilterCount(c29515122.cfilter,nil)
if ct==0 then return end
local dg=Duel.SelectMatchingCard(tp,Card.IsDestructable,tp,0,LOCATION_ONFIELD,1,ct,nil)
Duel.Destroy(dg,REASON_EFFECT)
end
--落とし大穴
function c30127518.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_TOGRAVE)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_SPSUMMON_SUCCESS)
e1:SetTarget(c30127518.target)
e1:SetOperation(c30127518.activate)
c:RegisterEffect(e1)
end
function c30127518.cfilter(c,sp,e)
return c:IsFaceup() and c:GetSummonPlayer()==sp and (not e or c:IsRelateToEffect(e))
end
function c30127518.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return eg:IsExists(c30127518.cfilter,2,nil,1-tp) end
local g=eg:Filter(c30127518.cfilter,nil,1-tp)
Duel.SetTargetCard(g)
Duel.SetOperationInfo(0,CATEGORY_TOGRAVE,g,g:GetCount(),0,0)
end
function c30127518.activate(e,tp,eg,ep,ev,re,r,rp)
local g=Duel.GetChainInfo(0,CHAININFO_TARGET_CARDS):Filter(c30127518.cfilter,nil,1-tp,e)
if g:GetCount()<2 then return end
local exg=Group.CreateGroup()
local tc=g:GetFirst()
while tc do
local fg=Duel.GetMatchingGroup(Card.IsCode,tp,0,LOCATION_DECK+LOCATION_EXTRA+LOCATION_HAND,nil,tc:GetCode())
exg:Merge(fg)
tc=g:GetNext()
end
Duel.SendtoGrave(g,REASON_EFFECT)
Duel.SendtoGrave(exg,REASON_EFFECT)
end
--異次元グランド
function c31849106.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetOperation(c31849106.activate)
c:RegisterEffect(e1)
end
function c31849106.activate(e,tp,eg,ep,ev,re,r,rp)
local e1=Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetProperty(EFFECT_FLAG_SET_AVAILABLE)
e1:SetCode(EFFECT_TO_GRAVE_REDIRECT)
e1:SetProperty(EFFECT_FLAG_IGNORE_RANGE)
e1:SetTarget(c31849106.rmtarget)
e1:SetValue(LOCATION_REMOVED)
e1:SetReset(RESET_PHASE+PHASE_END)
Duel.RegisterEffect(e1,tp)
end
function c31849106.rmtarget(e,c)
return not c:IsLocation(0x80) and not c:IsType(TYPE_SPELL+TYPE_TRAP)
end
...@@ -17,7 +17,7 @@ function c36099620.initial_effect(c) ...@@ -17,7 +17,7 @@ function c36099620.initial_effect(c)
e3:SetType(EFFECT_TYPE_FIELD) e3:SetType(EFFECT_TYPE_FIELD)
e3:SetCode(EFFECT_UPDATE_ATTACK) e3:SetCode(EFFECT_UPDATE_ATTACK)
e3:SetRange(LOCATION_SZONE) e3:SetRange(LOCATION_SZONE)
e3:SetTargetRange(LOCATION_MZONE,0) e3:SetTargetRange(LOCATION_MZONE,LOCATION_MZONE)
e3:SetTarget(aux.TargetBoolFunction(Card.IsSetCard,0x38)) e3:SetTarget(aux.TargetBoolFunction(Card.IsSetCard,0x38))
e3:SetValue(c36099620.atkval) e3:SetValue(c36099620.atkval)
c:RegisterEffect(e3) c:RegisterEffect(e3)
......
...@@ -3,9 +3,10 @@ function c41902352.initial_effect(c) ...@@ -3,9 +3,10 @@ function c41902352.initial_effect(c)
--synchro limit --synchro limit
local e1=Effect.CreateEffect(c) local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE) e1:SetType(EFFECT_TYPE_SINGLE)
e1:Setproperty(EFFECT_FLAG_CANNOT_DISABLE)
e1:SetCode(EFFECT_CANNOT_BE_SYNCHRO_MATERIAL) e1:SetCode(EFFECT_CANNOT_BE_SYNCHRO_MATERIAL)
e1:SetCondition(c41902352.synlimit) e1:SetCondition(c41902352.synlimit)
e1:SetValue(aux.TRUE) e1:SetValue(1)
c:RegisterEffect(e1) c:RegisterEffect(e1)
end end
function c41902352.synlimit(e) function c41902352.synlimit(e)
......
...@@ -17,7 +17,7 @@ function c45215453.initial_effect(c) ...@@ -17,7 +17,7 @@ function c45215453.initial_effect(c)
c:RegisterEffect(e1) c:RegisterEffect(e1)
end end
function c45215453.thcon(e,tp,eg,ep,ev,re,r,rp) function c45215453.thcon(e,tp,eg,ep,ev,re,r,rp)
return e:GetHandler():IsDefence() return Duel.GetTurnPlayer()==tp and e:GetHandler():IsDefence()
end end
function c45215453.filter(c) function c45215453.filter(c)
return c:IsType(TYPE_EQUIP) and c:IsAbleToHand() return c:IsType(TYPE_EQUIP) and c:IsAbleToHand()
......
--コアキリング
function c46089249.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_DESTROY+CATEGORY_DAMAGE)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetCost(c46089249.cost)
e1:SetTarget(c46089249.target)
e1:SetOperation(c46089249.activate)
c:RegisterEffect(e1)
end
function c46089249.cfilter(c)
return c:IsCode(36623431) and not c:IsPublic()
end
function c46089249.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(c46089249.cfilter,tp,LOCATION_HAND,0,1,nil) end
local g=Duel.SelectMatchingCard(tp,c46089249.cfilter,tp,LOCATION_HAND,0,1,1,nil)
Duel.ConfirmCards(1-tp,g)
Duel.ShuffleHand(tp)
end
function c46089249.filter(c)
return c:IsFaceup() and c:IsDestructable()
end
function c46089249.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsLocation(LOCAITON_MZONE) and c46089249.filter(chkc) end
if chk==0 then return Duel.IsExistingTarget(c46089249.filter,tp,LOCATION_MZONE,LOCATION_MZONE,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_DESTROY)
local g=Duel.SelectTarget(tp,c46089249.filter,tp,LOCATION_MZONE,LOCATION_MZONE,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_DESTROY,g,1,0,0)
Duel.SetOperationInfo(0,CATEGORY_DAMAGE,nil,0,PLAYER_ALL,1000)
end
function c46089249.activate(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if tc:IsFaceup() and tc:IsRelateToEffect(e) then
if Duel.Destroy(tc,REASON_EFFECT)>0 then
Duel.Damage(1-tp,1000,REASON_EFFECT)
Duel.Damage(tp,1000,REASON_EFFECT)
end
end
end
--呪いのお札
function c46967601.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_EQUIP)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
e1:SetTarget(c46967601.target)
e1:SetOperation(c46967601.operation)
c:RegisterEffect(e1)
--equip limit
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_EQUIP_LIMIT)
e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
e2:SetValue(1)
c:RegisterEffect(e2)
--damage
local e3=Effect.CreateEffect(c)
e3:SetDescription(aux.Stringid(46967601,0))
e3:SetCategory(CATEGORY_DAMAGE)
e3:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)
e3:SetCode(EVENT_TO_GRAVE)
e3:SetCondition(c46967601.damcon)
e3:SetTarget(c46967601.damtg)
e3:SetOperation(c46967601.damop)
c:RegisterEffect(e3)
end
function c46967601.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsLocation(LOCATION_MZONE) and chkc:IsFaceup() end
if chk==0 then return Duel.IsExistingTarget(Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_EQUIP)
Duel.SelectTarget(tp,Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_EQUIP,e:GetHandler(),1,0,0)
end
function c46967601.operation(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if e:GetHandler():IsRelateToEffect(e) and tc:IsRelateToEffect(e) and tc:IsFaceup() then
Duel.Equip(tp,e:GetHandler(),tc)
end
end
function c46967601.damcon(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
local ec=c:GetPreviousEquipTarget()
if not ec then return end
e:SetLabelObject(ec)
e:SetLabel(ec:GetPreviousControler())
return c:IsReason(REASON_LOST_TARGET) and ec:IsLocation(LOCATION_GRAVE) and ec:IsReason(REASON_DESTROY)
end
function c46967601.damtg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
local dam=e:GetLabelObject():GetTextDefence()
if dam<0 then dam=0 end
Duel.SetTargetPlayer(e:GetLabel())
Duel.SetTargetParam(dam)
Duel.SetOperationInfo(0,CATEGORY_DAMAGE,nil,0,e:GetLabel(),dam)
end
function c46967601.damop(e,tp,eg,ep,ev,re,r,rp)
local p,d=Duel.GetChainInfo(0,CHAININFO_TARGET_PLAYER,CHAININFO_TARGET_PARAM)
Duel.Damage(p,d,REASON_EFFECT)
end
--超弩級砲塔列車グスタフ·マックス
function c56910167.initial_effect(c)
--xyz summon
aux.AddXyzProcedure(c,aux.FilterEqualFunction(Card.GetLevel,10),2)
c:EnableReviveLimit()
--damage
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(56910167,0))
e1:SetCategory(CATEGORY_DAMAGE)
e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
e1:SetType(EFFECT_TYPE_IGNITION)
e1:SetRange(LOCATION_MZONE)
e1:SetCountLimit(1)
e1:SetCost(c56910167.cost)
e1:SetTarget(c56910167.target)
e1:SetOperation(c56910167.operation)
c:RegisterEffect(e1)
end
function c56910167.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return e:GetHandler():CheckRemoveOverlayCard(tp,1,REASON_COST) end
e:GetHandler():RemoveOverlayCard(tp,1,1,REASON_COST)
end
function c56910167.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
Duel.SetTargetPlayer(1-tp)
Duel.SetTargetParam(2000)
Duel.SetOperationInfo(0,CATEGORY_DAMAGE,nil,0,1-tp,2000)
end
function c56910167.operation(e,tp,eg,ep,ev,re,r,rp)
local p,d=Duel.GetChainInfo(0,CHAININFO_TARGET_PLAYER,CHAININFO_TARGET_PARAM)
Duel.Damage(p,d,REASON_EFFECT)
end
--ズバババスター
function c57036718.initial_effect(c)
--destroy
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_CONTINUOUS)
e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
e1:SetCode(EVENT_BATTLE_DAMAGE)
e1:SetOperation(c57036718.damop)
c:RegisterEffect(e1)
local e2=Effect.CreateEffect(c)
e2:SetDescription(aux.Stringid(57036718,0))
e2:SetCategory(CATEGORY_DESTROY+CATEGORY_ATKCHANGE)
e2:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)
e2:SetCode(EVENT_DAMAGE_STEP_END)
e2:SetCondition(c57036718.descon)
e2:SetTarget(c57036718.destg)
e2:SetOperation(c57036718.desop)
c:RegisterEffect(e2)
end
function c57036718.damop(e,tp,eg,ep,ev,re,r,rp)
e:GetHandler():RegisterFlagEffect(57036718,RESET_EVENT+0x1fe0000+RESET_PHASE+PHASE_DAMAGE,0,1)
end
function c57036718.descon(e,tp,eg,ep,ev,re,r,rp)
return e:GetHandler():GetFlagEffect(57036718)~=0
end
function c57036718.desop(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
if c:IsAttack() and c:IsRelateToBattle() then
Duel.ChangePosition(c,POS_FACEUP_DEFENCE)
end
end
function c57036718.filter(c)
return c:IsFaceup() and c:IsDestructable()
end
function c57036718.destg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
local g=Duel.GetMatchingGroup(c57036718.filter,tp,LOCATION_MZONE,LOCATION_MZONE,nil)
if g:GetCount()==0 then return end
local tg=g:GetMinGroup(Card.GetAttack)
Duel.SetOperationInfo(0,CATEGORY_DESTROY,tg,1,0,0)
end
function c57036718.desop(e,tp,eg,ep,ev,re,r,rp)
local g=Duel.GetMatchingGroup(c57036718.filter,tp,LOCATION_MZONE,LOCATION_MZONE,nil)
if g:GetCount()>0 then
local tg=g:GetMinGroup(Card.GetAttack)
if tg:GetCount()>1 then
local sg=tg:Select(tp,1,1,nil)
Duel.Destroy(sg,REASON_EFFECT)
else Duel.Destroy(tg,REASON_EFFECT) end
end
local c=e:GetHandler()
if c:IsRelateToEffect(e) then
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_UPDATE_ATTACK)
e1:SetValue(-800)
e1:SetReset(RESET_EVENT+0x1fe0000)
c:RegisterEffect(e1)
end
end
...@@ -18,5 +18,5 @@ function c58258899.filter(c) ...@@ -18,5 +18,5 @@ function c58258899.filter(c)
return c:IsFaceup() and c:IsSetCard(0x27) return c:IsFaceup() and c:IsSetCard(0x27)
end end
function c58258899.val(e,c) function c58258899.val(e,c)
return Duel.GetMatchingGroupCount(c58258899.filter,tp,LOCATION_MZONE,0,nil)*300 return Duel.GetMatchingGroupCount(c58258899.filter,c:GetControler(),LOCATION_MZONE,0,nil)*300
end end
...@@ -11,11 +11,14 @@ function c64034255.initial_effect(c) ...@@ -11,11 +11,14 @@ function c64034255.initial_effect(c)
e1:SetOperation(c64034255.spop) e1:SetOperation(c64034255.spop)
c:RegisterEffect(e1) c:RegisterEffect(e1)
end end
function c64034255.cfilter(c)
return c:IsFaceup() and c:IsAbleToHandAsCost()
end
function c64034255.spcost(e,tp,eg,ep,ev,re,r,rp,chk) function c64034255.spcost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(Card.IsAbleToHandAsCost,tp,LOCATION_MZONE,0,1,nil) end if chk==0 then return Duel.IsExistingMatchingCard(c64034255.cfilter,tp,LOCATION_MZONE,0,1,nil) end
Duel.ConfirmCards(1-tp,e:GetHandler()) Duel.ConfirmCards(1-tp,e:GetHandler())
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_RTOHAND) Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_RTOHAND)
local g=Duel.SelectMatchingCard(tp,Card.IsAbleToHandAsCost,tp,LOCATION_MZONE,0,1,1,nil) local g=Duel.SelectMatchingCard(tp,c64034255.cfilter,tp,LOCATION_MZONE,0,1,1,nil)
if g:GetFirst():IsAttribute(ATTRIBUTE_WIND) then e:SetLabel(1) else e:SetLabel(0) end if g:GetFirst():IsAttribute(ATTRIBUTE_WIND) then e:SetLabel(1) else e:SetLabel(0) end
Duel.SendtoHand(g,nil,REASON_EFFECT) Duel.SendtoHand(g,nil,REASON_EFFECT)
end end
......
--能力吸収石
function c67234805.initial_effect(c)
c:SetCounterLimit(0x16,2)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
c:RegisterEffect(e1)
--Add counter
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_CONTINUOUS+EFFECT_TYPE_FIELD)
e2:SetCode(EVENT_CHAIN_SOLVING)
e2:SetProperty(EFFECT_FLAG_DELAY)
e2:SetRange(LOCATION_SZONE)
e2:SetOperation(c67234805.ctop)
c:RegisterEffect(e2)
--negate
local e3=Effect.CreateEffect(c)
e3:SetType(EFFECT_TYPE_FIELD)
e3:SetCode(EFFECT_CANNOT_TRIGGER)
e3:SetRange(LOCATION_SZONE)
e3:SetTargetRange(LOCATION_MZONE,LOCATION_MZONE)
e3:SetCondition(c67234805.discon)
c:RegisterEffect(e3)
local e4=Effect.CreateEffect(c)
e4:SetType(EFFECT_TYPE_FIELD)
e4:SetCode(EFFECT_DISABLE)
e4:SetRange(LOCATION_SZONE)
e4:SetTargetRange(LOCATION_MZONE,LOCATION_MZONE)
e4:SetCondition(c67234805.discon)
e4:SetTarget(c67234805.distg)
c:RegisterEffect(e4)
--remove counter
local e5=Effect.CreateEffect(c)
e5:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_CONTINUOUS)
e5:SetCode(EVENT_PHASE+PHASE_END)
e5:SetRange(LOCATION_SZONE)
e5:SetCondition(c67234805.rmcon)
e5:SetOperation(c67234805.rmop)
c:RegisterEffect(e5)
end
function c67234805.ctop(e,tp,eg,ep,ev,re,r,rp)
local c=re:GetHandler()
if c:IsType(TYPE_MONSTER) then
e:GetHandler():AddCounter(0x16,1)
end
end
function c67234805.discon(e)
return e:GetHandler():GetCounter(0x16)==2
end
function c67234805.distg(e,c)
return c:IsType(TYPE_EFFECT)
end
function c67234805.rmcon(e,tp,eg,ep,ev,re,r,rp)
return e:GetHandler():GetCounter(0x16)>0
end
function c67234805.rmop(e,tp,eg,ep,ev,re,r,rp)
e:GetHandler():RemoveCounter(tp,0x16,e:GetHandler():GetCounter(0x16),REASON_EFFECT)
end
...@@ -13,7 +13,6 @@ function c71413901.initial_effect(c) ...@@ -13,7 +13,6 @@ function c71413901.initial_effect(c)
c:RegisterEffect(e1) c:RegisterEffect(e1)
--attackup --attackup
local e2=Effect.CreateEffect(c) local e2=Effect.CreateEffect(c)
e2:SetDescription(aux.Stringid(71413901,1))
e2:SetType(EFFECT_TYPE_SINGLE) e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetProperty(EFFECT_FLAG_SINGLE_RANGE) e2:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
e2:SetRange(LOCATION_MZONE) e2:SetRange(LOCATION_MZONE)
......
--ディフェンダーズ·クロス
function c71417170.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_POSITION)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetCondition(c71417170.condition)
e1:SetTarget(c71417170.target)
e1:SetOperation(c71417170.activate)
c:RegisterEffect(e1)
end
function c71417170.condition(e,tp,eg,ep,ev,re,r,rp)
return Duel.GetCurrentPhase()==PHASE_BATTLE
end
function c71417170.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(Card.IsDefence,tp,0,LOCATION_MZONE,1,nil) end
local g=Duel.GetMatchingGroup(Card.IsDefence,tp,0,LOCATION_MZONE,nil)
Duel.SetOperationInfo(0,CATEGORY_POSITION,g,g:GetCount(),0,0)
end
function c71417170.activate(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
local g=Duel.GetMatchingGroup(Card.IsDefence,tp,0,LOCATION_MZONE,nil)
Duel.ChangePosition(g,0,0,POS_FACEUP_ATTACK,POS_FACEUP_ATTACK)
local tc=g:GetFirst()
while tc do
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_DISABLE)
e1:SetReset(RESET_EVENT+0x1fe0000)
tc:RegisterEffect(e1)
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_DISABLE_EFFECT)
e2:SetReset(RESET_EVENT+0x1fe0000)
tc:RegisterEffect(e2)
tc=g:GetNext()
end
end
--重力崩壊
function c7811875.initial_effect(c)
--Activate(summon)
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_DISABLE_SUMMON+CATEGORY_DESTROY)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_SUMMON)
e1:SetCondition(c7811875.condition)
e1:SetCost(c7811875.cost)
e1:SetTarget(c7811875.target)
e1:SetOperation(c7811875.activate)
c:RegisterEffect(e1)
local e2=e1:Clone()
e2:SetCode(EVENT_FLIP_SUMMON)
c:RegisterEffect(e2)
local e3=e1:Clone()
e3:SetCode(EVENT_SPSUMMON)
c:RegisterEffect(e3)
end
function c7811875.condition(e,tp,eg,ep,ev,re,r,rp)
return Duel.GetCurrentChain()==0
end
function c7811875.cfilter(c)
return c:IsFaceup() and c:IsType(TYPE_SYNCHRO) and c:IsAbleToGraveAsCost()
end
function c7811875.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.IsExistingMatchingCard(c7811875.cfilter,tp,LOCATION_MZONE,0,1,nil) end
local g=Duel.SelectMatchingCard(tp,c7811875.cfilter,tp,LOCATION_MZONE,0,1,1,nil)
Duel.SendtoGrave(g,REASON_COST)
end
function c7811875.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
Duel.SetOperationInfo(0,CATEGORY_DISABLE_SUMMON,eg,1,0,0)
Duel.SetOperationInfo(0,CATEGORY_DESTROY,eg,1,0,0)
end
function c7811875.activate(e,tp,eg,ep,ev,re,r,rp)
Duel.NegateSummon(eg:GetFirst())
Duel.Destroy(eg,REASON_EFFECT)
local e1=Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_FIELD)
e1:SetProperty(EFFECT_FLAG_PLAYER_TARGET)
e1:SetCode(EFFECT_CANNOT_SPECIAL_SUMMON)
e1:SetReset(RESET_PHASE+PHASE_END)
e1:SetTargetRange(0,1)
Duel.RegisterEffect(e1,tp)
local e2=e1:Clone()
e2:SetCode(EFFECT_CANNOT_SUMMON)
Duel.RegisterEffect(e2,tp)
local e3=e2:Clone()
e3:SetCode(EFFECT_CANNOT_FLIP_SUMMON)
Duel.RegisterEffect(e3,tp)
end
...@@ -5,7 +5,7 @@ function c80280737.initial_effect(c) ...@@ -5,7 +5,7 @@ function c80280737.initial_effect(c)
e1:SetCategory(CATEGORY_SPECIAL_SUMMON) e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
e1:SetType(EFFECT_TYPE_ACTIVATE) e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN) e1:SetCode(EVENT_FREE_CHAIN)
e1:SetHintTiming(0,TIMING_DRAW_PHASE) e1:SetHintTiming(0,TIMING_DRAW_PHASE+TIMING_END_PHASE)
e1:SetCost(c80280737.cost) e1:SetCost(c80280737.cost)
e1:SetTarget(c80280737.target) e1:SetTarget(c80280737.target)
e1:SetOperation(c80280737.activate) e1:SetOperation(c80280737.activate)
......
--No.7 ラッキー·ストライプ
function c82308875.initial_effect(c)
--xyz summon
aux.AddXyzProcedure(c,aux.FilterEqualFunction(Card.GetLevel,7),3)
c:EnableReviveLimit()
--destroy
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(82308875,0))
e1:SetCategory(CATEGORY_ATKCHANGE+CATEGORY_DRAW+CATEGORY_SPECIAL_SUMMON+CATEGORY_TOGRAVE)
e1:SetType(EFFECT_TYPE_IGNITION)
e1:SetRange(LOCATION_MZONE)
e1:SetCost(c82308875.cost)
e1:SetTarget(c82308875.target)
e1:SetOperation(c82308875.operation)
c:RegisterEffect(e1)
end
function c82308875.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return e:GetHandler():CheckRemoveOverlayCard(tp,1,REASON_COST) end
e:GetHandler():RemoveOverlayCard(tp,1,1,REASON_COST)
end
function c82308875.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
Duel.SetOperationInfo(0,CATEGORY_DICE,nil,0,tp,2)
end
function c82308875.spfilter(c,e,tp)
return c:IsCanBeSpecialSummoned(e,0,tp,false,false) and not c:IsHasEffect(EFFECT_NECRO_VALLEY)
end
function c82308875.operation(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
local d1,d2=Duel.TossDice(tp,2)
if d2>d1 then d1,d2=d2,d1 end
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_SET_ATTACK)
e1:SetValue(d1*700)
e1:SetReset(RESET_EVENT+0x1fe0000+RESET_PHASE+PHASE_END)
c:RegisterEffect(e1)
if d1+d2==7 then
local b1=Duel.GetFieldGroupCount(tp,LOCATION_ONFIELD,LOCATION_ONFIELD)>1
local spg=Duel.GetMatchingGroup(c82308875.spfilter,tp,LOCATION_HAND+LOCATION_GRAVE,LOCATION_GRAVE,nil,e,tp)
local b2=Duel.GetLocationCount(tp,LOCATION_MZONE)~=0 and spg:GetCount()>0
local b3=Duel.IsPlayerCanDraw(tp,3)
if not b1 and not b2 and not b3 then return end
local op=0
if b1 and not b2 and not b3 then op=Duel.SelectOption(tp,aux.Stringid(82308875,1))
elseif not b1 and b2 and not b3 then op=Duel.SelectOption(tp,aux.Stringid(82308875,2))+1
elseif not b1 and not b2 and b3 then op=Duel.SelectOption(tp,aux.Stringid(82308875,3))+2
elseif b1 and b2 and not b3 then op=Duel.SelectOption(tp,aux.Stringid(82308875,1),aux.Stringid(82308875,2))
elseif b1 and not b2 and b3 then op=Duel.SelectOption(tp,aux.Stringid(82308875,1),aux.Stringid(82308875,3)) if op==1 then op=2 end
elseif not b1 and b2 and b3 then op=Duel.SelectOption(tp,aux.Stringid(82308875,2),aux.Stringid(82308875,3))+1
else op=Duel.SelectOption(tp,aux.Stringid(82308875,1),aux.Stringid(82308875,2),aux.Stringid(82308875,3)) end
if op==0 then
local g=Duel.GetMatchingGroup(aux.TRUE,tp,LOCATION_ONFIELD,LOCATION_ONFIELD,e:GetHandler())
Duel.SendtoGrave(g,REASON_EFFECT)
elseif op==1 then
local sg=spg:Select(tp,1,1,nil)
Duel.SpecialSummon(sg,0,tp,tp,false,false,POS_FACEUP)
else
Duel.Draw(tp,3,REASON_EFFECT)
Duel.BreakEffect()
Duel.DiscardHand(tp,aux.TRUE,2,2,REASON_EFFECT+REASON_DISCARD)
end
end
end
--霊滅独鈷杵
function c82361206.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_EQUIP)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
e1:SetTarget(c82361206.target)
e1:SetOperation(c82361206.operation)
c:RegisterEffect(e1)
--equip limit
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_EQUIP_LIMIT)
e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
e2:SetValue(1)
c:RegisterEffect(e2)
--remove
local e3=Effect.CreateEffect(c)
e3:SetDescription(aux.Stringid(83584898,0))
e3:SetCategory(CATEGORY_REMOVE)
e3:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_O)
e3:SetProperty(EFFECT_FLAG_CARD_TARGET+EFFECT_FLAG_DAMAGE_STEP)
e3:SetCode(EVENT_DAMAGE)
e3:SetRange(LOCATION_SZONE)
e3:SetCondition(c82361206.rmcon)
e3:SetTarget(c82361206.rmtg)
e3:SetOperation(c82361206.rmop)
c:RegisterEffect(e3)
end
function c82361206.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsLocation(LOCATION_MZONE) and chkc:IsFaceup() end
if chk==0 then return Duel.IsExistingTarget(Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_EQUIP)
Duel.SelectTarget(tp,Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_EQUIP,e:GetHandler(),1,0,0)
end
function c82361206.operation(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if e:GetHandler():IsRelateToEffect(e) and tc:IsRelateToEffect(e) and tc:IsFaceup() then
Duel.Equip(tp,e:GetHandler(),tc)
end
end
function c82361206.rmcon(e,tp,eg,ep,ev,re,r,rp)
return ep~=tp and r==REASON_BATTLE and eg:GetFirst()==e:GetHandler():GetEquipTarget()
end
function c82361206.rmtg(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IcLocation(LOCATION_GRAVE) and chkc:IsControler(1-tp) and chkc:IsAbleToRemove() end
if chk==0 then return Duel.IsExistingTarget(Card.IsAbleToRemove,tp,0,LOCATION_GRAVE,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_REMOVE)
local g=Duel.SelectTarget(tp,Card.IsAbleToRemove,tp,0,LOCATION_GRAVE,1,2,nil)
Duel.SetOperationInfo(0,CATEGORY_REMOVE,g,g:GetCount(),0,0)
end
function c82361206.rmop(e,tp,eg,ep,ev,re,r,rp)
local g=Duel.GetChainInfo(0,CHAININFO_TARGET_CARDS):Filter(Card.IsRelateToEffect,nil,e)
Duel.Remove(g,POS_FACEUP,REASON_EFFECT)
end
...@@ -17,7 +17,7 @@ function c82732705.initial_effect(c) ...@@ -17,7 +17,7 @@ function c82732705.initial_effect(c)
c:RegisterEffect(e2) c:RegisterEffect(e2)
end end
function c82732705.disable(e,c) function c82732705.disable(e,c)
return c:IsFaceup() and c:IsType(TYPE_EFFECT) return c:IsType(TYPE_EFFECT)
end end
function c82732705.cost(e,tp,eg,ep,ev,re,r,rp,chk) function c82732705.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.CheckLPCost(tp,1000) end if chk==0 then return Duel.CheckLPCost(tp,1000) end
......
--チャッチャカアーチャー
function c83021423.initial_effect(c)
--destroy
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(83021423,0))
e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
e1:SetCategory(CATEGORY_DESTROY)
e1:SetType(EFFECT_TYPE_IGNITION)
e1:SetRange(LOCATION_MZONE)
e1:SetCountLimit(1)
e1:SetTarget(c83021423.destg)
e1:SetOperation(c83021423.desop)
c:RegisterEffect(e1)
end
function c83021423.filter(c)
return c:IsType(TYPE_SPELL+TYPE_TRAP) and c:IsDestructable()
end
function c83021423.destg(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsOnField() and c83021423.filter(chkc) end
if chk==0 then return Duel.IsExistingTarget(c83021423.filter,tp,LOCATION_ONFIELD,LOCATION_ONFIELD,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_DESTROY)
local g=Duel.SelectTarget(tp,c83021423.filter,tp,LOCATION_ONFIELD,LOCATION_ONFIELD,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_DESTROY,g,1,0,0)
end
function c83021423.desop(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if tc:IsRelateToEffect(e) then
Duel.Destroy(tc,REASON_EFFECT)
end
end
--魔界の足枷
function c83584898.initial_effect(c)
--Activate
local e1=Effect.CreateEffect(c)
e1:SetCategory(CATEGORY_EQUIP)
e1:SetType(EFFECT_TYPE_ACTIVATE)
e1:SetCode(EVENT_FREE_CHAIN)
e1:SetProperty(EFFECT_FLAG_CARD_TARGET)
e1:SetTarget(c83584898.target)
e1:SetOperation(c83584898.operation)
c:RegisterEffect(e1)
--atk,def
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_EQUIP)
e2:SetCode(EFFECT_SET_ATTACK)
e2:SetValue(100)
c:RegisterEffect(e2)
local e3=Effect.CreateEffect(c)
e3:SetType(EFFECT_TYPE_EQUIP)
e3:SetCode(EFFECT_SET_DEFENCE)
e3:SetValue(100)
c:RegisterEffect(e3)
--equip limit
local e4=Effect.CreateEffect(c)
e4:SetType(EFFECT_TYPE_SINGLE)
e4:SetCode(EFFECT_EQUIP_LIMIT)
e4:SetProperty(EFFECT_FLAG_CANNOT_DISABLE)
e4:SetValue(1)
c:RegisterEffect(e4)
--damage
local e5=Effect.CreateEffect(c)
e5:SetDescription(aux.Stringid(83584898,0))
e5:SetCategory(CATEGORY_DAMAGE)
e5:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_F)
e5:SetCode(EVENT_PHASE+PHASE_STANDBY)
e5:SetRange(LOCATION_SZONE)
e5:SetCountLimit(1)
e5:SetCondition(c83584898.damcon)
e5:SetTarget(c83584898.damtg)
e5:SetOperation(c83584898.damop)
c:RegisterEffect(e5)
end
function c83584898.target(e,tp,eg,ep,ev,re,r,rp,chk,chkc)
if chkc then return chkc:IsLocation(LOCATION_MZONE) and chkc:IsFaceup() end
if chk==0 then return Duel.IsExistingTarget(Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,nil) end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_EQUIP)
Duel.SelectTarget(tp,Card.IsFaceup,tp,LOCATION_MZONE,LOCATION_MZONE,1,1,nil)
Duel.SetOperationInfo(0,CATEGORY_EQUIP,e:GetHandler(),1,0,0)
end
function c83584898.operation(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstTarget()
if e:GetHandler():IsRelateToEffect(e) and tc:IsRelateToEffect(e) and tc:IsFaceup() then
Duel.Equip(tp,e:GetHandler(),tc)
end
end
function c83584898.damcon(e,tp,eg,ep,ev,re,r,rp)
return tp==Duel.GetTurnPlayer()
end
function c83584898.damtg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
local p=e:GetHandler():GetEquipTarget():GetControler()
Duel.SetTargetPlayer(p)
Duel.SetTargetParam(500)
Duel.SetOperationInfo(0,CATEGORY_RECOVER,nil,0,p,500)
end
function c83584898.damop(e,tp,eg,ep,ev,re,r,rp)
if not e:GetHandler():IsRelateToEffect(e) then return end
local p=e:GetHandler():GetEquipTarget():GetControler()
local d=Duel.GetChainInfo(0,CHAININFO_TARGET_PARAM)
Duel.Damage(p,d,REASON_EFFECT)
end
...@@ -12,7 +12,7 @@ function c91422370.initial_effect(c) ...@@ -12,7 +12,7 @@ function c91422370.initial_effect(c)
c:RegisterEffect(e1) c:RegisterEffect(e1)
end end
function c91422370.costfilter(c) function c91422370.costfilter(c)
return c:IsFaceup() and c:IsSetCard(0x58) and c:IsAttackAbove(1500) return c:IsSetCard(0x58) and c:IsAttackAbove(1500)
end end
function c91422370.cost(e,tp,eg,ep,ev,re,r,rp,chk) function c91422370.cost(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.CheckReleaseGroup(tp,c91422370.costfilter,1,nil) end if chk==0 then return Duel.CheckReleaseGroup(tp,c91422370.costfilter,1,nil) end
......
...@@ -35,6 +35,8 @@ ...@@ -35,6 +35,8 @@
!system 81 进入结束阶段 !system 81 进入结束阶段
!system 90 是否不解放怪物通常召唤? !system 90 是否不解放怪物通常召唤?
!system 91 是否使用额外的召唤机会? !system 91 是否使用额外的召唤机会?
!system 100 先攻
!system 101 后攻
!system 500 请选择要解放的卡 !system 500 请选择要解放的卡
!system 501 请选择要丢弃的手牌 !system 501 请选择要丢弃的手牌
!system 502 请选择要破坏的卡 !system 502 请选择要破坏的卡
...@@ -210,15 +212,15 @@ ...@@ -210,15 +212,15 @@
!system 1234 主机名称: !system 1234 主机名称:
!system 1235 主机密码: !system 1235 主机密码:
!system 1236 允许启动效果优先权 !system 1236 允许启动效果优先权
!system 1240 OCG专有 !system 1240 OCG
!system 1241 TCG专有 !system 1241 TCG
!system 1242 全部允许 !system 1242 OCG&TCG
!system 1243 全部禁止 !system 1243 专有卡禁止
!system 1244 单局模式 !system 1244 单局模式
!system 1245 比赛模式 !system 1245 比赛模式
!system 1250 决斗准备 !system 1250 决斗准备
!system 1251 决斗者 !system 1251 决斗者
!system 1252 观战 !system 1252 观战
!system 1253 当前观战人数: !system 1253 当前观战人数:
!system 1254 卡组选择: !system 1254 卡组选择:
!system 1255 准备完毕! !system 1255 准备完毕!
...@@ -242,7 +244,7 @@ ...@@ -242,7 +244,7 @@
!system 1312 怪兽 !system 1312 怪兽
!system 1313 魔法 !system 1313 魔法
!system 1314 陷阱 !system 1314 陷阱
!system 1315 准入 !system 1315 禁限
!system 1316 禁止 !system 1316 禁止
!system 1317 限制 !system 1317 限制
!system 1318 准限制 !system 1318 准限制
...@@ -270,6 +272,14 @@ ...@@ -270,6 +272,14 @@
!system 1350 等待对方行动中... !system 1350 等待对方行动中...
!system 1351 等待对方行动中.... !system 1351 等待对方行动中....
!system 1352 等待对方行动中..... !system 1352 等待对方行动中.....
!system 1400 无法连接到主机。
!system 1401 连接已断开。
!system 1402 网络传输发生错误。
!system 1403 无法加入主机。
!system 1404 密码错误。
!system 1405 主机拒绝了连接。
!system 1406 无效卡组。
!system 1407 「%ls」的数量不符合当前设定。
#vistory reason #vistory reason
!victory 0x1 LP变成0 !victory 0x1 LP变成0
!victory 0x2 没有卡可抽 !victory 0x2 没有卡可抽
...@@ -298,3 +308,4 @@ ...@@ -298,3 +308,4 @@
!counter 0x13 混沌指示物 !counter 0x13 混沌指示物
!counter 0x14 指示物(奇迹之侏罗纪蛋) !counter 0x14 指示物(奇迹之侏罗纪蛋)
!counter 0x15 冰指示物 !counter 0x15 冰指示物
!counter 0x16 魔石指示物
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
antialias = 2 antialias = 2
nickname = Player nickname = Player
gamename = Game gamename = Game
lastdeck = infernity lastdeck = gadget
textfont = c:/windows/fonts/simsun.ttc textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf numfont = c:/windows/fonts/arialbd.ttf
serverport = 7911 serverport = 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