@@ -67,38 +67,89 @@ export const skillDetails: SkillDetail[] = [
67
67
export interface SkillValue {
68
68
exp : number ;
69
69
level : number ;
70
+ modifiedLevel ?: number ;
70
71
}
71
72
72
- export class Skills {
73
+ export class SkillShortcut {
74
+
75
+ public constructor ( private skills : Skills , private skillName : SkillName ) {
76
+ }
77
+
78
+ public addExp ( exp : number ) : void {
79
+ this . skills . addExp ( this . skillName , exp ) ;
80
+ }
81
+
82
+ public get level ( ) : number {
83
+ return this . skills . getLevel ( this . skillName ) ;
84
+ }
85
+
86
+ public get exp ( ) : number {
87
+ return this . skills . get ( this . skillName ) . exp ;
88
+ }
89
+
90
+ public get levelForExp ( ) : number {
91
+ return this . skills . getLevelForExp ( this . exp ) ;
92
+ }
93
+
94
+ }
95
+
96
+ type SkillShortcutMap = {
97
+ [ skillName in SkillName ] : SkillShortcut ;
98
+ } ;
99
+
100
+ class SkillShortcuts implements SkillShortcutMap {
101
+ agility : SkillShortcut ;
102
+ attack : SkillShortcut ;
103
+ construction : SkillShortcut ;
104
+ cooking : SkillShortcut ;
105
+ crafting : SkillShortcut ;
106
+ defence : SkillShortcut ;
107
+ farming : SkillShortcut ;
108
+ firemaking : SkillShortcut ;
109
+ fishing : SkillShortcut ;
110
+ fletching : SkillShortcut ;
111
+ herblore : SkillShortcut ;
112
+ hitpoints : SkillShortcut ;
113
+ magic : SkillShortcut ;
114
+ mining : SkillShortcut ;
115
+ prayer : SkillShortcut ;
116
+ ranged : SkillShortcut ;
117
+ runecrafting : SkillShortcut ;
118
+ slayer : SkillShortcut ;
119
+ smithing : SkillShortcut ;
120
+ strength : SkillShortcut ;
121
+ thieving : SkillShortcut ;
122
+ woodcutting : SkillShortcut ;
123
+ }
124
+
125
+ export class Skills extends SkillShortcuts {
73
126
74
127
private _values : SkillValue [ ] ;
75
128
76
129
public constructor ( private actor : Actor , values ?: SkillValue [ ] ) {
130
+ super ( ) ;
131
+
132
+ Object . keys ( Skill )
133
+ . map ( skillName => skillName . toLowerCase ( ) )
134
+ . forEach ( skillName =>
135
+ this [ skillName ] = new SkillShortcut ( this , skillName as SkillName )
136
+ ) ;
137
+
77
138
if ( values ) {
78
139
this . _values = values ;
79
140
} else {
80
141
this . _values = this . defaultValues ( ) ;
81
142
}
82
143
}
83
144
84
- private defaultValues ( ) : SkillValue [ ] {
85
- const values : SkillValue [ ] = [ ] ;
86
- skillDetails . forEach ( s => values . push ( { exp : 0 , level : 1 } ) ) ;
87
- values [ Skill . HITPOINTS ] = { exp : 1154 , level : 10 } ;
88
- return values ;
89
- }
90
-
91
- /*
92
- * @TODO make an additional field for boostedLevel that this reads from
93
- * Also add a new method to get the unboostedLevel incase it's ever needed
94
- * Then think about some way to reliably and easily fade those boosts out over time
95
- */
96
- public getSkillLevel ( skill : number | SkillName ) : number {
97
- return this . get ( skill ) . level ;
145
+ public getLevel ( skill : number | SkillName , ignoreLevelModifications : boolean = false ) : number {
146
+ const s = this . get ( skill ) ;
147
+ return ( s . modifiedLevel !== undefined && ! ignoreLevelModifications ? s . modifiedLevel : s . level ) ;
98
148
}
99
149
100
- public hasSkillLevel ( skill : number | SkillName , level : number ) : boolean {
101
- return this . get ( skill ) . level >= level ;
150
+ public hasLevel ( skill : number | SkillName , level : number , ignoreLevelModifications : boolean = false ) : boolean {
151
+ const s = this . get ( skill ) ;
152
+ return ( ignoreLevelModifications ? s . level : s . modifiedLevel ) >= level ;
102
153
}
103
154
104
155
public getLevelForExp ( exp : number ) : number {
@@ -181,16 +232,6 @@ export class Skills {
181
232
} ) ;
182
233
}
183
234
184
- public setExp ( skill : number | SkillName , exp : number ) : void {
185
- const skillId = this . getSkillId ( skill ) ;
186
- this . _values [ skillId ] . exp = exp ;
187
- }
188
-
189
- public setLevel ( skill : number | SkillName , level : number ) : void {
190
- const skillId = this . getSkillId ( skill ) ;
191
- this . _values [ skillId ] . level = level ;
192
- }
193
-
194
235
public getSkillId ( skill : number | SkillName ) : number {
195
236
if ( typeof skill === 'number' ) {
196
237
return skill ;
@@ -209,6 +250,23 @@ export class Skills {
209
250
}
210
251
}
211
252
253
+ private defaultValues ( ) : SkillValue [ ] {
254
+ const values : SkillValue [ ] = [ ] ;
255
+ skillDetails . forEach ( s => values . push ( { exp : 0 , level : 1 } ) ) ;
256
+ values [ Skill . HITPOINTS ] = { exp : 1154 , level : 10 } ;
257
+ return values ;
258
+ }
259
+
260
+ private setExp ( skill : number | SkillName , exp : number ) : void {
261
+ const skillId = this . getSkillId ( skill ) ;
262
+ this . _values [ skillId ] . exp = exp ;
263
+ }
264
+
265
+ private setLevel ( skill : number | SkillName , level : number ) : void {
266
+ const skillId = this . getSkillId ( skill ) ;
267
+ this . _values [ skillId ] . level = level ;
268
+ }
269
+
212
270
public get values ( ) : SkillValue [ ] {
213
271
return this . _values ;
214
272
}
0 commit comments