GMCP-Char: Startwerte nur mit CAN-Flags

Auch bei Start des Moduls sollen (auf Spielerwunsch)
nur Daten gesendet werden, die spaeter aktualisiert
werden.

Change-Id: I542c4548dd34c342b06bb867afa7c07b156e233f
diff --git a/std/player/protocols/gmcp.c b/std/player/protocols/gmcp.c
index 905fdc9..ad9485f 100644
--- a/std/player/protocols/gmcp.c
+++ b/std/player/protocols/gmcp.c
@@ -324,6 +324,7 @@
 protected void GMCPmod_MG_char_v1_send(mapping data)
 {
   mapping squeue = m_allocate(5,0);
+  int can = QueryProp(P_CAN_FLAGS);
   struct gmcp_mod_s mod = gmcpdata["MG.char"];
   // mod->data fungiert hier auch als Cache der Daten. Die muss man naemlich
   // leider immer alle senden, nicht nur die geaenderten.
@@ -331,6 +332,7 @@
   {
     // Alle verfuegbaren Informationen senden...
     mod->data = m_allocate(6);
+    
     m_add(mod->data, "MG.char.base",
               ([P_NAME: Name(WER),
                 P_GUILD: QueryProp(P_GUILD),
@@ -338,14 +340,18 @@
                 P_TITLE: QueryProp(P_TITLE),
                 "wizlevel": query_wiz_level(this_object()),
                 P_RACE: QueryProp(P_RACE)]) );  // TODO
-    m_add(mod->data,"MG.char.vitals", 
-              ([P_HP: QueryProp(P_HP),
-                P_SP: QueryProp(P_SP),
-                P_POISON: QueryProp(P_POISON) ]) );
     m_add(mod->data,"MG.char.maxvitals",
               ([P_MAX_HP: QueryProp(P_MAX_HP),
                 P_MAX_SP: QueryProp(P_MAX_SP),
                 P_MAX_POISON: QueryProp(P_MAX_POISON) ]) );
+    // aktuelle Werte fuer LP/KP/Gift
+    mapping d = m_allocate(3);
+    d[P_HP] = QueryProp(P_HP);
+    if (can & CAN_REPORT_SP)
+      d[P_SP] = QueryProp(P_SP);
+    if (can & CAN_REPORT_POISON)
+      d[P_POISON] = QueryProp(P_POISON);
+    m_add(mod->data,"MG.char.vitals", d );
     m_add(mod->data,"MG.char.attributes",
               ([ A_STR: QueryAttribute(A_STR),
                  A_INT: QueryAttribute(A_INT),
@@ -355,15 +361,20 @@
               ([P_LEVEL: QueryProp(P_LEVEL),
                 P_GUILD_LEVEL: QueryProp(P_GUILD_LEVEL),
                 P_GUILD_TITLE: QueryProp(P_GUILD_TITLE) ]) );
-    m_add(mod->data,"MG.char.wimpy",
-              ([P_WIMPY: QueryProp(P_WIMPY),
-                P_WIMPY_DIRECTION: QueryProp(P_WIMPY_DIRECTION) ]) );
+    // Und die Vorsicht
+    d = m_allocate(2);
+    if (can & CAN_REPORT_WIMPY)
+      d[P_WIMPY] = QueryProp(P_WIMPY);
+    if (can & CAN_REPORT_WIMPY_DIR)
+      d[P_WIMPY_DIRECTION] = QueryProp(P_WIMPY_DIRECTION);
+    m_add(mod->data,"MG.char.wimpy", d );
+    if (sizeof(d))
+      m_add(squeue,"MG.char.wimpy");
     m_add(squeue,"MG.char.base");
     m_add(squeue,"MG.char.vitals");
     m_add(squeue,"MG.char.maxvitals");
     m_add(squeue,"MG.char.attributes");
     m_add(squeue,"MG.char.info");
-    m_add(squeue,"MG.char.wimpy");
     // dies wird direkt gesendet, weil es nicht gespeichert werden muss. (wird
     // nur beim Start des Moduls gesendet).
     GMCP_send("MG.char.infoVars", ([
@@ -493,7 +504,7 @@
   if (!environment())
     return;
 
-  // Blind gibt es auch per GMCP nix.
+  // Blind gibt es auch per GMCP keine Short oder weitere Infos.
   if (CannotSee(1))
     return;
 
@@ -563,12 +574,16 @@
   // leider immer alle senden, nicht nur die geaenderten.
   if (!mappingp(data))
   {
+    int can = QueryProp(P_CAN_FLAGS);
     // Alle verfuegbaren Informationen senden...
     mod->data = m_allocate(4);
     m_add(mod->data, "char.base", (["name": query_real_name(),
                                  "race": QueryProp(P_RACE)]) );
-    m_add(mod->data,"char.vitals", (["hp": QueryProp(P_HP),
-                                  "mana": QueryProp(P_SP)]) );
+    mapping d = m_allocate(2);
+    d["hp"] = QueryProp(P_HP);
+    if (can & CAN_REPORT_SP)
+      d["mana"] = QueryProp(P_SP);
+    m_add(mod->data,"char.vitals", d );
     m_add(mod->data,"char.stats", ([ "str": QueryAttribute(A_STR),
                                "int": QueryAttribute(A_INT),
                                "dex": QueryAttribute(A_DEX),
@@ -644,12 +659,16 @@
   // leider immer alle senden, nicht nur die geaenderten.
   if (!mappingp(data))
   {
+    int can = QueryProp(P_CAN_FLAGS);
     // Alle verfuegbaren Informationen senden...
     mod->data = m_allocate(4);
-    m_add(mod->data,"Char.Vitals", (["hp": QueryProp(P_HP),
-                                     "mp": QueryProp(P_SP),
-                                     "maxhp": QueryProp(P_MAX_HP),
-                                     "maxmp": QueryProp(P_MAX_SP) ]) );
+    mapping d = m_allocate(4);
+    d["hp"] = QueryProp(P_HP);
+    d["maxhp"] = QueryProp(P_MAX_HP);
+    d["maxmp"] = QueryProp(P_MAX_SP);
+    if (can & CAN_REPORT_SP)
+      d["mp"] = QueryProp(P_SP);
+    m_add(mod->data,"Char.Vitals", d );
     m_add(mod->data,"Char.Status", (["level": QueryProp(P_LEVEL),
                                      "guild": QueryProp(P_GUILD) ]) );
     m_add(squeue,"Char.Vitals");
@@ -702,7 +721,7 @@
   }
 }
 
-// Handler fuer das "char" Modul von GMCP (Modul von Aardwolf)
+// Handler fuer das "Char" Modul von GMCP (Modul von IRE)
 // Gerufen bei Empfang von Kommandos vom Client.
 protected void GMCPmod_Char_v1_recv(string cmd, mixed args)
 {