diff --git a/std/armour/wear.c b/std/armour/wear.c
index 3615d43..c89f0a2 100644
--- a/std/armour/wear.c
+++ b/std/armour/wear.c
@@ -159,9 +159,8 @@
 }
 
 protected void _informunwear(object worn_by, int silent, int all) {
-  mixed res;
   // Gesetzte Resistenzen loeschen
-  ({void})worn_by->RemoveResistanceModifier(res=QueryProp(P_ARMOUR_TYPE));
+  ({void})worn_by->RemoveResistanceModifier(QueryProp(P_ARMOUR_TYPE));
   
   // Ruestungen koennen Attribute aendern/blockieren. Also muessen diese
   // nach dem Ausziehen aktualisiert werden
diff --git a/std/clothing/container_description.c b/std/clothing/container_description.c
index 3f19e80..3d06d80 100644
--- a/std/clothing/container_description.c
+++ b/std/clothing/container_description.c
@@ -123,10 +123,9 @@
 {
   int iswiz;
   mixed objs, info;
-  string descr;
 
   iswiz = IS_LEARNER( viewer ) && ({int})viewer->QueryProp(P_WANTS_TO_LEARN);
-  descr = ""; objs = ({}); info = ({});
+  objs = ({}); info = ({});
   map(inv, #'stringenize/*'*/, iswiz | (flags & 2) | (flags & 4), &objs, &info);
   if(flags & 1) return info;
   inv = map(info, #'collect/*'*/) - ({ 0 });
diff --git a/std/clothing/wear.c b/std/clothing/wear.c
index d85ea25..5fe900a 100644
--- a/std/clothing/wear.c
+++ b/std/clothing/wear.c
@@ -196,8 +196,7 @@
 // Hierbei steht -1 dafuer, dass der Aufrufer return 0 machen sollte,
 // <= -2 sollte zur einem return !all fuehren.
 protected int _check_wear_restrictions(int silent, int all) {
-  mixed   type,res;
-  object  *armours;
+  mixed   res;
 
   // Man kann nur Kram anziehen, die man bei sich traegt
   if (environment()!=PL) {            
diff --git a/std/container/inventory.c b/std/container/inventory.c
index 5b6e257..a339d27 100644
--- a/std/container/inventory.c
+++ b/std/container/inventory.c
@@ -62,7 +62,6 @@
 void InsertSensitiveObject(object ob, mixed arg) {
   int i;
   mixed x;
-  mapping map_ldfied;
   
   if (!pointerp(arg))
     return;
diff --git a/std/corpse.c b/std/corpse.c
index 71e0602..8aed0f2 100644
--- a/std/corpse.c
+++ b/std/corpse.c
@@ -119,7 +119,6 @@
 {
     closure cl;
     int i;
-    string info;
 
     spielerleiche = query_once_interactive(ob);
     cl=symbol_function("QueryProp", ob);
@@ -691,7 +690,7 @@
 
 object _channel( object ob )
 {
-  int m_FMM, m_HP, m_WC, m_AC, s_HP, s_WC, s_AC;
+  int m_FMM, m_HP, m_WC, m_AC;
   object rueck;
 
   if (member(inherit_list(previous_object()),CORPSE_OBJ)>-1)
@@ -723,9 +722,9 @@
                     (m_AC = ({int}) funcall( m_q, P_TOTAL_AC ))))
                   > 200000) ? 2 : 0) ||
            (nr = (((y = m_HP * (m_WC + m_AC)) >
-                   (z = 5 * (s_HP = ({int}) funcall( s_q, P_MAX_HP )) *
-                    ((s_WC = ({int}) funcall( s_q, P_TOTAL_WC )) +
-                     (s_AC = ({int}) funcall( s_q, P_TOTAL_AC )))))
+                   (z = 5 * (({int}) funcall( s_q, P_MAX_HP )) *
+                    ((({int}) funcall( s_q, P_TOTAL_WC )) +
+                     (({int}) funcall( s_q, P_TOTAL_AC )))))
                   ? 3 : 0)))
       {
         SetProp( P_NAME, "Geist "+({string}) ob->name(WESSEN, 0) );
diff --git a/std/food.c b/std/food.c
index c2220b3..ae0a5d8 100644
--- a/std/food.c
+++ b/std/food.c
@@ -490,7 +490,6 @@
     write("Mit diesem Futter stimmt was nicht!"
       " Sprich mal mit einem Magier.\n");
     raise_error("Food ohne Werte.\n");
-    return 0;
   }
 
   if (!is_eatable()) {
@@ -515,7 +514,6 @@
     write("Mit diesem Futter stimmt was nicht!"
       " Sprich mal mit einem Magier.\n");
     raise_error("Food ohne Werte.\n");
-    return 0;
   }
 
   if (!is_drinkable()) {
diff --git a/std/gilden_ob.c b/std/gilden_ob.c
index 3435ba4..6656eb2 100644
--- a/std/gilden_ob.c
+++ b/std/gilden_ob.c
@@ -195,8 +195,6 @@
 
 varargs int
 AddSpell(string verb, mapping ski) {
-  mapping skills;
-
   if (!verb)
       return 0;
   if (!mappingp(ski))
@@ -352,7 +350,6 @@
 LearnSpell(string spell,object pl) {
   mapping ski,restr;
   string res;
-  mixed learn_initfunc;
   int abil,diff;
 
   // Wenn kein pl gesetzt ist, nehmen wir this_player(), das ist der
@@ -393,7 +390,6 @@
   mapping ski,restr;
   object pl;
   string res;
-  mixed learn_initfunc;
   int abil,diff;
 
   if (!IsGuildMember(pl=this_player())) {
diff --git a/std/inpc/eval.c b/std/inpc/eval.c
index 24e1337..a8fbe80 100644
--- a/std/inpc/eval.c
+++ b/std/inpc/eval.c
@@ -100,7 +100,7 @@
 
 varargs object *minimize_prop_filt(object *here, mixed prop) {
   object *obs,ob;
-  int i,mhp,hp,sz;
+  int i,mhp,hp;
   
   obs=0;
   if (!pointerp(here))
@@ -125,7 +125,7 @@
 
 varargs object *maximize_prop_filt(object *here, mixed prop) {
   object *obs,ob;
-  int i,mwc,wc,sz;
+  int i,mwc,wc;
   
   obs=0;
   if (!pointerp(here))
diff --git a/std/inpc/select.c b/std/inpc/select.c
index 1fc0163..ada4ccb 100644
--- a/std/inpc/select.c
+++ b/std/inpc/select.c
@@ -45,7 +45,6 @@
         ctime()+"select::scan_objects(). Rest "+to_string(cost)+
         ", i="+member(src, ob)+", Size "+to_string(sizeof(src))+".\n");
       return res;
-      break;
     }
     if (!objectp(ob))
       continue;
@@ -111,7 +110,6 @@
         "Break in select::find_best_weapon(). Rest-Ticks "+to_string(cost)+
         ", i = "+to_string(i)+", Size "+to_string(sizeof(res))+".\n");
       return bob; // zurueckgeben, was bisher drinsteht.
-      break;
     } 
   }
   return bob;
@@ -217,7 +215,6 @@
 	to_string(cost)+", i="+member(diff, di)+", Size "+
 	to_string(sizeof(diff))+".\n");
       return 1; // zurueckgeben, was bisher drinsteht.
-      break;
     }
   }
   diff=na-oa;
@@ -235,7 +232,6 @@
 	 to_string(cost)+", i="+member(diff, di)+", Size "+
 	 to_string(sizeof(diff))+".\n");
       return 1; // zurueckgeben, was bisher drinsteht.
