diff --git a/rogueviz/ads/ads-game.cpp b/rogueviz/ads/ads-game.cpp index b3458830..ac835c30 100644 --- a/rogueviz/ads/ads-game.cpp +++ b/rogueviz/ads/ads-game.cpp @@ -85,6 +85,7 @@ void restart() { paused = false; ship_pt = 0; + no_param_change = all_params_default(); init_gamedata(); } diff --git a/rogueviz/ads/control.cpp b/rogueviz/ads/control.cpp index d50e1c4a..c4849596 100644 --- a/rogueviz/ads/control.cpp +++ b/rogueviz/ads/control.cpp @@ -153,12 +153,13 @@ ld read_movement() { bool ads_turn(int idelta) { multi::handleInput(idelta, multi::scfg_default); ld delta = idelta / 1000.; - + if(!(cmode & sm::NORMAL)) return false; - + hybrid::in_actual([&] { handle_crashes(); + if(no_param_change && !all_params_default()) no_param_change = false; auto& act = multi::action_states[1]; diff --git a/rogueviz/ads/ds-game.cpp b/rogueviz/ads/ds-game.cpp index 2cab43b5..1df4c3ba 100644 --- a/rogueviz/ads/ds-game.cpp +++ b/rogueviz/ads/ds-game.cpp @@ -345,6 +345,7 @@ bool ds_turn(int idelta) { if(!(cmode & sm::NORMAL)) return false; ds_handle_crashes(); + if(no_param_change && !all_params_default()) no_param_change = false; auto& act = multi::action_states[1]; @@ -396,7 +397,7 @@ bool ds_turn(int idelta) { if(mshift) { #if RVCOL constexpr ld win_time = 60; - if(current.shift < win_time && (current.shift + mshift) >= win_time && !game_over && all_params_default()) + if(current.shift < win_time && (current.shift + mshift) >= win_time && !game_over && no_param_change) rogueviz::rv_achievement("DSGAME"); #endif current.shift += mshift; @@ -741,6 +742,7 @@ void ds_restart() { } ship_pt = 0; + no_param_change = all_params_default(); rocks.clear(); history.clear(); diff --git a/rogueviz/ads/globals.cpp b/rogueviz/ads/globals.cpp index 89442fcb..6de87f28 100644 --- a/rogueviz/ads/globals.cpp +++ b/rogueviz/ads/globals.cpp @@ -251,6 +251,8 @@ string get_main_help(); int generate_mouseovers(); bool all_params_default(); +bool no_param_change; +bool params_changed(); void start_relhell_tour(); diff --git a/rogueviz/ads/hiscore.cpp b/rogueviz/ads/hiscore.cpp index 168c5314..e6b9d54d 100644 --- a/rogueviz/ads/hiscore.cpp +++ b/rogueviz/ads/hiscore.cpp @@ -66,9 +66,9 @@ void game_over_with_message(const string& reason) { if(pdata.ammo <= 0) cur.deathreason += " while out of ammo"; game_over = true; #if RVCOL - if(main_rock && all_params_default()) + if(main_rock && no_param_change) rogueviz::rv_leaderboard("de Sitter", current.shift * 1000, 1, rvlc::ms); - if(!main_rock && all_params_default()) { + if(!main_rock && no_param_change) { auto& s = pdata.score; string data = lalign(0, s[0], " ", s[1], " ", s[2]); rogueviz::rv_leaderboard("anti de Sitter: total score", s[0] + s[1] + s[2], 1, rvlc::num, data); diff --git a/rogueviz/ads/menu.cpp b/rogueviz/ads/menu.cpp index d1932460..fef614ef 100644 --- a/rogueviz/ads/menu.cpp +++ b/rogueviz/ads/menu.cpp @@ -81,8 +81,11 @@ void edit_difficulty() { }); } - dialog::addBoolItem(XLAT("all default"), all_params_default(), 'D'); - dialog::add_action([] { all_params_reset(); restart(); }); + bool pa = all_params_default(); + dialog::addSelItem(XLAT("all default"), + (pa && !no_param_change) ? XLAT("PARTIAL") : ONOFF(pa), 'd'); + if(pa) + dialog::add_action([] { all_params_reset(); restart(); }); dialog::addBack(); dialog::display(); diff --git a/rogueviz/ads/resources.cpp b/rogueviz/ads/resources.cpp index cb3b8aad..cb09011a 100644 --- a/rogueviz/ads/resources.cpp +++ b/rogueviz/ads/resources.cpp @@ -201,7 +201,7 @@ void gain_resource(eResourceType rsrc) { for(auto r: {rtGoldGate, rtGoldRocks, rtGoldTurret}) { D(r, score[treasure_id(r)]) #ifdef RVCOL - if(pdata.score[0] + pdata.score[1] + pdata.score[2] == 30 && all_params_default()) rogueviz::rv_achievement("ADSGAME"); + if(pdata.score[0] + pdata.score[1] + pdata.score[2] == 30 && no_param_change) rogueviz::rv_achievement("ADSGAME"); #endif } playSound(nullptr, rsrc_sound[rsrc]);