Dokumentation zu: GiveAbility(L)

HR Image


FUNKTION:
        int GiveAbility(string abil, int wert)

DEFINIERT IN:
        /std/living/skills.c

BESCHREIBUNG:
        Die Funktion 'GiveAbility()' ist die zentrale Funktion um einem
        Spieler/NPC eine 'echte' Fertigkeit zu geben oder zu nehmen oder
        um den Lernwert zu veraendern. Was genau gemacht wird, haengt
        massgeblich von 'wert' ab.

ARGUMENTE:
        abil: Der Name einer Fertigkeit, die im Skillmaster angemeldet ist.

        wert: zwischen 0 und 1000    (Lernwert setzen)
              Hat das Living diese Fertigkeit noch nicht, wird sie ihm
              gegeben. Hat der 'Geber' eine P_SKILLS_ID gesetzt, wird
              diese mit zur Fertigkeit gespeichert.

              Hat das Living die Fertigkeit bereits, wird nur der Lernwert
              fuer diese Fertigkeit neu gesetzt. Ist im 'Geber' P_SKILLS_ID
              gesetzt, wird diese mit zur Fertigkeit gespeichert.

              Bei 'wert' _sollte_ man sich nach dem P_SM_BEGIN-Wert fuer
              diese Fertigkeit im Skillmaster richten. Der zustaendige
              Regions-/Erzmagier ist vorher mal zu Rate zu ziehen...

        wert: -1    (soft wegnehmen)
              Es wird versucht die Fertigkeit in Abhaengigkeit von 
              P_SKILLS_ID wegzunehmen. Hat das Living die Fertigkeit nicht
              vom aufrufenden Objekt erhalten oder hat der 'Nehmer'
              P_SKILLS_ID nicht gesetzt, wird die Fertigkeit nicht wegge-
              nommen, sondern nur (wenn gesetzt) die ID geloescht.

              (Ausnahmsweise wird die Fertigkeit doch entfernt, wenn sie
              selbst keinerlei IDs gespeichert hat. Siehe P_SKILLS)

              Im KLARTEXT: Der 'Nehmer' kann nur seine eigne Vergabe auch
              wieder wegnehmen. Das schuetzt das Living davor, dass es die
              Fertigkeit von einem Objekt weggenommen bekommt, obwohl es die
              Fertigkeit auch noch von anderen Objekten bekommen hat.

        wert: -2    (hart wegnehmen)
              Dem Living wird die Fertigkeit in jedem Fall weggenommen, ganz
              gleich, ob es noch andere 'Geber' gibt oder nicht. Das 'hart'
              wegnehmen sollte eine Ausnahme und bestimmten Tools vorbe-
              halten bleiben! (Dokumentation nur zur Vollstaendigkeit)
        
RÜCKGABEWERT:
        0..1000 - wenn die Vergabe erfolgreich war (entsprechend 'wert')
          -1    - beim 'soft' wegnehmen:
                  Die Fertigkeit (oder nur die P_SKILLS_ID) wurde erfolgreich
                  entfernt, auch wenn das Living die Fertigkeit in Wirklich-
                  keit noch hat.
                  Das hat dem Nehmer aber egal zu sein. Will man eine ent-
                  sprechende 'Wegnahmemeldung' ausgeben, empfiehlt es sich
                  mit 'GetProbability()' nochmal nachzuschauen, ehe man den
                  Mund zu voll nimmt. ;-)

                  beim 'hart' wegnehmen:
                  Die Fertigkeit wurde eiskalt entfernt. :-(

          -2    - beim nehmen:
                  Das Living hat die Fertigkeit gar nicht.

                  beim geben:
                  Die Fertigkeit ist im Skillmaster nicht angemeldet.

BEACHTE:
        VOR dem Setzen sollte man immer mit 'GetProbability()' testen,
        ob das Living die Fertigkeit nicht vielleicht schon hat und
        dann den ermittelten Wert selbst wieder setzen, damit man
        nicht die vorhandene Lernrate des Livings wieder loescht.

        Die P_SKILLS_ID sollte in einem 'Geber' oder 'Nehmer' _immer_
        gesetzt sein. Setzt man es nicht, kann es passieren, dass 
        andere Objekte dem Spieler die Fertigkeit wieder wegnehmen.
        Zum Beispiel kann man den Zauberspruch 'ruestung' sowohl von
        der Spruchrolle in der Herzschlossquest bekommen, als auch
        in der Abenteurergilde lernen. Macht der Spieler die Quest
        und bekommt den Spruch und tritt dann bei den Abenteurern 
        aus, versucht die Gilde den Ruestungsspruch wegzunehmen. Hat
        die Rolle keine P_SKILLS_ID gesetzt gehabt, dann verliert der
        Spieler den Spruch, obwohl er ihn von der Rolle bekommen hat.
        Und was wollen wir ja nicht, gell? :-)

        Die RICHTWERT aus dem Skillmaster sollen wirklich nur in Aus-
        nahmefaellen ueberschritten werden.

