Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/obj/tools/dancetool.c b/obj/tools/dancetool.c
new file mode 100644
index 0000000..dcf3b9a
--- /dev/null
+++ b/obj/tools/dancetool.c
@@ -0,0 +1,321 @@
+// DANCETOOL.C   Stand: 10.12.94 Dancer 
+//
+// Kleines Tool zum Schreiben und Nachsehen von Details.
+//
+//
+ 
+inherit "std/thing";
+ 
+#include <properties.h>
+#include <defines.h>
+#include <wizlevels.h>
+ 
+#define bs( x ) break_string( x, 78 )
+ 
+private int i, counter, first_detail_line, startline, endline; 
+private string *detail_shorts, *newstring, *file_lines, *new_lines;
+private string detail_long, save_string, old_file, new_file, actual_file,
+               detail_text;
+       
+void create()
+{
+   ::create();
+   SetProp( P_AUTOLOADOBJ,1 );
+   SetProp( P_NAME, "Dancers Sandtigerkralle" );
+   SetProp( P_GENDER, FEMALE );
+   SetProp( P_SHORT, "Dancers Sandtigerkralle" );
+   SetProp( P_LONG, bs( "Die Sandtigerkralle von Dancer ist "+
+              "ein kleines Tool, mit dem Du gewoehnliche Details "+
+              "in allen Raeumen nachschauen und in Deinen eigenen "+
+              "hinzufuegen kannst. Weitere Informationen kannst Du "+
+              "mit dem Befehl <dancetool> bekommen." ) );
+   SetProp( P_ARTICLE, 2 );
+   SetProp( P_WEIGHT, 500 );
+   SetProp( P_VALUE, 10000 );
+   SetProp( P_NOBUY, 1 );
+   SetProp( P_NODROP, 1 );
+   AddId( "kralle" );
+   AddId( "sandtigerkralle" );
+   AddId( "tigerkralle" );
+   AddId( "dancetool" );
+   AddId( "dancertool" );
+   seteuid(getuid(this_object()));
+}
+ 
+ 
+void init()
+{
+  if (!IS_LEARNER(this_player())) return;
+  ::init();
+  add_action("query_add_details", "show_detail" );
+  add_action("query_add_details", "show_details" );
+  add_action("query_add_details", "sd" );
+  add_action("set_add_detail", "add_detail" );
+  add_action("set_add_detail", "add_details" );
+  add_action("set_add_detail", "ad" );
+  add_action("give_info", "dancetool" );
+}
+ 
+ 
+int give_info()
+{
+   write( "-----------------------------------------------------------------------------\n" );
+   write( "Die Sandtigerkralle ermoeglicht folgende Befehle:\n" );
+   write( "\nadd_detail, add_details oder ad:\n" );
+   write( bs( "Ruft einen kleinen AddDetail-Editor auf, mit dem Du "+
+      "Details in Deine eigenen Raeume einfuegen kannst. Als Argument "+
+      "kann hinter den Befehl der Filename eines Raumes eingegeben "+
+      "werden. Wird kein Argument eingegeben, so wird der Raum "+
+      "genommen, in dem Du gerade stehst. Achtung: Es koennen "+
+      "nur Details in Raeume eingefuegt haben, die bereits ein "+
+      "AddDetail in ihrem create() haben. Du musst die Lupe haben, "+
+      "da der Raum nach dem Einfuegen des Details automatisch "+
+      "neu geladen wird." ) );
+   write( "\nshow_detail, show_details oder sd:\n" );
+   write( bs( "Zeigt Dir alle Zeilen des angesprochenen Raumes bzw. "+
+      "des Raumes in dem Du stehst, die ein AddDetail "+
+      "beinhalten. So kannst Du kontrollieren, welche Details "+
+      "Du schon eingebaut hast." ) );
+   write( "-----------------------------------------------------------------------------\n" );
+   return 1;
+}
+ 
+ 
+int renew_variables()
+{
+   i = counter = first_detail_line = startline = endline = 0; 
+   detail_shorts = newstring = file_lines = new_lines = ({});
+   detail_long = save_string = old_file = new_file = actual_file = detail_text = 0;
+   return 1;
+} 
+ 
+ 
+ 
+int query_add_details( string str )
+{
+   string old_file, *file_lines, new_file, *new_lines, actual_file;        
+   int i, counter, first_detail_line, startline, endline;      
+ 
+   actual_file = "";
+                            
+   if ( !str ) actual_file = object_name( environment( this_player() ) )+".c";
+   else       
+   {
+      if ( str[0..0] == "/" )
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = str+".c";
+         else
+             actual_file = str;
+      }
+      else
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str+".c";
+         else
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str;
+      }
+   }
+   if ( file_size( actual_file )==-1 )
+   {
+     write( "File: "+actual_file+" nicht gefunden!\n" );
+     return 1;
+   }
+   call_other( actual_file, "???" );
+   write( "\n-----------------------------------------------------------------------------\n" );
+   write( "Aktuelles File:   "+actual_file+"\n" );
+   write( "Filegroesse:      "+file_size( actual_file )+"\n" );
+   write( "Userid des Files: "+getuid( find_object( actual_file ) )+"\n" );
+   new_file = "";
+   counter = 0;
+   first_detail_line = 0;
+   old_file = read_file( actual_file );
+   file_lines = ({ "dummy" }) + old_explode( old_file, "\n" );          
+   startline = 1;
+   endline = sizeof( file_lines )-1;        
+   for( i = startline; i <= endline; i++ )
+   {                                                        
+      new_file = new_file+file_lines[ i ]+"\n";
+      if ( strstr( file_lines[i], "AddDetail" ) != -1 )
+      {
+         write( file_lines[i]+"\n" );
+         if ( !first_detail_line ) first_detail_line = i;
+          counter = counter + 1;
+      }
+   }                                
+   write( "Details found: "+counter+".\n" ); 
+   write( "-----------------------------------------------------------------------------\n" );
+   return 1;
+}    
+ 
+ 
+int set_add_detail( string str )
+{
+ 
+   renew_variables();
+                            
+   if ( !str ) actual_file = object_name( environment( this_player() ) )+".c";
+   else       
+   {
+      if ( str[0..0] == "/" )
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = str+".c";
+         else
+             actual_file = str;
+      }
+      else
+      {
+         if ( str[<2..] != ".c" )
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str+".c";
+         else
+             actual_file = this_player()->QueryProp( P_CURRENTDIR )+
+                           "/"+str;
+      }
+   }
+   if ( file_size( actual_file )==-1 )
+   {
+     write( "File: "+actual_file+" nicht gefunden!\n" );
+     return 1;
+   }
+   call_other( actual_file, "???" );
+   write( "\n-----------------------------------------------------------------------------\n" );
+   write( "Aktuelles File:   "+actual_file+"\n" );
+   write( "Filegroesse:      "+file_size( actual_file )+"\n" );
+   write( "Userid des Files: "+getuid( find_object( actual_file ) )+"\n" );
+   new_file = "";
+   new_lines = ({ "dummy" });
+   counter = 0;
+   first_detail_line = 0;
+   old_file = read_file( actual_file );
+   file_lines = ({ "dummy" }) + old_explode( old_file, "\n" );          
+   startline = 1;
+   endline = sizeof( file_lines )-1;        
+   for( i = startline; i <= endline; i++ )
+   {                                                        
+      new_file = new_file+file_lines[ i ]+"\n";
+      if ( strstr( file_lines[i], "AddDetail" ) != -1 )
+      {
+        if ( !first_detail_line ) first_detail_line = i;
+        counter = counter + 1;
+      }
+   }
+   if ( !first_detail_line )
+   {
+      write( bs( "Es wurden im File "+actual_file+" keine "+
+         "Details gefunden! Um Details hinzufuegen zu koennen, "+
+         "muss mindestens ein AddDetail bereits vorhanden sein!" ) );
+      write( "-----------------------------------------------------------------------------\n" );
+      return 1;
+   }
+   write( "Details found:    "+counter+".\n" );
+   write( "-----------------------------------------------------------------------------\n" ); 
+   write( "Bitte die Detail-Kuerzel eingeben:\n(Bemerkung: "+
+          "die Kuerzel muessen mit Leerzeichen getrennt sein, "+
+          "Abbruch mit 'q'.)\n->" );
+   input_to( "get_detail_short" );
+   return 1;
+}    
+ 
+ 
+int get_detail_short( string str )
+{
+   string dummy;
+   if ( str == "q" )
+   {
+     tell_object( this_player(), "Abgebrochen!\n" );
+     return 1;
+   }
+   detail_shorts = map( old_explode( str, " " ),#'lower_case);
+   dummy = break_string(implode(sort_array(map(detail_shorts,#'lower_case),#'>),", ")+":",78);
+   write( "-----------------------------------------------------------------------------\n" );
+   write( bs ( "Bitte Beschreibung eingeben fuer das Detail mit den Namen \n" ) );
+   write( dummy+"( Abbruch mit 'q'.)\n->" );
+   input_to( "get_detail_long" );
+   return 1;
+}
+ 
+ 
+int get_detail_long( string str )
+{
+   if ( str == "q" )
+   {
+     write( "Abgebrochen!\n" );
+     write( "-----------------------------------------------------------------------------\n" );
+     return 1;
+   }
+   detail_long = break_string( "break_string( \""+str, 60 ); 
+   save_string = "  AddDetail( ({ ";        
+   for( i = 0; i < sizeof( detail_shorts ); i ++ )
+   {
+      if ( !(i%3) && i )
+        save_string = save_string + "\n                ";
+      if ( i < sizeof( detail_shorts ) - 1 ) 
+         detail_shorts[ i ] = "\""+detail_shorts[ i ]+"\", ";
+      else
+         detail_shorts[ i ] = "\""+detail_shorts[ i ]+"\" ";
+      save_string = save_string + detail_shorts[ i ];      
+      write( detail_shorts[ i ]+"\n" );
+   }
+   save_string = save_string + "}), \n";
+   newstring = old_explode( detail_long,"\n");
+   i = 0; 
+   for( i = 0; i<sizeof(newstring); i++) 
+   {
+      if ( i < sizeof(newstring)-1 )
+      {
+         if ( i==0||!i )
+          save_string = save_string +"                "+newstring[i]+" \"+\n";
+         else
+          save_string = save_string +"                \""+ newstring[i]+" \"+\n";
+ 
+      }
+      else
+      {
+         if ( i==0||!i )
+          save_string = save_string +"                "+ newstring[i]+"\", 78 ) );";
+         else
+          save_string = save_string +"                \""+ newstring[i]+"\", 78 ) );";
+      }
+   }
+   new_lines += ({ "dummy" });
+   for ( i = 1; i < first_detail_line; i++ )
+   {
+     new_lines += ({ file_lines[i] });
+   }                                  
+   new_lines += ({ save_string });
+   for ( i = first_detail_line + 1; i <= endline+1; i++ )
+     new_lines += ({ file_lines[ i - 1 ] });
+   write( "-----------------------------------------------------------------------------\n" );
+   write( bs( "Folgende Zeilen werden in die Datei "+actual_file+" geschrieben, falls `j` eingegeben wird:\n" ) );
+   write( save_string+"\n" );
+   write( "\nDetail speichern? (j/n)\n->" );
+   input_to( "save_detail" );
+   return 1;
+}
+ 
+ 
+int save_detail( string str )
+{  
+   if ( str != "j" && str != "ja" && str != "Ja" && str != "J" )
+   {
+     write( "Abgebrochen!\n" );
+     write( "-----------------------------------------------------------------------------\n" );
+     return 1;
+   }   
+   if ( !rm( actual_file ) )
+   {
+      write( "File: "+actual_file+" wurde nicht gefunden!\n" );
+      return 1;
+   }                   
+   for ( i = 2; i <= endline+2; i++ )
+     write_file( actual_file, new_lines[i]+"\n" ); 
+     //write( new_lines[i]+"\n" ); 
+   write( "Das Detail wurde in die Datei geschrieben.\n" );
+   this_player()->command_me( "here make" );
+   write( "-----------------------------------------------------------------------------\n" );  
+   return 1;
+}