-      break;
     }
   }
   return 1;
diff --git a/std/inpc/walking.c b/std/inpc/walking.c
index 1fe19a4..eef8977 100644
--- a/std/inpc/walking.c
+++ b/std/inpc/walking.c
@@ -117,13 +117,17 @@
 }
 
 int walk_route() {
+  return 0;
 }
 
 int walk_to() {
+  return 0;
 }
 
 int walk_follow() {
+  return 0;
 }
 
 int walk_flee() {
+  return 0;
 }
diff --git a/std/items/fishing/angel.c b/std/items/fishing/angel.c
index 7f403f3..108944a 100644
--- a/std/items/fishing/angel.c
+++ b/std/items/fishing/angel.c
@@ -63,7 +63,7 @@
 // Verlustwahrsch. fuer Koeder falls Fisch zu schwer
 
 private object room, current_user;
-private int active, actime;
+private int active;
 private mapping aquarium = STDFISHLIST;
 
 nomask varargs void StopFishing(string msg_me, string msg_room);
@@ -307,7 +307,6 @@
         // - Haken mit Koeder ist dran.
         // - alte Beute wurde abgenommen.
         // - Move-Hook gesetzt, um Abbruch ausloesen zu koennen.
-        actime = time();
         current_user = TP;
         tell_object(TP, "Du wirfst die Angel aus.\n");
         tell_room(environment(TP), TP->Name()+" wirft eine Angel aus.\n", 
diff --git a/std/items/flasche.c b/std/items/flasche.c
index ed0da17..dd4365b 100644
--- a/std/items/flasche.c
+++ b/std/items/flasche.c
@@ -207,7 +207,6 @@
       " fuellen koenntest!\n");
     return 0;
   }
-  return 0;
 }
 
 static int cmd_leere(string str)
diff --git a/std/items/kraeuter/trank.c b/std/items/kraeuter/trank.c
index e038d1a..afc8bd3 100644
--- a/std/items/kraeuter/trank.c
+++ b/std/items/kraeuter/trank.c
@@ -1102,12 +1102,12 @@
   // erst die positiven, dann die negativen Wirkungen aktivieren
   // fuer jede Wirkung wird eine lfun act_<trankattribut>() gerufen, z.B.
   // act_attr_tragen() (-> act_T_CARRY() )
