allow interrupting replay

This commit is contained in:
2025-01-16 12:42:24 -06:00
parent 2d824e869e
commit 62313e5bd6
8 changed files with 27 additions and 5 deletions

View File

@@ -0,0 +1,9 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<?xml-stylesheet href="dialog.xsl" type="text/xsl"?>
<dialog defbtn='cancel'>
<pict type='dlog' num='23' top='9' left='9'/>
<text top='5' left='51' width='255' height='72'>
Are you sure you wish to stop this replay?</text>
<button name='quit' type='regular' top='86' left='178'>Stop</button>
<button name='cancel' type='regular' def-key='esc' top='86' left='248'>Cancel</button>
</dialog>

View File

@@ -45,6 +45,8 @@ cDialog* cDialog::topWindow = nullptr;
void (*cDialog::redraw_everything)() = nullptr;
std::mt19937 cDialog::ui_rand;
extern bool check_for_interrupt(std::string);
std::string cDialog::generateRandomString(){
// Not bothering to seed, because it doesn't actually matter if it's truly random.
int n_chars = ui_rand() % 100;
@@ -564,7 +566,10 @@ void cDialog::handle_events() {
cFramerateLimiter fps_limiter;
while(dialogNotToast) {
if(replaying && has_next_action("click_control")){
if(replaying && check_for_interrupt("confirm-interrupt-replay")){
replaying = false;
return;
}else if(replaying && has_next_action("click_control")){
Element& next_action = pop_next_action();
auto info = info_from_action(next_action);
if(info["id"].empty()) continue;

View File

@@ -3757,11 +3757,11 @@ bool is_sign(ter_num_t ter) {
return false;
}
bool check_for_interrupt(){
bool check_for_interrupt(std::string confirm_dialog){
using kb = sf::Keyboard;
bool interrupt = false;
sf::Event evt;
if(replaying && has_next_action() && next_action_type() == "handle_interrupt"){
if(replaying && confirm_dialog == "confirm-interrupt-special" && has_next_action() && next_action_type() == "handle_interrupt"){
pop_next_action();
interrupt = true;
}
@@ -3778,7 +3778,7 @@ bool check_for_interrupt(){
if(recording){
record_action("handle_interrupt", "");
}
cChoiceDlog confirm("confirm-interrupt", {"quit","cancel"});
cChoiceDlog confirm(confirm_dialog, {"quit","cancel"});
if(confirm.show() == "quit") return true;
}
return false;

View File

@@ -40,7 +40,7 @@ void setup_outdoors(location where);
short get_outdoor_num();
short count_walls(location loc);
bool is_sign(ter_num_t ter);
bool check_for_interrupt();
bool check_for_interrupt(std::string confirm_dialog = "confirm-interrupt-special");
void handle_startup_button_click(eStartButton btn, eKeyMod mods);
void handle_switch_pc(short which_pc, bool& need_redraw, bool& need_reprint);

View File

@@ -863,6 +863,10 @@ void handle_events() {
while(!All_Done) {
if(replaying && has_next_action()){
if(check_for_interrupt("confirm-interrupt-replay")){
replaying = false;
continue;
}
replay_next_action();
}else{
#ifdef __APPLE__

View File

@@ -29,6 +29,8 @@ extern rectangle name_rect;
extern rectangle pc_race_rect;
extern rectangle edit_rect[5];
bool check_for_interrupt(std::string) {}
bool handle_action(const sf::Event & event) {
location the_point = translate_mouse_coordinates({event.mouseButton.x, event.mouseButton.y});

View File

@@ -102,6 +102,8 @@ short special_to_paste = -1;
bool monst_on_space(location loc,short m_num);
static bool terrain_matches(unsigned char x, unsigned char y, ter_num_t ter);
bool check_for_interrupt(std::string) {}
void init_screen_locs() {
for(short i = 0; i < 4; i++)
border_rect[i] = terrain_rect;