diff --git a/src/app/input.cpp b/src/app/input.cpp index 228b5e9e..9ca2ea45 100644 --- a/src/app/input.cpp +++ b/src/app/input.cpp @@ -66,6 +66,7 @@ CInput::CInput() { INPUT_SLOT_CAMERA_UP, "camup" }, { INPUT_SLOT_CAMERA_DOWN, "camdown" }, { INPUT_SLOT_PAUSE, "pause" }, + { INPUT_SLOT_CMDLINE, "cmdline" }, }; m_kmodState = 0; @@ -275,6 +276,7 @@ void CInput::SetDefaultInputBindings() m_inputBindings[INPUT_SLOT_CAMERA_DOWN].primary = KEY(PAGEDOWN); m_inputBindings[INPUT_SLOT_PAUSE].primary = KEY(PAUSE); m_inputBindings[INPUT_SLOT_PAUSE].secondary = KEY(p); + m_inputBindings[INPUT_SLOT_CMDLINE].primary = KEY(BACKQUOTE); m_joyAxisBindings[JOY_AXIS_SLOT_X].axis = 0; m_joyAxisBindings[JOY_AXIS_SLOT_Y].axis = 1; diff --git a/src/common/event.cpp b/src/common/event.cpp index 7bc9f493..15dfaa8b 100644 --- a/src/common/event.cpp +++ b/src/common/event.cpp @@ -182,6 +182,7 @@ void InitializeEventTypeTexts() EVENT_TYPE_TEXT[EVENT_INTERFACE_READ] = "EVENT_INTERFACE_READ"; EVENT_TYPE_TEXT[EVENT_INTERFACE_ABORT] = "EVENT_INTERFACE_ABORT"; EVENT_TYPE_TEXT[EVENT_INTERFACE_USER] = "EVENT_INTERFACE_USER"; + EVENT_TYPE_TEXT[EVENT_INTERFACE_SATCOM] = "EVENT_INTERFACE_SATCOM"; EVENT_TYPE_TEXT[EVENT_INTERFACE_CHAP] = "EVENT_INTERFACE_CHAP"; EVENT_TYPE_TEXT[EVENT_INTERFACE_LIST] = "EVENT_INTERFACE_LIST"; diff --git a/src/common/event.h b/src/common/event.h index ad3d068d..38d7a592 100644 --- a/src/common/event.h +++ b/src/common/event.h @@ -210,6 +210,7 @@ enum EventType EVENT_INTERFACE_READ = 411, EVENT_INTERFACE_ABORT = 412, EVENT_INTERFACE_USER = 413, + EVENT_INTERFACE_SATCOM = 414, EVENT_INTERFACE_CHAP = 420, EVENT_INTERFACE_LIST = 421, diff --git a/src/common/key.h b/src/common/key.h index d57dd098..83375918 100644 --- a/src/common/key.h +++ b/src/common/key.h @@ -105,6 +105,7 @@ enum InputSlot INPUT_SLOT_CAMERA_UP, INPUT_SLOT_CAMERA_DOWN, INPUT_SLOT_PAUSE, + INPUT_SLOT_CMDLINE, INPUT_SLOT_MAX }; diff --git a/src/common/restext.cpp b/src/common/restext.cpp index 8184c44a..059af142 100644 --- a/src/common/restext.cpp +++ b/src/common/restext.cpp @@ -161,6 +161,7 @@ void InitializeRestext() stringsEvent[EVENT_INTERFACE_FREE] = TR("Free game\\Free game without a specific goal"); stringsEvent[EVENT_INTERFACE_CODE_BATTLES] = TR("Code battles\\Program your robot to be the best of them all!"); stringsEvent[EVENT_INTERFACE_USER] = TR("Custom levels\\Levels from mods created by the users"); + stringsEvent[EVENT_INTERFACE_SATCOM] = TR("SatCom"); stringsEvent[EVENT_INTERFACE_NAME] = TR("Change player\\Change player"); stringsEvent[EVENT_INTERFACE_SETUP] = TR("Options\\Preferences"); stringsEvent[EVENT_INTERFACE_AGAIN] = TR("Restart\\Restart the mission from the beginning"); @@ -238,6 +239,7 @@ void InitializeRestext() stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAMERA_UP] = TR("Camera up\\Increase camera angle while visiting message origin"); stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CAMERA_DOWN] = TR("Camera down\\Decrease camera angle while visiting message origin"); stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_PAUSE] = TR("Pause\\Pause the game without opening menu"); + stringsEvent[EVENT_INTERFACE_KEY+INPUT_SLOT_CMDLINE] = TR("Cheat console\\Show cheat console"); stringsEvent[EVENT_INTERFACE_VOLSOUND] = TR("Sound effects:\\Volume of engines, voice, shooting, etc."); stringsEvent[EVENT_INTERFACE_VOLMUSIC] = TR("Background sound :\\Volume of audio tracks"); diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index 9214c511..d0fe1de2 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -351,6 +351,7 @@ std::string PhaseToString(Phase phase) if (phase == PHASE_WIN) return "PHASE_WIN"; if (phase == PHASE_LOST) return "PHASE_LOST"; if (phase == PHASE_QUIT_SCREEN) return "PHASE_QUIT_SCREEN"; + if (phase == PHASE_SATCOM) return "PHASE_SATCOM"; return "(unknown)"; } @@ -516,6 +517,12 @@ void CRobotMain::ChangePhase(Phase phase) } m_ui->ChangePhase(m_phase); + if (m_phase == PHASE_SATCOM) + { + m_interface->DeleteControl(EVENT_WINDOW5); + StartDisplayInfo(InjectLevelPathsForCurrentLevel("cbot.txt", "help/%lng%"), 0); + } + if (!resetWorld) return; dim.x = 32.0f/640.0f; @@ -708,21 +715,25 @@ bool CRobotMain::ProcessEvent(Event &event) } // Management of the console. - if (event.type == EVENT_TEXT_INPUT && - event.GetData()->text[0] == KEY(BACKQUOTE)) // Pause ? + if (event.type == EVENT_KEY_DOWN) { - if (m_phase != PHASE_PLAYER_SELECT && - !m_movie->IsExist() && - !m_movieLock && !m_editLock && !m_cmdEdit) + auto data = event.GetData(); + + if (data->slot == INPUT_SLOT_CMDLINE) { - Ui::CEdit* pe = static_cast(m_interface->SearchControl(EVENT_CMD)); - if (pe == nullptr) return false; - pe->SetState(Ui::STATE_VISIBLE); - m_interface->SetFocus(pe); - if (m_phase == PHASE_SIMUL) m_cmdEditPause = m_pause->ActivatePause(PAUSE_ENGINE); - m_cmdEdit = true; + if (m_phase != PHASE_PLAYER_SELECT && + !m_movie->IsExist() && + !m_movieLock && !m_editLock && !m_cmdEdit) + { + Ui::CEdit* pe = static_cast(m_interface->SearchControl(EVENT_CMD)); + if (pe == nullptr) return false; + pe->SetState(Ui::STATE_VISIBLE); + m_interface->SetFocus(pe); + if (m_phase == PHASE_SIMUL) m_cmdEditPause = m_pause->ActivatePause(PAUSE_ENGINE); + m_cmdEdit = true; + } + return false; } - return false; } if (event.type == EVENT_KEY_DOWN && @@ -734,6 +745,7 @@ bool CRobotMain::ProcessEvent(Event &event) pe->GetText(cmd, 50); pe->SetText(""); pe->ClearState(Ui::STATE_VISIBLE); + m_interface->SetFocus(nullptr); if (m_phase == PHASE_SIMUL) { m_pause->DeactivatePause(m_cmdEditPause); @@ -778,6 +790,9 @@ bool CRobotMain::ProcessEvent(Event &event) if (event.type == EVENT_OBJECT_INFOOK) StopDisplayInfo(); + if (m_displayInfo == nullptr && m_phase == PHASE_SATCOM) + ChangePhase(PHASE_MAIN_MENU); + return false; } diff --git a/src/level/robotmain.h b/src/level/robotmain.h index fe7e40ec..82318402 100644 --- a/src/level/robotmain.h +++ b/src/level/robotmain.h @@ -72,6 +72,7 @@ enum Phase PHASE_WIN, PHASE_LOST, PHASE_QUIT_SCREEN, + PHASE_SATCOM, }; std::string PhaseToString(Phase phase); bool IsInSimulationConfigPhase(Phase phase); diff --git a/src/ui/controls/edit.cpp b/src/ui/controls/edit.cpp index 1d55624c..4bbdc26a 100644 --- a/src/ui/controls/edit.cpp +++ b/src/ui/controls/edit.cpp @@ -484,10 +484,12 @@ bool CEdit::EventProcess(const Event &event) if ( event.customParam == m_eventType ) { m_bFocus = true; + UpdateFocus(); } else { m_bFocus = false; + UpdateFocus(); } } @@ -504,10 +506,12 @@ bool CEdit::EventProcess(const Event &event) if ( m_bEdit || m_bHilite ) m_bCapture = true; } m_bFocus = true; + UpdateFocus(); } else { m_bFocus = false; + UpdateFocus(); } } @@ -3229,9 +3233,13 @@ void CEdit::SetFocus(CControl* control) if (oldFocus != m_bFocus) { - // Start/stop text input mode, this toggles the on-screen keyboard - CApplication::GetInstancePointer()->SetTextInput(m_bFocus); + UpdateFocus(); } } +void CEdit::UpdateFocus() +{ + CApplication::GetInstancePointer()->SetTextInput(m_bFocus); } + +} \ No newline at end of file diff --git a/src/ui/controls/edit.h b/src/ui/controls/edit.h index 87112951..e4f1e7f7 100644 --- a/src/ui/controls/edit.h +++ b/src/ui/controls/edit.h @@ -228,6 +228,7 @@ protected: void UpdateScroll(); void SetFocus(CControl* control) override; + void UpdateFocus(); // Start/stop text input mode, this toggles the on-screen keyboard protected: std::unique_ptr m_scroll; // vertical scrollbar on the right diff --git a/src/ui/screen/screen_main_menu.cpp b/src/ui/screen/screen_main_menu.cpp index fcab0623..4d9e103c 100644 --- a/src/ui/screen/screen_main_menu.cpp +++ b/src/ui/screen/screen_main_menu.cpp @@ -162,6 +162,12 @@ void CScreenMainMenu::CreateInterface() pl->SetFontType(Gfx::FONT_COURIER); pl->SetFontSize(Gfx::FONT_SIZE_SMALL); + // SatCom button + pos.x = ox+sx*4.4f; + pos.y = oy+sy*4.4f; + pb = pw->CreateButton(pos, dim, 128+60, EVENT_INTERFACE_SATCOM); + pb->SetState(STATE_SHADOW); + SetBackground("textures/interface/interface.png"); CreateVersionDisplay(); } @@ -223,6 +229,10 @@ bool CScreenMainMenu::EventProcess(const Event &event) m_main->ChangePhase(PHASE_PLAYER_SELECT); break; + case EVENT_INTERFACE_SATCOM: + m_main->ChangePhase(PHASE_SATCOM); + break; + default: return true; }