blob: 3c5834272262c0478e1393ae99f421b0962c38e7 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// ModifySkill-Beispiel fuer einem Spell. Erlaeuterung auf man-Page
2// und im Objekt selbst
3inherit "/std/thing";
4#include <new_skills.h>
5#include <properties.h>
6#include <wizlevels.h>
7#include <break_string.h>
8
9static int skillset(string str);
10static int skillunset(string str);
11
12void create() {
13 if(!clonep(this_object())) {
14 set_next_reset(-1);
15 return;
16 }
17
18 ::create();
19 set_next_reset(7200);
20
21 SetProp(P_NAME, "Skillbeispiel");
22 SetProp(P_SHORT, "Eine Skillbeispiel");
23 SetProp(P_LONG, break_string(
24 "Mit \"skillset\" kann man sich den Skill (eigentlich Spell) "
25 "\"fnrx\" setzen.\n"+
26 "Durch \"skillunset\" wird der Skill geloescht.\n"
27 "Das zaehlt deshalb als Spell, weil er kleingeschrieben und "
28 "damit direkt vom Spieler (also dir) als Kommando via UseSpell() "
29 "ausfuehrbar ist.", 78, 0, BS_LEAVE_MY_LFS));
30 SetProp(P_GENDER, NEUTER);
31 AddId(({"beispiel", "skillbeispiel", "spellbeispiel",
32 "skill", "spell"}));
33
34 AddCmd("skillset", #'skillset);
35 AddCmd("skillunset", #'skillunset);
36}
37
38// Testfunktion, weil im Code dazu aufgefordert wird, das Objekt auch
39// mal zu wegzulegen. Spieler sollten nicht an sich herumfummeln.
40private static int _checkLearner(object pl) {
41 if(!IS_LEARNER(this_player())) {
42 notify_fail("Du bist kein Magier, deshalb geht das nicht.\n");
43 call_out(#'remove, 1);
44 return 0;
45 }
46 return 1;
47}
48
49static int skillset(string str) {
50 if(!_checkLearner(this_player()))
51 return 0;
52
53 if(this_player()->QuerySkill("fnrx")) {
54 notify_fail("Du kannst den Skill schon.\n");
55 return 0;
56 }
57
58 this_player()->ModifySkill("fnrx",
59 ([SI_CLOSURE: function int (object caster, string skill, mapping sinf) {
60 caster->LearnSkill("fnrx", 1);
61 tell_object(caster, "Peng! Dein Skillwert steigt auf "+
62 caster->QuerySkillAbility("fnrx")+".\n");
63 return 1;
64 },
65 SI_SKILLABILITY: 8432]), 100, "ANY");
66 tell_object(this_player(), break_string(
67 "Der Skill ist gesetzt. Tipp doch ein paar Mal \"fnrx\" und schau den "
68 "Code unter "+load_name(this_object())+" an, damit du siehst, dass der "
69 "Skill jetzt nur aus einem Eintrag in dir und einer ueber UseSpell() "
70 "gerufenen Funktion in diesem Objekt besteht. Der Skill ist kein "
71 "Kommando in einem anderen Objekt.\n\n"
72 "Wenn du dieses Objekt weglegst, funktioniert also alles weiter. "
73 "Zerstoerst du aber das Objekt (oder dich mit \"ende\", funktioniert "
74 "die Skillfunktion nicht mehr.\n"
75 "Schau dir auch xeval this_player()->QuerySkill(\"fnrx\") an.", 78, 0,
76 BS_LEAVE_MY_LFS));
77 return 1;
78}
79
80// Here be dragons!
81// Bitte benutzt die folgende Art von Manipulation der Skills nur dann,
82// wenn ihr genau wisst, was ihr tut. In anderen Worten: NICHT MACHEN!
83// Und wenn, dann NUR AM EIGENEN MAGIEROBJEKT, NICHT AN SPIELERN!
84static int skillunset(string str) {
85 if(!_checkLearner(this_player()))
86 return 0;
87
88 // per Query() das Mapping an der _query_*-Fun vorbei direkt holen
89 mapping skills = this_player()->Query(P_NEWSKILLS);
90 // ... und manipulieren (wirkt sich wegen Referenz direkt aus)
91 if(mappingp(skills) && mappingp(skills["ANY"]) &&
92 member(skills["ANY"], "fnrx")) {
93 efun::m_delete(skills["ANY"], "fnrx");
94 tell_object(this_player(), "Erledigt.\n");
95 } else
96 tell_object(this_player(), "Nichts zu erledigen.\n");
97
98 return 1;
99}
100
101void reset() {
102 remove();
103}