Wie programmiere ich ein Raetsel? ================================= 1. Man habe eine Idee. (klingt einfach, ist es aber nicht unbedingt, nicht jede Idee ist gut umzusetzen in ein Raetsel.) 2. ZUERST solltet Ihr in der Enzy unter 'Richtlinien/Richtlinien zur Raetsel- programmierung' ALLE Punkte durcharbeiten, damit Ihr wisst, was beim Programmieren eines Raetsels zu tun und zu beachten ist! 3. Man suche sich einen Platz fuer sein Raetsel, also eine Domain. Man werde gegebenenfalls Mitglied der Wunschdomain, in dem man zum Domainlord geht. 4. Man programmiert sein Raetsel (das ist der langwierigste Schritt). 5. Man teste alles in Ruhe. Lasst auch mal andere Spieler/Engel durch Euer Raetsel laufen, denn die werden noch eine ganze Menge Fehler und Ideen absetzen! Um die Punktevergabe (siehe 6.) testen zu koennen, gibt es einen Teststatus fuer Raetsel, den die Raetselgoetter vergeben koennen. 6. Punkteverteilung. Wenn man Punkte fuer das Raetsel verteilen will und das Raetsel (im Rathaus) installieren will, dann braucht man ein sogenanntes Quest object. Das ist ein Objekt, das die ganzen wichtigen Eigenschaften des Raetsels beschreibt: Das Questobjekt --------------- Das Objekt inheritet "/i/object/quest_obj" und hat nur eine Funktion create() mit folgenden Aufrufen. - Raetselname (set_name) Beispiel: set_name("rumpelkiste"); - Die Aufschrift fuer die Tafel im Rathaus. (set_hint) Beispiel: set_hint("Meister Garfrog sucht zwei mutige Helfer.\n"+ "Du findest ihn im nordoestlichen Teil Tadmors.\n"); - Einen Hinweis auf die Loesung (siehe Punkt 5.) Dieser Text erscheint zusaetzlich auf dem Schild im Rathaus, wenn ein Gott das Schild betrachtet. (set_loesung) Beispiel: set_loesung("Loesung: siehe /d/Vaniorh/garthan/vlab/LOESUNG\n"); - Die Meldung fuer andere Spieler, wenn das Raetsel geloest wurde. Bespiel: set_solved_msg("$Der('ob) hat .... geholfen."); oder: set_solved_msg("Prof. Ungr. ist $dem('ob) zu Dank verpflichet."); - Die Maximalpunktezahl, die der Spieler durch das Loesen des vollstaendigen Raetsels bekommt. (set_skill) Diese Punktezahl ist mit den 'Obergoettern' abzusprechen!! und liegt bei Raetseln in der Regel zwischen 1000 und 4500 je nach Schwierigkeit. Diese Zahl sollte nach Installation auf keinen Fall mehr geaendert werden. Beispiel: set_skill(4500); - Skilltexte fuer den Befehl 'erfahrung raetsel' (set_skill_msgs) Diese Texte erscheinen je nach erreichter Punktezahl des Spielers beim Befehl 'erfahrung raetsel' (Man kann die Punkte im Raetsel in beliebig vielen, auch unterschiedlichen Mengen an den Spieler verteilen, nur sollte der Spieler am Schluss, die mit set_skill() definierte Punktezahl haben, wenn er das Raetsel vollstaendig geloest hat. Es gibt zwei Moeglichkeiten fuer Skilltexteinteilungen: o Autoskalierte Meldungen: Die Maximalpunkzahl m aus set_skill wird durch die Anzahl der Meldungen anz minus Eins geteilt. Das ergibt die Bereichsgroesse b fuer eine Meldung: b = max / (anz-1) Die erste Meldung wird dann bei skills von 0..b-1 ausgeben, die zweite Meldung bei b..2*b-1 und so fort ... m Die letzte Meldung wird nur ausgegeben wenn der Spieler die Maximalpunktezahl m erreicht hat Beispiel: set_skill_msgs( ({ "Meister Garfrog steht vor einem Problem, hilf ihm.", "Du hast Meister Garfrog zusammen mit deinem Partner"+ "sehr geholfen." }) ); Hier ist b = 4500 / ( 2 Meldungen - 1 ) = 4500. Also wird die erste Meldung bei Punktzahlen zwischen 0..4499 und die zweite Meldung bei exakt 4500 Punkten ausgegeben. (Hinweis: Das klingt alles viel schwieriger als es ist...) o Handskalierte Meldungen: Will man ungleichgrosse Bereiche haben so kann man die Uebergangspunktezahlen auch selbst explizit angeben: Beispiel: (Shannara-Raetsel) set_skill_msgs( ({ "Du hast Amberle im Keller der Druidenburg gefunden.", "Du hast den Samen des Ellcrys geholt.", "Du warst mit Amberle beim Blutfeuer.", "Du hast den Ellcrys erneuert." }), ({ 500, 1000, 3000, 4500 }) ); Ab 500 Punkten die erste Meldung, ab 1000 Punkten die zweite, usw. Der letzen Meldung sollte der Wert aus set_skill zugeordnet sein. o Unterschiedliche Meldungen fuer saechlich/maennlich/weiblich Beispiel: set_skill_msgs( ({ ({"Im Go-Spiel zaehlst Du noch als Anfaenger.", // saechlich "Im Go-Spiel zaehlst Du noch als Anfaenger.", // maennlich "Im Go-Spiel zaehlst Du noch als Anfaengerin."}), //weiblich "Im Go machst Du so langsam Fortschritte.", "Du bist in die Amateur-Klasse der Go-Liga eingezogen.", ({"So langsam mauserst Du Dich zum Go-Klasse-Spieler.", "So langsam mauserst Du Dich zum Go-Klasse-Spieler.", "So langsam mauserst Du Dich zur Go-Klasse-Spielerin."}), "Du wirst nur noch wenige finden, die ..." })); Der Aufruf im Raetsel --------------------- So hat man nun ein Questobjekt gemacht, dann braucht man noch die tatsaechliche Punktevergabe zur rechten Zeit, waehrend des Raetsels. Man hat zwei Moeglichkeiten: o One shoot: Man vergibt alle Punkte am Ende des Raetsels mit einem Aufruf: QUEST_ROOM->set_quest("quest_name", Q_SOLVED, this_player()); Ist das Raetsel installiert (siehe unten), bekommt der Spieler alle Punkte fuer das Raetsels gutgeschrieben. "quest_name" ist der Raetselname von oben (set_name). this_player() ist derjenige der die Punkte bekommt. o Many shoots: Man vergibt die Punkte in mehreren Etappen der Spieler hat dann die Moeglichkeit das Raetsel in mehreren Etappen zu spielen (siehe Shannara-Raetsel) QUEST_ROOM->set_quest("quest_name", punkte, this_player()); Wobei punkte ein Teil der maximalen Punktzahl ist, am Schluss sollte der Spieler diese Maximalzahl erreichen, wenn er das Raetsel vollstaendig geloest hat. Die skill_msgs sollten auf diese 'Punktestufen' abgestimmt sein. (siehe oben) Die defines sind in definiert, das man an entsprechender Stelle includen muss mit: #include 7. Zugang zum Raetsel Das Raetsel muss fuer die Spieler nach der Installation zugaenglich sein. Der Zusgang zum Raetsel sollte also gesichert sein... 8. Installationsphase Das Raetsel wird dabei von den Raetselgoettern auf Spielbarkeit getestet. Eventuelle Fehler sollten dann korrigiert werden. Das fertige (fehlerarme ;)) Raetsel wird dann von den Raetselgoettern im Raetselraum eingetragen und ist fuer die Spieler freigegeben. 9. Hat man alle Schritte 1. bis 8. erfolgreich absolviert, hat man die einmalige Gelegenheit seinen Level etwas hochsetzen zu lassen... Ein feriges Beispiel fuer ein Questobjekt: --- snip --- snap --- knabber --- #include inherit "/i/object/quest_obj"; void create() { ::create(); set_name("rumpelkiste"); set_hint("Meister Garfrog sucht zwei mutige Helfer.\n"+ "Du findest ihn im nordoestlichen Teil Tadmors.\n"); set_loesung("Loesung: siehe /d/Vaniorh/garthan/vlab/LOESUNG\n"); set_skill(MAX_SKILL); set_skill_msgs( ({ "Meister Garfrog steht vor einem Problem, hilf ihm.", "Du hast Meister Garfrog zusammen mit deinem Partner sehr geholfen." })); set_solved_msg("$Der('ob) hat Meister Garfrog einen Dienst erwiesen!"); } --- snip --- snap --- knabber ---