Filter fuer Questliste

Bei der Ausgabe der Questliste kann man nun auch nach
geloesten und ungeloesten Quests filtern.

Change-Id: I4e3a964914c0cdf141a38de7d1ae5cd6c86192d1
diff --git a/doc/help/abenteuerliste b/doc/help/abenteuerliste
index 7ac2ffe..370ddba 100644
--- a/doc/help/abenteuerliste
+++ b/doc/help/abenteuerliste
@@ -4,8 +4,12 @@
  Die Liste der spielbaren Abenteuer haengt in jeder Gilde im MorgenGrauen aus.
  Sie ist mit dem Kommando "liste" abrufbar.
 
+ Will man nur die ungeloesten Quests anzeigen lassen, geht dies mit dem
+ Kommando "liste ungeloest", die Liste der geloesten Quests entsprechend
+ mit "liste geloest".
+
  Die in der Liste verwendeten Abkuerzungen werden im Folgenden erlaeutert:
- 
+
  AP       = Fuer die Quest vergebene Abenteuerpunkte
  Klasse   = Subjektive Einstufung innerhalb der Gruppe bzgl. Arbeitsaufwand,
             Dauer oder Gefahren
@@ -30,5 +34,5 @@
  SIEHE AUCH:
     abenteuer, stufen, stufenpunkte, schlafe, kampf, reset
 
-26.05.2016, Zesstra
+ 06.01.2020, Zesstra
 
diff --git a/secure/questmaster.c b/secure/questmaster.c
index 9007460..6a7d952 100644
--- a/secure/questmaster.c
+++ b/secure/questmaster.c
@@ -434,7 +434,10 @@
     return i[4] > j[4];
 }
 
-varargs string liste(mixed pl) {
+#define FILTER_GELOEST   1
+#define FILTER_UNGELOEST 2
+varargs string liste(mixed pl, int geloest_filter)
+{
   int qgroups, i, j, qrfw;
   mixed *qlists, *qgrouped, *qtmp;
   string str;
@@ -448,7 +451,7 @@
   if(!objectp(pl))
     return "Ohne Spielernamen/Spielerobjekt gibt es auch keine Liste.\n";
 
-  if ( ((string)pl->QueryProp(P_TTY)) == "ansi")
+  if ( (pl->QueryProp(P_TTY)) == "ansi")
   {
       ja = ANSI_GREEN + "ja" + ANSI_NORMAL;
       nein = ANSI_RED + "nein" + ANSI_NORMAL;
@@ -474,20 +477,30 @@
   qgrouped = QueryGroupedKeys();
 
   for (i=sizeof(qgrouped)-1;i>=0; i--)
-    for (j=sizeof(qgrouped[i])-1;j>=0; j--) {
+    for (j=sizeof(qgrouped[i])-1;j>=0; j--)
+    {
       qtmp = QueryQuest(qgrouped[i][j]);
-      qlists[i] += ({ ({
-        qgrouped[i][j],
-        qtmp[Q_QP],
-        QCLASS_STARS(qtmp[Q_CLASS]),
-        capitalize(QATTR_STRINGS[qtmp[Q_ATTR]]),
-        qtmp[Q_DIFF],
-        (qtmp[Q_AVERAGE][1]>10 /*&& IS_ARCH(this_player())*/
-                  ? to_string(to_int(qtmp[Q_AVERAGE][0]))
-                  : "-"),
-        capitalize(qtmp[Q_WIZ]),
-        (int)pl->QueryQuest(qgrouped[i][j]) == OK ? ja : nein
-      }) });
+      int geloest_status = pl->QueryQuest(qgrouped[i][j]);
+      // Quest ausgeben, wenn "kein Filter" gegeben oder Quest geloest und
+      // Filter "geloest" oder Quest ungeloest und Filter "ungeloest".
+      if ( !(geloest_filter & (FILTER_GELOEST|FILTER_UNGELOEST))
+          || ((geloest_filter & FILTER_GELOEST) && geloest_status == OK)
+          || ((geloest_filter & FILTER_UNGELOEST) && geloest_status != OK)
+         )
+      {
+        qlists[i] += ({ ({
+          qgrouped[i][j],
+          qtmp[Q_QP],
+          QCLASS_STARS(qtmp[Q_CLASS]),
+          capitalize(QATTR_STRINGS[qtmp[Q_ATTR]]),
+          qtmp[Q_DIFF],
+          (qtmp[Q_AVERAGE][1]>10
+                    ? to_string(to_int(qtmp[Q_AVERAGE][0]))
+                    : "-"),
+          capitalize(qtmp[Q_WIZ]),
+          geloest_status == OK ? ja : nein
+        }) });
+      }
     }
 
   for( i=0; i<qgroups; i++ )
diff --git a/std/room/gilde.c b/std/room/gilde.c
index d402ac9..a153b96 100644
--- a/std/room/gilde.c
+++ b/std/room/gilde.c
@@ -347,8 +347,18 @@
 {
   if (!this_player())
     return 0;
+  int geloest_filter;
+  switch(arg)
+  {
+    case "geloest":
+      geloest_filter = 1;
+      break;
+    case "ungeloest":
+      geloest_filter = 2;
+      break;
+  }
 
-  string str = QM->liste(this_player());
+  string str = QM->liste(this_player(), geloest_filter);
 
   this_player()->More( str, 0 );
   return 1;