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 {
......
......@@ -135,7 +135,9 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->gMutex.Lock();
mainGame->CloseDuelWindow();
mainGame->gMutex.Unlock();
mainGame->dInfo.isStarted = false;
mainGame->device->setEventReceiver(&mainGame->menuHandler);
mainGame->ShowElement(mainGame->wLanWindow);
......@@ -231,10 +233,6 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf);
myswprintf(msgbuf, L"%ls%ls\n", dataManager.GetSysString(1227), dataManager.GetSysString(1244 + pkt->info.mode));
str.append(msgbuf);
if(pkt->info.enable_priority) {
myswprintf(msgbuf, L"*%ls\n", dataManager.GetSysString(1236));
str.append(msgbuf);
}
str.append(L"==========\n");
myswprintf(msgbuf, L"%ls%d\n", dataManager.GetSysString(1231), pkt->info.start_lp);
str.append(msgbuf);
......@@ -242,6 +240,10 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
str.append(msgbuf);
myswprintf(msgbuf, L"%ls%d\n", dataManager.GetSysString(1233), pkt->info.draw_count);
str.append(msgbuf);
if(pkt->info.enable_priority) {
myswprintf(msgbuf, L"*%ls\n", dataManager.GetSysString(1236));
str.append(msgbuf);
}
if(pkt->info.no_check_deck) {
myswprintf(msgbuf, L"*%ls\n", dataManager.GetSysString(1229));
str.append(msgbuf);
......@@ -253,11 +255,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->gMutex.Lock();
mainGame->SetStaticText(mainGame->stHostSingleRule, 180, mainGame->guiFont, (wchar_t*)str.c_str());
mainGame->RefreshDeck(mainGame->cbDeckSelect);
mainGame->gMutex.Unlock();
if(mainGame->wCreateHost->isVisible())
mainGame->HideElement(mainGame->wCreateHost);
else if (mainGame->wLanWindow->isVisible())
mainGame->HideElement(mainGame->wLanWindow);
mainGame->gMutex.Unlock();
mainGame->WaitFrameSignal(10);
mainGame->ShowElement(mainGame->wHostSingle);
mainGame->WaitFrameSignal(10);
......@@ -317,7 +319,9 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
mainGame->gMutex.Lock();
mainGame->CloseDuelWindow();
mainGame->gMutex.Unlock();
mainGame->ShowElement(mainGame->wLanWindow);
mainGame->dInfo.isStarted = false;
mainGame->btnCreateHost->setEnabled(true);
......@@ -410,9 +414,8 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->stACMessage->setText(L"Error occurs.");
mainGame->PopupElement(mainGame->wACMessage, 100);
mainGame->WaitFrameSignal(120);
if(!mainGame->dField.is_replaying) {
if(!mainGame->dInfo.isReplay)
mainGame->dInfo.isStarted = false;
}
return false;
}
case MSG_HINT: {
......@@ -438,7 +441,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
break;
}
case HINT_OPSELECTED: {
myswprintf(textBuffer, L"对方选择了:[%ls]", dataManager.GetDesc(data));
myswprintf(textBuffer, dataManager.GetSysString(1510), dataManager.GetDesc(data));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, textBuffer);
......@@ -454,7 +457,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
break;
}
case HINT_RACE: {
myswprintf(textBuffer, L"对方宣言了:[%ls]", dataManager.FormatRace(data));
myswprintf(textBuffer, dataManager.GetSysString(1511), dataManager.FormatRace(data));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, textBuffer);
......@@ -463,7 +466,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
break;
}
case HINT_ATTRIB: {
myswprintf(textBuffer, L"对方宣言了:[%ls]", dataManager.FormatAttribute(data));
myswprintf(textBuffer, dataManager.GetSysString(1511), dataManager.FormatAttribute(data));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, textBuffer);
......@@ -472,7 +475,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
break;
}
case HINT_CODE: {
myswprintf(textBuffer, L"对方宣言了:[%ls]", dataManager.GetName(data));
myswprintf(textBuffer, dataManager.GetSysString(1511), dataManager.GetName(data));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(data);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, textBuffer);
......@@ -481,7 +484,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
break;
}
case HINT_NUMBER: {
myswprintf(textBuffer, L"对方选择了:[%d]", data);
myswprintf(textBuffer, dataManager.GetSysString(1512), data);
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
mainGame->SetStaticText(mainGame->stACMessage, 310, mainGame->textFont, textBuffer);
......@@ -503,26 +506,26 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
int player = BufferIO::ReadInt8(pbuf);
int type = BufferIO::ReadInt8(pbuf);
if(player == 2)
myswprintf(textBuffer, L"Draw Game.\n原因:%ls", dataManager.GetVictoryString(type));
myswprintf(textBuffer, L"Draw Game.\n(%ls)", dataManager.GetVictoryString(type));
else if(mainGame->LocalPlayer(player) == 0) {
if(!mainGame->dField.is_replaying) {
if(!mainGame->dInfo.isReplay) {
if(type == 1 || type == 2)
myswprintf(textBuffer, L"You Win!\n原因:%ls%ls", mainGame->LocalName(1), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"You Win!\n原因:%ls", dataManager.GetVictoryString(type));
myswprintf(textBuffer, L"You Win!\n(%ls%ls)", mainGame->LocalName(1), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"You Win!\n(%ls)", dataManager.GetVictoryString(type));
} else {
if(type == 1 || type == 2)
myswprintf(textBuffer, L"%ls Win!\n原因:%ls%ls", mainGame->LocalName(0), mainGame->LocalName(1), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"%ls Win!\n原因:%ls", mainGame->LocalName(0), dataManager.GetVictoryString(type));
myswprintf(textBuffer, L"%ls Win!\n(%ls%ls)", mainGame->LocalName(0), mainGame->LocalName(1), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"%ls Win!\n(%ls)", mainGame->LocalName(0), dataManager.GetVictoryString(type));
}
} else {
if(!mainGame->dField.is_replaying) {
if(!mainGame->dInfo.isReplay) {
if(type == 1 || type == 2)
myswprintf(textBuffer, L"You Lose!\n原因:%ls%ls", mainGame->LocalName(0), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"You Lose!\n原因:%ls", dataManager.GetVictoryString(type));
myswprintf(textBuffer, L"You Lose!\n(%ls%ls)", mainGame->LocalName(0), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"You Lose!\n(%ls)", dataManager.GetVictoryString(type));
} else {
if(type == 1 || type == 2)
myswprintf(textBuffer, L"%ls Win!\n原因:%ls%ls", mainGame->LocalName(1), mainGame->LocalName(0), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"%ls Win!\n原因:%ls", mainGame->LocalName(1), dataManager.GetVictoryString(type));
myswprintf(textBuffer, L"%ls Win!\n(%ls%ls)", mainGame->LocalName(1), mainGame->LocalName(0), dataManager.GetVictoryString(type));
else myswprintf(textBuffer, L"%ls Win!\n(%ls)", mainGame->LocalName(1), dataManager.GetVictoryString(type));
}
}
mainGame->stACMessage->setText(textBuffer);
......@@ -533,14 +536,16 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
case MSG_WAITING: {
mainGame->waitFrame = 0;
mainGame->gMutex.Lock();
mainGame->stHintMsg->setText(L"等待对方行动中...");
mainGame->stHintMsg->setText(dataManager.GetSysString(1390));
mainGame->stHintMsg->setVisible(true);
mainGame->gMutex.Unlock();
return true;
}
case MSG_START: {
mainGame->gMutex.Lock();
mainGame->dInfo.is_first_turn = BufferIO::ReadInt8(pbuf) ? false : true;
int playertype = BufferIO::ReadInt8(pbuf);
mainGame->dInfo.isFirst = (playertype & 0xf) ? false : true;
mainGame->dInfo.isObserver = (playertype & 0xf0) ? true : false;
mainGame->dInfo.lp[mainGame->LocalPlayer(0)] = BufferIO::ReadInt32(pbuf);
mainGame->dInfo.lp[mainGame->LocalPlayer(1)] = BufferIO::ReadInt32(pbuf);
myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]);
......@@ -563,14 +568,6 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->gMutex.Lock();
mainGame->dField.UpdateFieldCard(player, location, pbuf);
mainGame->gMutex.Unlock();
if (location == LOCATION_HAND && mainGame->dInfo.is_shuffling) {
mainGame->dInfo.is_shuffling = false;
for(int i = 0; i < mainGame->dField.hand[0].size(); ++i) {
mainGame->dField.hand[0][i]->is_hovered = false;
mainGame->dField.MoveCard(mainGame->dField.hand[0][i], 5);
}
mainGame->WaitFrameSignal(5);
}
return true;
}
case MSG_UPDATE_CARD: {
......@@ -751,7 +748,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
if (pcard->code != code)
pcard->SetCode(code);
BufferIO::ReadInt8(pbuf);
myswprintf(textBuffer, L"是否在[%ls]发动[%ls]的效果?", dataManager.FormatLocation(l), dataManager.GetName(code));
myswprintf(textBuffer, dataManager.GetSysString(200), dataManager.FormatLocation(l), dataManager.GetName(code));
mainGame->gMutex.Lock();
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, textBuffer);
mainGame->PopupElement(mainGame->wQuery);
......@@ -789,7 +786,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->dField.selected_option = 0;
if(select_hint)
myswprintf(textBuffer, L"%ls", dataManager.GetDesc(select_hint));
else myswprintf(textBuffer, L"请选择一个选项:");
else myswprintf(textBuffer, dataManager.GetSysString(555));
select_hint = 0;
mainGame->wOptions->setText(textBuffer);
mainGame->PopupElement(mainGame->wOptions);
......@@ -834,7 +831,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
if(select_hint)
myswprintf(textBuffer, L"%ls(%d-%d)", dataManager.GetDesc(select_hint),
mainGame->dField.select_min, mainGame->dField.select_max);
else myswprintf(textBuffer, L"请选择卡:(%d-%d)", mainGame->dField.select_min, mainGame->dField.select_max);
else myswprintf(textBuffer, L"%ls(%d-%d)", dataManager.GetSysString(560), mainGame->dField.select_min, mainGame->dField.select_max);
select_hint = 0;
if (panelmode) {
mainGame->gMutex.Lock();
......@@ -889,9 +886,9 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
}
mainGame->gMutex.Lock();
if(count == 0)
myswprintf(textBuffer, L"此时没有可以发动的效果\n是否要确认场上的情况?");
myswprintf(textBuffer, L"%ls\n%ls", dataManager.GetSysString(201), dataManager.GetSysString(202));
else
myswprintf(textBuffer, L"%ls\n是否进行连锁?", event_string);
myswprintf(textBuffer, L"%ls\n%ls", event_string, dataManager.GetSysString(203));
mainGame->SetStaticText(mainGame->stQMessage, 310, mainGame->textFont, (wchar_t*)textBuffer);
mainGame->PopupElement(mainGame->wQuery);
mainGame->gMutex.Unlock();
......@@ -911,19 +908,19 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
if (mainGame->dInfo.curMsg == MSG_SELECT_PLACE && mainGame->chkAutoPos->isChecked()) {
int filter;
if (mainGame->dField.selectable_field & 0x1f) {
respbuf[0] = mainGame->dInfo.is_first_turn ? 0 : 1;
respbuf[0] = mainGame->dInfo.isFirst ? 0 : 1;
respbuf[1] = 0x4;
filter = mainGame->dField.selectable_field & 0x1f;
} else if (mainGame->dField.selectable_field & 0x1f00) {
respbuf[0] = mainGame->dInfo.is_first_turn ? 0 : 1;
respbuf[0] = mainGame->dInfo.isFirst ? 0 : 1;
respbuf[1] = 0x8;
filter = (mainGame->dField.selectable_field >> 8) & 0x1f;
} else if (mainGame->dField.selectable_field & 0x1f0000) {
respbuf[0] = mainGame->dInfo.is_first_turn ? 1 : 0;
respbuf[0] = mainGame->dInfo.isFirst ? 1 : 0;
respbuf[1] = 0x4;
filter = (mainGame->dField.selectable_field >> 16) & 0x1f;
} else {
respbuf[0] = mainGame->dInfo.is_first_turn ? 1 : 0;
respbuf[0] = mainGame->dInfo.isFirst ? 1 : 0;
respbuf[1] = 0x8;
filter = (mainGame->dField.selectable_field >> 24) & 0x1f;
}
......@@ -1017,7 +1014,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
pcard->select_seq = i;
pcard->is_selectable = true;
}
mainGame->stHintMsg->setText(L"请选择上级召唤用需要解放的怪兽:");
mainGame->stHintMsg->setText(dataManager.GetSysString(531));
mainGame->stHintMsg->setVisible(false);
mainGame->localAction.Reset();
mainGame->localAction.Wait();
......@@ -1045,7 +1042,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
pcard->select_seq = i;
pcard->is_selectable = true;
}
myswprintf(textBuffer, L"请移除%d个[%ls]: ", mainGame->dField.select_counter_count, dataManager.GetCounterName(mainGame->dField.select_counter_type));
myswprintf(textBuffer, dataManager.GetSysString(204), mainGame->dField.select_counter_count, dataManager.GetCounterName(mainGame->dField.select_counter_type));
mainGame->gMutex.Lock();
mainGame->stHintMsg->setText(textBuffer);
mainGame->stHintMsg->setVisible(true);
......@@ -1086,7 +1083,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->dField.CheckSelectSum();
if(select_hint)
myswprintf(textBuffer, L"%ls(%d)", dataManager.GetDesc(select_hint), mainGame->dField.select_max);
else myswprintf(textBuffer, L"请选择卡:(%d)", mainGame->dField.select_max);
else myswprintf(textBuffer, L"%ls(%d)", dataManager.GetSysString(560), mainGame->dField.select_max);
select_hint = 0;
if (panelmode) {
mainGame->wCardSelect->setText(textBuffer);
......@@ -1128,9 +1125,9 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
return true;
}
if(mainGame->dInfo.curMsg == MSG_SORT_CHAIN)
mainGame->wCardSelect->setText(L"请选择连锁顺序:");
mainGame->wCardSelect->setText(dataManager.GetSysString(206));
else
mainGame->wCardSelect->setText(L"请选择排列顺序:");
mainGame->wCardSelect->setText(dataManager.GetSysString(205));
mainGame->dField.select_min = 0;
mainGame->dField.select_max = count;
mainGame->dField.ShowSelectCard();
......@@ -1144,7 +1141,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
int count = BufferIO::ReadInt8(pbuf);
int code, c, l, s;
ClientCard* pcard;
myswprintf(textBuffer, L"翻开卡组上方%d张卡:", count);
myswprintf(textBuffer, dataManager.GetSysString(207), count);
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
mainGame->dField.selectable_cards.clear();
......@@ -1176,8 +1173,9 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
int count = BufferIO::ReadInt8(pbuf);
int code, c, l, s;
std::vector<ClientCard*> field_confirm;
ClientCard* pcard;
myswprintf(textBuffer, L"确认%d张卡:", count);
std::vector<ClientCard*> panel_confirm;
ClientCard* pcard;
myswprintf(textBuffer, dataManager.GetSysString(208), count);
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(0);
for (int i = 0; i < count; ++i) {
......@@ -1191,9 +1189,9 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
myswprintf(textBuffer, L"%d[%ls]", i, dataManager.GetName(code));
mainGame->lstLog->addItem(textBuffer);
mainGame->logParam.push_back(code);
if (l & 0x41) {
if (l & 0x40) {
float shift = -0.15f;
if ((c == 0 && l == 0x40) || (c == 1 && l == 0x1)) shift = 0.15f;
if (c == 0 && l == 0x40) shift = 0.15f;
pcard->dPos = irr::core::vector3df(shift, 0, 0);
pcard->dRot = irr::core::vector3df(0, 3.14159f / 5.0f, 0);
pcard->is_moving = true;
......@@ -1201,7 +1199,9 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->WaitFrameSignal(45);
mainGame->dField.MoveCard(pcard, 5);
mainGame->WaitFrameSignal(5);
} else
} else if(l & 0x1)
panel_confirm.push_back(pcard);
else
field_confirm.push_back(pcard);
}
if (field_confirm.size() > 0) {
......@@ -1232,27 +1232,34 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
}
mainGame->WaitFrameSignal(45);
for(int i = 0; i < field_confirm.size(); ++i) {
if (pcard->location != LOCATION_HAND)
mainGame->dField.MoveCard(pcard, 5);
mainGame->dField.MoveCard(pcard, 5);
}
mainGame->WaitFrameSignal(5);
}
if (panel_confirm.size()) {
std::sort(panel_confirm.begin(), panel_confirm.end(), ClientCard::client_card_sort);
mainGame->gMutex.Lock();
mainGame->dField.selectable_cards = panel_confirm;
mainGame->dField.ShowSelectCard();
mainGame->gMutex.Unlock();
mainGame->localAction.Reset();
mainGame->localAction.Wait();
}
return true;
}
case MSG_SHUFFLE_DECK: {
int player = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
std::vector<ClientCard*>::iterator cit;
for (int i = 0; i < mainGame->dField.deck[player].size(); ++i)
mainGame->dField.deck[player][i]->code = 0;
for (int i = 0; i < 5; ++i) {
for (cit = mainGame->dField.deck[player].begin(); cit != mainGame->dField.deck[player].end(); ++cit) {
for (auto cit = mainGame->dField.deck[player].begin(); cit != mainGame->dField.deck[player].end(); ++cit) {
(*cit)->dPos = irr::core::vector3df(rand() * 0.4f / RAND_MAX - 0.2f, 0, 0);
(*cit)->dRot = irr::core::vector3df(0, 0, 0);
(*cit)->is_moving = true;
(*cit)->aniFrame = 3;
}
mainGame->WaitFrameSignal(3);
for (cit = mainGame->dField.deck[player].begin(); cit != mainGame->dField.deck[player].end(); ++cit)
for (auto cit = mainGame->dField.deck[player].begin(); cit != mainGame->dField.deck[player].end(); ++cit)
mainGame->dField.MoveCard(*cit, 3);
mainGame->WaitFrameSignal(3);
}
......@@ -1260,11 +1267,11 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
}
case MSG_SHUFFLE_HAND: {
int player = mainGame->LocalPlayer(BufferIO::ReadInt8(pbuf));
std::vector<ClientCard*>::iterator cit;
int count = BufferIO::ReadInt8(pbuf);
mainGame->WaitFrameSignal(5);
if(player == 1) {
bool flip = false;
for (cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit)
for (auto cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit)
if((*cit)->code) {
(*cit)->dPos = irr::core::vector3df(0, 0, 0);
(*cit)->dRot = irr::core::vector3df(1.322f / 5, 3.1415926f / 5, 0);
......@@ -1276,7 +1283,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
if(flip)
mainGame->WaitFrameSignal(5);
}
for (cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit) {
for (auto cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit) {
(*cit)->dPos = irr::core::vector3df((3.9f - (*cit)->curPos.X) / 5, 0, 0);
(*cit)->dRot = irr::core::vector3df(0, 0, 0);
(*cit)->is_moving = true;
......@@ -1284,17 +1291,13 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
(*cit)->aniFrame = 5;
}
mainGame->WaitFrameSignal(20);
for (cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit)
(*cit)->SetCode(0);
if (player == 0)
mainGame->dInfo.is_shuffling = true;
else {
for (cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit) {
(*cit)->is_hovered = false;
mainGame->dField.MoveCard(*cit, 5);
}
mainGame->WaitFrameSignal(5);
for (auto cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit)
(*cit)->SetCode(BufferIO::ReadInt32(pbuf));
for (auto cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit) {
(*cit)->is_hovered = false;
mainGame->dField.MoveCard(*cit, 5);
}
mainGame->WaitFrameSignal(5);
return true;
}
case MSG_REFRESH_DECK: {
......@@ -1626,7 +1629,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
}
case MSG_FIELD_DISABLED: {
int disabled = BufferIO::ReadInt32(pbuf);
if (!mainGame->dInfo.is_first_turn)
if (!mainGame->dInfo.isFirst)
disabled = (disabled >> 16) | (disabled << 16);
mainGame->dField.disabled_field = disabled;
return true;
......@@ -1862,7 +1865,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
myswprintf(event_string, L"对方受到%d伤害", val);
mainGame->lpccolor = 0xffff0000;
mainGame->lpplayer = player;
myswprintf(textBuffer, L" - % d", val);
myswprintf(textBuffer, L"-%d", val);
mainGame->lpcstring = textBuffer;
mainGame->WaitFrameSignal(30);
mainGame->lpframe = 10;
......@@ -1885,7 +1888,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
myswprintf(event_string, L"对方回复%dLP", val);
mainGame->lpccolor = 0xff00ff00;
mainGame->lpplayer = player;
myswprintf(textBuffer, L" + % d", val);
myswprintf(textBuffer, L"+%d", val);
mainGame->lpcstring = textBuffer;
mainGame->WaitFrameSignal(30);
mainGame->lpframe = 10;
......@@ -1893,7 +1896,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->lpcstring = 0;
mainGame->dInfo.lp[player] = final;
mainGame->gMutex.Lock();
myswprintf(mainGame->dInfo.strLP[player], L" % d", mainGame->dInfo.lp[player]);
myswprintf(mainGame->dInfo.strLP[player], L"%d", mainGame->dInfo.lp[player]);
mainGame->gMutex.Unlock();
return true;
}
......@@ -2178,7 +2181,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
}
if(select_hint)
myswprintf(textBuffer, L"%ls", dataManager.GetDesc(select_hint));
else myswprintf(textBuffer, L"请宣言种族");
else myswprintf(textBuffer, dataManager.GetSysString(563));
select_hint = 0;
mainGame->wANRace->setText(textBuffer);
mainGame->PopupElement(mainGame->wANRace);
......@@ -2199,7 +2202,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
}
if(select_hint)
myswprintf(textBuffer, L"%ls", dataManager.GetDesc(select_hint));
else myswprintf(textBuffer, L"请宣言属性");
else myswprintf(textBuffer, dataManager.GetSysString(562));
select_hint = 0;
mainGame->wANAttribute->setText(textBuffer);
mainGame->PopupElement(mainGame->wANAttribute);
......@@ -2213,7 +2216,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->ebANCard->setText(L"");
if(select_hint)
myswprintf(textBuffer, L"%ls", dataManager.GetDesc(select_hint));
else myswprintf(textBuffer, L"请宣言卡名");
else myswprintf(textBuffer, dataManager.GetSysString(564));
select_hint = 0;
mainGame->wANCard->setText(textBuffer);
mainGame->PopupElement(mainGame->wANCard);
......@@ -2235,7 +2238,7 @@ int DuelClient::ClientAnalyze(char* msg, unsigned int len) {
mainGame->cbANNumber->setSelected(0);
if(select_hint)
myswprintf(textBuffer, L"%ls", dataManager.GetDesc(select_hint));
else myswprintf(textBuffer, L"请宣言数字");
else myswprintf(textBuffer, dataManager.GetSysString(565));
select_hint = 0;
mainGame->wANNumber->setText(textBuffer);
mainGame->PopupElement(mainGame->wANNumber);
......
......@@ -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;
......
#include "game.h"
#include "../ocgcore/ocgapi.h"
#include "../ocgcore/card.h"
#include "../ocgcore/duel.h"
#include "../ocgcore/field.h"
#include <algorithm>
#define MSG_REPLAY 0xf0
#define MSG_DUEL_END 0xf1
namespace ygo {
int Game::LocalPlayer(int player) {
return dInfo.is_first_turn ? player : 1 - player;
}
const wchar_t* Game::LocalName(int local_player) {
return local_player == 0 ? dInfo.hostname : dInfo.clientname;
}
/*
void Game::ReplayRefresh(int flag) {
int len = query_field_card(dInfo.pDuel, 0, LOCATION_MZONE, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_MZONE, queryBuffer);
len = query_field_card(dInfo.pDuel, 1, LOCATION_MZONE, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(1), LOCATION_MZONE, queryBuffer);
len = query_field_card(dInfo.pDuel, 0, LOCATION_SZONE, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_SZONE, queryBuffer);
len = query_field_card(dInfo.pDuel, 1, LOCATION_SZONE, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(1), LOCATION_SZONE, queryBuffer);
len = query_field_card(dInfo.pDuel, 0, LOCATION_HAND, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_HAND, queryBuffer);
len = query_field_card(dInfo.pDuel, 1, LOCATION_HAND, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(1), LOCATION_HAND, queryBuffer);
}
void Game::ReplayRefreshHand(int player, int flag) {
int len = query_field_card(dInfo.pDuel, player, LOCATION_HAND, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(player), LOCATION_HAND, queryBuffer);
}
void Game::ReplayRefreshGrave(int player, int flag) {
int len = query_field_card(dInfo.pDuel, 0, LOCATION_GRAVE, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateFieldCard(mainGame->LocalPlayer(player), LOCATION_GRAVE, queryBuffer);
}
void Game::ReplayRefreshSingle(int player, int location, int sequence, int flag) {
int len = query_card(dInfo.pDuel, player, location, sequence, flag, (unsigned char*)queryBuffer, 0);
dField.UpdateCard(mainGame->LocalPlayer(player), location, sequence, queryBuffer);
}
int Game::ReplayThread(void* pd) {
DuelInfo* pdInfo = (DuelInfo*)pd;
Replay& rep = mainGame->lastReplay;
ReplayHeader rh = mainGame->lastReplay.pheader;
pdInfo->is_local_host = true;
int seed = rh.seed;
mainGame->rnd.reset(seed);
pdInfo->is_host_player[0] = true;
pdInfo->is_host_player[1] = false;
pdInfo->is_first_turn = true;
mainGame->lastReplay.ReadData(pdInfo->hostname, 40);
mainGame->lastReplay.ReadData(pdInfo->clientname, 40);
mainGame->gMutex.Lock();
mainGame->imgCard->setImage(mainGame->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->btnReplayStart->setVisible(false);
mainGame->btnReplayPause->setVisible(true);
mainGame->btnReplayStep->setVisible(false);
mainGame->dInfo.engLen = 0;
mainGame->dInfo.msgLen = 0;
mainGame->dInfo.is_local_host = false;
mainGame->dField.panel = 0;
mainGame->dField.hovered_card = 0;
mainGame->dField.clicked_card = 0;
mainGame->gMutex.Unlock();
mainGame->WaitFrameSignal(10);
set_card_reader((card_reader)Game::CardReader);
set_message_handler((message_handler)Game::MessageHandler);
pdInfo->pDuel = create_duel(mainGame->rnd.rand());
int start_lp = mainGame->lastReplay.ReadInt32();
int start_hand = mainGame->lastReplay.ReadInt32();
int draw_count = mainGame->lastReplay.ReadInt32();
int opt = mainGame->lastReplay.ReadInt32();
set_player_info(pdInfo->pDuel, 0, start_lp, start_hand, draw_count);
set_player_info(pdInfo->pDuel, 1, start_lp, start_hand, draw_count);
pdInfo->lp[0] = start_lp;
pdInfo->lp[1] = start_lp;
myswprintf(pdInfo->strLP[0], L"%d", pdInfo->lp[0]);
myswprintf(pdInfo->strLP[1], L"%d", pdInfo->lp[1]);
pdInfo->turn = 0;
pdInfo->strTurn[0] = 0;
mainGame->dField.Clear();
int main = rep.ReadInt32();
for(int i = 0; i < main; ++i)
new_card(pdInfo->pDuel, rep.ReadInt32(), 0, 0, LOCATION_DECK, 0, 0);
int extra = rep.ReadInt32();
for(int i = 0; i < extra; ++i)
new_card(pdInfo->pDuel, rep.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, 0);
mainGame->dField.Initial(0, main, extra);
main = rep.ReadInt32();
for(int i = 0; i < main; ++i)
new_card(pdInfo->pDuel, rep.ReadInt32(), 1, 1, LOCATION_DECK, 0, 0);
extra = rep.ReadInt32();
for(int i = 0; i < extra; ++i)
new_card(pdInfo->pDuel, rep.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, 0);
mainGame->dField.Initial(1, main, extra);
start_duel(pdInfo->pDuel, opt);
mainGame->dField.is_replaying = true;
mainGame->dField.is_pausing = false;
mainGame->dField.is_paused = false;
mainGame->dField.is_swaping = false;
pdInfo->isStarted = true;
char engineBuffer[0x1000];
pdInfo->engFlag = 0;
bool replaying = true;
while (replaying && mainGame->dField.is_replaying && pdInfo->isStarted && !mainGame->is_closing) {
if (pdInfo->engFlag == 2) {
pdInfo->engFlag = 0;
break;
}
int result = process(pdInfo->pDuel);
pdInfo->engLen = result & 0xffff;
pdInfo->engFlag = result >> 16;
if (pdInfo->engLen > 0) {
get_message(pdInfo->pDuel, (byte*)&engineBuffer[2]);
replaying = AnalyzeReplay(pd, engineBuffer);
}
}
end_duel(pdInfo->pDuel);
if(!mainGame->is_closing) {
mainGame->stMessage->setText(L"录像结束");
mainGame->localAction.Reset();
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Wait();
}
pdInfo->isStarted = false;
mainGame->dField.is_replaying = false;
if(!mainGame->is_closing) {
mainGame->gMutex.Lock();
mainGame->wCardImg->setVisible(false);
mainGame->stHintMsg->setVisible(false);
mainGame->stTip->setVisible(false);
mainGame->wInfos->setVisible(false);
mainGame->wReplay->setVisible(false);
mainGame->btnDP->setVisible(false);
mainGame->btnSP->setVisible(false);
mainGame->btnM1->setVisible(false);
mainGame->btnBP->setVisible(false);
mainGame->btnM2->setVisible(false);
mainGame->btnEP->setVisible(false);
mainGame->lstLog->clear();
mainGame->logParam.clear();
mainGame->imgCard->setImage(0);
mainGame->stName->setText(L"");
mainGame->stDataInfo->setText(L"");
mainGame->stText->setText(L"");
mainGame->imageManager.ClearTexture();
mainGame->gMutex.Unlock();
}
return 0;
}
bool Game::AnalyzeReplay(void* pd, char* engbuf) {
DuelInfo* pdInfo = (DuelInfo*)pd;
Replay& rep = mainGame->lastReplay;
char* offset, *pbufw, *pbuf = &engbuf[2];
int player, count, type;
bool pauseable;
while (pbuf - &engbuf[2] < pdInfo->engLen) {
if(mainGame->is_closing)
return false;
if(mainGame->dField.is_swaping) {
mainGame->gMutex.Lock();
mainGame->dField.ReplaySwap();
mainGame->gMutex.Unlock();
mainGame->dField.is_swaping = false;
}
offset = pbuf;
pauseable = true;
pdInfo->engType = NetManager::ReadUInt8(pbuf);
switch (pdInfo->engType) {
case MSG_RETRY: {
SolveMessage(pd, offset, pbuf - offset);
pdInfo->engFlag = 2;
return false;
}
case MSG_HINT: {
pbuf += 6;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_WIN: {
pbuf += 2;
SolveMessage(pd, offset, pbuf - offset);
return false;
}
case MSG_SELECT_BATTLECMD: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count * 11;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 8 + 2;
mainGame->ReplayRefresh();
return rep.ReadNextResponse();
}
case MSG_SELECT_IDLECMD: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 11 + 2;
mainGame->ReplayRefresh();
return rep.ReadNextResponse();
}
case MSG_SELECT_EFFECTYN: {
player = NetManager::ReadInt8(pbuf);
pbuf += 8;
return rep.ReadNextResponse();
}
case MSG_SELECT_YESNO: {
player = NetManager::ReadInt8(pbuf);
pbuf += 4;
return rep.ReadNextResponse();
}
case MSG_SELECT_OPTION: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count * 4;
return rep.ReadNextResponse();
}
case MSG_SELECT_CARD:
case MSG_SELECT_TRIBUTE: {
player = NetManager::ReadInt8(pbuf);
pbuf += 3;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 8;
return rep.ReadNextResponse();
}
case MSG_SELECT_CHAIN: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += 9 + count * 11;
return rep.ReadNextResponse();
}
case MSG_SELECT_PLACE:
case MSG_SELECT_DISFIELD: {
player = NetManager::ReadInt8(pbuf);
pbuf += 5;
return rep.ReadNextResponse();
}
case MSG_SELECT_POSITION: {
player = NetManager::ReadInt8(pbuf);
pbuf += 5;
return rep.ReadNextResponse();
}
case MSG_SELECT_COUNTER: {
player = NetManager::ReadInt8(pbuf);
pbuf += 3;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 8;
return rep.ReadNextResponse();
}
case MSG_SELECT_SUM: {
pbuf++;
player = NetManager::ReadInt8(pbuf);
pbuf += 5;
count = NetManager::ReadInt8(pbuf);
pbuf += count * 11;
return rep.ReadNextResponse();
}
case MSG_SORT_CARD:
case MSG_SORT_CHAIN: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
return rep.ReadNextResponse();
}
case MSG_CONFIRM_DECKTOP: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_CONFIRM_CARDS: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count * 7;
pauseable = false;
break;
}
case MSG_SHUFFLE_DECK: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_SHUFFLE_HAND: {
int oplayer = NetManager::ReadInt8(pbuf);
player = mainGame->LocalPlayer(oplayer);
mainGame->WaitFrameSignal(5);
for (auto cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit) {
(*cit)->dPos = irr::core::vector3df((3.9f - (*cit)->curPos.X) / 5, 0, 0);
(*cit)->dRot = irr::core::vector3df(0, 0, 0);
(*cit)->is_moving = true;
(*cit)->is_hovered = false;
(*cit)->aniFrame = 5;
}
mainGame->WaitFrameSignal(10);
mainGame->ReplayRefreshHand(oplayer);
for (auto cit = mainGame->dField.hand[player].begin(); cit != mainGame->dField.hand[player].end(); ++cit) {
(*cit)->is_hovered = false;
mainGame->dField.MoveCard(*cit, 5);
}
mainGame->WaitFrameSignal(5);
break;
}
case MSG_REFRESH_DECK: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_SWAP_GRAVE_DECK: {
player = NetManager::ReadInt8(pbuf);
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefreshGrave(player);
break;
}
case MSG_SHUFFLE_SET_CARD: {
count = NetManager::ReadInt8(pbuf);
pbuf += count * 8;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_NEW_TURN: {
pbuf++;
mainGame->ReplayRefresh();
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_NEW_PHASE: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
break;
}
case MSG_MOVE: {
int pc = pbuf[4];
int pl = pbuf[5];
int ps = pbuf[6];
int pp = pbuf[7];
int cc = pbuf[8];
int cl = pbuf[9];
int cs = pbuf[10];
int cp = pbuf[11];
pbuf += 16;
SolveMessage(pd, offset, pbuf - offset);
if(pl != cl || pc != cc)
mainGame->ReplayRefreshSingle(cc, cl, cs);
break;
}
case MSG_POS_CHANGE: {
pbuf += 9;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_SET: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SWAP: {
pbuf += 16;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_FIELD_DISABLED: {
pbuf += 4;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SUMMONING: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SUMMONED: {
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
break;
}
case MSG_SPSUMMONING: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SPSUMMONED: {
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
break;
}
case MSG_FLIPSUMMONING: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_FLIPSUMMONED: {
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
break;
}
case MSG_CHAINING: {
pbuf += 16;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_CHAINED: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
break;
}
case MSG_CHAIN_SOLVING: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_CHAIN_SOLVED: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
pauseable = false;
break;
}
case MSG_CHAIN_END: {
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
pauseable = false;
break;
}
case MSG_CHAIN_INACTIVATED: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_CHAIN_DISABLED: {
pbuf++;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_CARD_SELECTED:
case MSG_RANDOM_SELECTED: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count * 4;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_BECOME_TARGET: {
count = NetManager::ReadInt8(pbuf);
pbuf += count * 4;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_DRAW: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbufw = pbuf;
pbuf += count * 4;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_DAMAGE: {
pbuf += 5;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_RECOVER: {
pbuf += 5;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_EQUIP: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_LPUPDATE: {
pbuf += 5;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_UNEQUIP: {
pbuf += 4;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_CARD_TARGET: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_CANCEL_TARGET: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_PAY_LPCOST: {
pbuf += 5;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_ADD_COUNTER: {
pbuf += 6;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_REMOVE_COUNTER: {
pbuf += 6;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_ATTACK: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_BATTLE: {
pbuf += 18;
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_ATTACK_DISABLED: {
SolveMessage(pd, offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_DAMAGE_STEP_START: {
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
pauseable = false;
break;
}
case MSG_DAMAGE_STEP_END: {
SolveMessage(pd, offset, pbuf - offset);
mainGame->ReplayRefresh();
pauseable = false;
break;
}
case MSG_MISSED_EFFECT: {
pbuf += 8;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_TOSS_COIN: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_TOSS_DICE: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += count;
SolveMessage(pd, offset, pbuf - offset);
break;
}
case MSG_ANNOUNCE_RACE: {
player = NetManager::ReadInt8(pbuf);
pbuf += 5;
return rep.ReadNextResponse();
}
case MSG_ANNOUNCE_ATTRIB: {
player = NetManager::ReadInt8(pbuf);
pbuf += 5;
return rep.ReadNextResponse();
}
case MSG_ANNOUNCE_CARD: {
player = NetManager::ReadInt8(pbuf);
return rep.ReadNextResponse();
}
case MSG_ANNOUNCE_NUMBER: {
player = NetManager::ReadInt8(pbuf);
count = NetManager::ReadInt8(pbuf);
pbuf += 4 * count;
return rep.ReadNextResponse();
}
case MSG_COUNT_TURN: {
pbuf += 6;
SolveMessage(pd, offset, pbuf - offset);
break;
}
}
if(pauseable && mainGame->dField.is_pausing) {
mainGame->dField.is_paused = true;
mainGame->localAction.Reset();
mainGame->localAction.Wait();
}
}
return true;
}
*/
}
......@@ -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) {
......
#include "replay_mode.h"
#include "duelclient.h"
#include "game.h"
#include "../ocgcore/field.h"
#include "../ocgcore/mtrandom.h"
namespace ygo {
long ReplayMode::pduel = 0;
Replay ReplayMode::cur_replay;
bool ReplayMode::is_closing;
bool ReplayMode::is_continuing = true;
bool ReplayMode::is_closing = false;
bool ReplayMode::is_pausing = false;
bool ReplayMode::is_paused = false;
bool ReplayMode::is_swaping = false;
bool ReplayMode::exit_pending = false;
wchar_t ReplayMode::event_string[256];
ReplayMode replayMode;
bool ReplayMode::StartReplay() {
return false;
Thread::NewThread(ReplayThread, 0);
return true;
}
void ReplayMode::StopReplay(bool is_exiting) {
is_pausing = false;
is_continuing = false;
is_closing = is_exiting;
exit_pending = true;
mainGame->localAction.Set();
}
void ReplayMode::SwapField() {
if(is_paused)
mainGame->dField.ReplaySwap();
else
is_swaping = true;
}
void ReplayMode::Pause(bool is_pause, bool is_step) {
if(is_pause)
is_pausing = true;
else {
if(!is_step)
is_pausing = false;
mainGame->localAction.Set();
}
}
bool ReplayMode::ReadReplayResponse() {
unsigned char resp[64];
bool result = cur_replay.ReadNextResponse(resp);
if(result)
set_responseb(pduel, resp);
return result;
}
int ReplayMode::ReplayThread(void* param) {
ReplayHeader rh = cur_replay.pheader;
mainGame->dInfo.isFirst = true;
mtrandom rnd;
int seed = rh.seed;
rnd.reset(seed);
cur_replay.ReadData(mainGame->dInfo.hostname, 40);
cur_replay.ReadData(mainGame->dInfo.clientname, 40);
set_card_reader((card_reader)DataManager::CardReader);
//set_message_handler((message_handler)DuelClient::MessageHandler);
pduel = create_duel(rnd.rand());
int start_lp = cur_replay.ReadInt32();
int start_hand = cur_replay.ReadInt32();
int draw_count = cur_replay.ReadInt32();
int opt = cur_replay.ReadInt32();
set_player_info(pduel, 0, start_lp, start_hand, draw_count);
set_player_info(pduel, 1, start_lp, start_hand, draw_count);
mainGame->dInfo.lp[0] = start_lp;
mainGame->dInfo.lp[1] = start_lp;
myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]);
myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]);
mainGame->dInfo.turn = 0;
mainGame->dInfo.strTurn[0] = 0;
int main = cur_replay.ReadInt32();
for(int i = 0; i < main; ++i)
new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_DECK, 0, 0);
int extra = cur_replay.ReadInt32();
for(int i = 0; i < extra; ++i)
new_card(pduel, cur_replay.ReadInt32(), 0, 0, LOCATION_EXTRA, 0, 0);
mainGame->dField.Initial(0, main, extra);
main = cur_replay.ReadInt32();
for(int i = 0; i < main; ++i)
new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_DECK, 0, 0);
extra = cur_replay.ReadInt32();
for(int i = 0; i < extra; ++i)
new_card(pduel, cur_replay.ReadInt32(), 1, 1, LOCATION_EXTRA, 0, 0);
mainGame->dField.Initial(1, main, extra);
start_duel(pduel, opt);
mainGame->dInfo.isStarted = true;
mainGame->dInfo.isReplay = true;
char engineBuffer[0x1000];
is_continuing = true;
exit_pending = false;
int len = 0, flag = 0;
while (is_continuing && !exit_pending) {
int result = process(pduel);
len = result & 0xffff;
flag = result >> 16;
if (len > 0) {
get_message(pduel, (byte*)engineBuffer);
is_continuing = ReplayAnalyze(engineBuffer, len);
}
}
end_duel(pduel);
if(!is_closing) {
mainGame->stMessage->setText(dataManager.GetSysString(1501));
mainGame->localAction.Reset();
mainGame->PopupElement(mainGame->wMessage);
mainGame->localAction.Wait();
mainGame->dInfo.isStarted = false;
mainGame->dInfo.isReplay = false;
mainGame->CloseDuelWindow();
mainGame->ClearTextures();
mainGame->ShowElement(mainGame->wReplay);
mainGame->device->setEventReceiver(&mainGame->menuHandler);
}
return 0;
}
int ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
return 0;
bool ReplayMode::ReplayAnalyze(char* msg, unsigned int len) {
char* offset, *pbufw, *pbuf = msg;
int player, count, type;
bool pauseable;
while (pbuf - msg < len) {
if(is_closing)
return false;
if(is_swaping) {
mainGame->gMutex.Lock();
mainGame->dField.ReplaySwap();
mainGame->gMutex.Unlock();
is_swaping = false;
}
offset = pbuf;
pauseable = true;
mainGame->dInfo.curMsg = BufferIO::ReadUInt8(pbuf);
switch (mainGame->dInfo.curMsg) {
case MSG_RETRY: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
return false;
}
case MSG_HINT: {
pbuf += 6;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_WIN: {
pbuf += 2;
DuelClient::ClientAnalyze(offset, pbuf - offset);
return false;
}
case MSG_SELECT_BATTLECMD: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 8 + 2;
ReplayRefresh();
return ReadReplayResponse();
}
case MSG_SELECT_IDLECMD: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11 + 2;
ReplayRefresh();
return ReadReplayResponse();
}
case MSG_SELECT_EFFECTYN: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 8;
return ReadReplayResponse();
}
case MSG_SELECT_YESNO: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 4;
return ReadReplayResponse();
}
case MSG_SELECT_OPTION: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 4;
return ReadReplayResponse();
}
case MSG_SELECT_CARD:
case MSG_SELECT_TRIBUTE: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 3;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 8;
return ReadReplayResponse();
}
case MSG_SELECT_CHAIN: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += 9 + count * 11;
return ReadReplayResponse();
}
case MSG_SELECT_PLACE:
case MSG_SELECT_DISFIELD: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
return ReadReplayResponse();
}
case MSG_SELECT_POSITION: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
return ReadReplayResponse();
}
case MSG_SELECT_COUNTER: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 3;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 8;
return ReadReplayResponse();
}
case MSG_SELECT_SUM: {
pbuf++;
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 11;
return ReadReplayResponse();
}
case MSG_SORT_CARD:
case MSG_SORT_CHAIN: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
return ReadReplayResponse();
}
case MSG_CONFIRM_DECKTOP: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_CONFIRM_CARDS: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 7;
pauseable = false;
break;
}
case MSG_SHUFFLE_DECK: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_SHUFFLE_HAND: {
int oplayer = BufferIO::ReadInt8(pbuf);
int count = BufferIO::ReadInt8(pbuf);
pbuf += count * 4;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_REFRESH_DECK: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_SWAP_GRAVE_DECK: {
player = BufferIO::ReadInt8(pbuf);
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefreshGrave(player);
break;
}
case MSG_SHUFFLE_SET_CARD: {
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_NEW_TURN: {
pbuf++;
ReplayRefresh();
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_NEW_PHASE: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
break;
}
case MSG_MOVE: {
int pc = pbuf[4];
int pl = pbuf[5];
int ps = pbuf[6];
int pp = pbuf[7];
int cc = pbuf[8];
int cl = pbuf[9];
int cs = pbuf[10];
int cp = pbuf[11];
pbuf += 16;
DuelClient::ClientAnalyze(offset, pbuf - offset);
if(pl != cl || pc != cc)
ReplayRefreshSingle(cc, cl, cs);
break;
}
case MSG_POS_CHANGE: {
pbuf += 9;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_SET: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SWAP: {
pbuf += 16;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_FIELD_DISABLED: {
pbuf += 4;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SUMMONING: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SUMMONED: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
break;
}
case MSG_SPSUMMONING: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_SPSUMMONED: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
break;
}
case MSG_FLIPSUMMONING: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_FLIPSUMMONED: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
break;
}
case MSG_CHAINING: {
pbuf += 16;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_CHAINED: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
break;
}
case MSG_CHAIN_SOLVING: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_CHAIN_SOLVED: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
pauseable = false;
break;
}
case MSG_CHAIN_END: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
pauseable = false;
break;
}
case MSG_CHAIN_INACTIVATED: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_CHAIN_DISABLED: {
pbuf++;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_CARD_SELECTED:
case MSG_RANDOM_SELECTED: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 4;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_BECOME_TARGET: {
count = BufferIO::ReadInt8(pbuf);
pbuf += count * 4;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_DRAW: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbufw = pbuf;
pbuf += count * 4;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_DAMAGE: {
pbuf += 5;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_RECOVER: {
pbuf += 5;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_EQUIP: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_LPUPDATE: {
pbuf += 5;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_UNEQUIP: {
pbuf += 4;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_CARD_TARGET: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_CANCEL_TARGET: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_PAY_LPCOST: {
pbuf += 5;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_ADD_COUNTER: {
pbuf += 6;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_REMOVE_COUNTER: {
pbuf += 6;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_ATTACK: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_BATTLE: {
pbuf += 18;
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_ATTACK_DISABLED: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
pauseable = false;
break;
}
case MSG_DAMAGE_STEP_START: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
pauseable = false;
break;
}
case MSG_DAMAGE_STEP_END: {
DuelClient::ClientAnalyze(offset, pbuf - offset);
ReplayRefresh();
pauseable = false;
break;
}
case MSG_MISSED_EFFECT: {
pbuf += 8;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_TOSS_COIN: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_TOSS_DICE: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += count;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
case MSG_ANNOUNCE_RACE: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
return ReadReplayResponse();
}
case MSG_ANNOUNCE_ATTRIB: {
player = BufferIO::ReadInt8(pbuf);
pbuf += 5;
return ReadReplayResponse();
}
case MSG_ANNOUNCE_CARD: {
player = BufferIO::ReadInt8(pbuf);
return ReadReplayResponse();
}
case MSG_ANNOUNCE_NUMBER: {
player = BufferIO::ReadInt8(pbuf);
count = BufferIO::ReadInt8(pbuf);
pbuf += 4 * count;
return ReadReplayResponse();
}
case MSG_COUNT_TURN: {
pbuf += 6;
DuelClient::ClientAnalyze(offset, pbuf - offset);
break;
}
}
if(pauseable && is_pausing) {
is_paused = true;
mainGame->localAction.Reset();
mainGame->localAction.Wait();
is_paused = false;
}
}
return true;
}
void ReplayMode::ReplayRefresh(int flag) {
unsigned char queryBuffer[0x1000];
int len = query_field_card(pduel, 0, LOCATION_MZONE, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_MZONE, (char*)queryBuffer);
len = query_field_card(pduel, 1, LOCATION_MZONE, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(1), LOCATION_MZONE, (char*)queryBuffer);
len = query_field_card(pduel, 0, LOCATION_SZONE, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_SZONE, (char*)queryBuffer);
len = query_field_card(pduel, 1, LOCATION_SZONE, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(1), LOCATION_SZONE, (char*)queryBuffer);
len = query_field_card(pduel, 0, LOCATION_HAND, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(0), LOCATION_HAND, (char*)queryBuffer);
len = query_field_card(pduel, 1, LOCATION_HAND, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(1), LOCATION_HAND, (char*)queryBuffer);
}
void ReplayMode::ReplayRefreshHand(int player, int flag) {
unsigned char queryBuffer[0x1000];
int len = query_field_card(pduel, player, LOCATION_HAND, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(player), LOCATION_HAND, (char*)queryBuffer);
}
void ReplayMode::SetResponseI(int respI) {
void ReplayMode::ReplayRefreshGrave(int player, int flag) {
unsigned char queryBuffer[0x1000];
int len = query_field_card(pduel, 0, LOCATION_GRAVE, flag, queryBuffer, 0);
mainGame->dField.UpdateFieldCard(mainGame->LocalPlayer(player), LOCATION_GRAVE, (char*)queryBuffer);
}
void ReplayMode::SetResponseB(unsigned char* respB, unsigned char len) {
void ReplayMode::ReplayRefreshSingle(int player, int location, int sequence, int flag) {
unsigned char queryBuffer[0x1000];
int len = query_card(pduel, player, location, sequence, flag, queryBuffer, 0);
mainGame->dField.UpdateCard(mainGame->LocalPlayer(player), location, sequence, (char*)queryBuffer);
}
}
......@@ -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