BEISPIEL:
        Folgendes Beispiel ist getestet und soll eine Art 'Checkliste'
        fuer Vergabe-Objekte darstellen. 8-) 'Verlernen' wird wohl
        normalerweise niemand brauchen, aber fuer die Vollstaendigkeit.
        In Gilden wird das eh alles automatisch gemacht.

        -------------- Schnipp-schnapp ------------------

        // Gewitter-lern-spruchrolle

        inherit "std/thing";

        #include <properties.h>
        #include <living/skills.h>

        void create() {
            if(!is_clone(this_object())) return;
            ::create();
            SetProp(P_NAME, "Spruchrolle");
            SetProp(P_PLURAL, "Spruchrollen");
            SetProp(P_LONG, "...bla bla...\n"
                "Du kannst 'Gewitter' damit lernen und verlernen.");
            SetProp(P_SKILLS_ID, "holger_rolle1");
            AddId(({"spruchrolle", "rolle"}));
            // usw...
            AddCmd("lerne&gewitter", "gib", "Was willst Du lernen?");
            AddCmd("verlerne&gewitter", "nimm", "Was willst Du verlernen?");
        }

        int gib() {
            int alt, neu, lev;
            if(this_player()->QueryProp(P_GHOST)) {
                write("Du hast kein Gehirn. Womit willst Du lernen?!?\n");
                return 1;
            }
            // SM ist ein define auf den Skillmaster in <living/skills.h>
            // Die Anfangswerte im Skillmaster sind 'gute Richtwerte'
            neu=SM->QueryProp("gewitter", P_SM_BEGIN);
            lev=SM->QueryProp("gewitter", P_SM_LEVEL);
            if(this_player()->QueryProp(P_LEVEL)<lev) {
                write("Dein Level ist zu klein fuer 'Gewitter'.\n");
                return 1;
            }
            alt=this_player()->GetProbability("gewitter");
            if(alt<0) {
                this_player()->GiveAbility("gewitter", neu);
                write("Du erlernst 'Gewitter'.\n");
                return 1;
            }
            if(alt<neu) {
                this_player()->GiveAbility("gewitter", neu);
                write("Dein Zauberspruch 'Gewitter' verbessert sich.\n");
                return 1;
            }
            // trotzdem nochmal, um auch meine P_SKILLS_ID zu speichern.
            this_player()->GiveAbility("gewitter", alt);
            write("'Gewitter' kannst Du doch schon...\n");
            return 1;
        }

        int nimm() {
            int ret;
            ret=this_player()->GiveAbility("gewitter", -1);
            if(ret==-2) {
                write("Was man nicht kann, kann man nicht verlernen...\n");
                return 1;
            }
            if(ret==-1) {
                if(this_player()->GetProbability("gewitter")<0)
                    write("Du hast soeben 'Gewitter' verlernt.\n");
                else
                    // Mogeln wir uns mal um ne Aussage rum *grins*
                    write("Da hast Du nochmal Glueck gehabt! ;-)\n");
                return 1;
            }
            // sollte nie erreicht werden...
            write("Nun...\n");
            return 1;
        }

        -------------- Schnipp-schnapp ------------------

SIEHE AUCH:
        P_LAST_SKILL, P_COMBAT_SKILLS, P_ACTIVE_SKILLS, P_MAX_SKILLS,
        P_SKILLS, P_SKILLS_ID, SetSkillVerbs(L), QuerySkillVerbs(L),
        GetProbability(L), SetActiveSkill(L), AddSkillAction(L),
        SetDelayTime(L), QueryDelay(L), DisableSkill(L), EnableSkill(L),
        QuerySkillIDs(L), QueryDisablerIDs(L), _cast_(L), skillmaster(SEC),
        abilities.doc(WL)


Start » Magierhandbuch » Docu » Lfun » GiveAbility Letzte Generierung: 25.04.2021, 01:58
Email an: mud@wl.mud.de
Valid HTML 4.01!