blob: cc65d0de346075e435caabf3df7dc1d61905b954 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// living/std_skills.c -- Standardfaehigkeiten
4//
5// $Id: std_skills.c 6673 2008-01-05 20:57:43Z Zesstra $
6#pragma strong_types
7#pragma save_types
8#pragma range_check
9#pragma no_clone
MG Mud User88f12472016-06-24 23:31:02 +020010
11#define NEED_PROTOTYPES
12#include <living/skills.h>
13#include <living/skill_attributes.h>
14#include <thing/properties.h>
15#include <attributes.h>
16#undef NEED_PROTOTYPES
17#include <properties.h>
18#include <new_skills.h>
19
20#define SIG(x) (x?(x>0?1:-1):0)
21
22protected int StdSkill_Nightvision(object me, string sname, mixed sinfo) {
23 int abil,light,llt,dt,res;
24
25 if (!sinfo || !environment()) return 0;
26 if (intp(sinfo)) sinfo=([SI_SKILLABILITY:sinfo]);
27 if (!mappingp(sinfo)) return 0;
28 if ((light=QueryProp(P_PLAYER_LIGHT))>0) {
29 ModifySkill(sname,([SI_LASTLIGHT:time()]));
30 return light;
31 }
32 abil=sinfo[SI_SKILLABILITY];
33 if (!(llt=sinfo[SI_LASTLIGHT])) {
34 ModifySkill(sname,([SI_LASTLIGHT:time()]));
35 dt=0;
36 } else {
37 dt=time()-llt;
38 if (dt<0) dt=0;
39 if (dt>86400) dt=86400;
40 }
41
42 res=(abil*dt)/(20*MAX_ABILITY)+light;
43 if (res<=0) {
44 res--; // Wert muss !=0 sein
45 if (res<-MAX_ABILITY) res=-MAX_ABILITY;
46 } else {
47 if (res>MAX_ABILITY) res=MAX_ABILITY;
48 }
49 return res;
50}
51
52protected mapping StdSkill_Bihand(object me, string sname, mapping sinfo) {
53 int abil,val;
54
55 // printf("Bihand: %O\n",sinfo);
56 if (!sinfo) return 0;
57 abil=sinfo[SI_SKILLABILITY];
58 val=(abil*(QueryAttribute(A_STR)+33))/MAX_ABILITY;
59 val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
60 sinfo[SI_SKILLDAMAGE]+=val;
61 // + max. 53
62 return sinfo;
63}
64
65protected mapping StdSkill_Fight_sword(object me, string sname, mapping sinfo) {
66 int abil,asig,val;
67
68 abil=sinfo[SI_SKILLABILITY];asig=SIG(abil);
69 val=(abil*(QueryAttribute(A_STR) +
70 QueryAttribute(A_DEX)*asig +
71 33))/MAX_ABILITY;
72 val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
73 sinfo[SI_SKILLDAMAGE]+=val;
74 // + max. 73
75 return sinfo;
76}
77
78protected mapping StdSkill_Fight_hands(object me, string sname, mapping sinfo) {
79 int abil,asig,val;
80
81 if (!sinfo) return 0;
82 abil=sinfo[SI_SKILLABILITY];asig=SIG(abil);
83 val=(abil*(QueryAttribute(A_STR) +
84 QueryAttribute(A_DEX)*3*asig +
85 100))/MAX_ABILITY;
86 val=(val*QuerySkillAttribute(SA_DAMAGE))/100;
87 sinfo[SI_SKILLDAMAGE]+=val;
88 // + max. 180
89 return sinfo;
90}
91
92protected int StdSkill_Booze(object me, string sname, mapping sinfo) {
93 int abil,val;
94
95 val=0;
96 if (!sinfo || (val=sinfo[SI_SKILLARG])<=0)
97 return val;
98 abil=sinfo[SI_SKILLABILITY];
99 val-=(val*abil)/(MAX_ABILITY+2500); // Bis zu 80% Abzug bei Alkoholikern.
100 if (val<=0) val=1;
101 return val;
102}
103