Commit 30f57cac authored by argon.sun's avatar argon.sun

recon

parent 38e38c8c
......@@ -16,7 +16,6 @@ ClientCard::ClientCard() {
is_showtarget = false;
is_highlighting = false;
is_disabled = false;
is_confirming = false;
cmdFlag = 0;
code = 0;
type = 0;
......@@ -37,7 +36,7 @@ ClientCard::ClientCard() {
equipTarget = 0;
}
void ClientCard::SetCode(int code) {
if(location == LOCATION_HAND && controler == 1 && this->code != code)
if(location == LOCATION_HAND && this->code != code)
mainGame->dField.MoveCard(this, 5);
this->code = code;
}
......@@ -48,7 +47,7 @@ void ClientCard::UpdateInfo(char* buf) {
int pdata;
if(flag & QUERY_CODE) {
pdata = BufferIO::ReadInt32(buf);
if(location == LOCATION_HAND && controler == 1 && pdata != code)
if(location == LOCATION_HAND && pdata != code)
mainGame->dField.MoveCard(this, 5);
code = pdata;
}
......
......@@ -58,7 +58,6 @@ public:
bool is_showequip;
bool is_showtarget;
bool is_highlighting;
bool is_confirming;
u32 code;
u32 alias;
u32 type;
......
......@@ -15,8 +15,6 @@ ClientField::ClientField() {
grave_act = false;
remove_act = false;
extra_act = false;
is_replaying = false;
is_paused = false;
for(int p = 0; p < 2; ++p) {
for(int i = 0; i < 5; ++i)
mzone[p].push_back(0);
......@@ -453,7 +451,7 @@ void ClientField::ReplaySwap() {
(*cit)->mTransform.setRotationRadians((*cit)->curRot);
(*cit)->is_moving = false;
}
mainGame->dInfo.is_first_turn = !mainGame->dInfo.is_first_turn;
mainGame->dInfo.isFirst = !mainGame->dInfo.isFirst;
std::swap(mainGame->dInfo.lp[0], mainGame->dInfo.lp[1]);
for(int i = 0; i < 16; ++i)
std::swap(mainGame->dInfo.strLP[0][i], mainGame->dInfo.strLP[1][i]);
......@@ -594,13 +592,13 @@ void ClientField::GetCardLocation(ClientCard* pcard, irr::core::vector3df* t, ir
t->Y = 4.0f;
t->Z = 0.5f + 0.001f * sequence;
}
if(!pcard->is_confirming && !pcard->code) {
if(pcard->code) {
r->X = -0.661f;
r->Y = 0.0f;
r->Z = 0.0f;
} else {
r->X = -0.661f;
r->Y = 0;
r->X = 0.661f;
r->Y = 3.1415926f;
r->Z = 0;
}
} else {
......
......@@ -40,11 +40,6 @@ public:
std::vector<int> select_options;
std::vector<ChainInfo> chains;
bool is_replaying;
bool is_pausing;
bool is_paused;
bool is_swaping;
int selected_option;
ClientCard* attacker;
ClientCard* attack_target;
......
......@@ -263,7 +263,7 @@ void Game::DrawMisc() {
}
}
//lp bar
if((dInfo.turn % 2 && dInfo.is_first_turn) || (!(dInfo.turn % 2) && !dInfo.is_first_turn)) {
if((dInfo.turn % 2 && dInfo.isFirst) || (!(dInfo.turn % 2) && !dInfo.isFirst)) {
driver->draw2DRectangle(0xa0000000, recti(327, 8, 630, 51));
driver->draw2DRectangleOutline(recti(327, 8, 630, 51), 0xffff8080);
} else {
......
This diff is collapsed.
......@@ -5,6 +5,7 @@
#include "duelclient.h"
#include "data_manager.h"
#include "image_manager.h"
#include "replay_mode.h"
#include "../ocgcore/field.h"
namespace ygo {
......@@ -42,46 +43,39 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break;
}
case BUTTON_REPLAY_START: {
if(!mainGame->dField.is_replaying)
if(!mainGame->dInfo.isReplay)
break;
is_pausing = false;
is_paused = false;
mainGame->btnReplayStart->setVisible(false);
mainGame->btnReplayPause->setVisible(true);
mainGame->btnReplayStep->setVisible(false);
mainGame->localAction.Set();
ReplayMode::Pause(false, false);
break;
}
case BUTTON_REPLAY_PAUSE: {
if(!mainGame->dField.is_replaying)
if(!mainGame->dInfo.isReplay)
break;
is_pausing = true;
mainGame->btnReplayStart->setVisible(true);
mainGame->btnReplayPause->setVisible(false);
mainGame->btnReplayStep->setVisible(true);
ReplayMode::Pause(true, false);
break;
}
case BUTTON_REPLAY_STEP: {
if(!mainGame->dField.is_replaying)
if(!mainGame->dInfo.isReplay)
break;
is_paused = false;
mainGame->localAction.Set();
ReplayMode::Pause(false, true);
break;
}
case BUTTON_REPLAY_EXIT: {
if(!mainGame->dField.is_replaying)
if(!mainGame->dInfo.isReplay)
break;
mainGame->dField.is_replaying = false;
mainGame->localAction.Set();
ReplayMode::StopReplay();
break;
}
case BUTTON_REPLAY_SWAP: {
if(!mainGame->dField.is_replaying)
if(!mainGame->dInfo.isReplay)
break;
if(is_paused)
ReplaySwap();
else
is_swaping = true;
ReplayMode::SwapField();
break;
}
case BUTTON_REPLAY_SAVE: {
......@@ -592,10 +586,14 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
mainGame->HideElement(mainGame->wCardSelect, true);
}
break;
} else if(mainGame->dInfo.curMsg == MSG_CONFIRM_CARDS) {
mainGame->HideElement(mainGame->wCardSelect, true);
break;
} else {
mainGame->HideElement(mainGame->wCardSelect);
break;
}
break;
}
}
break;
......@@ -755,7 +753,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case irr::EET_MOUSE_INPUT_EVENT: {
switch(event.MouseInput.Event) {
case irr::EMIE_LMOUSE_LEFT_UP: {
if(is_replaying)
if(mainGame->dInfo.isReplay)
break;
if(!mainGame->dInfo.isStarted)
break;
......@@ -1028,7 +1026,7 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
break;
}
case irr::EMIE_RMOUSE_LEFT_UP: {
if(is_replaying)
if(mainGame->dInfo.isReplay)
break;
mainGame->wCmdMenu->setVisible(false);
if(mainGame->fadingFrame)
......
......@@ -109,8 +109,8 @@ bool Game::Initialize() {
cbMatchMode = env->addComboBox(rect<s32>(140, 85, 300, 110), wCreateHost);
cbMatchMode->addItem(dataManager.GetSysString(1244));
cbMatchMode->addItem(dataManager.GetSysString(1245));
chkEnablePriority = env->addCheckBox(false, rect<s32>(20, 120, 360, 140), wCreateHost, -1, dataManager.GetSysString(1236));
env->addStaticText(dataManager.GetSysString(1228), rect<s32>(20, 150, 320, 170), false, false, wCreateHost);
chkEnablePriority = env->addCheckBox(false, rect<s32>(20, 150, 360, 170), wCreateHost, -1, dataManager.GetSysString(1236));
env->addStaticText(dataManager.GetSysString(1228), rect<s32>(20, 120, 320, 140), false, false, wCreateHost);
chkNoCheckDeck = env->addCheckBox(false, rect<s32>(20, 180, 170, 200), wCreateHost, -1, dataManager.GetSysString(1229));
chkNoShuffleDeck = env->addCheckBox(false, rect<s32>(180, 180, 360, 200), wCreateHost, -1, dataManager.GetSysString(1230));
env->addStaticText(dataManager.GetSysString(1231), rect<s32>(20, 210, 320, 230), false, false, wCreateHost);
......@@ -408,11 +408,12 @@ bool Game::Initialize() {
wReplay = env->addWindow(rect<s32>(220, 100, 800, 520), false, dataManager.GetSysString(1200));
wReplay->getCloseButton()->setVisible(false);
wReplay->setVisible(false);
lstReplayList = env->addListBox(rect<s32>(10, 30, 400, 350), wReplay, LISTBOX_REPLAY_LIST, true);
lstReplayList = env->addListBox(rect<s32>(10, 30, 350, 350), wReplay, LISTBOX_REPLAY_LIST, true);
lstReplayList->setItemHeight(18);
btnLoadReplay = env->addButton(rect<s32>(460, 355, 570, 380), wReplay, BUTTON_LOAD_REPLAY, dataManager.GetSysString(1348));
btnReplayCancel = env->addButton(rect<s32>(460, 385, 570, 410), wReplay, BUTTON_CANCEL_REPLAY, dataManager.GetSysString(1347));
stReplayInfo = env->addStaticText(L"", rect<s32>(410, 30, 570, 350), false, true, wReplay);
env->addStaticText(dataManager.GetSysString(1349), rect<s32>(360, 30, 570, 50), false, true, wReplay);
stReplayInfo = env->addStaticText(L"", rect<s32>(360, 60, 570, 350), false, true, wReplay);
//replay save
wReplaySave = env->addWindow(rect<s32>(510, 200, 820, 320), false, dataManager.GetSysString(1340));
wReplaySave->getCloseButton()->setVisible(false);
......@@ -491,11 +492,11 @@ void Game::MainLoop() {
if(waitFrame >= 0) {
waitFrame++;
if(waitFrame % 90 == 0) {
stHintMsg->setText(dataManager.GetSysString(1350));
stHintMsg->setText(dataManager.GetSysString(1390));
} else if(waitFrame % 90 == 30) {
stHintMsg->setText(dataManager.GetSysString(1351));
stHintMsg->setText(dataManager.GetSysString(1391));
} else if(waitFrame % 90 == 60) {
stHintMsg->setText(dataManager.GetSysString(1352));
stHintMsg->setText(dataManager.GetSysString(1392));
}
}
driver->endScene();
......@@ -756,6 +757,15 @@ void Game::CloseDuelWindow() {
wPhase->setVisible(false);
wPosSelect->setVisible(false);
wQuery->setVisible(false);
wReplayControl->setVisible(false);
stHintMsg->setVisible(false);
ClearTextures();
}
int Game::LocalPlayer(int player) {
return dInfo.isFirst ? player : 1 - player;
}
const wchar_t* Game::LocalName(int local_player) {
return local_player == 0 ? dInfo.hostname : dInfo.clientname;
}
}
......@@ -23,8 +23,10 @@ struct Config {
struct DuelInfo {
bool isStarted;
bool isReplay;
bool isObserver;
bool isFirst;
bool is_shuffling;
bool is_first_turn;
int lp[2];
int turn;
short curMsg;
......@@ -65,22 +67,6 @@ public:
int LocalPlayer(int player);
const wchar_t* LocalName(int local_player);
/*
void ReplayRefresh(int flag = 0x181fff);
void ReplayRefreshHand(int player, int flag = 0x181fff);
void ReplayRefreshGrave(int player, int flag = 0x181fff);
void ReplayRefreshSingle(int player, int location, int sequence, int flag = 0x181fff);
static int EngineThread(void*);
static void Proceed(void*);
static void Analyze(void*, char*);
static int RecvThread(void*);
static int GameThread(void*);
static bool SolveMessage(void*, char*, int);
static int ReplayThread(void* pd);
static bool AnalyzeReplay(void*, char*);*/
//
Mutex gMutex;
Mutex gBuffer;
Signal frameSignal;
......
......@@ -4,6 +4,7 @@
#include "duelclient.h"
#include "deck_manager.h"
#include "replay_mode.h"
#include "image_manager.h"
#include "game.h"
namespace ygo {
......@@ -109,14 +110,33 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
}
case BUTTON_REPLAY_MODE: {
mainGame->HideElement(mainGame->wMainMenu, false, mainGame->wReplay);
mainGame->RefreshReplay();
break;
}
case BUTTON_LOAD_REPLAY: {
if(mainGame->lstReplayList->getSelected() == -1)
break;
if(!replayMode.cur_replay.OpenReplay(mainGame->lstReplayList->getListItem(mainGame->lstReplayList->getSelected())))
if(!ReplayMode::cur_replay.OpenReplay(mainGame->lstReplayList->getListItem(mainGame->lstReplayList->getSelected())))
break;
replayMode.StartReplay();
mainGame->imgCard->setImage(imageManager.tCover);
mainGame->wCardImg->setVisible(true);
mainGame->wInfos->setVisible(true);
mainGame->wReplay->setVisible(true);
mainGame->stName->setText(L"");
mainGame->stInfo->setText(L"");
mainGame->stDataInfo->setText(L"");
mainGame->stText->setText(L"");
mainGame->wReplayControl->setVisible(true);
mainGame->btnReplayStart->setVisible(false);
mainGame->btnReplayPause->setVisible(true);
mainGame->btnReplayStep->setVisible(false);
mainGame->dField.panel = 0;
mainGame->dField.hovered_card = 0;
mainGame->dField.clicked_card = 0;
mainGame->dField.Clear();
mainGame->HideElement(mainGame->wReplay);
mainGame->device->setEventReceiver(&mainGame->dField);
ReplayMode::StartReplay();
break;
}
case BUTTON_CANCEL_REPLAY: {
......@@ -135,7 +155,6 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->wFilter->setVisible(true);
mainGame->deckBuilder.filterList = deckManager._lfList[0].content;;
mainGame->cbDBLFList->setSelected(0);
mainGame->device->setEventReceiver(&mainGame->deckBuilder);
mainGame->cbCardType->setSelected(0);
mainGame->cbCardType2->setSelected(0);
mainGame->cbAttribute->setSelected(0);
......@@ -154,6 +173,7 @@ bool MenuHandler::OnEvent(const irr::SEvent& event) {
mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear();
mainGame->deckBuilder.is_draging = false;
mainGame->device->setEventReceiver(&mainGame->deckBuilder);
for(int i = 0; i < 32; ++i)
mainGame->chkCategory[i]->setChecked(false);
break;
......
This diff is collapsed.
......@@ -147,18 +147,13 @@ bool Replay::CheckReplay(const wchar_t* name) {
return rheader.id == 0x31707279 && rheader.version >= 0x1020;
}
bool Replay::ReadNextResponse(unsigned char resp[64]) {
char resType = *pdata++;
if(pdata - replay_data >= replay_size)
return false;
if(resType == 1) {
*((int*)resp) = *((int*)pdata);
pdata += 4;
} else if(resType = 2) {
int len = *pdata++;
for(int i = 0; i < len; ++i)
resp[i] = *pdata++;
} else
int len = *pdata++;
if(len > 64)
return false;
memcpy(resp, pdata, len);
pdata += len;
return true;
}
void Replay::ReadData(void* data, unsigned int length) {
......
This diff is collapsed.
......@@ -11,7 +11,13 @@ namespace ygo {
class ReplayMode {
private:
static long pduel;
static bool is_continuing;
static bool is_closing;
static bool is_pausing;
static bool is_paused;
static bool is_swaping;
static bool exit_pending;
static wchar_t event_string[256];
public:
static Replay cur_replay;
......@@ -19,15 +25,18 @@ public:
public:
static bool StartReplay();
static void StopReplay(bool is_exiting = false);
static void SwapField();
static void Pause(bool is_pause, bool is_step);
static bool ReadReplayResponse();
static int ReplayThread(void* param);
static int ReplayAnalyze(char* msg, unsigned int len);
static void SetResponseI(int respI);
static void SetResponseB(unsigned char* respB, unsigned char len);
static bool ReplayAnalyze(char* msg, unsigned int len);
static void ReplayRefresh(int flag = 0x181fff);
static void ReplayRefreshHand(int player, int flag = 0x181fff);
static void ReplayRefreshGrave(int player, int flag = 0x181fff);
static void ReplayRefreshSingle(int player, int location, int sequence, int flag = 0x181fff);
};
extern ReplayMode replayMode;
}
#endif //REPLAY_MODE_H
......@@ -4,6 +4,7 @@
#include "../ocgcore/card.h"
#include "../ocgcore/duel.h"
#include "../ocgcore/field.h"
#include "../ocgcore/mtrandom.h"
namespace ygo {
......@@ -285,6 +286,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
if(dp->state != CTOS_TP_RESULT)
return;
bool swapped = false;
mtrandom rnd;
if((tp && dp->type == 1) || (!tp && dp->type == 0)) {
DuelPlayer* p = players[0];
players[0] = players[1];
......@@ -300,6 +302,7 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
ReplayHeader rh;
rh.id = 0x31707279;
rh.version = PRO_VERSION;
rh.flag = 0;
time_t seed = time(0);
rh.seed = seed;
last_replay.BeginRecord();
......@@ -364,14 +367,13 @@ void SingleDuel::TPResult(DuelPlayer* dp, unsigned char tp) {
BufferIO::WriteInt16(pbuf, query_field_count(pduel, 1, 0x1));
BufferIO::WriteInt16(pbuf, query_field_count(pduel, 1, 0x40));
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, startbuf, 18);
if(!swapped)
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
startbuf[1] = 1;
NetServer::SendBufferToPlayer(players[1], STOC_GAME_MSG, startbuf, 18);
if(swapped)
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
startbuf[1] = 0x10;
else startbuf[1] = 0x11;
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::SendBufferToPlayer(*oit, STOC_GAME_MSG, startbuf, 18);
RefreshExtra(0);
RefreshExtra(1);
start_duel(pduel, opt);
......@@ -587,12 +589,20 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
case MSG_CONFIRM_CARDS: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
if(pbuf[5] == LOCATION_HAND) {
pbuf += count * 7;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1 - player]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
} else {
pbuf += count * 7;
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, pbuf - offset);
}
break;
}
case MSG_SHUFFLE_DECK: {
pbuf++;
player = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
......@@ -601,8 +611,11 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
}
case MSG_SHUFFLE_HAND: {
player = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[0], STOC_GAME_MSG, offset, pbuf - offset);
NetServer::ReSendToPlayer(players[1]);
count = BufferIO::ReadInt8(pbuf);
NetServer::SendBufferToPlayer(players[player], STOC_GAME_MSG, offset, (pbuf - offset) + count * 4);
for(int i = 0; i < count; ++i)
BufferIO::WriteInt32(pbuf, 0);
NetServer::SendBufferToPlayer(players[1 - player], STOC_GAME_MSG, offset, pbuf - offset);
for(auto oit = observers.begin(); oit != observers.end(); ++oit)
NetServer::ReSendToPlayer(*oit);
RefreshHand(player, 0x181fff, 0);
......@@ -1084,6 +1097,7 @@ int SingleDuel::Analyze(char* msgbuffer, unsigned int len) {
void SingleDuel::GetResponse(DuelPlayer* dp, void* pdata, unsigned int len) {
byte resb[64];
memcpy(resb, pdata, len);
last_replay.WriteInt8(len);
last_replay.WriteData(resb, len);
set_responseb(pduel, resb);
players[dp->type]->state = 0xff;
......@@ -1111,6 +1125,8 @@ void SingleDuel::EndDuel() {
void SingleDuel::WaitforResponse(int playerid) {
last_response = playerid;
players[playerid]->state = CTOS_RESPONSE;
unsigned char msg = MSG_WAITING;
NetServer::SendPacketToPlayer(players[1-playerid], STOC_GAME_MSG, msg);
}
void SingleDuel::RefreshMzone(int player, int flag, int use_cache) {
char query_buffer[0x1000];
......
......@@ -4,7 +4,6 @@
#include "config.h"
#include "network.h"
#include "Replay.h"
#include "../ocgcore/mtrandom.h"
namespace ygo {
......@@ -45,7 +44,6 @@ protected:
unsigned char last_response;
std::set<DuelPlayer*> observers;
Replay last_replay;
mtrandom rnd;
};
}
......
......@@ -369,12 +369,16 @@ void field::shuffle(uint8 playerid, uint8 location) {
}
if(location == LOCATION_HAND) {
pduel->write_buffer8(MSG_SHUFFLE_HAND);
pduel->write_buffer8(playerid);
pduel->write_buffer8(player[playerid].list_hand.size());
for(auto cit = player[playerid].list_hand.begin(); cit != player[playerid].list_hand.end(); ++cit)
pduel->write_buffer32((*cit)->data.code);
core.shuffle_hand_check[playerid] = FALSE;
} else {
pduel->write_buffer8(MSG_SHUFFLE_DECK);
pduel->write_buffer8(playerid);
core.shuffle_deck_check[playerid] = FALSE;
}
pduel->write_buffer8(playerid);
}
void field::reset_sequence(uint8 playerid, uint8 location) {
if(location & (LOCATION_ONFIELD))
......
--Reborn Tengu
function c10028593.initial_effect(c)
--spsummon
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(10028593,0))
e1:SetCategory(CATEGORY_SPECIAL_SUMMON)
e1:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_F)
e1:SetCode(EVENT_LEAVE_FIELD)
e1:SetCondition(c10028593.spcon)
e1:SetTarget(c10028593.sptg)
e1:SetOperation(c10028593.spop)
c:RegisterEffect(e1)
end
function c10028593.spcon(e,tp,eg,ep,ev,re,r,rp)
local c=e:GetHandler()
return c:IsPreviousPosition(POS_FACEUP) and not c:IsLocation(LOCATION_DECK)
end
function c10028593.sptg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,nil,1,tp,LOCATION_DECK)
end
function c10028593.spfilter(c,e,tp)
return c:IsCode(10028593) and c:IsCanBeSpecialSummoned(e,0,tp,false,false)
end
function c10028593.spop(e,tp,eg,ep,ev,re,r,rp)
local tc=Duel.GetFirstMatchingCard(c10028593.spfilter,tp,LOCATION_DECK,0,nil,e,tp)
if tc then
Duel.SpecialSummon(tc,0,tp,tp,false,false,POS_FACEUP)
end
end
--Tour Guide From the Underworld
function c10802915.initial_effect(c)
--spsummon
local e2=Effect.CreateEffect(c)
e2:SetDescription(aux.Stringid(10802915,0))
e2:SetCategory(CATEGORY_SPECIAL_SUMMON)
e2:SetType(EFFECT_TYPE_SINGLE+EFFECT_TYPE_TRIGGER_O)
e2:SetCode(EVENT_SUMMON_SUCCESS)
e2:SetTarget(c10802915.sptg)
e2:SetOperation(c10802915.spop)
c:RegisterEffect(e2)
end
function c10802915.filter(c,e,tp)
return c:GetLevel()==3 and c:IsRace(RACE_FIEND) and c:IsCanBeSpecialSummoned(e,0,tp,false,false)
end
function c10802915.sptg(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return Duel.GetLocationCount(tp,LOCATION_MZONE)>0
and Duel.IsExistingMatchingCard(c10802915.filter,tp,LOCATION_HAND+LOCATION_DECK,0,1,nil,e,tp) end
Duel.SetOperationInfo(0,CATEGORY_SPECIAL_SUMMON,nil,1,tp,LOCATION_HAND+LOCATION_DECK)
end
function c10802915.spop(e,tp,eg,ep,ev,re,r,rp)
if Duel.GetLocationCount(tp,LOCATION_MZONE)==0 then return end
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SPSUMMON)
local g=Duel.SelectMatchingCard(tp,c10802915.filter,tp,LOCATION_HAND+LOCATION_DECK,0,1,1,nil,e,tp)
local tc=g:GetFirst()
if tc and Duel.SpecialSummonStep(tc,0,tp,tp,false,false,POS_FACEUP) then
local e1=Effect.CreateEffect(e:GetHandler())
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetCode(EFFECT_DISABLE)
e1:SetReset(RESET_EVENT+0x1fe0000)
tc:RegisterEffect(e1,true)
local e2=Effect.CreateEffect(e:GetHandler())
e2:SetType(EFFECT_TYPE_SINGLE)
e2:SetCode(EFFECT_DISABLE_EFFECT)
e2:SetReset(RESET_EVENT+0x1fe0000)
tc:RegisterEffect(e2,true)
local e3=Effect.CreateEffect(e:GetHandler())
e3:SetType(EFFECT_TYPE_SINGLE)
e3:SetCode(EFFECT_CANNOT_BE_SYNCHRO_MATERIAL)
e3:SetProperty(EFFECT_FLAG_UNCOPYABLE)
e3:SetValue(1)
e3:SetReset(RESET_EVENT+0x1fe0000)
tc:RegisterEffect(e3,true)
Duel.SpecialSummonComplete()
end
end
--Evolzar Dolkka
function c42752141.initial_effect(c)
--xyz summon
aux.AddXyzProcedure(c,c42752141.xyzfilter,2)
c:EnableReviveLimit()
--negate activate
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(42752141,0))
e1:SetCategory(CATEGORY_NEGATE+CATEGORY_DESTROY)
e1:SetProperty(EFFECT_FLAG_DAMAGE_STEP+EFFECT_FLAG_DAMAGE_CAL)
e1:SetType(EFFECT_TYPE_QUICK_O)
e1:SetRange(LOCATION_MZONE)
e1:SetCode(EVENT_CHAINING)
e1:SetCondition(c42752141.condition)
e1:SetCost(c42752141.cost)
e1:SetTarget(c42752141.target)
e1:SetOperation(c42752141.operation)
c:RegisterEffect(e1)
end
function c42752141.xyzfilter(c)
return c:GetLevel()==4 and c:IsRace(RACE_DINOSAUR)
end
function c42752141.condition(e,tp,eg,ep,ev,re,r,rp,chk)
return Duel.GetChainInfo(ev,CHAININFO_TYPE)==TYPE_MONSTER and Duel.IsChainInactivatable(ev)
end
function c42752141.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 c42752141.target(e,tp,eg,ep,ev,re,r,rp,chk)
if chk==0 then return true end
Duel.SetOperationInfo(0,CATEGORY_NEGATE,eg,1,0,0)
if re:GetHandler():IsDestructable() and re:GetHandler():IsRelateToEffect(re) then
Duel.SetOperationInfo(0,CATEGORY_DESTROY,eg,1,0,0)
end
end
function c42752141.operation(e,tp,eg,ep,ev,re,r,rp)
Duel.NegateActivation(ev)
if re:GetHandler():IsRelateToEffect(re) then
Duel.Destroy(eg,REASON_EFFECT)
end
end
--Gladiator Beast Essedarii
function c73285660.initial_effect(c)
c:EnableReviveLimit()
--spsummon condition
local e1=Effect.CreateEffect(c)
e1:SetType(EFFECT_TYPE_SINGLE)
e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE)
e1:SetCode(EFFECT_SPSUMMON_CONDITION)
e1:SetValue(c73285660.splimit)
c:RegisterEffect(e1)
--special summon rule
local e2=Effect.CreateEffect(c)
e2:SetType(EFFECT_TYPE_FIELD)
e2:SetCode(EFFECT_SPSUMMON_PROC)
e2:SetProperty(EFFECT_FLAG_UNCOPYABLE)
e2:SetRange(LOCATION_EXTRA)
e2:SetCondition(c73285660.sprcon)
e2:SetOperation(c73285660.sprop)
c:RegisterEffect(e2)
end
function c73285660.splimit(e,se,sp,st)
return e:GetHandler():GetLocation()~=LOCATION_EXTRA
end
function c73285660.spfilter(c)
local tpe=c:GetOriginalType()
return c:IsSetCard(0x19) and c:IsCanBeFusionMaterial() and
((bit.band(tpe,TYPE_FUSION)>0 and c:IsAbleToExtraAsCost()) or
(bit.band(tpe,TYPE_FUSION)==0 and c:IsAbleToDeckAsCost()))
end
function c73285660.sprcon(e,c)
if c==nil then return true end
local tp=c:GetControler()
return Duel.IsExistingMatchingCard(c73285660.spfilter,tp,LOCATION_MZONE,0,2,nil)
end
function c73285660.sprop(e,tp,eg,ep,ev,re,r,rp,c)
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_TODECK)
local g=Duel.SelectMatchingCard(tp,c73285660.spfilter,tp,LOCATION_MZONE,0,2,2,nil)
local tc=g:GetFirst()
while tc do
if not tc:IsFaceup() then Duel.ConfirmCards(1-tp,tc) end
tc=g:GetNext()
end
Duel.SendtoDeck(g,nil,2,REASON_COST)
end
......@@ -37,6 +37,15 @@
!system 91 是否使用额外的召唤机会?
!system 100 先攻
!system 101 后攻
!system 200 是否在[%ls]发动[%ls]的效果?
!system 201 此时没有可以发动的效果
!system 202 是否要确认场上的情况?
!system 203 是否要进行连锁?
!system 204 请移除%d个[%ls]:
!system 205 请选择排列顺序
!system 206 请选择连锁顺序
!system 207 翻开卡组上方%d张卡:
!system 208 确认%d张卡:
!system 500 请选择要解放的卡
!system 501 请选择要丢弃的手牌
!system 502 请选择要破坏的卡
......@@ -68,16 +77,19 @@
!system 528 请选择要改变表示形式的怪兽
!system 529 请选择自己的卡
!system 530 请选择对方的卡
!system 531 请选择上级召唤用需要解放的怪兽:
!system 550 请选择要发动的效果
!system 551 请选择效果的对象
!system 552 请选择硬币的正反面
!system 553 请选择骰子的结果
!system 554 请选择一个种类
!system 555 请选择一个选项
!system 560 请选择
!system 561 请选择表示形式
!system 562 请选择要宣言的属性
!system 563 请选择要宣言的种族
!system 564 请宣言一个卡名
!system 565 请选择一个数字
!system 1000 卡组
!system 1001 手牌
!system 1002 怪兽区
......@@ -271,9 +283,10 @@
!system 1346 切换视角
!system 1347 退出
!system 1348 载入录像
!system 1350 等待对方行动中...
!system 1351 等待对方行动中....
!system 1352 等待对方行动中.....
!system 1349 录像信息:
!system 1390 等待对方行动中...
!system 1391 等待对方行动中....
!system 1392 等待对方行动中.....
!system 1400 无法连接到主机。
!system 1401 连接已断开。
!system 1402 网络传输发生错误。
......@@ -285,6 +298,9 @@
!system 1500 决斗结束。
!system 1501 录像结束。
!system 1502 连接已断开。
!system 1510 对方选择了:[%ls]
!system 1511 对方宣言了:[%ls]
!system 1512 对方选择了:[%d]
#vistory reason
!victory 0x1 LP变成0
!victory 0x2 没有卡可抽
......
......@@ -3,7 +3,7 @@
antialias = 2
nickname = Player
gamename = Game
lastdeck = chaosls
lastdeck = tgagent
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