blob: 9214ff59e206779d9aaeb30afaf414f32b7971ce [file] [log] [blame]
Bugfix183214d2016-08-18 16:38:26 +02001/* Humni, 2005-07-01 : habbich mal gebaut */
2
3/* Verwendung: 1. Erben
4 2. Entweder die Einzelfunktionen aufrufen oder einfach
5 BuildUp(int spielerlevel) aufrufen und danach noch
6 bei Bedarf modifizieren.
7*/
8
9inherit "/std/npc";
10
11#include <properties.h>
12#include <language.h>
13#include <new_skills.h>
14#include <combat.h>
15
16// In das Kommando-Array kommen die ganzen Befehle, die der NPC kann.
17string* attack_kommandos;
18string* defend_kommandos;
19mapping row_kommandos;
20
21
22create()
23{
24 ::create();
25
26 attack_kommandos=({});
27 defend_kommandos=({});
28 row_kommandos=([]);
29 SetProp(P_GUILD,"abenteurer");
30 seteuid(getuid(this_object()));
31}
32
33/* Mal als simpel-Methode eingebaut, vielleicht kann das ja irgend ein NPC
34 auch noch so brauchen.*/
35AddAttackCommand(string str)
36{
37 attack_kommandos+=({str});
38}
39
40AddDefendCommand(string str)
41{
42 defend_kommandos+=({str});
43}
44
45AddRowCommand(int row, string str)
46{
47 string * com;
48 if (!pointerp(row_kommandos[row]))
49 {
50 row_kommandos+=([row:({str})]);
51 }
52 else
53 {
54 com=row_kommandos[row];
55 com+=({str});
56 row_kommandos+=([row:com]);
57 }
58}
59
60/* Sehr simpel gemacht, gebe ich gerne zu.*/
61AddPreferedRow(int row)
62{
63 AddDefendCommand(sprintf("team reihe %d",row));
64}
65
66/* BuildSkills: Baut die Skills im NPC auf.
67
68 Idee: Level genauso gross wie Mindeslevel fuer Spell: Ability 1000. Danach pro Level>Mindestlevel +1000, bis zu 10000.
69
70 Kampfspells: Saeurestrahl, Feuerball, Schnell, Ausweichen, Kampfschrei.
71 */
72BuildSkills(int level)
73{
74 int val;
75 if (level>=11)
76 {
77 val=((level>21)?10000:(level-10)*1000);
78 ModifySkill("pfeil",val);
79 AddAttackCommand("pfeil");
80 AddAttackCommand("pfeil");
81 AddRowCommand(2,"pfeil");
82 AddRowCommand(2,"pfeil");
83 }
84 if (level>=15)
85 {
86 val=((level>25)?10000:(level-14)*1000);
87 ModifySkill("feuerball",val);
88 AddAttackCommand("feuerball");
89 AddAttackCommand("feuerball");
90 AddRowCommand(3,"feuerball");
91 AddRowCommand(3,"feuerball");
92 AddRowCommand(2,"feuerball");
93 AddRowCommand(3,"feuerball");
94 AddRowCommand(4,"feuerball");
95 }
96 if (level>=30)
97 {
98 val=((level>40)?10000:(level-30)*1000);
99 ModifySkill("saeurestrahl",val);
100 AddAttackCommand("saeurestrahl");
101 AddAttackCommand("saeurestrahl");
102 AddRowCommand(4,"saeurestrahl");
103 AddRowCommand(4,"saeurestrahl");
104 AddRowCommand(4,"saeurestrahl");
105 AddRowCommand(4,"saeurestrahl");
106 AddRowCommand(3,"saeurestrahl");
107 }
108 if (level>=17)
109 {
110 val=((level>27)?10000:(level-16)*1000);
111 ModifySkill("schnell",val);
112 AddRowCommand(1,"schnell");
113 AddRowCommand(1,"schnell");
114 }
115 if (level>=12)
116 {
117 val=((level>27)?10000:(level-16)*1000);
118 ModifySkill("ausweichen",val);
119 AddRowCommand(1,"ausweichen");
120 AddRowCommand(1,"ausweichen");
121 AddRowCommand(1,"ausweichen");
122 }
123 if (level>=13)
124 {
125 val=((level>13)?10000:(level-12)*1000);
126 ModifySkill("kampfschrei",val);
127 AddAttackCommand("kampfschrei");
128 AddAttackCommand("kampfschrei");
129 }
130
131 ModifySkill(SK_FIGHT,([SI_SKILLABILITY:((level>50)?10000:level*200)]),150,"ANY");
132}
133
134//Nachbau...geklaut aus /std/player/skills.c
135
136StdSkill_Fight(object me, string sname, mapping sinfo)
137{
138 int val, w;
139 object enemy;
140
141 if (!mappingp(sinfo) || !objectp(sinfo[P_WEAPON]))
142 return 0;
143
144 w = ([WT_KNIFE : 8,
145 WT_SWORD : 5,
146 WT_AXE : 4,
147 WT_SPEAR : 6,
148 WT_CLUB : 1,
149 WT_WHIP : 9,
150 WT_STAFF : 7])[sinfo[P_WEAPON]->QueryProp(P_WEAPON_TYPE)];
151
152
153 val = sinfo[SI_SKILLABILITY]*(sinfo[P_WEAPON]->QueryProp(P_WC)*
154 (w*QueryAttribute(A_DEX)+
155 (10-w)*QueryAttribute(A_STR))/800)
156 /MAX_ABILITY;
157
158 sinfo[SI_SKILLDAMAGE]+=val;
159
160 //Naja, gut. Lernen hab ich nicht uebernommen, das tut der NPC nicht.
161
162}
163
164void SpellAttack(object enemy)
165{
166 int row;
167 string* cmds;
168 row=PresentPosition();
169 cmds=attack_kommandos;
170 if (pointerp(row_kommandos[row]))
171 cmds+=row_kommandos[row];
172 if (sizeof(cmds)>0)
173 command(cmds[random(sizeof(cmds))]);
174 ::SpellAttack(enemy);
175}
176
177int Defend(int dam, mixed dam_type, mixed spell, object enemy)
178{
179 if (sizeof(defend_kommandos)>0)
180 command(defend_kommandos[random(sizeof(defend_kommandos))]);
181 ::Defend(dam,dam_type,spell,enemy);
182}
183
184BuildUp(int spielerlevel)
185{
186 // Sehr simpel, zugegeben.
187 create_default_npc(spielerlevel);
188 BuildSkills(spielerlevel);
189 AddPreferedRow(spielerlevel>30?4:(spielerlevel>15?3:(spielerlevel>11?2:1)));
190}