Commit 7fba40e7 authored by mercury233's avatar mercury233

add chain buttons

parent 93aceb9b
......@@ -123,6 +123,7 @@ public:
virtual bool OnEvent(const irr::SEvent& event);
void GetHoverField(int x, int y);
void ShowMenu(int flag, int x, int y);
void UpdateChainButtons();
void SetResponseSelectedCards() const;
};
......
......@@ -284,6 +284,9 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->btnSideOK->setVisible(true);
if(mainGame->dInfo.player_type < 7)
mainGame->btnLeaveGame->setVisible(false);
mainGame->btnChainIgnore->setVisible(false);
mainGame->btnChainAlways->setVisible(false);
mainGame->btnChainWhenAvail->setVisible(false);
mainGame->deckBuilder.result_string[0] = L'0';
mainGame->deckBuilder.result_string[1] = 0;
mainGame->deckBuilder.results.clear();
......@@ -502,6 +505,11 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
}
case STOC_DUEL_END: {
mainGame->gMutex.Lock();
if(mainGame->dInfo.player_type < 7)
mainGame->btnLeaveGame->setVisible(false);
mainGame->btnChainIgnore->setVisible(false);
mainGame->btnChainAlways->setVisible(false);
mainGame->btnChainWhenAvail->setVisible(false);
mainGame->stMessage->setText(dataManager.GetSysString(1500));
mainGame->PopupElement(mainGame->wMessage);
mainGame->gMutex.Unlock();
......@@ -528,6 +536,9 @@ void DuelClient::HandleSTOCPacketLan(char* data, unsigned int len) {
mainGame->wPhase->setVisible(false);
if(mainGame->dInfo.player_type < 7)
mainGame->btnLeaveGame->setVisible(false);
mainGame->btnChainIgnore->setVisible(false);
mainGame->btnChainAlways->setVisible(false);
mainGame->btnChainWhenAvail->setVisible(false);
time_t nowtime = time(NULL);
struct tm *localedtime = localtime(&nowtime);
char timebuf[40];
......@@ -1214,7 +1225,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
panelmode = true;
}
}
if(!forced && (mainGame->ignore_chain || ((count == 0 || specount == 0) && !mainGame->always_chain))) {
if(!forced && (mainGame->ignore_chain || ((count == 0 || specount == 0) && !mainGame->always_chain)) && (count == 0 || !mainGame->chain_when_avail)) {
SetResponseI(-1);
mainGame->dField.ClearChainSelect();
if(mainGame->chkWaitChain->isChecked() && !mainGame->ignore_chain) {
......@@ -1223,7 +1234,7 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
DuelClient::SendResponse();
return true;
}
if(mainGame->chkAutoChain->isChecked() && forced) {
if(mainGame->chkAutoChain->isChecked() && forced && !(mainGame->always_chain || mainGame->chain_when_avail)) {
SetResponseI(0);
mainGame->dField.ClearChainSelect();
DuelClient::SendResponse();
......@@ -1836,6 +1847,19 @@ int DuelClient::ClientAnalyze(char * msg, unsigned int len) {
mainGame->btnLeaveGame->setText(dataManager.GetSysString(1351));
mainGame->btnLeaveGame->setVisible(true);
}
if(!mainGame->dInfo.isReplay && mainGame->dInfo.player_type < 7) {
if(!mainGame->chkHideChainButton->isChecked()) {
mainGame->btnChainIgnore->setVisible(true);
mainGame->btnChainAlways->setVisible(true);
mainGame->btnChainWhenAvail->setVisible(true);
mainGame->dField.UpdateChainButtons();
}
else {
mainGame->btnChainIgnore->setVisible(false);
mainGame->btnChainAlways->setVisible(false);
mainGame->btnChainWhenAvail->setVisible(false);
}
}
if(mainGame->dInfo.isTag && mainGame->dInfo.turn != 1) {
if(player == 0)
mainGame->dInfo.tag_player[0] = !mainGame->dInfo.tag_player[0];
......
......@@ -127,6 +127,27 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
}
break;
}
case BUTTON_CHAIN_IGNORE: {
mainGame->ignore_chain = mainGame->btnChainIgnore->isPressed();
mainGame->always_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
break;
}
case BUTTON_CHAIN_ALWAYS: {
mainGame->always_chain = mainGame->btnChainAlways->isPressed();
mainGame->ignore_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
break;
}
case BUTTON_CHAIN_WHENAVAIL: {
mainGame->chain_when_avail = mainGame->btnChainWhenAvail->isPressed();
mainGame->always_chain = false;
mainGame->ignore_chain = false;
UpdateChainButtons();
break;
}
case BUTTON_MSG_OK: {
mainGame->HideElement(mainGame->wMessage);
mainGame->actionSignal.Set();
......@@ -884,8 +905,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
irr::core::position2di pos(x, y);
if(x < 300)
break;
if(mainGame->gameConf.control_mode == 1)
if(mainGame->gameConf.control_mode == 1) {
mainGame->always_chain = event.MouseInput.isLeftPressed();
mainGame->ignore_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
}
if(mainGame->wCmdMenu->isVisible() && !mainGame->wCmdMenu->getRelativePosition().isPointInside(pos))
mainGame->wCmdMenu->setVisible(false);
if(panel && panel->isVisible())
......@@ -1219,8 +1244,12 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case irr::EMIE_RMOUSE_LEFT_UP: {
if(mainGame->dInfo.isReplay)
break;
if(mainGame->gameConf.control_mode == 1 && event.MouseInput.X > 300)
if(mainGame->gameConf.control_mode == 1 && event.MouseInput.X > 300) {
mainGame->ignore_chain = event.MouseInput.isRightPressed();
mainGame->always_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
}
mainGame->wCmdMenu->setVisible(false);
if(mainGame->fadingList.size())
break;
......@@ -1518,15 +1547,23 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case irr::EMIE_LMOUSE_PRESSED_DOWN: {
if(!mainGame->dInfo.isStarted)
break;
if(mainGame->gameConf.control_mode == 1 && event.MouseInput.X > 300)
if(mainGame->gameConf.control_mode == 1 && event.MouseInput.X > 300) {
mainGame->always_chain = event.MouseInput.isLeftPressed();
mainGame->ignore_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
}
break;
}
case irr::EMIE_RMOUSE_PRESSED_DOWN: {
if(!mainGame->dInfo.isStarted)
break;
if(mainGame->gameConf.control_mode == 1 && event.MouseInput.X > 300)
if(mainGame->gameConf.control_mode == 1 && event.MouseInput.X > 300) {
mainGame->ignore_chain = event.MouseInput.isRightPressed();
mainGame->always_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
}
break;
}
default:
......@@ -1537,13 +1574,30 @@ bool ClientField::OnEvent(const irr::SEvent& event) {
case irr::EET_KEY_INPUT_EVENT: {
switch(event.KeyInput.Key) {
case irr::KEY_KEY_A: {
if(mainGame->gameConf.control_mode == 0)
if(mainGame->gameConf.control_mode == 0) {
mainGame->always_chain = event.KeyInput.PressedDown;
mainGame->ignore_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
}
break;
}
case irr::KEY_KEY_S: {
if(mainGame->gameConf.control_mode == 0)
if(mainGame->gameConf.control_mode == 0) {
mainGame->ignore_chain = event.KeyInput.PressedDown;
mainGame->always_chain = false;
mainGame->chain_when_avail = false;
UpdateChainButtons();
}
break;
}
case irr::KEY_KEY_D: {
if(mainGame->gameConf.control_mode == 0) {
mainGame->chain_when_avail = event.KeyInput.PressedDown;
mainGame->always_chain = false;
mainGame->ignore_chain = false;
UpdateChainButtons();
}
break;
}
case irr::KEY_KEY_R: {
......@@ -1852,7 +1906,13 @@ void ClientField::ShowMenu(int flag, int x, int y) {
mainGame->wCmdMenu->setVisible(true);
mainGame->wCmdMenu->setRelativePosition(irr::core::recti(x - 20 , y - 20 - height, x + 80, y - 20));
}
void ClientField::UpdateChainButtons() {
if(mainGame->btnChainAlways->isVisible()) {
mainGame->btnChainIgnore->setPressed(mainGame->ignore_chain);
mainGame->btnChainAlways->setPressed(mainGame->always_chain);
mainGame->btnChainWhenAvail->setPressed(mainGame->chain_when_avail);
}
}
void ClientField::SetResponseSelectedCards() const {
unsigned char respbuf[64];
respbuf[0] = selected_cards.size();
......
......@@ -239,6 +239,8 @@ bool Game::Initialize() {
chkIgnore2->setChecked(gameConf.chkIgnore2 != 0);
chkHideSetname = env->addCheckBox(false, rect<s32>(20, 260, 280, 285), tabSystem, -1, dataManager.GetSysString(1354));
chkHideSetname->setChecked(gameConf.chkHideSetname != 0);
chkHideChainButton = env->addCheckBox(false, rect<s32>(20, 290, 280, 315), tabSystem, -1, dataManager.GetSysString(1355));
chkHideChainButton->setChecked(gameConf.chkHideChainButton != 0);
//
wHand = env->addWindow(rect<s32>(500, 450, 825, 605), false, L"");
wHand->getCloseButton()->setVisible(false);
......@@ -522,7 +524,17 @@ bool Game::Initialize() {
wChat->setDrawTitlebar(false);
wChat->setVisible(false);
ebChatInput = env->addEditBox(L"", rect<s32>(3, 2, 710, 22), true, wChat, EDITBOX_CHAT);
//
//chain buttons
btnChainIgnore = env->addButton(rect<s32>(205, 100, 295, 135), 0, BUTTON_CHAIN_IGNORE, dataManager.GetSysString(1292));
btnChainAlways = env->addButton(rect<s32>(205, 140, 295, 175), 0, BUTTON_CHAIN_ALWAYS, dataManager.GetSysString(1293));
btnChainWhenAvail = env->addButton(rect<s32>(205, 180, 295, 215), 0, BUTTON_CHAIN_WHENAVAIL, dataManager.GetSysString(1294));
btnChainIgnore->setIsPushButton(true);
btnChainAlways->setIsPushButton(true);
btnChainWhenAvail->setIsPushButton(true);
btnChainIgnore->setVisible(false);
btnChainAlways->setVisible(false);
btnChainWhenAvail->setVisible(false);
//leave/surrender/exit
btnLeaveGame = env->addButton(rect<s32>(205, 5, 295, 80), 0, BUTTON_LEAVE_GAME, L"");
btnLeaveGame->setVisible(false);
device->setEventReceiver(&menuHandler);
......@@ -600,8 +612,6 @@ void Game::MainLoop() {
driver->endScene();
if(closeSignal.Wait(0))
CloseDuelWindow();
if(!device->isWindowActive())
ignore_chain = false;
fps++;
cur_time = timer->getTime();
if(cur_time < fps * 17 - 20)
......@@ -842,6 +852,7 @@ void Game::LoadConfig() {
gameConf.chkIgnore1 = 0;
gameConf.chkIgnore2 = 0;
gameConf.chkHideSetname = 0;
gameConf.chkHideChainButton = 0;
gameConf.control_mode = 0;
gameConf.draw_field_spell = 1;
gameConf.separate_clear_button = 1;
......@@ -891,6 +902,8 @@ void Game::LoadConfig() {
gameConf.chkIgnore2 = atoi(valbuf);
} else if(!strcmp(strbuf, "hide_setname")) {
gameConf.chkHideSetname = atoi(valbuf);
} else if(!strcmp(strbuf, "hide_chain_button")) {
gameConf.chkHideChainButton = atoi(valbuf);
} else if(!strcmp(strbuf, "control_mode")) {
gameConf.control_mode = atoi(valbuf);
} else if(!strcmp(strbuf, "draw_field_spell")) {
......@@ -945,7 +958,8 @@ void Game::SaveConfig() {
fprintf(fp, "mute_opponent = %d\n", ((mainGame->chkIgnore1->isChecked()) ? 1 : 0));
fprintf(fp, "mute_spectators = %d\n", ((mainGame->chkIgnore2->isChecked()) ? 1 : 0));
fprintf(fp, "hide_setname = %d\n", ((mainGame->chkHideSetname->isChecked()) ? 1 : 0));
fprintf(fp, "#control_mode = 0: Key A/S/R. control_mode = 1: MouseLeft/MouseRight/F9\n");
fprintf(fp, "hide_chain_button = %d\n", ((mainGame->chkHideChainButton->isChecked()) ? 1 : 0));
fprintf(fp, "#control_mode = 0: Key A/S/D/R. control_mode = 1: MouseLeft/MouseRight/NULL/F9\n");
fprintf(fp, "control_mode = %d\n", gameConf.control_mode);
fprintf(fp, "draw_field_spell = %d\n", gameConf.draw_field_spell);
fprintf(fp, "separate_clear_button = %d\n", gameConf.separate_clear_button);
......@@ -1096,6 +1110,9 @@ void Game::CloseDuelWindow() {
stHintMsg->setVisible(false);
btnSideOK->setVisible(false);
btnLeaveGame->setVisible(false);
btnChainIgnore->setVisible(false);
btnChainAlways->setVisible(false);
btnChainWhenAvail->setVisible(false);
wChat->setVisible(false);
lstLog->clear();
logParam.clear();
......
......@@ -32,6 +32,7 @@ struct Config {
int chkIgnore1;
int chkIgnore2;
int chkHideSetname;
int chkHideChainButton;
int control_mode;
int draw_field_spell;
int separate_clear_button;
......@@ -153,6 +154,7 @@ public:
wchar_t* lpcstring;
bool always_chain;
bool ignore_chain;
bool chain_when_avail;
bool is_building;
bool is_siding;
......@@ -191,6 +193,7 @@ public:
irr::gui::IGUICheckBox* chkAutoChain;
irr::gui::IGUICheckBox* chkWaitChain;
irr::gui::IGUICheckBox* chkHideSetname;
irr::gui::IGUICheckBox* chkHideChainButton;
irr::gui::IGUIListBox* lstLog;
irr::gui::IGUIButton* btnClearLog;
irr::gui::IGUIButton* btnSaveLog;
......@@ -387,6 +390,10 @@ public:
irr::gui::IGUIButton* btnReplaySwap;
//surrender/leave
irr::gui::IGUIButton* btnLeaveGame;
//chain control
irr::gui::IGUIButton* btnChainIgnore;
irr::gui::IGUIButton* btnChainAlways;
irr::gui::IGUIButton* btnChainWhenAvail;
};
......@@ -470,6 +477,9 @@ extern Game* mainGame;
#define BUTTON_M2 261
#define BUTTON_EP 262
#define BUTTON_LEAVE_GAME 263
#define BUTTON_CHAIN_IGNORE 264
#define BUTTON_CHAIN_ALWAYS 265
#define BUTTON_CHAIN_WHENAVAIL 266
#define BUTTON_CLEAR_LOG 270
#define LISTBOX_LOG 271
#define SCROLL_CARDTEXT 280
......
......@@ -279,6 +279,9 @@
!system 1281 自定义
!system 1290 忽略对方发言
!system 1291 忽略观战者发言
!system 1292 忽略时点
!system 1293 显示时点
!system 1294 可用时点
!system 1300 禁限卡表:
!system 1301 卡组列表:
!system 1302 保存
......@@ -330,6 +333,7 @@
!system 1352 主要信息:
!system 1353 播放起始于回合:
!system 1354 不显示卡片系列
!system 1355 不显示询问连锁按钮
!system 1360 上一步
!system 1370 星数↑
!system 1371 攻击↑
......
......@@ -18,6 +18,7 @@ waitchain = 0
mute_opponent = 0
mute_spectators = 0
hide_setname = 0
#control_mode = 0: Key A/S/R. control_mode = 1: MouseLeft/MouseRight/F9
hide_chain_button = 0
#control_mode = 0: Key A/S/D/R. control_mode = 1: MouseLeft/MouseRight/NULL/F9
control_mode = 0
draw_field_spell = 1
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