From ddb9e8e774f1a7ff187079d7a551f6ca02748cc1 Mon Sep 17 00:00:00 2001 From: Kp Date: Sun, 4 Apr 2021 22:01:25 +0000 Subject: [PATCH] Add in-game editor menu to update Cursegp --- similar/main/gamecntl.cpp | 48 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/similar/main/gamecntl.cpp b/similar/main/gamecntl.cpp index 0f744cea9..6de7e50e7 100644 --- a/similar/main/gamecntl.cpp +++ b/similar/main/gamecntl.cpp @@ -399,6 +399,51 @@ static void format_time(char (&str)[9], unsigned secs_int, unsigned hours_extra) snprintf(str, sizeof(str), "%1u:%02u:%02u", h, m, s); } +struct choose_curseg_menu_items +{ + std::array caption; + std::array text; + std::array m; + choose_curseg_menu_items(const d_level_shared_segment_state &LevelSharedSegmentState) : + m{{ + nm_item_text((snprintf(caption.data(), caption.size(), "Enter target segment number (max=%hu)", LevelSharedSegmentState.get_segments().get_count()), caption.data())), + nm_item_input((text.front() = 0, text)), + }} + { + } +}; + +struct choose_curseg_menu : choose_curseg_menu_items, passive_newmenu +{ + choose_curseg_menu(const d_level_shared_segment_state &LevelSharedSegmentState, grs_canvas &src) : + choose_curseg_menu_items(LevelSharedSegmentState), + passive_newmenu(menu_title{nullptr}, menu_subtitle{nullptr}, menu_filename{nullptr}, tiny_mode_flag::normal, tab_processing_flag::ignore, adjusted_citem::create(m, 0), src) + { + } + virtual window_event_result event_handler(const d_event &) override; +}; + +window_event_result choose_curseg_menu::event_handler(const d_event &event) +{ + switch (event.type) + { + case EVENT_WINDOW_CLOSE: + { + char *p; + const auto s = strtoul(text.data(), &p, 0); + if (*p) + break; + if (s >= Segments.get_count()) + break; + Cursegp = Segments.vmptridx(static_cast(s)); + break; + } + default: + break; + } + return newmenu::event_handler(event); +} + } } @@ -1384,6 +1429,9 @@ static window_event_result HandleTestKey(fvmsegptridx &vmsegptridx, int key, con break; } #endif + case KEY_C + KEY_CTRLED + KEY_DEBUGGED: + window_create(LevelSharedSegmentState, *grd_curcanv); + break; case KEY_C + KEY_SHIFTED + KEY_DEBUGGED: if (Player_dead_state == player_dead_state::no && !(Game_mode & GM_MULTI))