-  mapping notactivated =
-          filter(peff, function int (string k, int val)
-              {return !funcall(symbol_function("act_"+k,this_object()), val);})
-         +
-          filter(neff, function int (string k, int val)
-              {return !funcall(symbol_function("act_"+k,this_object()), val);});
+  // mapping notactivated = 
+  filter(peff, function int (string k, int val)
+      {return !funcall(symbol_function("act_"+k,this_object()), val);})
+  +
+  filter(neff, function int (string k, int val)
+      {return !funcall(symbol_function("act_"+k,this_object()), val);});
   // Meldungen ausgeben ueber nicht aktivierte Wirkungen?
   // TODO
 }
diff --git a/std/lightsource.c b/std/lightsource.c
index f45d510..834c8b7 100644
--- a/std/lightsource.c
+++ b/std/lightsource.c
@@ -304,7 +304,6 @@
 string short()
 {
   string s;
-  string desc;
 
   if(!(s=QueryProp(P_SHORT)))
     return 0;
diff --git a/std/living/attributes.c b/std/living/attributes.c
index e1d88fc..eef675c 100644
--- a/std/living/attributes.c
+++ b/std/living/attributes.c
@@ -148,7 +148,7 @@
 
 nomask protected void attribute_hb()
 {
-  int now,i,k,update,outdated;
+  int now,i,k,outdated;
   string* keys;
   mapping tonotify;
 	
@@ -433,9 +433,6 @@
 }
 
 protected void add_offsets(mapping arr) {
-  mixed *ind;
-  int i;
-  
   if ( !mappingp(arr) )
     return;
 
@@ -504,7 +501,6 @@
 }
 
 static mixed _query_timed_attr_mod() {
-  mixed ret;
   return Set(P_TIMED_ATTR_MOD,	    
       ({attributes_timed_mods[0],
 	deep_copy(attributes_timed_mods[1]),
diff --git a/std/living/description.c b/std/living/description.c
index 113f3c4..034b7cb 100644
--- a/std/living/description.c
+++ b/std/living/description.c
@@ -100,7 +100,7 @@
 public varargs int AddExtraLook(string look, int duration, string key, 
                                 string lookende, object ob) {
   mapping xl;
-  string oname;
+
   if (!stringp(key) || !sizeof(key)) {
     // Automatisch erzeugen, wenn moeglich
     if (!objectp(previous_object()) || 
@@ -243,10 +243,8 @@
 }
 
 varargs string long() {
-  string str, cap_pronoun;
-  string descr, invl,tmp,exl;
-  int hpnt, max_hpnt;
-  mixed filter_ldfied;
+  string str;
+  string invl,tmp,exl;
   object ob;
 
   str = process_string( QueryProp(P_LONG) );
@@ -286,7 +284,7 @@
     }
   }
   
-  if(filter_ldfied = QueryProp(P_TRANSPARENT))
+  if(QueryProp(P_TRANSPARENT))
   {
     invl = make_invlist(PL, all_inventory(ME));
     if(invl != "")
diff --git a/std/living/light.c b/std/living/light.c
index 90c3aef..ecbc926 100644
--- a/std/living/light.c
+++ b/std/living/light.c
@@ -30,6 +30,7 @@
 {
   if (environment())
     return environment()->QueryProp(P_INT_LIGHT) + QueryProp(P_LIGHT_MODIFIER);
+  return 0;
 }
 
 varargs int CannotSee(int silent)
diff --git a/std/living/put_and_get.c b/std/living/put_and_get.c
index 936fad0..e44e4da 100644
--- a/std/living/put_and_get.c
+++ b/std/living/put_and_get.c
@@ -280,7 +280,6 @@
 
             return capitalize(wen0 + " kannst Du dort nicht hineinstecken.");
     }
-    return 0; // NOT REACHED
 }
 
 
@@ -1186,7 +1185,6 @@
      else obs=(inv->present_objects(str) || ({}));
      return obs-({ ME });
    }
-   return(0);
 }
 
 int pick_obj(object ob)
@@ -1243,8 +1241,6 @@
 
 int give_obj(object ob, object where)
 {
-  object env;
-
   if (environment(ob)!=this_object()) {
     TME("Das solltest Du erstmal nehmen.");
     return 1;
diff --git a/std/living/skill_attributes.c b/std/living/skill_attributes.c
index c88b4f4..43206e0 100644
--- a/std/living/skill_attributes.c
+++ b/std/living/skill_attributes.c
@@ -110,9 +110,6 @@
 
 private int InternalModifySkillAttribute(object caster, string atrname,
                                 mixed value, int duration) {
-  int zeit = utime()[1];
-  int ticks = get_eval_cost();
-
   // nur existierende SAs...
   if (!stringp(atrname)
       || member(VALID_SKILL_ATTRIBUTES, atrname) == -1)
diff --git a/std/more.c b/std/more.c
index 3635e88..91ab479 100644
--- a/std/more.c
+++ b/std/more.c
@@ -70,7 +70,7 @@
 
 int search(mixed pinfo)
 {
-  int l, lines;
+  int l;
   mixed tmp;
   l = pinfo[CURL];
   while((tmp = fread(pinfo, l, pinfo[PAGE])) &&
diff --git a/std/newsclient.c b/std/newsclient.c
index eac517e..7d3648e 100644
--- a/std/newsclient.c
+++ b/std/newsclient.c
@@ -223,7 +223,6 @@
 	    default: write("Interner Fehler. Bitte Erzmagier verstaendigen !\n");
 	    return 1;
 	  }
-  return 0;
 }
 
 void Crumble()
diff --git a/std/npc/chat.c b/std/npc/chat.c
index ff6990e..2491d93 100644
--- a/std/npc/chat.c
+++ b/std/npc/chat.c
@@ -68,7 +68,6 @@
 }
 
 void DoAttackChat() {
-  string* c;
   if (!ME || !environment(ME))
     return;
   if (QueryProp(P_DISABLE_ATTACK)>0)return ;
@@ -77,7 +76,6 @@
 }
 
 void DoChat() {
-  string *c;
   if (!ME || !environment(ME))
     return;
   if (random(100) < QueryProp(P_CHAT_CHANCE))
diff --git a/std/pile.c b/std/pile.c
index 049d84f..bb57f48 100644
--- a/std/pile.c
+++ b/std/pile.c
@@ -52,7 +52,6 @@
 	} else {
 		return "Ein grosser Haufen Krempel";
 	}
-  return 0;
 }
 
 // Prueft, ob wir in einen Spieler gemovt werden sollen.
diff --git a/std/player/channel.c b/std/player/channel.c
index cf8d85a..0ecefc2 100644
--- a/std/player/channel.c
+++ b/std/player/channel.c
@@ -349,7 +349,7 @@
 int ChannelParser(string args)
 {
   string|string* ch;
-  int pos, type, err;
+  int type, err;
   string tmp;
   notify_fail("Benutzung: -<Ebene>[ ]['|:|;]<Text>\n"
               "           -<Ebene>[+|-|?|!|*]\n"
diff --git a/std/player/comm.c b/std/player/comm.c
index 87dd6a0..36aaff4 100644
--- a/std/player/comm.c
+++ b/std/player/comm.c
@@ -81,8 +81,6 @@
 // erzeugt sortierte Liste an Kommunikationspartnern
 private string *sorted_commpartners(int reversed);
 
-private nosave string *buffer = ({});
-
 void create()
 {
   ::create();
@@ -989,7 +987,6 @@
 }
 
 static int _msg_prepend(string str) {
-  int beep_interval;
   notify_fail("Syntax: senderwiederholung ein/aus\n");
   if (stringp(str)) {
     if (str=="aus")  
@@ -1109,7 +1106,7 @@
 {
   object    ob;
   string    away,myname,ret;
-  mixed     ignore,it;
+  mixed     it;
   string    *xname;
   int       i,visflag;
 
@@ -1389,9 +1386,7 @@
 
 static int _shout_to_wizards(mixed str)
 {
-  int     i, j;
   string    myname;
-  object   *u;
 
   str = _unparsed_args();
   if (!str||!sizeof(str)) {
@@ -1744,7 +1739,6 @@
         default: // mehr als 3 Teile...
           raise_error(sprintf("TestIgnoreExt(): too many qualifiers, only 1 "
                 "is supported. Got: %s\n",srcname));
-          break;
       }
     }
   }
diff --git a/std/player/command.c b/std/player/command.c
index beea800..d342e90 100644
--- a/std/player/command.c
+++ b/std/player/command.c
@@ -208,6 +208,8 @@
   }
   else if (!s||s=="")
     return (default_notify_fail=0);
+
+  return 0;
 }
 
 static mixed _query_default_notify_fail()
diff --git a/std/player/description.c b/std/player/description.c
index acd4200..91980f5 100644
--- a/std/player/description.c
+++ b/std/player/description.c
@@ -115,8 +115,7 @@
 
 varargs string long()
 {
-  string exl, descr, tmp, size_descr;
-  object ob;
+  string descr, size_descr;
   mixed trans, w, a, r;
   int per;
   string fill, fill2;
diff --git a/std/player/exploration.c b/std/player/exploration.c
index 3990e54..e45637e 100644
--- a/std/player/exploration.c
+++ b/std/player/exploration.c
@@ -21,8 +21,6 @@
 
 private string given_scores;
 
-private nosave mixed epnum;
-
 void create() {
   Set(P_LEP, SECURED|SAVE, F_MODE_AS);
 
diff --git a/std/player/invmaster/invmaster.c b/std/player/invmaster/invmaster.c
index 49c3c38..2ac7bd2 100644
--- a/std/player/invmaster/invmaster.c
+++ b/std/player/invmaster/invmaster.c
@@ -132,10 +132,7 @@
 // where possible
 static string ComposeDesc(object item)
 {
-  int i;
-  string text, *buff;
-  
-  text=regreplace(item->QueryProp(P_SHORT)
+  string text=regreplace(item->QueryProp(P_SHORT)
                 ||item->name(RAW)
                 ||"<?>",
                 "^(Ein Paar|Ein|Eine|Der|Die|Das) ","",0);
diff --git a/std/player/life.c b/std/player/life.c
index 3a52dee..ca295fd 100644
--- a/std/player/life.c
+++ b/std/player/life.c
@@ -505,7 +505,7 @@
 static int _set_hp( int hp )
 {
     object *hooks;
-    int ret, i, old;
+    int ret, old;
 
     if ( (old = Query(P_HP, F_VALUE)) == hp )
         return old;
@@ -532,7 +532,7 @@
 static int _set_sp( int sp )
 {
     object *hooks;
-    int ret, i, old;
+    int ret, old;
 
     if ( (old = Query(P_SP,F_VALUE)) == sp )
         return old;
diff --git a/std/player/protocols/gmcp.c b/std/player/protocols/gmcp.c
index e3e6d6c..905fdc9 100644
--- a/std/player/protocols/gmcp.c
+++ b/std/player/protocols/gmcp.c
@@ -156,9 +156,8 @@
 
 private void GMCP_unregister_module(string mod)
 {
-  int version;
   // Wenn nicht "mod version" Schema, ignorieren
-  if (sscanf(mod, "%s %d", mod, version) != 2)
+  if (sscanf(mod, "%s %~d", mod) != 2)
       return;
 
   if (mod=="Core") // darf nicht abgeschaltet werden.
diff --git a/std/player/reputation.c b/std/player/reputation.c
index 792c386..f32b75d 100644
--- a/std/player/reputation.c
+++ b/std/player/reputation.c
@@ -27,7 +27,9 @@
  */
 public varargs int ChangeReputation(string repid, int value, 
                                           int silent) {
-  string uid, changemsg; int newval; mapping rep;
+  string changemsg;
+  int newval;
+  mapping rep;
   
   if(!intp(value) || !value || !stringp(repid) || !sizeof(repid)) 
     return REP_RET_WRONGARGS;
diff --git a/std/player/shadows/ark_hunger_shadow.c b/std/player/shadows/ark_hunger_shadow.c
index 42d6dff..2559f01 100644
--- a/std/player/shadows/ark_hunger_shadow.c
+++ b/std/player/shadows/ark_hunger_shadow.c
@@ -46,6 +46,7 @@
   }
   return 0;
  }
+ return 0;
 }
 
 void Loeschen() {
diff --git a/std/player/soul.c b/std/player/soul.c
index 9ea7bba..5368d1d 100644
--- a/std/player/soul.c
+++ b/std/player/soul.c
@@ -633,7 +633,7 @@
 varargs static int
 SoulComm(string str, string _verb)  {
   int t_g,t_n,flag;
-  string str1,str2,str3,*taenze,vb;
+  string str1,str2,*taenze,vb;
   out_sel=out_vic=out_oth=who=0;
 //  if (this_interactive()!=ME) return 0;
   if (interactive(ME)) str=_unparsed_args(); // NPCs haben das nicht :(
diff --git a/std/player/travel.c b/std/player/travel.c
index 1b41d59..cca6a54 100644
--- a/std/player/travel.c
+++ b/std/player/travel.c
@@ -43,7 +43,7 @@
 static int reise(string str)
 {
   mixed  t, ship, dstr;
-  string mit, nach, s1, s2;
+  string mit, nach;
   int    i;
 
   _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n\n"
diff --git a/std/player/util.c b/std/player/util.c
index 0d7ca18..40d3729 100644
--- a/std/player/util.c
+++ b/std/player/util.c
@@ -96,7 +96,7 @@
 // Lacht nicht ueber den Namen!!! -Boing
 // Nein, ueber den Namen lache ich nicht ... -Paracelsus
 static void DumpKeyValPair(mapping x, mixed key, int size)
-{ int j, vc;
+{ int j;
 
   PrettyDump(key);
   write(" : ");
diff --git a/std/player/viewcmd.c b/std/player/viewcmd.c
index 718db88..ab528c5 100644
--- a/std/player/viewcmd.c
+++ b/std/player/viewcmd.c
@@ -109,7 +109,7 @@
 int _inventory(string str)
 {
   mixed *args, output;
-  int ansi, i, flags, minv;
+  int ansi, flags, minv;
   mixed inventory, weapons, armours, misc;
   string format;
 
@@ -681,8 +681,6 @@
       return 0;
     }
   }
-  // Nie erreicht.
-  return 0;
 }
 
 varargs int _examine(string str, int mode)
@@ -768,7 +766,6 @@
 varargs string env_descr(int allow_short,int flags, int force_short )
 {
   object env;
-  int brief;
 
   env = environment(ME);
 
@@ -778,7 +775,7 @@
   if (!force_short && (!allow_short || !QueryProp(P_BRIEF)))
       return env->int_long(ME,ME,flags);
 
-  if (!flags && ((brief=QueryProp(P_BRIEF))>=2))
+  if (!flags && QueryProp(P_BRIEF)>=2)
       return "";
 
   return env->int_short(ME,ME);
diff --git a/std/room/pub.c b/std/room/pub.c
index bdd2c90..00121b1 100644
--- a/std/room/pub.c
+++ b/std/room/pub.c
@@ -93,7 +93,6 @@
     case "&6#": return "@WESSENQP1";
     case "&7#": return "@WEMQP1";
     case "&8#": return "@WENQP1";
-    default: return str;
   }
   return str;
 }
diff --git a/std/room/shop.c b/std/room/shop.c
index 1196129..880aadb 100644
--- a/std/room/shop.c
+++ b/std/room/shop.c
@@ -35,8 +35,6 @@
 
 varargs void AddFixedObject(string str, int val, string|string* ids)
 {
-  int i;
-
   // Achtung, bei solchen Objekten muss die Blueprint initialisiert werden!
   if (!str) return;
   if (!val) val=str->QueryProp(P_VALUE);
@@ -205,7 +203,6 @@
 {
   object store = load_object(storage);
   store->_register_shop(ME);
-  object* output = ({});
   object* all_items = all_inventory(store);
 
   // Wir brauchen eine Liste, die von jeder Blueprint nur einen Clone
diff --git a/std/secure_thing.c b/std/secure_thing.c
index 805c7df..e47f66a 100644
--- a/std/secure_thing.c
+++ b/std/secure_thing.c
@@ -29,5 +29,6 @@
   string sh;
   if( sh=QueryProp(P_SHORT) )
     return funcall(sh)+".\n";
+  return 0;
 }
 
diff --git a/std/shells/darkelf.c b/std/shells/darkelf.c
index bf197ef..e993a03 100644
--- a/std/shells/darkelf.c
+++ b/std/shells/darkelf.c
@@ -203,7 +203,6 @@
     }
     return sinfo[SI_SKILLABILITY]+1;
   }
-  return 0;
 }
 
 varargs int CannotSee(int silent)
diff --git a/std/shells/magier/fileedit.c b/std/shells/magier/fileedit.c
index b0bfeb0..a242c68 100644
--- a/std/shells/magier/fileedit.c
+++ b/std/shells/magier/fileedit.c
@@ -60,7 +60,7 @@
 static int _ed(string cmdline)
 {
   mixed *args,*args2;
-  int flags,i,arg_size;
+  int flags,arg_size;
   cmdline=_unparsed_args();
   args=parseargs(cmdline,&flags,"",1);
   if (flags==-1||!(arg_size=sizeof(args)))
@@ -149,7 +149,6 @@
       if (flags&CP_V) printf(FILE_COPIED,source);
       return RET_OK;
   }
-  return 0; // not-reached
 }
 
 static void _cp_ask_overwrite2(string input, mixed *filedata,
@@ -290,9 +289,8 @@
 
 static void _cp_ask_copy(mixed *filedata,int move, int flags)
 {
-  mixed data;
   string dest,source;
-  int delete_subs,jump;
+  int jump;
 
   if(!sizeof(filedata))
   {
@@ -441,7 +439,7 @@
 
 static int _rmdir(string cmdline)
 {
-  string dest,tmp;
+  string dest;
   int flags;
   mixed *args;
   
@@ -492,7 +490,7 @@
 
 static int _mkdir(string cmdline)
 {
-  string dest,tmp;
+  string dest;
   int flags,i;
   string *args;
   
@@ -581,13 +579,10 @@
       _rm_ask_delete(filedata,flags);
       return;
   }
-  return;
 }
 
 private void _rm_ask_delete(mixed *filedata, int flags)
 {
-  int i;
-  mixed temp;
   if (!sizeof(filedata))
   {
     printf("rm: abgeschlossen.\n");
@@ -600,7 +595,7 @@
       _rm_ask_delete(filedata[1..],flags);
       return;
     case FSIZE_DIR:
-      if (i=filedata[0][SUBDIRSIZE])
+      if (filedata[0][SUBDIRSIZE])
         printf("Ins Verzeichnis '%s' hinabsteigen?\n",
           filedata[0][FULLNAME]);
       else
@@ -652,7 +647,7 @@
 
 static int _rm(string cmdline)
 {
-  mixed *args,*args2;
+  mixed *args;
   int flags,i;
   string mask;
   
diff --git a/std/shells/magier/fileview.c b/std/shells/magier/fileview.c
index 6929357..2fc4b2f 100644
--- a/std/shells/magier/fileview.c
+++ b/std/shells/magier/fileview.c
@@ -65,7 +65,6 @@
 // und bereitet beides fuer die Nutzung durch terminal_colours() vor.
 private void SetColorstrings()
 {
-  string term = QueryProp(P_TTY);
   mapping vars = QueryProp(P_VARIABLES);
   // 2nd value in templates is the additional amount of space the templates
   // itself needs in addition to the value inserted later in place of %s.
@@ -76,7 +75,7 @@
   lstemplates.colormap[0]=ANSI_NORMAL;
   // Template fuer die Ausgabe und die Defaults fuer die Farbplatzhalter je
   // nach Terminal einstellen.
-  switch(term=QueryProp(P_TTY))
+  switch(QueryProp(P_TTY))
   {
     case "vt100":
       lstemplates.templates[DIR] = "%^LS_DIR_START%^%s/%^LS_DIR_END%^";
@@ -153,7 +152,6 @@
 private int _ls_maxlen(mixed filedata,int flags,int maxlen)
 {
   string base;
-  int size;
   base=filedata[BASENAME];
   if (!(flags&LS_A)&&(base[0]=='.')) return 0;
   maxlen=max(maxlen,sizeof(base));
@@ -250,7 +248,7 @@
   mixed* args;
   string output;
   mixed *tmp;
-  closure output_fun,v_read,v_write,creator,sort_fun;
+  closure v_read,v_write,creator,sort_fun;
   
   cmdline=_unparsed_args()||"";
   args=parseargs(cmdline,&flags,LS_OPTS,1);
diff --git a/std/shells/magier/todo.c b/std/shells/magier/todo.c
index c87d17d..f28bd12 100644
--- a/std/shells/magier/todo.c
+++ b/std/shells/magier/todo.c
@@ -12,7 +12,6 @@
 
 #define SAVEFILENAME sprintf("/players/%s/.todoliste",getuid())
 
-private nosave status todo_initialized;
 private nosave mixed *todo_data;
 mixed *todo_data_public;
 static mixed _query_localcmds()
@@ -23,9 +22,8 @@
 
 private void todo_save()
 {
-
-  int i,j;
-  string a,b;
+  int j;
+  string a;
   a=SAVEFILENAME+".o";
   rm(a);
   if (j=sizeof(todo_data))
diff --git a/std/shells/magier/upd.c b/std/shells/magier/upd.c
index 87a3030..ebee975 100644
--- a/std/shells/magier/upd.c
+++ b/std/shells/magier/upd.c
@@ -65,7 +65,6 @@
   if (!obj=find_object(file[0..<3]+(clone?("#"+clone):"")))
   {
     int pos,pos2;
-    string bt;
 
     if(file_size(file)<0)
     {
@@ -356,7 +355,7 @@
   if ( (!(flags&UPD_LOAD))&&
        ((obj = find_object(file)) || (flags & (UPD_M|UPD_I))))
   {
-    object *inv, env, *pl_inv;
+    object *inv, env;
     mapping pro;
     int i;
     mixed configdata;
diff --git a/std/spellbook.c b/std/spellbook.c
index ac9031a..8ef27d1 100644
--- a/std/spellbook.c
+++ b/std/spellbook.c
@@ -162,13 +162,12 @@
 varargs int
 TryDefaultAttackSpell(object victim, object caster, mapping sinfo, 
                       mixed si_spell) {
-  object team;
   int row;
   
   if (!si_spell) si_spell=sinfo[SI_SPELL];
   // Wenn der Spieler in einem Team ist, die Teamreihen-Boni
   // beruecksichtigen. Wenn nicht, eben nicht.
-  if (!team=(({object})caster->QueryProp(P_TEAM)))
+  if (!({object})caster->QueryProp(P_TEAM))
   return TryAttackSpell(victim,
                         GetRandFValueO(SI_SKILLDAMAGE,sinfo,caster),
                         GetData(SI_SKILLDAMAGE_TYPE,sinfo,caster),
@@ -299,7 +298,7 @@
 varargs int
 UseSpell(object caster, string spell, mapping sinfo) {
   mapping ski,tmp;
-  string spellbook,sname,fname,txt;
+  string sname,fname,txt;
   int res,fat,cost;
   mixed ps;
 
diff --git a/std/thing/commands.c b/std/thing/commands.c
index 157fe74..98934eb 100644
--- a/std/thing/commands.c
+++ b/std/thing/commands.c
@@ -608,8 +608,7 @@
   while(nindex--)
    if(!strstr(query_verb(),keys[nindex]) &&
       member((flag=added_cmds[keys[nindex], CMDIDX_FLAG]),1)>=0) {
-    int i,ret;
-    i=sizeof(flag);
+    int i = sizeof(flag);
     // Reihenfolge nicht aendern !
     while(i--)
       if(flag[i]==1) {
diff --git a/std/thing/description.c b/std/thing/description.c
index b2326da..db238d2 100644
--- a/std/thing/description.c
+++ b/std/thing/description.c
@@ -275,7 +275,6 @@
 // zusamengebaut werden, dazu muss ich das leerzeichen aber erstmal
 // abschneiden und so weiter ...
 private string depointer_adj( <string|string*>* adj, int casus, int demon ) {
-  string msg;
   int start;
   string res,a;
 	adj = map( adj, #'DeclAdj, casus, demon );
@@ -498,7 +497,6 @@
 // Detail(s) hinzufuegen
 public void AddDetail(string|string* keys, string|string*|mapping|closure descr)
 {
-    int i;
     mapping details;
 
     details = Query(P_DETAILS, F_VALUE);
diff --git a/std/thing/language.c b/std/thing/language.c
index 4b23c8a..e0e3b3d 100644
--- a/std/thing/language.c
+++ b/std/thing/language.c
@@ -50,7 +50,7 @@
 // Artikel vorschlagen: gibt es noch mehr Objekte im inv?
 protected varargs int SuggestArticle(string id)
 {
-  object ob,*obs;
+  object ob;
 
   // Raum oder Master: Bestimmt.
   if (!environment()) return 1;
@@ -110,8 +110,6 @@
 // Pronomen bestimmen nach KNG
 public varargs string QueryPronoun(int casus)
 {
-  int gender;
-
   // Plural ist immer einfach ...
   if (QueryProp(P_PLURAL)) 
   {
diff --git a/std/thing/light.c b/std/thing/light.c
index 465eea7..99d2e17 100644
--- a/std/thing/light.c
+++ b/std/thing/light.c
@@ -85,5 +85,4 @@
     default:
       return (lighttype & my_light_type);
   }
-  return 0;
 }
diff --git a/std/thing/util.c b/std/thing/util.c
index 0a0d1ff..4e58576 100644
--- a/std/thing/util.c
+++ b/std/thing/util.c
@@ -96,7 +96,7 @@
 // Lacht nicht ueber den Namen!!! -Boing
 // Nein, ueber den Namen lache ich nicht ... -Paracelsus
 static void DumpKeyValPair(mapping x, mixed key, int size)
-{ int j, vc;
+{ int j;
 
   PrettyDump(key);
   write(" : ");
diff --git a/std/transport.c b/std/transport.c
index 2f46927..1499cbc 100644
--- a/std/transport.c
+++ b/std/transport.c
@@ -177,8 +177,7 @@
 
 mixed HasRoute(mixed dest)
 {
-  int i,s,z;
-  string str;
+  int i,s;
   object ob;
   mixed harb;
   
@@ -484,8 +483,7 @@
 static varargs void connect(string room, string code)
 {
   mixed *arrivemsg, *t;
-  object *trav, ob;
-  string *trs, *msgs;
+  object *trav;
   int i;
 
   if (roomCode) disconnect();
diff --git a/std/unit.c b/std/unit.c
index 3024714..83c73a9 100644
--- a/std/unit.c
+++ b/std/unit.c
@@ -627,7 +627,6 @@
 // uebergeben. Wichtig: zu diesem Zeitpunkt hat sich an der Unit noch nix (!)
 // geaendert!
 protected void DoDecayMessage(int oldamount, int zerfall) {
-  string msg;
   if (oldamount == zerfall) {
     if (living(environment())) {
       tell_object(environment(), break_string(sprintf(
diff --git a/std/user_filter.c b/std/user_filter.c
index edc3deb..4b156c2 100644
--- a/std/user_filter.c
+++ b/std/user_filter.c
@@ -165,7 +165,7 @@
 {
   object *res, *orig, *zwi;
   string *words;
-  int i, sz, f, l,t;
+  int i, sz, f, t;
   mixed x;
   
   orig = users();
diff --git a/std/util/ex.c b/std/util/ex.c
index aa8509d..ded4707 100644
--- a/std/util/ex.c
+++ b/std/util/ex.c
@@ -279,10 +279,9 @@
 
 varargs int ex(mixed text, closure func, mixed fargs, string buffer)
 {
-  int c, l;
+  int l;
   mixed ct;
   if(!text) text = "";
-  c = sizeof(text);
   l = sizeof(text = explode(text, "\n")) - 1;
   ct = ({ CMD, text, 0, func, fargs, 0, 0});
   if(!ctrl[buffer]) StartEX(0, ct);
diff --git a/std/util/pager.c b/std/util/pager.c
index abd5e63..d628ea6 100644
--- a/std/util/pager.c
+++ b/std/util/pager.c
@@ -26,7 +26,7 @@
   if(pinfo[FILE]) return read_file(pinfo[TEXT], begin, c);
   else
   {
-    int start, end, l, x;
+    int start, end;
 
     if(member(pinfo[JUNK], begin)) 
     {
diff --git a/std/util/ringbuffer.c b/std/util/ringbuffer.c
index b7143af..a549836 100644
--- a/std/util/ringbuffer.c
+++ b/std/util/ringbuffer.c
@@ -135,7 +135,6 @@
       else
 	return copy(rbuffer);
   }
-  return 0;
 }
 
 /** Erzeugt einen neuen Ringbuffer der Groesse \a size und dem gleichen Modus
diff --git a/std/virtual/v_compiler.c b/std/virtual/v_compiler.c
index a6bb773..c09eaab 100644
--- a/std/virtual/v_compiler.c
+++ b/std/virtual/v_compiler.c
@@ -130,7 +130,6 @@
 private mixed AddObject(string file)
 {
   object ob;
-  string err;
 
   // clean up the object list
   objects = filter_indices(objects, function int (string f) {
diff --git a/std/weapon/combat.c b/std/weapon/combat.c
index f26b1d8..333ea3c 100644
--- a/std/weapon/combat.c
+++ b/std/weapon/combat.c
@@ -219,7 +219,6 @@
 varargs int wield_me(int silent) 
 {
   raise_error("wield_me() ist veraltet. Bitte nutze DoWield()\n");
-  return 1;
 }
 
 // Die Funktion, die das eigentliche Zuecken durchfuehrt.
