| THEMA: |
| Reputationen |
| |
| |
| ALLGEMEINE BESCHREIBUNG: |
| Man kann bei einer Gruppierung/Volk/Partei/etc. Ruf gewinnen oder verlieren |
| und somit entweder deren Respekt erlangen oder auf ihrer Abschussliste |
| landen. |
| |
| Am Beispiel der Goblins im Walddorf Skoga: Dort gibt es das Freie Volk, das |
| aus seinem Heimatdorf vertrieben wurde, und die Goblins, welche das Dorf |
| besetzt haben. Hilft man einer Seite, baut man Ruf auf und erhaelt |
| beispielsweise Zugang zu Heilstellen und speziellen Items, waehrend die |
| andere Seite zunehmend misstrauisch reagiert und einen schlussendlich ohne |
| zu fragen attackiert. |
| |
| Es muessen nicht immer mehrere Seiten involviert sein. Auch eine einzelne |
| Partei ist denkbar, der man helfen kann und in deren Laeden/Kneipen man mit |
| steigendem Ruf z.B. Verguenstigungen, mehr Informationen, Bonusitems und |
| Aehnliches erhaelt. |
| |
| Denkbar ist es auch, das Ganze zu vernetzen. Beispielsweise koennte ein |
| Verwandter eines Mitglieds von obengenanntem Freien Volk vor den Angriffen |
| ins Polargebiet umgezogen sein, aber von des Spielers Heldentaten gehoert |
| haben und ihm so freundlicher gesonnen sein. |
| |
| |
| METHODEN (s. a. einzelne Manpages): |
| |
| int ChangeReputation(string repid, int value, int silent) |
| Die Funktion ist in jedem Spielerobjekt vordefiniert. |
| Vor der Aenderung wird ein Check auf die UID des ausfuehrenden Objektes |
| ausgefuehrt, "fremde" Reputationen darf man somit nicht veraendern. |
| Man kann aber selbstverstaendlich in begruendeten Faellen mit dem |
| zustaendigen Magier/Regionsmagier sprechen, ob man ebenfalls Zugriff |
| erhaelt. Eingetragen wird dies schlussendlich durch einen EM. |
| |
| |
| int GetReputation(string repid) |
| Ebenfalls im Spielerobjekt vordefiniert. Liefert den aktuellen Wert der |
| angegebenen Reputation zurueck. |
| |
| |
| mapping GetReputations() |
| Ebenso vordefiniert. Liefert ein Mapping aller im Spieler gespeicherten |
| Reputationen und ihrer Werte zurueck. |
| |
| |
| BEISPIELE: |
| |
| // Eine kleine Aufgabe fuer das "Freie Volk" bringt dem Spieler etwas |
| // Ansehen. |
| |
| void QuestGeloest(object pl) { |
| // Silent, wir geben eine eigene Meldung aus. |
| pl->ChangeReputation("freiesvolk", 250, 1); |
| |
| tell_object(pl, "Du befreist einen Gefangenen. Das freie Volk wird es " |
| "Dir danken.\n"); |
| } |
| |
| // Ein NPC des "Schaedlspalta-Klans". Wenn er getoetet wird, verlieren die |
| // toetenden Spieler Ruf bei dieser Fraktion. |
| |
| #include <properties.h> |
| |
| inherit "/std/npc.c"; |
| |
| void create() { |
| npc::create(); |
| SetProp(P_SHORT, "Ein Goblin des Schaedlspalta-Klans"); |
| ... |
| } |
| |
| varargs void die(int poison, int ext) { |
| object *enemies; |
| int value; |
| // Begleit-NPCs brauchen keine Reputation |
| enemies = filter(PresentEnemies(), #'interactive); |
| // 50 Reputationsabzug pro Kill, aufgeteilt auf alle Gegner |
| value = -50 / sizeof(enemies); |
| foreach(object pl : enemies) { |
| pl->ChangeReputation("schaedlspalta", value); |
| // Optional koennte ihre "Feindfraktion" das gutheissen: |
| // pl->ChangeReputation("freiesvolk", abs(value)); |
| } |
| return npc::die(poison, ext); |
| } |
| |
| // Jeder beteiligte Feind kriegt nun eine Meldung, die in etwa lauten |
| // koennte: "Dein Ansehen beim Schaedlspalta-Klan hat sich etwas |
| // verschlechtert." Der NPC koennte nun Spieler automatisch angreifen, |
| // sobald ihr Ruf zu tief gesunken ist: |
| |
| #include <reputation.h> |
| |
| void init() { |
| npc::init(); |
| if(objectp(this_player()) && !IsEnemy(this_player()) && |
| this_player()->GetReputation("schaedlspalta") <= REP_DISLIKED) |
| InsertEnemy(this_player()); |
| } |
| |
| // Ein NPC rueckt bestimmte Informationen erst raus, sobald das Ansehen |
| // des Spielers hoch genug ist: |
| |
| #include <properties.h> |
| #include <reputation.h> |
| |
| inherit "/std/npc.c"; |
| |
| string InfoGeheimplan(); |
| |
| void create() { |
| npc::create(); |
| SetProp(P_SHORT, "Der Kommandant des freien Volkes"); |
| ... |
| AddInfo("geheimplan", #'InfoGeheimplan, "sagt: "); |
| } |
| |
| string InfoGeheimplan() { |
| if(this_player()->GetReputation("freiesvolk") < REP_TRUSTED) |
| return "Das geht Dich ueberhaupt nichts an!"; |
| return "Nun, ich vertraue Dir. Also, heute um Mitternacht ... ... ..."; |
| } |
| |
| // Pruefung der (wichtigsten) Rueckgabewerte: |
| |
| #include <reputations.h> |
| |
| void QuestGeloest(object pl) { |
| string msg; |
| |
| // Sonstige Meldungen |
| ... |
| |
| switch(pl->ChangeReputation("freiesvolk", 500, 1)) { |
| // Reputation bereits Max |
| case REP_RET_ALREADYMAX: |
| msg = "Dein Ansehen beim freien Volk kann sich nicht mehr weiter " |
| "verbessern."; |
| break; |
| // Reputation waere hoeher als Max geworden, daher auf Max gesetzt |
| case REP_RET_SUCCESSCUT: |
| msg = "Dein Ansehen beim freien Volk hat sich etwas verbessert, " |
| "aber weiter steigern kannst Du es nicht mehr."; |
| break; |
| // Reputation erfolgreich geaendert |
| case REP_RET_SUCCESS: |
| msg = "Dein Ansehen beim freien Volk hat sich etwas verbessert."; |
| break; |
| default: |
| // Technischer Fehler |
| break; |
| } |
| |
| if(stringp(msg) && strlen(msg)) |
| tell_object(pl, break_string(msg, 78)); |
| } |
| |
| SIEHE AUCH: |
| |
| LETZTE AENDERUNG: |
| 2009-22-03, 12:30:00 von Nibel |