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() {
linebuf[p] = 0;
count = atoi(&linebuf[sa]);
(*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);
}
LFList nolimit;
myswprintf(nolimit.listName, L"无限制");
myswprintf(nolimit.listName, L"N/A");
nolimit.hash = 0;
nolimit.content = new std::unordered_map<int, int>;
_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>* 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;
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) {
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;
ccount[code]++;
dc = ccount[code];
auto it = list->find(code);
if(dc > 3 || (it != list->end() && dc > it->second))
return false;
return cit->first;
}
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;
ccount[code]++;
dc = ccount[code];
auto it = list->find(code);
if(dc > 3 || (it != list->end() && dc > it->second))
return false;
return cit->first;
}
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;
ccount[code]++;
dc = ccount[code];
auto it = list->find(code);
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) {
deck.main.clear();
deck.extra.clear();
deck.side.clear();
deck.clear();
int code;
CardData cd;
for(int i = 0; i < mainc; ++i) {
......@@ -120,7 +141,29 @@ void DeckManager::LoadDeck(Deck& deck, int* dbuf, int mainc, int sidec) {
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) {
int sp = 0, ct = 0, mainc = 0, sidec = 0, code;
wchar_t deck[64];
......@@ -158,7 +201,7 @@ bool DeckManager::LoadDeck(const wchar_t* file) {
else mainc++;
}
fclose(fp);
LoadDeck(deckhost, cardlist, mainc, sidec);
LoadDeck(current_deck, cardlist, mainc, sidec);
return true;
}
void DeckManager::SaveDeck(Deck& deck, const wchar_t* name) {
......
......@@ -17,17 +17,29 @@ struct Deck {
std::vector<code_pointer> main;
std::vector<code_pointer> extra;
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 {
public:
Deck deckhost;
Deck deckclient;
Deck current_deck;
std::vector<LFList> _lfList;
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);
bool LoadSide(Deck& deck, int* dbuf, int mainc, int sidec);
bool LoadDeck(const wchar_t* file);
void SaveDeck(Deck& deck, const wchar_t* name);
};
......
......@@ -614,21 +614,21 @@ void Game::DrawDeckBd() {
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(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.deckhost.main.size()], recti(380, 138, 440, 158), 0xffffffff, false, true);
numFont->draw(dataManager.numStrings[deckManager.current_deck.main.size()], recti(379, 137, 439, 157), 0xff000000, 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->draw2DRectangleOutline(recti(309, 159, 797, 436));
int lx;
float dx;
if(deckManager.deckhost.main.size() <= 40) {
if(deckManager.current_deck.main.size() <= 40) {
dx = 436.0f / 9;
lx = 10;
} else {
lx = (deckManager.deckhost.main.size() - 41) / 4 + 11;
lx = (deckManager.current_deck.main.size() - 41) / 4 + 11;
dx = 436.0f / (lx - 1);
}
for(int i = 0; i < deckManager.deckhost.main.size(); ++i) {
DrawThumb(deckManager.deckhost.main[i]->first, position2di(314 + (i % lx) * dx, 164 + (i / lx) * 68), deckBuilder.filterList);
for(int i = 0; i < deckManager.current_deck.main.size(); ++i) {
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)
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() {
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(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.deckhost.extra.size()], recti(380, 441, 440, 461), 0xffffffff, false, true);
numFont->draw(dataManager.numStrings[deckManager.current_deck.extra.size()], recti(379, 440, 439, 460), 0xff000000, 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->draw2DRectangleOutline(recti(309, 462, 797, 533));
if(deckManager.deckhost.extra.size() <= 10)
if(deckManager.current_deck.extra.size() <= 10)
dx = 436.0f / 9;
else dx = 436.0f / (deckManager.deckhost.extra.size() - 1);
for(int i = 0; i < deckManager.deckhost.extra.size(); ++i) {
DrawThumb(deckManager.deckhost.extra[i]->first, position2di(314 + i * dx, 466), deckBuilder.filterList);
else dx = 436.0f / (deckManager.current_deck.extra.size() - 1);
for(int i = 0; i < deckManager.current_deck.extra.size(); ++i) {
DrawThumb(deckManager.current_deck.extra[i]->first, position2di(314 + i * dx, 466), deckBuilder.filterList);
if(deckBuilder.hovered_pos == 2 && deckBuilder.hovered_seq == i)
driver->draw2DRectangleOutline(recti(313 + i * dx, 465, 359 + i * dx, 531));
}
......@@ -654,15 +654,15 @@ void Game::DrawDeckBd() {
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(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.deckhost.side.size()], recti(380, 538, 440, 558), 0xffffffff, false, true);
numFont->draw(dataManager.numStrings[deckManager.current_deck.side.size()], recti(379, 537, 439, 557), 0xff000000, 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->draw2DRectangleOutline(recti(309, 559, 797, 630));
if(deckManager.deckhost.side.size() <= 10)
if(deckManager.current_deck.side.size() <= 10)
dx = 436.0f / 9;
else dx = 436.0f / (deckManager.deckhost.side.size() - 1);
for(int i = 0; i < deckManager.deckhost.side.size(); ++i) {
DrawThumb(deckManager.deckhost.side[i]->first, position2di(314 + i * dx, 564), deckBuilder.filterList);
else dx = 436.0f / (deckManager.current_deck.side.size() - 1);
for(int i = 0; i < deckManager.current_deck.side.size(); ++i) {
DrawThumb(deckManager.current_deck.side[i]->first, position2di(314 + i * dx, 564), deckBuilder.filterList);
if(deckBuilder.hovered_pos == 3 && deckBuilder.hovered_seq == i)
driver->draw2DRectangleOutline(recti(313 + i * dx, 563, 359 + i * dx, 629));
}
......
This diff is collapsed.
......@@ -96,16 +96,16 @@ bool Game::Initialize() {
wCreateHost = env->addWindow(rect<s32>(320, 100, 700, 520), false, dataManager.GetSysString(1224));
wCreateHost->getCloseButton()->setVisible(false);
wCreateHost->setVisible(false);
env->addStaticText(dataManager.GetSysString(1225), rect<s32>(20, 30, 220, 50), false, false, wCreateHost);
cbRule = env->addComboBox(rect<s32>(140, 25, 300, 50), wCreateHost);
env->addStaticText(dataManager.GetSysString(1226), rect<s32>(20, 30, 220, 50), false, false, 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(1241));
cbRule->addItem(dataManager.GetSysString(1242));
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);
cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost);
cbMatchMode->addItem(dataManager.GetSysString(1244));
......
#include "config.h"
#include "game.h"
#include <event2/thread.h>
int main() {
#ifdef _WIN32
......@@ -7,7 +8,9 @@ int main() {
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 2);
WSAStartup(wVersionRequested, &wsaData);
evthread_use_windows_threads();
#else
evthread_use_pthreads();
#endif //_WIN32
ygo::Game _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) {
break;
}
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->btnJoinHost->setEnabled(false);
mainGame->btnJoinCancel->setEnabled(false);
......@@ -46,9 +56,10 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break;
}
case BUTTON_HOST_CONFIRM: {
BufferIO::CopyWStr(mainGame->ebServerName->getText(), mainGame->gameConf.gamename, 20);
if(!NetServer::StartServer(mainGame->gameConf.serverport))
break;
if(!DuelClient::StartClient(0xc0a80264, mainGame->gameConf.serverport)) {
if(!DuelClient::StartClient(0x7f000001, mainGame->gameConf.serverport)) {
NetServer::StopServer();
break;
}
......@@ -64,23 +75,34 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
break;
}
case BUTTON_HS_DUELIST: {
DuelClient::SendPacketToServer(CTOS_HS_TODUELIST);
break;
}
case BUTTON_HS_OBSERVER: {
DuelClient::SendPacketToServer(CTOS_HS_TOOBSERVER);
break;
}
case BUTTON_HS_KICK: {
int id = caller - static_cast<IGUIElement*>(mainGame->btnHostSingleKick[0]);
CTOS_Kick csk;
if(id == 0)
DuelClient::SendPacketToServer(CTOS_HS_KICK1);
else
DuelClient::SendPacketToServer(CTOS_HS_KICK2);
csk.pos = 0;
else csk.pos = 1;
DuelClient::SendPacketToServer(CTOS_HS_KICK, csk);
break;
}
case BUTTON_HS_START: {
if(!mainGame->chkHostSingleReady[0]->isChecked()
|| !!mainGame->chkHostSingleReady[0]->isChecked())
break;
break;
}
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;
}
case BUTTON_DECK_EDIT: {
......@@ -199,7 +221,28 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
if(!caller->isEnabled())
break;
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;
}
}
......
#include "netserver.h"
#include "single_duel.h"
#include "match_duel.h"
namespace ygo {
std::unordered_map<bufferevent*, DuelPlayer> NetServer::users;
......@@ -17,11 +16,6 @@ bool NetServer::StartServer(unsigned short port) {
net_evbase = event_base_new();
if(!net_evbase)
return false;
#ifdef _WIN32
evthread_use_windows_threads();
#else
evthread_use_pthreads();
#endif
sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
......@@ -29,8 +23,11 @@ bool NetServer::StartServer(unsigned short port) {
sin.sin_port = htons(port);
listener = evconnlistener_new_bind(net_evbase, ServerAccept, NULL,
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;
}
evconnlistener_set_error_cb(listener, ServerAcceptError);
Thread::NewThread(ServerThread, net_evbase);
return true;
......@@ -84,10 +81,14 @@ int NetServer::ServerThread(void* param) {
bufferevent_disable(bit->first, EV_READ);
bufferevent_free(bit->first);
}
users.clear();
evconnlistener_free(listener);
event_base_free(net_evbase);
listener = 0;
net_evbase = 0;
if(duel_mode)
delete duel_mode;
duel_mode = 0;
return 0;
}
void NetServer::DisconnectPlayer(DuelPlayer* dp) {
......@@ -106,26 +107,30 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
switch(pktType) {
case CTOS_RESPONSE:
break;
case CTOS_CHANGEDECK:
case CTOS_UPDATE_DECK: {
if(!dp->game || !duel_mode)
return;
duel_mode->UpdateDeck(dp, pdata);
break;
}
case CTOS_PLAYER_INFO: {
CTOS_PlayerInfo* pkt = (CTOS_PlayerInfo*)pdata;
BufferIO::CopyWStr(pkt->name, dp->name, 20);
break;
}
case CTOS_CREATE_GAME: {
if(dp->game || duel_mode || len < sizeof(CTOS_CreateGame))
if(dp->game || duel_mode)
return;
CTOS_CreateGame* pkt = (CTOS_CreateGame*)pdata;
if(pkt->info.mode == MODE_SINGLE) {
duel_mode = new SingleDuel;
} else {
duel_mode = new MatchDuel;
} else if(pkt->info.mode == MODE_SINGLE) {
duel_mode = new SingleDuel;
}
if(pkt->info.rule > 3)
pkt->info.rule = 0;
if(pkt->info.mode > 1)
pkt->info.rule = 0;
pkt->info.mode = 0;
unsigned int hash = 0;
for(auto lfit = deckManager._lfList.begin(); lfit != deckManager._lfList.end(); ++lfit) {
if(pkt->info.lflist == lfit->hash) {
......@@ -147,7 +152,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode->JoinGame(dp, pdata, false);
break;
}
case CTOS_EXIT_GAME: {
case CTOS_LEAVE_GAME: {
if(!duel_mode)
break;
duel_mode->LeaveGame(dp);
......@@ -165,17 +170,18 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, char* data, unsigned int len) {
duel_mode->ToObserver(dp);
break;
}
case CTOS_HS_READY: {
case CTOS_HS_READY:
case CTOS_HS_NOTREADY: {
if(!duel_mode || duel_mode->pduel)
break;
duel_mode->PlayerReady(dp);
duel_mode->PlayerReady(dp, CTOS_HS_NOTREADY - pktType);
break;
}
case CTOS_HS_KICK1:
case CTOS_HS_KICK2: {
case CTOS_HS_KICK: {
if(!duel_mode || duel_mode->pduel)
break;
duel_mode->PlayerKick(dp, pktType - CTOS_HS_KICK1);
CTOS_Kick* pkt = (CTOS_Kick*)pdata;
duel_mode->PlayerKick(dp, pkt->pos);
break;
}
case CTOS_HS_START: {
......
......@@ -12,16 +12,16 @@
namespace ygo {
struct HostInfo {
unsigned int lflist;
unsigned char rule;
unsigned char mode;
unsigned int lflist;
bool enable_priority;
bool no_check_deck;
bool no_shuffle_deck;
unsigned int start_lp;
unsigned char start_hand;
unsigned char draw_count;
};
struct HostPacket {
unsigned short identifier;
unsigned short version;
......@@ -29,15 +29,9 @@ struct HostPacket {
unsigned short port;
HostInfo host;
};
struct HostRequest {
unsigned short identifier;
};
struct CTOS_Response {
};
struct CTOS_ChangeDeck {
};
struct CTOS_PlayerInfo {
unsigned short name[20];
};
......@@ -50,8 +44,11 @@ struct CTOS_JoinGame {
unsigned int gameid;
unsigned short pass[20];
};
struct STOC_DeckError {
unsigned char reason;
struct CTOS_Kick {
unsigned char pos;
};
struct STOC_ErrorMsg {
unsigned char msg;
unsigned int code;
};
struct STOC_CreateGame {
......@@ -59,17 +56,13 @@ struct STOC_CreateGame {
};
struct STOC_JoinGame {
HostInfo info;
};
struct STOC_TypeChange {
unsigned char type;
};
struct STOC_ExitGame {
unsigned pos;
};
struct STOC_JoinFail {
//0 - common error
//1 - password incorrect
//2 - host denied
unsigned int reason;
};
struct STOC_HS_PlayerEnter {
unsigned short name[20];
unsigned char pos;
......@@ -113,7 +106,7 @@ public:
virtual void LeaveGame(DuelPlayer* dp) = 0;
virtual void ToDuelist(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 UpdateDeck(DuelPlayer* dp, void* pdata) = 0;
virtual void StartDuel(DuelPlayer* dp) = 0;
......@@ -146,24 +139,24 @@ public:
#define NETPLAYER_TYPE_OBSERVER 7
#define CTOS_RESPONSE 0x1
#define CTOS_CHANGEDECK 0x2
#define CTOS_UPDATE_DECK 0x2
#define CTOS_PLAYER_INFO 0x10
#define CTOS_CREATE_GAME 0x11
#define CTOS_JOIN_GAME 0x12
#define CTOS_EXIT_GAME 0x13
#define CTOS_LEAVE_GAME 0x13
#define CTOS_HS_TODUELIST 0x20
#define CTOS_HS_TOOBSERVER 0x21
#define CTOS_HS_READY 0x22
#define CTOS_HS_KICK1 0x23
#define CTOS_HS_KICK2 0x24
#define CTOS_HS_NOTREADY 0x23
#define CTOS_HS_KICK 0x24
#define CTOS_HS_START 0x25
#define STOC_GAME_MSG 0x1
#define STOC_DECK_ERROR 0x2
#define STOC_ERROR_MSG 0x2
#define STOC_CREATE_GAME 0x11
#define STOC_JOIN_GAME 0x12
#define STOC_EXIT_GAME 0x13
#define STOC_JOIN_FAIL 0x14
#define STOC_TYPE_CHANGE 0x13
#define STOC_LEAVE_GAME 0x14
#define STOC_GAME_START 0x15
#define STOC_HS_PLAYER_ENTER 0x20
#define STOC_HS_PLAYER_CHANGE 0x21
......@@ -174,6 +167,9 @@ public:
#define PLAYERCHANGE_LEAVE 0x3
#define PLAYERCHANGE_OBSERVE 0x4
#define ERRMSG_JOINERROR 0x1
#define ERRMSG_DECKERROR 0x2
#define MODE_SINGLE 0x0
#define MODE_MATCH 0x1
#endif //NETWORK_H
......@@ -6,19 +6,20 @@ namespace ygo {
void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
if(!is_creater) {
if(dp->game && dp->type != 0xff) {
STOC_JoinFail scjf;
scjf.reason = 0;
NetServer::SendPacketToPlayer(dp, STOC_JOIN_FAIL, scjf);
STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR;
scem.code = 0;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return;
}
CTOS_JoinGame* pkt = (CTOS_JoinGame*)pdata;
wchar_t jpass[20];
for(int i = 0; i < 20; ++i) jpass[i] = pkt->pass[i];
jpass[20] = 0;
BufferIO::CopyWStr(pkt->pass, jpass, 20);
if(wcscmp(jpass, pass)) {
STOC_JoinFail scjf;
scjf.reason = 1;
NetServer::SendPacketToPlayer(dp, STOC_JOIN_FAIL, scjf);
STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR;
scem.code = 1;
NetServer::SendPacketToPlayer(dp, STOC_ERROR_MSG, scem);
return;
}
}
......@@ -27,7 +28,8 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
host_player = dp;
STOC_JoinGame scjg;
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]) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
......@@ -44,16 +46,16 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
if(!players[0]) {
players[0] = dp;
dp->type = NETPLAYER_TYPE_PLAYER1;
scjg.type |= NETPLAYER_TYPE_PLAYER1;
sctc.type |= NETPLAYER_TYPE_PLAYER1;
} else {
players[1] = dp;
dp->type = NETPLAYER_TYPE_PLAYER2;
scjg.type |= NETPLAYER_TYPE_PLAYER2;
sctc.type |= NETPLAYER_TYPE_PLAYER2;
}
} else {
observers.insert(dp);
dp->type = NETPLAYER_TYPE_OBSERVER;
scjg.type |= NETPLAYER_TYPE_OBSERVER;
sctc.type |= NETPLAYER_TYPE_OBSERVER;
STOC_HS_WatchChange scwc;
scwc.watch_count = observers.size();
if(players[0])
......@@ -64,6 +66,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_WATCH_CHANGE, scwc);
}
NetServer::SendPacketToPlayer(dp, STOC_JOIN_GAME, scjg);
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
if(players[0]) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[0]->name, scpe.name, 20);
......@@ -93,7 +96,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, void* pdata, bool is_creater) {
}
}
void SingleDuel::LeaveGame(DuelPlayer* dp) {
if(dp == host_player){
if(dp == host_player) {
NetServer::StopServer();
} else if(dp->type == NETPLAYER_TYPE_OBSERVER) {
if(!pduel) {
......@@ -113,26 +116,86 @@ void SingleDuel::LeaveGame(DuelPlayer* dp) {
NetServer::SendPacketToPlayer(*pit, STOC_HS_PLAYER_CHANGE, scpc);
if(pduel)
NetServer::StopServer();
else
else {
ready[dp->type] = false;
NetServer::DisconnectPlayer(dp);
}
}
}
void SingleDuel::ToDuelist(DuelPlayer* dp) {
if(dp->type != NETPLAYER_TYPE_OBSERVER)
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) {
if(dp->type > 1)
return;
STOC_HS_PlayerChange scpc;
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)
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;
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])
NetServer::SendPacketToPlayer(players[1 - dp->type], STOC_HS_PLAYER_CHANGE, scpc);
for(auto pit = observers.begin(); pit != observers.end(); ++pit)
......@@ -144,8 +207,16 @@ void SingleDuel::PlayerKick(DuelPlayer* dp, unsigned char pos) {
LeaveGame(players[pos]);
}
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) {
if(dp != host_player)
return;
}
void SingleDuel::Process() {
}
......
......@@ -12,7 +12,7 @@ public:
virtual void LeaveGame(DuelPlayer* dp);
virtual void ToDuelist(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 UpdateDeck(DuelPlayer* dp, void* pdata);
virtual void StartDuel(DuelPlayer* dp);
......
......@@ -310,8 +310,7 @@ int32 card::get_attack(uint8 swap) {
break;
case EFFECT_SET_ATTACK:
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;
case EFFECT_SET_ATTACK_FINAL:
if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) {
......@@ -396,8 +395,7 @@ int32 card::get_defence(uint8 swap) {
break;
case EFFECT_SET_DEFENCE:
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;
case EFFECT_SET_DEFENCE_FINAL:
if ((eset[i]->type & EFFECT_TYPE_SINGLE) && !(eset[i]->flag & EFFECT_FLAG_SINGLE_RANGE)) {
......
......@@ -218,6 +218,7 @@ struct processor {
card* attack_target;
card* sub_attack_target;
card* limit_tuner;
uint8 attack_cancelable;
int32 battle_damage[2];
int32 summon_count[2];
int32 spe_effect[2];
......
......@@ -496,15 +496,13 @@ int32 field::pay_lp_cost(uint32 step, uint8 playerid, uint32 cost) {
e.reason_player = playerid;
core.select_options.clear();
core.select_effects.clear();
if(val < player[playerid].lp) {
if(val <= player[playerid].lp) {
core.select_options.push_back(11);
core.select_effects.push_back(0);
}
pair<effect_container::iterator, effect_container::iterator> pr;
pr = effects.continuous_effect.equal_range(EFFECT_LPCOST_REPLACE);
effect* peffect;
auto pr = effects.continuous_effect.equal_range(EFFECT_LPCOST_REPLACE);
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)) {
core.select_options.push_back(peffect->description);
core.select_effects.push_back(peffect);
......@@ -2561,6 +2559,13 @@ int32 field::move_to_field(uint16 step, card * target, uint32 enable, uint32 ret
if(target->current.location & LOCATION_ONFIELD)
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;
if(location != LOCATION_MZONE) {
......
......@@ -2378,6 +2378,7 @@ int32 field::process_battle_command(uint16 step) {
core.to_m2 = FALSE;
if(must_attack.size())
core.to_ep = FALSE;
core.attack_cancelable = TRUE;
add_process(PROCESSOR_SELECT_BATTLECMD, 0, 0, 0, infos.turn_player, 0);
return FALSE;
}
......@@ -2414,6 +2415,20 @@ int32 field::process_battle_command(uint16 step) {
core.attacker = core.attackable_cards[sel];
core.attacker->set_status(STATUS_ATTACK_CANCELED, FALSE);
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;
} else {
core.units.begin()->step = 29;
......@@ -2459,7 +2474,7 @@ int32 field::process_battle_command(uint16 step) {
if(core.select_cards.size() == 1)
returns.bvalue[1] = 0;
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;
return FALSE;
}
......@@ -2477,12 +2492,12 @@ int32 field::process_battle_command(uint16 step) {
if(core.units.begin()->arg2) {
if(core.select_cards.size() == 1)
returns.bvalue[1] = 0;
else
add_process(MSG_SELECT_CARD, 0, 0, 0, 1 - infos.turn_player + 0x20000, 0x10001);
else
add_process(MSG_SELECT_CARD, 0, 0, 0, 1 - infos.turn_player + (core.attack_cancelable ? 0x20000 : 0), 0x10001);
core.units.begin()->step = 5;
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;
return FALSE;
}
......@@ -2492,7 +2507,7 @@ int32 field::process_battle_command(uint16 step) {
return FALSE;
} else {
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
core.units.begin()->step = -1;
}
......@@ -2507,26 +2522,10 @@ int32 field::process_battle_command(uint16 step) {
core.attack_target = 0;
else
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;
}
case 7: {
core.attack_cancelable = TRUE;
core.sub_attacker = 0;
core.sub_attack_target = (card*)0xffffffff;
core.attack_state[infos.turn_player] = TRUE;
......@@ -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))
clit->flag |= CHAIN_DISABLE_EFFECT;
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->target_cards = 0;
clit->target_player = PLAYER_NONE;
......
......@@ -12,7 +12,7 @@ function c11373345.initial_effect(c)
c:RegisterEffect(e1)
end
function c11373345.cfilter(c)
return c:IsFaceup() and c:GetLevel()>=7
return c:IsFaceup() and c:IsLevelAbove(7)
end
function c11373345.condition(e,tp,eg,ep,ev,re,r,rp)
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)
Duel.RegisterEffect(e1,tp)
end
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
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
......
......@@ -57,7 +57,7 @@ function c14017402.operation(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
local tc=Duel.GetFirstTarget()
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 reset_flag=RESET_EVENT+0x1fe0000+RESET_PHASE+RESET_END
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)
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(19578592,0))
e5:SetCategory(CATEGORY_DAMAGE)
e5:SetType(EFFECT_TYPE_FIELD+EFFECT_TYPE_TRIGGER_F)
e5:SetCode(EVENT_PHASE+PHASE_STANDBY)
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)
end
function c22201234.qcon(e,tp,eg,ep,ev,re,r,rp)
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
function c22201234.qcost(e,tp,eg,ep,ev,re,r,rp,chk)
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)
e3:SetType(EFFECT_TYPE_FIELD)
e3:SetCode(EFFECT_UPDATE_ATTACK)
e3:SetRange(LOCATION_SZONE)
e3:SetTargetRange(LOCATION_MZONE,0)
e3:SetTargetRange(LOCATION_MZONE,LOCATION_MZONE)
e3:SetTarget(aux.TargetBoolFunction(Card.IsSetCard,0x38))
e3:SetValue(c36099620.atkval)
c:RegisterEffect(e3)
......
......@@ -3,9 +3,10 @@ function c41902352.initial_effect(c)
--synchro limit
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:Setproperty(EFFECT_FLAG_CANNOT_DISABLE)
e1:SetCode(EFFECT_CANNOT_BE_SYNCHRO_MATERIAL)
e1:SetCondition(c41902352.synlimit)
e1:SetValue(aux.TRUE)
e1:SetValue(1)
c:RegisterEffect(e1)
end
function c41902352.synlimit(e)
......
......@@ -17,7 +17,7 @@ function c45215453.initial_effect(c)
c:RegisterEffect(e1)
end
function c45215453.thcon(e,tp,eg,ep,ev,re,r,rp)
return e:GetHandler():IsDefence()
return Duel.GetTurnPlayer()==tp and e:GetHandler():IsDefence()
end
function c45215453.filter(c)
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)
return c:IsFaceup() and c:IsSetCard(0x27)
end
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
......@@ -11,11 +11,14 @@ function c64034255.initial_effect(c)
e1:SetOperation(c64034255.spop)
c:RegisterEffect(e1)
end
function c64034255.cfilter(c)
return c:IsFaceup() and c:IsAbleToHandAsCost()
end
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.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
Duel.SendtoHand(g,nil,REASON_EFFECT)
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)
c:RegisterEffect(e1)
--attackup
local e2=Effect.CreateEffect(c)
e2:SetDescription(aux.Stringid(71413901,1))
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetProperty(EFFECT_FLAG_SINGLE_RANGE)
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)
e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
e1:SetType(EFFECT_TYPE_ACTIVATE)
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:SetTarget(c80280737.target)
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)
c:RegisterEffect(e2)
end
function c82732705.disable(e,c)
return c:IsFaceup() and c:IsType(TYPE_EFFECT)
return c:IsType(TYPE_EFFECT)
end
function c82732705.cost(e,tp,eg,ep,ev,re,r,rp,chk)
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)
c:RegisterEffect(e1)
end
function c91422370.costfilter(c)
return c:IsFaceup() and c:IsSetCard(0x58) and c:IsAttackAbove(1500)
return c:IsSetCard(0x58) and c:IsAttackAbove(1500)
end
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
......
......@@ -35,6 +35,8 @@
!system 81 进入结束阶段
!system 90 是否不解放怪物通常召唤?
!system 91 是否使用额外的召唤机会?
!system 100 先攻
!system 101 后攻
!system 500 请选择要解放的卡
!system 501 请选择要丢弃的手牌
!system 502 请选择要破坏的卡
......@@ -210,15 +212,15 @@
!system 1234 主机名称:
!system 1235 主机密码:
!system 1236 允许启动效果优先权
!system 1240 OCG专有
!system 1241 TCG专有
!system 1242 全部允许
!system 1243 全部禁止
!system 1240 OCG
!system 1241 TCG
!system 1242 OCG&TCG
!system 1243 专有卡禁止
!system 1244 单局模式
!system 1245 比赛模式
!system 1250 决斗准备
!system 1251 决斗者
!system 1252 观战
!system 1251 决斗者
!system 1252 观战
!system 1253 当前观战人数:
!system 1254 卡组选择:
!system 1255 准备完毕!
......@@ -242,7 +244,7 @@
!system 1312 怪兽
!system 1313 魔法
!system 1314 陷阱
!system 1315 准入
!system 1315 禁限
!system 1316 禁止
!system 1317 限制
!system 1318 准限制
......@@ -270,6 +272,14 @@
!system 1350 等待对方行动中...
!system 1351 等待对方行动中....
!system 1352 等待对方行动中.....
!system 1400 无法连接到主机。
!system 1401 连接已断开。
!system 1402 网络传输发生错误。
!system 1403 无法加入主机。
!system 1404 密码错误。
!system 1405 主机拒绝了连接。
!system 1406 无效卡组。
!system 1407 「%ls」的数量不符合当前设定。
#vistory reason
!victory 0x1 LP变成0
!victory 0x2 没有卡可抽
......@@ -298,3 +308,4 @@
!counter 0x13 混沌指示物
!counter 0x14 指示物(奇迹之侏罗纪蛋)
!counter 0x15 冰指示物
!counter 0x16 魔石指示物
......@@ -3,7 +3,7 @@
antialias = 2
nickname = Player
gamename = Game
lastdeck = infernity
lastdeck = gadget
textfont = c:/windows/fonts/simsun.ttc
numfont = c:/windows/fonts/arialbd.ttf
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