! NPCs in Raumbeschreibungen - Beispiel 3 ! ! Hier wird eine Gartenparty implementiert, bei der sich immer Leute, ! die zur gleichen Gruppe - Arbeitskollegen, Verwandte oder Vereins- ! kameraden- gehören, zusammenstellen und auch in Raumbeschreibungen ! gemeinsam genannt werden. ! ! Partygänger, die einer Gruppe angehören, gehören zur Klase der ! 'Socialiser' und haben eine 'group'. 'Socialiser', die ihre 'group' ! mit keinem anderen teilen sind Einzelgänger. ! ! Die Party ist zwar voll, aber trotzdem langweilig. Die Leute sind ! nur Objekte mit Vokabeln und Gruppenzugehörigkeit, und sie laufen ! mehr oder weniger zufällig herum. Dieser Code ist nur ein Beispiel, ! und wer will, kann verschiedene Gesprächsthemen je nach Gruppe und ! je nachdem, ob mehr Frauen oder Männer in der Gruppe sind einbauen. ! Oder je nachdem, in welchem Raum sie gerade sind. Auch den Anschluss ! an eine Gruppe kann man noch stark ausbauen. Vermutlich ist es auch ! besser, nur zehn Personen zu implementieren und die richtig. ! !----------------------------------------------------------------------- Constant Story "Grillen, Garten, Party"; Constant Headline "^Ein Beispiel für NPCs in Raumbeschreibungen^^"; Constant NO_SCORE; Constant MAX_TIMERS 64; Include "Parser"; Include "Verblib"; Constant KOLLEGE 1; Constant FUSSBALLER 2; Constant VERWANDTSCHAFT 3; Array aux buffer 500; Global ComeAndGo; [ WriteNPCList s; WriteListFromCase(s, WORKFLAG_BIT | ENGLISH_BIT, Nom); ]; [ PrintBuffer a i; (a-->0)++; (a-->0)++; for (i = 2: i < a-->0: i++) print (char) a->i; ]; Class Socialiser with group, describe [o n also; o = child(parent(self)); while (o) { if (o ofclass Socialiser) { if (o.group == self.group) { if (o ~= self) rtrue; break; } else also++; } o = sibling(o); } o = child(parent(self)); while (o) { if (o ofclass Socialiser) { if (o.group == self.group) { give o workflag; n++; } else give o ~workflag; } o = sibling(o); } if (n == 1) { print "^", (GDer) self, " steht hier, wahrscheinlich auf der Suche nach "; switch (self.group) { KOLLEGE: "Kollegen."; FUSSBALLER: "anderen Fußballern."; VERWANDTSCHAFT: "Verwandten."; default: "Anschluss."; } } new_line; PrintToBuffer(aux, 520, WriteNPCList, self); aux->2 = UpperCase(aux->2); PrintBuffer(aux); switch (self.group) { KOLLEGE: " sind in ein Gespräch vertieft. Es geht wie immer um die Arbeit."; FUSSBALLER: " stehen hier zusammen und lachen."; VERWANDTSCHAFT: " stehen hier und ziehen über nicht anwesende Verwandte her."; default: " stehen hier etwas verloren herum."; } ], description [; switch (self.group) { KOLLEGE: print_ret (GDer) self, " ist ein Arbeitskollege von dir."; FUSSBALLER: print_ret (GDen) self, " kennst du vom Fußballverein."; VERWANDTSCHAFT: print_ret (GDer) self, " gehört zur Verwandtschaft."; default: print_ret (GDer) self, " ist eher ein Einzelgänger."; } ], time_left, time_out [ n i o d; i = parent(self); objectloop (o in Compass) if (i provides o.door_dir) n++; if (n==0) return; o = nothing; while (~~o) { n = random(12); switch (n) { 1: d = n_to; 2: d = ne_to; 3: d = e_to; 4: d = se_to; 5: d = s_to; 6: d = sw_to; 7: d = w_to; 8: d = nw_to; 9: d = in_to; 10: d = out_to; 11: d = u_to; 12: d = d_to; } if (i provides d && i.d ofclass Object) o = i.d; } ! In jedem Zug kann immer nur je *eine* Person in den ! Aufenthaltsort des Spielers hineinkommen oder von ihm ! weggehen, um Unruhe zu vermeiden. if ((location == i && (ComeAndGo & 1)) || (location == o && (ComeAndGo & 2))) { StartTimer(self, 1); return; } move self to o; StartTimer(self, self.Ungeduld() + random(self.Ungeduld())); if (location == i) { ComeAndGo = ComeAndGo | 1; print "^", (GDer) self, " ", (string) random("geht", "schlendert", "läuft"), " "; switch (o) { Wohnzimmer: "ins Haus."; Veranda: "auf die Veranda."; Beim_Pool: "in Richtung Swimming-Pool."; Beim_Grill: "zum Grill."; Garten: "in die Mitte des Gartens."; Bei_der_Laube: if (location==Laube) "hinaus."; "zur Laube."; Laube: "in die Laube."; } "weg."; } if (location == o) { ComeAndGo = ComeAndGo | 2; print "^", (GDer) self, " kommt "; switch (i) { Wohnzimmer: "aus dem Haus."; Veranda: "von der Veranda."; Beim_Pool: "vom Swimming-Pool."; Beim_Grill: "vom Grill."; Garten: "aus dem Garten."; Bei_der_Laube: if (location==Laube) "hinein."; "von der Laube."; Laube: "aus der Laube."; } "herein."; } ], Ungeduld [; switch (self.group) { KOLLEGE: return 5; FUSSBALLER: return 8; VERWANDTSCHAFT: return 12; default: return 3; } ], init [; StartTimer(self, self.Ungeduld() + random(self.Ungeduld())); ], has proper animate; !----------------------------------------------------------------------- ! ! ---------- ---------- ---------- ! Wohnzimmer ---- Veranda ---- Beim Pool ! ---------- ---------- ---------- ! / | X | ! ---------- ---------- ---------- ! Beim Grill ---- Garten ---- B.d.Laube ! ---------- ---------- ---------- ! | ! ---------- ! Laube ! ---------- ! !----------------------------------------------------------------------- Object Wohnzimmer "Wohnzimmer" with name 'wohnzimmer' 'raum', description "Dieses Wohnzimmer ist modern eingerichtet und etwas ungeschickt platziert - es hat morgens Sonne. Im Norden geht es aus der Wohnung (und dem Spiel) heraus, die ausladende Veranda ist im Osten.", n_to [; ; ], e_to Veranda, out_to Veranda, has light; Socialiser -> Bernd "Bernd" with name 'bernd', group KOLLEGE, has male; Socialiser -> Arndt "Arndt" with name 'arndt', group KOLLEGE, has male; Socialiser -> Angelika "Tante Angelika" with name 'angelika' 'tante', group VERWANDTSCHAFT, has male; Object Veranda "Veranda" with name 'veranda', description "Eine große, gepflasterte Veranda. Im Westen ist der Bungalow, den man über das Wohnzimmer betreten kann. Ein Swimmingpool schimmert im Osten, und der Garten ist im Süden.", cant_go "Das Wohnzimmer ist im Westen, der Pool im Osten und der restliche Garten im Süden.", w_to Wohnzimmer, sw_to Beim_Grill, s_to Garten, se_to Bei_der_Laube, e_to Beim_Pool, has light; Socialiser -> Herr_Muehlbeck "Herr@02 Mühlbeck" with name 'herr' 'muehlbeck', group KOLLEGE, has male; Socialiser -> Heinzi "Heinzi" with name 'heinzi' 'heinz', group FUSSBALLER, has male; Socialiser -> Specki "Specki" with name 'speck' 'specki', group FUSSBALLER, has male; Socialiser -> Jupp "Jupp" with name 'jupp' 'juppes', group FUSSBALLER, has male; Object Beim_Pool "Beim Pool" with name 'pool' 'wasser', description "Der Pool im Norden ist zwar gefüllt, aber noch nicht benutzt. Vielleicht später, wenn die Gesellschaft von den Würstchen zum Bier übergegangen ist. Die Veranda ist im Westen. Der Garten liegt im Südosten und Süden, wo eine Laube steht.", cant_go "Die Veranda ist im Osten, der Garten im Südosten und Süden, wo eine Laube steht.", n_to "Noch nicht.", s_to Bei_der_Laube, sw_to Garten, w_to Veranda, has light; Socialiser -> Hacki "Hacki" with name 'hacki', group FUSSBALLER, has male; Socialiser -> Walze "Walze" with name 'walze' 'walze', group FUSSBALLER, has male; Socialiser -> Hoyzer "Hoyzer" with name 'hoyzer', group FUSSBALLER, has male; Socialiser -> Gabi "Gabi" with name 'gabi' 'gabriele', group KOLLEGE, has female; Socialiser -> Frau_Krottenhahn "Frau Krottenhahn" with name 'frau' 'krottenhahn', group KOLLEGE, has female; Socialiser -> Elli "Elli" with name 'elli', group KOLLEGE, has female; Socialiser -> Tamara "Tamara" with name 'tamara', group KOLLEGE, has female; Socialiser -> Antonio "Antonio" with name 'antinio', group KOLLEGE, has male; Object Beim_Grill "Beim Grill" with name 'grill' 'kohle', description "Der Grill, eigentlich der Mittelpunkt der Feier (zumindest am frühen Abend), wurde in diese Ecke des Gartens verbannt. Der Hauptteil des Gartens liegt im Osten.", cant_go "Es geht hier nur nach Osten in den Hauptteil des Gartens oder nach Nordosten auf die Veranda.", e_to Garten, out_to Garten, ne_to Veranda, has light; Object -> Horst "Horst" with name 'horst' 'griller' 'grillmeister' 'meister', description "Horst ist der Grillmeister, und das steht auch so auf seiner fettigen Schürze.", initial "Horst der Grillmeister hat den Grill fest in Beschlag und weitestgehend auch unter Kontrolle.", each_turn [; if (random(5) > 1) return; switch (random(4)) { 1: "^~Ich leg nomma auf, wer will watt?~, ruft der Grillmeister in die Menge"; 2: "^~Hier, nimma Würstchen, die müssen weg~, versucht dich Horst zu locken."; 3: "^Horst flucht vom Grill her. Du schaust weg, sonst musst du ihm noch etwas abnehmen."; default: "^Horst fächelt dem Grill gekonnt Luft zu."; } ], has male animate; Socialiser -> Alberto "Alberto" with name 'alberto', group FUSSBALLER, has male; Socialiser -> Guenni "Günni" with name 'guenni' 'guenther' 'guenter', group FUSSBALLER, has male; Socialiser -> Bretti "Bretti" with name 'bretti' 'brett', group FUSSBALLER, has male; Socialiser -> Vater "Vater" with name 'vater' 'papa', article yours, group VERWANDTSCHAFT, has male ~proper; Socialiser -> Mutter "Mutter" with name 'mutter' 'mama', article yours, group VERWANDTSCHAFT, has female ~proper; Object Garten "Garten" with name 'garten', description "Dies ist der Hauptteil des Gartens, eigentlich eher ein Rasen. Von Westen her kommt der unverkennbare Duft angebrannten Fleischs, im Osten ist eine Laube, im Nordosten der Swimmming-Pool und im Norden liegt die Veranda, von der man auch zurück ins Haus gehen kann.", n_to Veranda, ne_to Beim_Pool, e_to Bei_der_Laube, w_to Beim_Grill, out_to Veranda, cant_go "Wähle aus: Grill im Westen, Veranda im Norden, Pool im Nordosten, Laube im Osten, Gebüsch in allen anderen Richtungen.", has light; Socialiser -> Beatrice "Beatrice" with name 'beatrice' 'bea', short_name [; if (indef_mode) { print "dein", (string) LanguageSuffixes-->(possessive_suffix_base + 4*short_name_case + 2), " Cousine "; } print (object) self; rtrue; ], group VERWANDTSCHAFT, has female; Socialiser -> Michael "Michael" with name 'michael', group VERWANDTSCHAFT, short_name [; if (indef_mode) { print "dein", (string) LanguageSuffixes-->(possessive_suffix_base + 4*short_name_case + 1), " Vetter "; } print (object) self; rtrue; ], has male; Socialiser -> Mark "Mark" with name 'mark', short_name [; if (indef_mode) { print "dein", (string) LanguageSuffixes-->(possessive_suffix_base + 4*short_name_case + 1), " Bruder "; } print (object) self; rtrue; ], group VERWANDTSCHAFT, has male; Socialiser -> Babsi "Babsi" with name 'babsi' 'babs', group FUSSBALLER, has female; Socialiser -> Schorsch "Schorsch" with name 'schorsch' 'georg', group FUSSBALLER, has male; Socialiser -> Fischer "Fischer" with name 'fischer', group FUSSBALLER, has male; Socialiser -> Kalli "Kalli" with name 'kalli' 'karl', group FUSSBALLER, has male; Socialiser -> Petzold "Petzold" with name 'petzold', group 1000, has male; Socialiser -> Irina "Irina" with name 'irina', group KOLLEGE, has male; Socialiser -> Nina "Nina" with name 'nina', group KOLLEGE, has female; Object Bei_der_Laube "Bei der Laube" with name 'laube' 'garten', description "Dieser Teil des Gartens ist eher ruhig, noch ruhiger ist es wohl in der Laube im Süden. Wer mehr Action haben will kann nach Norden zum Pool, nach Westen in den Hauptteil des Gartens oder nach Nordwesten auf die Veranda gehen.", n_to Beim_Pool, s_to Laube, nw_to Veranda, w_to Garten, in_to Laube, out_to Garten, cant_go "Die Laube ist im Süden, in Norden, Nordwesten und Westen ist der Rest der Party.", has light; Socialiser -> Dr_Winterhager "Dr. Winterhager" with name 'doktor' 'dr' 'winterhager', group KOLLEGE, has male; Socialiser -> Ellen "Ellen" with name 'ellen', group KOLLEGE, has female; Socialiser -> Ansgar "Ansgar" with name 'ansgar', group KOLLEGE, has male; Object Laube "In der Laube" with name 'laube', description "Diese Laube wirkt etwas antiquiert, vor allem im Garten eines modernen Bungalows. Trotzdem ziehen sich die Partygäste gelegentlich gern hierher zurück. Der Ausgang ist im Norden.", cant_go "Der Ausgang aus der Laube ist im Nodern", n_to Bei_der_Laube, out_to Bei_der_Laube, has light; [ TimePasses; ComeAndGo = 0; ]; [ Initialise; location = Garten; "^^^^^"; ]; Include "GermanG";