diff 17/german.h 18/german.h
50c50
<         = "Offizielle deutsche Inform-Library, Release 17, Serial 021006";
---
>         = "Offizielle deutsche Inform-Library, Release 18, Serial 021015";
189a190,191
> !Alle Pronomen ab 'spez.' (inklusive) werden nicht angezeigt, wenn der
> !Spieler "Pronomen" eingibt.
191a194,203
> !Muß genausoviel Einträge haben wie bekannte Pronomen.
> 
> !Speichert das Geschlecht, unter dem das Pronomen gespeichert wurde
> !(eine tür wird als tor bezeichnet) -> Geschlecht neutral -> ihm
> !setzen. ihm ist mehrdeutig (m/n)
> Array LP_Changing_Gender_gender -> 7;
> 
> !Speichert das vorherige Objekt
> Array LP_Changing_Gender_prev_object --> NULL NULL NULL NULL NULL NULL NULL;
> 
323a336,341
> #ifdef INFIX;
>     !Bei Infix-Kommandos gar nichts machen, sonst wird z.B. ';give'
>     !nicht erkannt
>     if (buffer-> (parse->5) == ';') return;
> #endif;    
> 
1028c1046
<               23: "[Du scheinst mit jemandem sprechen zu wollen, aber ich weiss nicht, mit wem.]";
---
>               23: "[Du scheinst mit jemandem sprechen zu wollen, aber ich weiß nicht, mit wem.]";
diff 17/germang.h 18/germang.h
174,175c174,175
<       1: if (w == 'hinein' or 'rein') a = -1;
<       2: if (w == 'heraus' or 'herunter' or 'raus') a = -1;
---
>       1: if (w == 'hinein' or 'rein' or 'darein') a = -1;
>       2: if (w == 'heraus' or 'herunter' or 'raus' or 'daraus') a = -1;
177a178
>       5: if (w == 'darauf' or 'drauf' or 'herauf' or 'rauf') a=-1; 
195c196
< [ xhinweg;	return Token__LokalAdverb(3, 2); ];
---
> [ xhinweg;	return Token__LokalAdverb(3, 0); ];
198a200
> [ xdarauf;      return Token__LokalAdverb(5, 0); ];
237a240
>         * multiexcept xdarauf		         -> PutOn
433a437
>                 * xdarauf                         -> Enter
497a502
>                 * multiexcept xdarauf                   -> PutOn
581a587
>                 * xdarauf                               -> Attack
642a649
>                 * xdarauf                         -> Climb
661a669
>                 * xdarauf                         -> Swing
664a673
>                 * 'dich'/'mich' xdarauf           -> Swing
670a680
>                 * xdarauf                         -> Blow
diff 17/inform_de_aenderungen.txt 18/inform_de_aenderungen.txt
3a4,710
> * Deutsche Inform Library: Änderungsliste 18 (15.10.2002)
> ***********************************************************************
> ***********************************************************************
> ***********************************************************************
> 
> Vorschläge von: Christoph Winkler, Kai Roos, Dennis Brakhane
> 
> ***********************************************************************
> * german.h
> ***********************************************************************
> 
> Alt:
>                3: print "Auf ", (dem) x1;			!Max Kalus
>                   WriteListFromCase(child(x1),
>                       TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT, 0, Gen);
>                   ".";
> Neu:
>                3: print "Auf ", (dem) x1;			!Max Kalus
>                   WriteListFromCase(child(x1),
>                       TERSE_BIT + ENGLISH_BIT + ISARE_BIT + CONCEAL_BIT, 0, Akk);
>                   ".";
> 
> ***********************************************************************
> 
> Alt:
>               39: "Ein flüchtiger Blick darauf sagt dir, ", (string) C_DASS,
>                     "es sich um nichts wichtiges für das Spiel handelt.";
> Neu:
>               39: "Ein flüchtiger Blick darauf sagt dir, ", (string) C_DASS,
>                     "es sich um nichts Wichtiges für das Spiel handelt.";
> 
> ***********************************************************************
> 
> Alt:
>               23: "[Du scheinst mit jemandem sprechen zu wollen, aber ich weiss nicht, mit wem.]";
> Neu:
>               23: "[Du scheinst mit jemandem sprechen zu wollen, aber ich weiß nicht, mit wem.]";
> 
> ***********************************************************************
> 
> Alt:
>       'ihnen'  $$000111000111                    NULL   ! dat-pl
>       'spez.'  $$111000111000			 NULL;	! special for 'darauf'
> 
> Array LanguageDescriptors table
> Neu:
>       'ihnen'  $$000111000111                    NULL   ! dat-pl
> !Alle Pronomen ab 'spez.' (inklusive) werden nicht angezeigt, wenn der
> !Spieler "Pronomen" eingibt.
>       'spez.'  $$111000111000			 NULL;	! special for 'darauf'
> 
> !Muß genausoviel Einträge haben wie bekannte Pronomen.
> 
> !Speichert das Geschlecht, unter dem das Pronomen gespeichert wurde
> !(eine tür wird als tor bezeichnet) -> Geschlecht neutral -> ihm
> !setzen. ihm ist mehrdeutig (m/n)
> Array LP_Changing_Gender_gender -> 7;
> 
> !Speichert das vorherige Objekt
> Array LP_Changing_Gender_prev_object --> NULL NULL NULL NULL NULL NULL NULL;
> 
> Array LanguageDescriptors table
> 
> ***********************************************************************
> 
> Alt:
> #ifdef TARGET_ZCODE;
> ! 1. Pass: delete the optional "e" at the end of each german verb
> Neu:
> #ifdef TARGET_ZCODE;
> #ifdef INFIX;
>     !Bei Infix-Kommandos gar nichts machen, sonst wird z.B. ';give'
>     !nicht erkannt
>     if (buffer-> (parse->5) == ';') return;
> #endif;    
> 
> ! 1. Pass: delete the optional "e" at the end of each german verb
> 
> ***********************************************************************
> * germang.h
> ***********************************************************************
> 
> Alt:
>   switch (a)
>     {
>       1: if (w == 'hinein' or 'rein') a = -1;
>       2: if (w == 'heraus' or 'herunter' or 'raus') a = -1;
>       3: if (w == 'hinweg' or 'hinfort' or 'weg' or 'fort') a = -1;
>       4: if (w == 'damit') a = -1;
>     };
> Neu:
>   switch (a)
>     {
>       1: if (w == 'hinein' or 'rein' or 'darein') a = -1;
>       2: if (w == 'heraus' or 'herunter' or 'raus' or 'daraus') a = -1;
>       3: if (w == 'hinweg' or 'hinfort' or 'weg' or 'fort') a = -1;
>       4: if (w == 'damit') a = -1;
>       5: if (w == 'darauf' or 'drauf' or 'herauf' or 'rauf') a=-1; 
>     };
> 
> ***********************************************************************
> 
> Alt:
> [ xhinweg;	return Token__LokalAdverb(3, 2); ];
> [ xhinein;	return Token__LokalAdverb(1, 0); ];
> [ xheraus;	return Token__LokalAdverb(2, 0); ];
> [ xdamit;	return Token__LokalAdverb(4, 0); ];
> Neu:
> [ xhinweg;	return Token__LokalAdverb(3, 0); ];
> [ xhinein;	return Token__LokalAdverb(1, 0); ];
> [ xheraus;	return Token__LokalAdverb(2, 0); ];
> [ xdamit;	return Token__LokalAdverb(4, 0); ];
> [ xdarauf;      return Token__LokalAdverb(5, 0); ];
> 
> ***********************************************************************
> 
> Alt:
> 	* multiexcept 'auf' noun		 -> PutOn
> 	* multiexcept 'in' noun hinein		 -> Insert
> Neu:
> 	* multiexcept 'auf' noun		 -> PutOn
>         * multiexcept xdarauf		         -> PutOn
> 	* multiexcept 'in' noun hinein		 -> Insert
> 
> ***********************************************************************
> 
> Alt:
> 		* 'dich'/'mich' xhinein		  -> Enter
>                 * multiexcept 'in' noun           -> Insert
>                 * multiexcept 'in' noun hinein    -> Insert
>                 * multiexcept xhinein		  -> Insert
>                 * multiexcept 'auf' noun          -> PutOn;
> Neu:
> 		* 'dich'/'mich' xhinein		  -> Enter
>                 * 'dich'/'mich' xdarauf           -> Enter
>                 * multiexcept 'in' noun           -> Insert
>                 * multiexcept 'in' noun hinein    -> Insert
>                 * multiexcept xhinein		  -> Insert
>                 * multiexcept 'auf' noun          -> PutOn;
>                 * multiexcept xdarauf 		  -> PutOn
> 
> ***********************************************************************
> 
> Alt:
> Verb 'sitz' 'lieg'
>                 * 'auf' noun                      -> Enter
>                 * 'in' noun                       -> Enter;
> Neu:
> Verb 'sitz' 'lieg'
>                 * 'auf' noun                      -> Enter
>                 * xdarauf                         -> Enter
>                 * 'in' noun                       -> Enter;
> 
> ***********************************************************************
> 
> Alt:
> 		* multiexcept 'auf' noun		-> PutOn
>                 * noun 'auf' special 'ein'		-> SetTo
> Neu:
> 		* multiexcept 'auf' noun		-> PutOn
>                 * multiexcept xdarauf                   -> PutOn
>                 * noun 'auf' special 'ein'		-> SetTo
> 
> ***********************************************************************
> 
> Alt:
> 		* 'auf'	noun				-> Attack
> 		* noun 'auf'				-> Open
> Neu:
> 		* 'auf'	noun				-> Attack
>                 * xdarauf                               -> Attack
> 		* noun 'auf'				-> Open
> 
> ***********************************************************************
> 
> Alt:
>                 * 'auf' noun 'hoch'               -> Climb
>                 * 'in' noun                       -> Enter
> Neu:
>                 * 'auf' noun 'hoch'               -> Climb
>                 * xdarauf                         -> Climb
>                 * 'in' noun                       -> Enter
> 
> ***********************************************************************
> 
> Alt:
> Verb 'schwing' 'schwenk' 'wedel' 'wedl' 'bauml' 'baumel'
>                 * noun                            -> Wave
>                 * 'auf'/'an' noun                 -> Swing
>                 * 'mit' noun			  -> Wave
>                 * xdamit			  -> Wave
>                 * 'dich'/'mich' 'auf'/'in' noun   -> Swing
>                 * 'mit' 'der' 'hand'		  -> WaveHands
>                 * 'mit' 'den' 'haenden'		  -> WaveHands;
> 
> Verb 'blas' 'pust'
>                 * held                            -> Blow
>                 * 'in'/'auf' held                 -> Blow
>                 * xhinein                         -> Blow;
> Neu:
> Verb 'schwing' 'schwenk' 'wedel' 'wedl' 'bauml' 'baumel'
>                 * noun                            -> Wave
>                 * 'auf'/'an' noun                 -> Swing
>                 * xdarauf                         -> Swing
>                 * 'mit' noun			  -> Wave
>                 * xdamit			  -> Wave
>                 * 'dich'/'mich' 'auf'/'in' noun   -> Swing
>                 * 'dich'/'mich' xdarauf           -> Swing
>                 * 'mit' 'der' 'hand'		  -> WaveHands
>                 * 'mit' 'den' 'haenden'		  -> WaveHands;
> 
> Verb 'blas' 'pust'
>                 * held                            -> Blow
>                 * 'in'/'auf' held                 -> Blow
>                 * xdarauf                         -> Blow
>                 * xhinein                         -> Blow;
> 
> ***********************************************************************
> * parserm.h
> ***********************************************************************
> 
> Alt:
> Global old_himobj = NULL;            ! The object which is currently "him"
> Global old_herobj = NULL;            ! The object which is currently "her"
> #endif;
> ! ============================================================================
> Neu:
> Global old_himobj = NULL;            ! The object which is currently "him"
> Global old_herobj = NULL;            ! The object which is currently "her"
> #endif;
> ! ============================================================================
> 
> ! ----------------------------------------------------------------------------
> ! Dies ist die deutsche Version, also definieren wir hier noch ein
> ! paar Globale Variablen, die spezifisch für diese sind.
> ! ----------------------------------------------------------------------------
> 
> Global changed_gender;        !Wird von NounDomain für Synonyme
>                               !vers. Geschlechts gebraucht, muß von
>                               !parse_name gesetzt werden, bei 'name'
>                               !geht's automatisch.
> Array  ND_answer_words --> 5; !dito, wird gebraucht, um bei Nachfragen
>                               !des Parsers (an verschiedenen Stellen)
>                               !das Geschlecht korrekt bestimmen zu
>                               !können. An mehr als 5 Stellen wird er
>                               !wohl nicht nachfragen.
> 
> ! ============================================================================
> 
> ***********************************************************************
> 
> Alt:
>     Keyboard(buffer,parse);
> 
>   .ReParse;
> Neu:
>     Keyboard(buffer,parse);
>     for(i=0:i<5:i++)
> 	ND_answer_words --> i = 0;
> 
>   .ReParse;
> 
> ***********************************************************************
> 
> Alt:
>   if (match_from <= num_words)
>   {   if (number_matched==1) { i=match_list-->0; return i; }
> 
> !  ...now suppose that there was more typing to come, i.e. suppose that
> Neu:
>   if (match_from <= num_words)
>   {
>       if (number_matched==1) {
>       	  i=match_list-->0;
> 	  jump ND_Set_changing_gender;
>       }
>  
> !  ...now suppose that there was more typing to come, i.e. suppose that
> 
> ***********************************************************************
> 
> Alt:
>   if (i~=0)
>   {   if (dont_infer) return i;
>       if (inferfrom==0) inferfrom=pcount;
>       pattern-->pcount = i;
>       return i;
>   }
> Neu:
>   if (i~=0)
>   {   if (dont_infer) jump ND_Set_changing_gender;
>       if (inferfrom==0) inferfrom=pcount;
>       pattern-->pcount = i;
>       jump ND_Set_changing_gender;
>   }
> 
> ***********************************************************************
> 
> Alt:
> !  Having reconstructed the input, we warn the parser accordingly
> !  and get out.
> 
>   return REPARSE_CODE;
> Neu:
> !  Having reconstructed the input, we warn the parser accordingly
> !  and get out.
> 
>     for(j=0:j<5:j++)
> 	if (ND_answer_words -> (2*j) == 0 or match_from)
> 	{
> 	    ND_answer_words -> (2*j) = match_from;
> 	    break;
> 	}
> #ifdef DEBUG;
>     if (parser_trace>=5)
> 	print "  [ND_answer_words found/created entry at index ",j,"]^";
> #endif;
>     
>     if (j>=5) 
>     {
> 	print "** Runtime Error: ND_answer_words overflow!";
> 	j = 4;
>     }
> 	
>     ND_answer_words -> (2*j+1) = ND_answer_words -> (2*j+1) +
> 	answer_words;
>     !Addieren, da mehrmals an der gleichen Stelle nachgefragt werden kann.
>     
>   return REPARSE_CODE;
> 
> ***********************************************************************
> 
> Alt:
> #endif; ! TARGET_ZCODE
>  
>   return REPARSE_CODE;
> ];
> Neu:
> #endif; ! TARGET_ZCODE
>  
>   return REPARSE_CODE;
> 
> .ND_Set_changing_gender;
>   !Wenn wir ein einzelnen Objekt vor uns haben, das SAGs (Syn. anderen
>   ! Geschlechts) hat, müssen wir noch einiges tun
>   if (i>1 && i<REPARSE_CODE && i provides changing_gender)
>   {
>       !Zuerst schauen wir, ob das erste Wort, das dieses Objekt
>       !beschreibt, ein Pronomen ist
>       l = wn;
>       wn = match_from;
>       j = NounWord();
>       wn = l;
> 
>       if (j>1&&j<256)
>       {
> 	  !Wir haben hier ein Pronomen
> 	  if (PowersOfTwo_TB-->(GetGNAOfObject(i)) &
> 	      LanguagePronouns-->(j-1))
> 	      !Standardgeschlecht passt, also nehmen wir es
> 	      i.changing_gender = 0;
> 	  else {
> 	      !Passt nicht, also Geschlecht des Synonyms nehmen,
> 	      !aufgrundessen dieses Pronomen überhaupt mit diesem
> 	      !Objekt verbunden wurde
> 	      i.changing_gender = LP_Changing_Gender_gender ->((j-1)/3);
> 	  }
> 	  !Wir sind dann hier fertig
> 	  return i;
>       }
>       ! Kein Pronomen, hier fängt die ganze Arbeit an:
> 
>       ! Nun haben wir das richtige Objekt und können anhand der
>       ! Worte das Geschlecht bestimmen. Wir ignorieren dabei die
>       ! Wörter der erste Eingabe, falls nachgefragt werden musste,
>       ! da sonst z.B. folgendes passieren kann:
>       !   > x tor
>       !   Was meinst du, die grüne Tür oder die rote Tür?
>       !   > rot
>       ! Dies wird jetzt zu "x rot tor" gemacht, wenn wir "tor"
>       ! nicht ignorieren, bekommen wir female und nicht default/male.
>       ! (Die Frage impliziert ja schließlich Tür, nicht Tor)
> 
>       changed_gender = 0;
>       l=wn-match_from;
>       !Zuerst suchen wir in unsere Speicherliste, ob es bei diesem
>       !Objekt nachfragen gab, und wenn ja, aus wievielen Wörtern die
>       !Nachfrage besteht, da wir nur diese beachten (siehe oben)
>       for (k=0:k<5:k++)
>       {
> 	  if (ND_answer_words -> (2*k) == 0)
> 	      break;
> 	  if (ND_answer_words -> (2*k) == match_from)
> 	  {
> 	      l = ND_answer_words -> (2*k+1);
> 	      break;
> 	  }
>       }
>       if (i.parse_name == 0)
>       {
> 	  ! Das Objekt hat keine parse_name Routine bzw. diese
> 	  ! will/kann nicht entscheiden, ob dieses Objekt gemeint ist.
> 	  .ND_pn_doesnt_want_to_decide;
> #ifdef DEBUG;
> #ifdef TARGET_ZCODE;	  
> 	  if (parser_trace>=3)
> 	      print "   [set gender: searching from word
> 		  #",match_from," '",(address)
> 		      parse-->(2*match_from-1),"' to word
> 			  #",match_from+l-1," '",(address)
> 			      parse-->(2*(match_from+l-1)-1),"'";
> #ifnot; !GLULX
> 	  if (parser_trace>=3)
> 	      print "   [set gender: searching from word
> 		  #",match_from," '",(address)
> 		      parse-->(3*match_from-2),"' to word
> 			  #",match_from+l-1," '",(address)
> 			      parse-->(3*(match_from+l-1)-2),"'";
> #endif;	!TARGET_
> #endif; !DEBUG
> 	  !Refers setzt changed_gender
> 	  for(j=match_from:j<match_from+l:j++)
> 	      Refers(i,j);
>       } else {
> 	  !Objekt hat eine parse_name Routine. Wir rufen diese auf und
> 	  !erwarten, dass diese ggf. changed_gender setzt und daß sie
> 	  !die Anzahl der gelesenen Wörter zurückgibt
> #ifdef DEBUG;
> 	  if (parser_trace>=3)
> 	      print "   [set gender: calling parse_name
> 		  from word #",match_from," with total number of
> 		  words set to ",match_from+l-1;
> #endif; !DEBUG
> #ifdef TARGET_ZCODE;
> 	  j = parse->1;
> 	  parse->1 = match_from+l-1;
> 	  @push wn;
> #ifnot;
> 	  j = parse-->0;
> 	  parse-->0 = match_from+l-1;
> 	  @copy wn sp;
> #endif;
> 	  wn = match_from;
> 	  k = RunRoutines(i,parse_name);
> 	  
> #ifdef TARGET_ZCODE;
> 	  parse->1 = j;
> 	  @pull wn;
> #ifnot;
> 	  parse-->0 = j;
> 	  @copy sp wn;
> #endif;
> 	  if (k<0)
> 	  {
> #ifdef DEBUG;
> 	      if (parser_trace>=3)
> 		      print ". It said it doesn't want to decide. Falling
> 		      back to normal operation]^";
> #endif;
> 	      jump ND_pn_doesnt_want_to_decide;
> 	  }
>       }
>       ! Jetzt müssen wir nur noch dem Objekt das neue Geschlecht
>       ! 'mitteilen' und wir sind fertig
>       i.changing_gender = changed_gender;
> #ifdef DEBUG;
>       if (parser_trace>=3){
> 	  print " resulted in gender set to ";
> #ifdef INFIX;
> 	  if (changed_gender)
> 	      print (InfixPrintAttribute) changed_gender;
> 	  else print "default";
> #ifnot;
> 	  if (changed_gender)
> 	      print changed_gender;
> 	  else print "default";
> #endif; !INFIX
> 	  print "]^";
>       }
> #endif; !DEBUG
>   }
>   return i;
> ];
> 
> ***********************************************************************
> 
> Alt:
>            MakeMatch(obj,k);
> 	   if (obj ~= player && obj provides changing_gender &&
> 	       obj.changing_gender ~= 0) {
> 	       !Wir müssen noch ein weiteres Pronomen setzen.
> 	       w = PowersOfTwo_TB-->(GetGNAOfObjectWithGender(obj,obj.changing_gender));
> 	       for (j = 1 : j <= LanguagePronouns-->0: j = j+3)
> 		   if (w & (LanguagePronouns-->(j+1)) ~= 0)
> 		       LanguagePronouns-->(j+2) = obj;
> 	   }
>            return k;
> Neu:
>            MakeMatch(obj,k);
>            return k;
> 
> ***********************************************************************
> 
> Alt:
>     for (m=0:m<=l:m++)
> 	if(wd==k-->m) {
> 	    if (obj provides changing_gender) {
> 	    	if (m<l) {
> 		    m = k-->(m+1);
> 	    	    if (m>255)
> 			m=0;
> 		    else if (obj ~= player) {
> 			!Wir müssen noch ein weiteres Pronomen setzen.
> 			wd = PowersOfTwo_TB-->(GetGNAOfObjectWithGender(obj,m));
>    			for (l = 1 : l <= LanguagePronouns-->0: l = l+3)
>        			    if (wd & (LanguagePronouns-->(l+1)) ~= 0)
>            			LanguagePronouns-->(l+2) = obj;
> 		    }
> 		} else
> 		    m = 0;
> 	    	obj.changing_gender = m;
> 	    }
> 	    rtrue;
> 	}
> Neu:
>     for (m=0:m<=l:m++)
> 	if(wd==k-->m) {
> 	    	if (m<l) {
> 		    m = k-->(m+1);
>  		if (m<256)
> 		    changed_gender = m;
> 	    }
> 	    rtrue;
> 	}
> 
> ***********************************************************************
> 
> Alt:
>   {   !print "~", (address) LanguagePronouns-->x, "~ "; !auskommentiert Max Kalus
>       if (LanguagePronouns-->x == 'spez.') continue;
>       y = LanguagePronouns-->(x+2);
> Neu:
>   {   !print "~", (address) LanguagePronouns-->x, "~ "; !auskommentiert Max Kalus
>       if (LanguagePronouns-->x == 'spez.') break;
>       y = LanguagePronouns-->(x+2);
> 
> ***********************************************************************
> 
> Alt:
> [ PronounNotice obj x bm;
> 
>    if (obj == player) return;
> 
>    #ifdef EnglishNaturalLanguage;
>    PronounOldEnglish();
>    #endif;
> 
>    bm = PowersOfTwo_TB-->(GetGNAOfObject(obj));
> 
>    for (x = 1 : x <= LanguagePronouns-->0: x = x+3)
>        if (bm & (LanguagePronouns-->(x+1)) ~= 0)
>            LanguagePronouns-->(x+2) = obj;
> 
>    #ifdef EnglishNaturalLanguage;
>    itobj  = PronounValue('it');  old_itobj  = itobj;
>    himobj = PronounValue('him'); old_himobj = himobj;
>    herobj = PronounValue('her'); old_herobj = herobj;
>    #endif;
> ];
> Neu:
> [ PronounNotice obj x bm bm2 i obj2;
> 
>    if (obj == player) return;
> 
>    #ifdef EnglishNaturalLanguage;
>    PronounOldEnglish();
>    #endif;
> 
>     
>    bm = PowersOfTwo_TB-->(GetGNAOfObject(obj));
>    bm2 = PowersOfTwo_TB-->(GetGNAOfObjectWithGender(obj,obj.changing_gender));
> 
>    for (x = 1 : x <= LanguagePronouns-->0: x = x+3)
>        if (bm & (LanguagePronouns-->(x+1)) ~= 0)
>            LanguagePronouns-->(x+2) = obj;
> 
>    !Jetzt schauen wir, ob wir noch mehr Pronomen setzen müssen, weil
>    !das Objekt mit einem Synonym anderen Geschlechts (SAG) angesprochen wurde
>    if (obj.changing_gender) {
>        for (x = 1 : x <= LanguagePronouns-->0: x = x+3)
> 	   if (bm2 & (LanguagePronouns-->(x+1)) ~= 0
> 	       && LanguagePronouns-->(x+2) ~= obj) {
> 	       i = (x-1)/3;
> 	       !Wir haben ein Pronomen gefunden, dass nur zum Synonym
> 	       !passt.
> 
> 	       !Geschlecht dieses Synonyms abspeichern.
> 	       LP_Changing_Gender_gender->i = obj.changing_gender;
> 
> 	       !Altes Objekt, das durch dieses Pronomen bezeichnet
> 	       !wurde, sichern, aber nur, wenn es nicht auch zu einem
> 	       !SAG gehört
> 	       obj2 = LanguagePronouns-->(x+2);
> 	       
> 	       if ( obj2 == NULL || (~~obj2 provides changing_gender) ||
> 		   (PowersOfTwo_TB-->(GetGNAOfObject(obj2)))&(LanguagePronouns-->(x+1)) ~= 0
> 		   ) {
> 	       	   LP_Changing_Gender_prev_object --> i = obj2;
> 	       }	       
> 	       
> 	       LanguagePronouns-->(x+2) = obj;
> 	   }
>    } else if (obj provides changing_gender){
>        !Das Objekt wurde mit dem richtigen Geschlecht angesprochen
>        
>        !Alle Bezüge auf dieses Objekt mit falschem Geschlecht löschen
>        for (x = 1 : x <= LanguagePronouns-->0: x = x+3)
> 	   if (bm & (LanguagePronouns-->(x+1)) == 0 &&
> 	       LanguagePronouns-->(x+2) == obj) {
> 	       i = (x-1)/3;
> 	       LanguagePronouns-->(x+2) =
> 		   LP_Changing_Gender_prev_object --> i;
> 
> 	       LP_Changing_Gender_prev_object --> i = NULL;
> 	   }
>    }
> 
>    #ifdef EnglishNaturalLanguage;
>    itobj  = PronounValue('it');  old_itobj  = itobj;
>    himobj = PronounValue('him'); old_himobj = himobj;
>    herobj = PronounValue('her'); old_herobj = herobj;
>    #endif;
> ];
> 
> ***********************************************************************
> 
> Alt:
>                if (a==name) print "'", (address) x, "'";
> Neu:
>                if (a==name) {
> 		     if(x>255)
> 		         print "'", (address) x, "'";
>                      else {
> #ifdef INFIX;
> 	                 print (InfixPrintAttribute) x;
> #ifnot;
> 		         print "(gender)";
> #endif;
> 		     }
>                }
> 
> ***********************************************************************
> * tgerman.h
> ***********************************************************************
> 
> Alt:
> Property changing_gender;
> Neu:
> Property changing_gender 0;
> 
> ***********************************************************************
> 
> Alt:
> [ta_ArticlesChangingGenderOffset obj x;
>   if (~~(obj provides changing_gender && obj.changing_gender ~= 0))
>     return ta_ArticlesGenderOffset(obj);
>   x = obj.changing_gender;
>     
>   if (x==male) x=0; else
>   { if (x==female) x=ta_LanguageNumberCases; else
>     { if (x==neuter) 
> 	{x=ta_LanguageNumberCases * 2;
>      } else {
> #ifdef DEBUG;
>         print "^# TGERMAN Warnung: ", obj, 
>              " hat kein korrektes changing_gender - Interner Fehler?^";
> #endif;
>      return ta_ArticlesGenderOffset(obj); !sonst default nehmen
>       }
>     }
>   }
>   return x;
> ];
> Neu:
> [ta_ArticlesChangingGenderOffset obj x;
>   if (obj.changing_gender == 0)
>     return ta_ArticlesGenderOffset(obj);
>   x = obj.changing_gender;
>     
>   if (x==male) x=0; else
>   { if (x==female) x=ta_LanguageNumberCases; else
>     { if (x==neuter) 
> 	{x=ta_LanguageNumberCases * 2;
> #ifdef DEBUG;
>      } else {
>         print "^# TGERMAN Warnung: ", obj, 
>              " hat kein korrektes changing_gender (",obj.changing_gender,") - Interner Fehler?";
> #endif;
>       }
>     }
>   }
>   return x;
> ];
> 
> ***********************************************************************
> ***********************************************************************
> ***********************************************************************
9c716
< Vorschläge von: Dennis Brakhane, Chr. W. (?)
---
> Vorschläge von: Dennis Brakhane, Christoph Winkler
diff 17/parserm.h 18/parserm.h
473c473,487
< ! ============================================================================
---
>  
> ! ----------------------------------------------------------------------------
> ! Dies ist die deutsche Version, also definieren wir hier noch ein
> ! paar Globale Variablen, die spezifisch für diese sind.
> ! ----------------------------------------------------------------------------
> 
> Global changed_gender;        !Wird von NounDomain für Synonyme
>                               !vers. Geschlechts gebraucht, muß von
>                               !parse_name gesetzt werden, bei 'name'
>                               !geht's automatisch.
> Array  ND_answer_words --> 5; !dito, wird gebraucht, um bei Nachfragen
>                               !des Parsers (an verschiedenen Stellen)
>                               !das Geschlecht korrekt bestimmen zu
>                               !können. An mehr als 5 Stellen wird er
>                               !wohl nicht nachfragen.
474a489
> ! ============================================================================
1164a1180,1181
>     for(i=0:i<5:i++)
> 	ND_answer_words --> i = 0;
2496c2513,2517
<   {   if (number_matched==1) { i=match_list-->0; return i; }
---
>   {
>       if (number_matched==1) {
>       	  i=match_list-->0;
> 	  jump ND_Set_changing_gender;
>       }
2535c2556
<   {   if (dont_infer) return i;
---
>   {   if (dont_infer) jump ND_Set_changing_gender;
2538c2559
<       return i;
---
>       jump ND_Set_changing_gender;
2656a2678,2698
>     for(j=0:j<5:j++)
> 	if (ND_answer_words -> (2*j) == 0 or match_from)
> 	{
> 	    ND_answer_words -> (2*j) = match_from;
> 	    break;
> 	}
> #ifdef DEBUG;
>     if (parser_trace>=5)
> 	print "  [ND_answer_words found/created entry at index ",j,"]^";
> #endif;
>     
>     if (j>=5) 
>     {
> 	print "** Runtime Error: ND_answer_words overflow!";
> 	j = 4;
>     }
> 	
>     ND_answer_words -> (2*j+1) = ND_answer_words -> (2*j+1) +
> 	answer_words;
>     !Addieren, da mehrmals an der gleichen Stelle nachgefragt werden kann.
>     
2779a2822,2962
> 
> .ND_Set_changing_gender;
>   !Wenn wir ein einzelnen Objekt vor uns haben, das SAGs (Syn. anderen
>   ! Geschlechts) hat, müssen wir noch einiges tun
>   if (i>1 && i<REPARSE_CODE && i provides changing_gender)
>   {
>       !Zuerst schauen wir, ob das erste Wort, das dieses Objekt
>       !beschreibt, ein Pronomen ist
>       l = wn;
>       wn = match_from;
>       j = NounWord();
>       wn = l;
> 
>       if (j>1&&j<256)
>       {
> 	  !Wir haben hier ein Pronomen
> 	  if (PowersOfTwo_TB-->(GetGNAOfObject(i)) &
> 	      LanguagePronouns-->(j-1))
> 	      !Standardgeschlecht passt, also nehmen wir es
> 	      i.changing_gender = 0;
> 	  else {
> 	      !Passt nicht, also Geschlecht des Synonyms nehmen,
> 	      !aufgrundessen dieses Pronomen überhaupt mit diesem
> 	      !Objekt verbunden wurde
> 	      i.changing_gender = LP_Changing_Gender_gender ->((j-1)/3);
> 	  }
> 	  !Wir sind dann hier fertig
> 	  return i;
>       }
>       ! Kein Pronomen, hier fängt die ganze Arbeit an:
> 
>       ! Nun haben wir das richtige Objekt und können anhand der
>       ! Worte das Geschlecht bestimmen. Wir ignorieren dabei die
>       ! Wörter der erste Eingabe, falls nachgefragt werden musste,
>       ! da sonst z.B. folgendes passieren kann:
>       !   > x tor
>       !   Was meinst du, die grüne Tür oder die rote Tür?
>       !   > rot
>       ! Dies wird jetzt zu "x rot tor" gemacht, wenn wir "tor"
>       ! nicht ignorieren, bekommen wir female und nicht default/male.
>       ! (Die Frage impliziert ja schließlich Tür, nicht Tor)
> 
>       changed_gender = 0;
>       l=wn-match_from;
>       !Zuerst suchen wir in unsere Speicherliste, ob es bei diesem
>       !Objekt nachfragen gab, und wenn ja, aus wievielen Wörtern die
>       !Nachfrage besteht, da wir nur diese beachten (siehe oben)
>       for (k=0:k<5:k++)
>       {
> 	  if (ND_answer_words -> (2*k) == 0)
> 	      break;
> 	  if (ND_answer_words -> (2*k) == match_from)
> 	  {
> 	      l = ND_answer_words -> (2*k+1);
> 	      break;
> 	  }
>       }
>       if (i.parse_name == 0)
>       {
> 	  ! Das Objekt hat keine parse_name Routine bzw. diese
> 	  ! will/kann nicht entscheiden, ob dieses Objekt gemeint ist.
> 	  .ND_pn_doesnt_want_to_decide;
> #ifdef DEBUG;
> #ifdef TARGET_ZCODE;	  
> 	  if (parser_trace>=3)
> 	      print "   [set gender: searching from word
> 		  #",match_from," '",(address)
> 		      parse-->(2*match_from-1),"' to word
> 			  #",match_from+l-1," '",(address)
> 			      parse-->(2*(match_from+l-1)-1),"'";
> #ifnot; !GLULX
> 	  if (parser_trace>=3)
> 	      print "   [set gender: searching from word
> 		  #",match_from," '",(address)
> 		      parse-->(3*match_from-2),"' to word
> 			  #",match_from+l-1," '",(address)
> 			      parse-->(3*(match_from+l-1)-2),"'";
> #endif;	!TARGET_
> #endif; !DEBUG
> 	  !Refers setzt changed_gender
> 	  for(j=match_from:j<match_from+l:j++)
> 	      Refers(i,j);
>       } else {
> 	  !Objekt hat eine parse_name Routine. Wir rufen diese auf und
> 	  !erwarten, dass diese ggf. changed_gender setzt und daß sie
> 	  !die Anzahl der gelesenen Wörter zurückgibt
> #ifdef DEBUG;
> 	  if (parser_trace>=3)
> 	      print "   [set gender: calling parse_name
> 		  from word #",match_from," with total number of
> 		  words set to ",match_from+l-1;
> #endif; !DEBUG
> #ifdef TARGET_ZCODE;
> 	  j = parse->1;
> 	  parse->1 = match_from+l-1;
> 	  @push wn;
> #ifnot;
> 	  j = parse-->0;
> 	  parse-->0 = match_from+l-1;
> 	  @copy wn sp;
> #endif;
> 	  wn = match_from;
> 	  k = RunRoutines(i,parse_name);
> 	  
> #ifdef TARGET_ZCODE;
> 	  parse->1 = j;
> 	  @pull wn;
> #ifnot;
> 	  parse-->0 = j;
> 	  @copy sp wn;
> #endif;
> 	  if (k<0)
> 	  {
> #ifdef DEBUG;
> 	      if (parser_trace>=3)
> 		      print ". It said it doesn't want to decide. Falling
> 		      back to normal operation]^";
> #endif;
> 	      jump ND_pn_doesnt_want_to_decide;
> 	  }
>       }
>       ! Jetzt müssen wir nur noch dem Objekt das neue Geschlecht
>       ! 'mitteilen' und wir sind fertig
>       i.changing_gender = changed_gender;
> #ifdef DEBUG;
>       if (parser_trace>=3){
> 	  print " resulted in gender set to ";
> #ifdef INFIX;
> 	  if (changed_gender)
> 	      print (InfixPrintAttribute) changed_gender;
> 	  else print "default";
> #ifnot;
> 	  if (changed_gender)
> 	      print changed_gender;
> 	  else print "default";
> #endif; !INFIX
> 	  print "]^";
>       }
> #endif; !DEBUG
>   }
>   return i;
3791,3798d3973
< 	   if (obj ~= player && obj provides changing_gender &&
< 	       obj.changing_gender ~= 0) {
< 	       !Wir müssen noch ein weiteres Pronomen setzen.
< 	       w = PowersOfTwo_TB-->(GetGNAOfObjectWithGender(obj,obj.changing_gender));
< 	       for (j = 1 : j <= LanguagePronouns-->0: j = j+3)
< 		   if (w & (LanguagePronouns-->(j+1)) ~= 0)
< 		       LanguagePronouns-->(j+2) = obj;
< 	   }
3873d4047
< 	    if (obj provides changing_gender) {
3876,3887c4050,4051
< 	    	    if (m>255)
< 			m=0;
< 		    else if (obj ~= player) {
< 			!Wir müssen noch ein weiteres Pronomen setzen.
< 			wd = PowersOfTwo_TB-->(GetGNAOfObjectWithGender(obj,m));
<    			for (l = 1 : l <= LanguagePronouns-->0: l = l+3)
<        			    if (wd & (LanguagePronouns-->(l+1)) ~= 0)
<            			LanguagePronouns-->(l+2) = obj;
< 		    }
< 		} else
< 		    m = 0;
< 	    	obj.changing_gender = m;
---
>  		if (m<256)
> 		    changed_gender = m;
4210c4374
<       if (LanguagePronouns-->x == 'spez.') continue;
---
>       if (LanguagePronouns-->x == 'spez.') break;
4252c4416
< [ PronounNotice obj x bm;
---
> [ PronounNotice obj x bm bm2 i obj2;
4259a4424
>     
4260a4426
>    bm2 = PowersOfTwo_TB-->(GetGNAOfObjectWithGender(obj,obj.changing_gender));
4265a4432,4472
>    !Jetzt schauen wir, ob wir noch mehr Pronomen setzen müssen, weil
>    !das Objekt mit einem Synonym anderen Geschlechts (SAG) angesprochen wurde
>    if (obj.changing_gender) {
>        for (x = 1 : x <= LanguagePronouns-->0: x = x+3)
> 	   if (bm2 & (LanguagePronouns-->(x+1)) ~= 0
> 	       && LanguagePronouns-->(x+2) ~= obj) {
> 	       i = (x-1)/3;
> 	       !Wir haben ein Pronomen gefunden, dass nur zum Synonym
> 	       !passt.
> 
> 	       !Geschlecht dieses Synonyms abspeichern.
> 	       LP_Changing_Gender_gender->i = obj.changing_gender;
> 
> 	       !Altes Objekt, das durch dieses Pronomen bezeichnet
> 	       !wurde, sichern, aber nur, wenn es nicht auch zu einem
> 	       !SAG gehört
> 	       obj2 = LanguagePronouns-->(x+2);
> 	       
> 	       if ( obj2 == NULL || (~~obj2 provides changing_gender) ||
> 		   (PowersOfTwo_TB-->(GetGNAOfObject(obj2)))&(LanguagePronouns-->(x+1)) ~= 0
> 		   ) {
> 	       	   LP_Changing_Gender_prev_object --> i = obj2;
> 	       }	       
> 	       
> 	       LanguagePronouns-->(x+2) = obj;
> 	   }
>    } else if (obj provides changing_gender){
>        !Das Objekt wurde mit dem richtigen Geschlecht angesprochen
>        
>        !Alle Bezüge auf dieses Objekt mit falschem Geschlecht löschen
>        for (x = 1 : x <= LanguagePronouns-->0: x = x+3)
> 	   if (bm & (LanguagePronouns-->(x+1)) == 0 &&
> 	       LanguagePronouns-->(x+2) == obj) {
> 	       i = (x-1)/3;
> 	       LanguagePronouns-->(x+2) =
> 		   LP_Changing_Gender_prev_object --> i;
> 
> 	       LP_Changing_Gender_prev_object --> i = NULL;
> 	   }
>    }
> 
5131c5338,5348
<                if (a==name) print "'", (address) x, "'";
---
>                if (a==name) {
> 		     if(x>255)
> 		         print "'", (address) x, "'";
>                      else {
> #ifdef INFIX;
> 	                 print (InfixPrintAttribute) x;
> #ifnot;
> 		         print "(gender)";
> #endif;
> 		     }
>                }
diff 17/tgerman.h 18/tgerman.h
14c14
< Property changing_gender;
---
> Property changing_gender 0;
188c188
<   if (~~(obj provides changing_gender && obj.changing_gender ~= 0))
---
>   if (obj.changing_gender == 0)
196d195
<      } else {
197a197
>      } else {
199c199
<              " hat kein korrektes changing_gender - Interner Fehler?^";
---
>              " hat kein korrektes changing_gender (",obj.changing_gender,") - Interner Fehler?";
201d200
<      return ta_ArticlesGenderOffset(obj); !sonst default nehmen
967c966
< 	!print " ";
---
> !	print " ";

