From e29cbda2591ebcdd6f2c676829ebda827bb9de1d Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 5 Apr 2025 23:33:08 +0200 Subject: [PATCH] rogueviz::ads:: achievements/leaderboards --- rogueviz/ads/globals.cpp | 2 ++ rogueviz/ads/hiscore.cpp | 15 ++++++++++++++- rogueviz/ads/menu.cpp | 35 +++++++++++++++++++++++++++++++++++ rogueviz/ads/resources.cpp | 3 +++ 4 files changed, 54 insertions(+), 1 deletion(-) diff --git a/rogueviz/ads/globals.cpp b/rogueviz/ads/globals.cpp index d511ccab..8da93471 100644 --- a/rogueviz/ads/globals.cpp +++ b/rogueviz/ads/globals.cpp @@ -250,4 +250,6 @@ void load_hiscores(); string get_main_help(); int generate_mouseovers(); +bool all_params_default(); + }} diff --git a/rogueviz/ads/hiscore.cpp b/rogueviz/ads/hiscore.cpp index 924ccb59..168c5314 100644 --- a/rogueviz/ads/hiscore.cpp +++ b/rogueviz/ads/hiscore.cpp @@ -19,6 +19,7 @@ void fill_gamedata() { char buf[128]; strftime(buf, 128, "%c", localtime(&timer)); cur.timerend = buf; cur.seconds = int(timer - timerstart); for(int a=0; a<3; a++) cur.scores[a] = pdata.score[a]; + if(main_rock) cur.scores[0] = current.shift; shstream hs; print(hs, main_rock ? "2 " : "1 "); print(hs, DS_(simspeed), " ", DS_(accel), " ", DS_(how_much_invincibility), " ", vid.creature_scale, " ", DS_(missile_rapidity)); @@ -64,11 +65,23 @@ void game_over_with_message(const string& reason) { if(pdata.fuel <= 0) cur.deathreason += " while out of fuel"; if(pdata.ammo <= 0) cur.deathreason += " while out of ammo"; game_over = true; + #if RVCOL + if(main_rock && all_params_default()) + rogueviz::rv_leaderboard("de Sitter", current.shift * 1000, 1, rvlc::ms); + if(!main_rock && all_params_default()) { + 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); + rogueviz::rv_leaderboard("anti de Sitter: platinum", s[0], 1, rvlc::num, data); + rogueviz::rv_leaderboard("anti de Sitter: plasteel", s[1], 1, rvlc::num, data); + rogueviz::rv_leaderboard("anti de Sitter: uranium", s[2], 1, rvlc::num, data); + } + #endif } void save_to_hiscores() { if(!main_rock && (pdata.score[0] + pdata.score[1] + pdata.score[2] == 0)) return; - if(main_rock && pdata.score[0] < 5) return; + if(main_rock && current.shift < 5) return; save(cur); allsaves.push_back(cur); } diff --git a/rogueviz/ads/menu.cpp b/rogueviz/ads/menu.cpp index 42f0d356..ecea8df4 100644 --- a/rogueviz/ads/menu.cpp +++ b/rogueviz/ads/menu.cpp @@ -9,6 +9,38 @@ void adjust_for_scale() { else max_gen_per_frame = 3, draw_per_frame = 1000; } +vector get_all_params() { + vector vec = {&DS_(simspeed), &DS_(accel), &DS_(how_much_invincibility), &vid.creature_scale, &DS_(missile_rapidity)}; + if(!main_rock) { + vec.push_back(&rock_max_rapidity); + vec.push_back(&rock_density); + } + auto all = [&] (player_data& d) { + vec.push_back(&d.hitpoints); + vec.push_back(&d.ammo); + vec.push_back(&d.fuel); + vec.push_back(&d.oxygen); + }; + all(DS_(max_pdata)); + all(DS_(tank_pdata)); + return vec; + } + +bool all_params_default() { + for(auto v: get_all_params()) { + for(auto& fs: params) + if(fs.second->affects(v) && fs.second->dosave()) return false; + } + return true; + } + +void all_params_reset() { + for(auto v: get_all_params()) + for(auto& fs: params) + if(fs.second->affects(v)) + fs.second->reset(); + } + void edit_difficulty() { cmode = sm::SIDE | sm::MAYDARK; gamescreen(); @@ -49,6 +81,9 @@ void edit_difficulty() { }); } + dialog::addBoolItem(XLAT("all default"), all_params_default(), 'D'); + dialog::add_action([] { all_params_reset(); restart(); }); + dialog::addBack(); dialog::display(); } diff --git a/rogueviz/ads/resources.cpp b/rogueviz/ads/resources.cpp index cb6e7884..cb3b8aad 100644 --- a/rogueviz/ads/resources.cpp +++ b/rogueviz/ads/resources.cpp @@ -200,6 +200,9 @@ void gain_resource(eResourceType rsrc) { D(rtOxygen, oxygen) 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"); + #endif } playSound(nullptr, rsrc_sound[rsrc]); }