From ca7f0cb4c33488cc69457aee3535a0d31c7b4af9 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Fri, 6 Mar 2020 14:22:36 +0100 Subject: [PATCH] achievement_gain_once --- achievement.cpp | 9 +++++++++ pcmove.cpp | 16 ++++++---------- system.cpp | 2 +- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/achievement.cpp b/achievement.cpp index 6a97eb3b..92a8b4a8 100644 --- a/achievement.cpp +++ b/achievement.cpp @@ -128,6 +128,15 @@ EX bool wrongMode(char flags) { return false; } +EX set got_achievements; + +EX void achievement_gain_once(const string& s) { + LATE(achievement_gain_once(s)); + if(got_achievements.count(s)) return; + got_achievements.insert(s); + achievement_gain(s.c_str()); + } + EX void achievement_log(const char* s, char flags) { #ifdef PRINT_ACHIEVEMENTS diff --git a/pcmove.cpp b/pcmove.cpp index dacea1ce..4670fdcd 100644 --- a/pcmove.cpp +++ b/pcmove.cpp @@ -17,7 +17,7 @@ EX bool seenSevenMines = false; EX bool hauntedWarning; /** is the Survivalist achievement still valid? have we received it? */ -EX bool survivalist, got_survivalist; +EX bool survivalist; EX void fail_survivalist() { changes.value_set(survivalist, false); @@ -336,21 +336,17 @@ bool pcmove::after_move() { check_total_victory(); - if(items[itWhirlpool] && cwt.at->land != laWhirlpool && !whirlpool::escaped) { - changes.value_set(whirlpool::escaped, true); - achievement_gain("WHIRL1"); - } + if(items[itWhirlpool] && cwt.at->land != laWhirlpool) + achievement_gain_once("WHIRL1"); - if(items[itLotus] >= 25 && !isHaunted(cwt.at->land) && survivalist && !got_survivalist) { - changes.value_set(got_survivalist, true); - achievement_gain("SURVIVAL"); - } + if(items[itLotus] >= 25 && !isHaunted(cwt.at->land) && survivalist) + achievement_gain_once("SURVIVAL"); if(seenSevenMines && cwt.at->land != laMinefield) { changes.value_set(seenSevenMines, false); achievement_gain("SEVENMINE"); } - + DEBB(DF_TURN, ("done")); return true; } diff --git a/system.cpp b/system.cpp index b2b85d89..6c190406 100644 --- a/system.cpp +++ b/system.cpp @@ -360,7 +360,7 @@ EX void initgame() { #if CAP_CRYSTAL crystal::used_compass_inside = false; #endif - got_survivalist = false; + got_achievements = {}; #if CAP_INV if(inv::on) inv::init(); #endif