@rpgjs/server 5.0.0-alpha.21 → 5.0.0-alpha.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -30,102 +30,16 @@ export function WithElementManager<TBase extends PlayerCtor>(Base: TBase) {
30
30
  return class extends Base {
31
31
  _elementsEfficiency: { rate: number; element: any }[] = [];
32
32
 
33
- /**
34
- * Recovers the player's elements defense on inventory. This list is generated from the `elementsDefense` property defined on the weapons or armors equipped.
35
- * If several items have the same element, only the highest rate will be taken into account.
36
- *
37
- * Gets the defensive capabilities against various elements from equipped items.
38
- * The system automatically consolidates multiple defensive items, keeping only
39
- * the highest protection rate for each element type. This provides a comprehensive
40
- * view of the player's elemental resistances from all equipped gear.
41
- *
42
- * @returns Array of element defense objects with rate and element properties
43
- *
44
- * @example
45
- * ```ts
46
- * import { Armor } from '@rpgjs/server'
47
- *
48
- * enum Elements {
49
- * Fire = 'fire'
50
- * }
51
- *
52
- * @Armor({
53
- * name: 'Shield',
54
- * elementsDefense: [{ rate: 1, element: Elements.Fire }]
55
- * })
56
- * class Shield {}
57
- *
58
- * @Armor({
59
- * name: 'FireShield',
60
- * elementsDefense: [{ rate: 0.5, element: Elements.Fire }]
61
- * })
62
- * class FireShield {}
63
- *
64
- * player.addItem(Shield)
65
- * player.addItem(FireShield)
66
- * player.equip(Shield)
67
- * player.equip(FireShield)
68
- *
69
- * console.log(player.elementsDefense) // [{ rate: 1, element: 'fire' }]
70
- *
71
- * // Check specific element defense
72
- * const fireDefense = player.elementsDefense.find(def => def.element === 'fire');
73
- * if (fireDefense) {
74
- * console.log(`Fire defense rate: ${fireDefense.rate}`);
75
- * }
76
- * ```
77
- */
78
33
  get elementsDefense(): { rate: number; element: any }[] {
79
34
  return (this as any).getFeature("elementsDefense", "element");
80
35
  }
81
36
 
82
- /**
83
- * Set or retrieves all the elements where the player is vulnerable or not.
84
- *
85
- * Manages the player's elemental efficiency modifiers, which determine how
86
- * effective different elements are against this player. Values greater than 1
87
- * indicate vulnerability, while values less than 1 indicate resistance.
88
- * This combines both class-based efficiency and player-specific modifiers.
89
- *
90
- * @returns Array of element efficiency objects with rate and element properties
91
- *
92
- * @example
93
- * ```ts
94
- * import { Class } from '@rpgjs/server'
95
- *
96
- * enum Elements {
97
- * Fire = 'fire',
98
- * Ice = 'ice'
99
- * }
100
- *
101
- * @Class({
102
- * name: 'Fighter',
103
- * elementsEfficiency: [{ rate: 1, element: Elements.Fire }]
104
- * })
105
- * class Hero {}
106
- *
107
- * player.setClass(Hero)
108
- *
109
- * console.log(player.elementsEfficiency) // [{ rate: 1, element: 'fire' }]
110
- *
111
- * player.elementsEfficiency = [{ rate: 2, element: Elements.Ice }]
112
- *
113
- * console.log(player.elementsEfficiency) // [{ rate: 1, element: 'fire' }, { rate: 2, element: 'ice' }]
114
- *
115
- * // Check for vulnerabilities
116
- * const vulnerabilities = player.elementsEfficiency.filter(eff => eff.rate > 1);
117
- * console.log('Vulnerable to:', vulnerabilities.map(v => v.element));
118
- *
119
- * // Check for resistances
120
- * const resistances = player.elementsEfficiency.filter(eff => eff.rate < 1);
121
- * console.log('Resistant to:', resistances.map(r => r.element));
122
- * ```
123
- */
124
37
  get elementsEfficiency(): { rate: number; element: any }[] {
125
38
  if (this._class()) {
39
+ const classData = this._class() as any;
126
40
  return <any>[
127
41
  ...this._elementsEfficiency,
128
- ...(this._class()?.elementsEfficiency || []),
42
+ ...(classData?.elementsEfficiency || []),
129
43
  ];
130
44
  }
131
45
  return this._elementsEfficiency;
@@ -135,33 +49,6 @@ export function WithElementManager<TBase extends PlayerCtor>(Base: TBase) {
135
49
  this._elementsEfficiency = val;
136
50
  }
137
51
 
138
- /**
139
- * Retrieves a array of elements assigned to the player and the elements of the weapons / armor equipped
140
- *
141
- * Gets all offensive elements available to the player from equipped weapons and armor.
142
- * This determines what elemental damage types the player can deal in combat.
143
- * The system automatically combines elements from all equipped items and removes duplicates.
144
- *
145
- * @returns Array of element objects with rate and element properties for offensive capabilities
146
- *
147
- * @example
148
- * ```ts
149
- * // Get all offensive elements
150
- * console.log(player.elements); // [{ rate: 1.5, element: 'fire' }, { rate: 1.2, element: 'ice' }]
151
- *
152
- * // Check if player can deal fire damage
153
- * const hasFireElement = player.elements.some(el => el.element === 'fire');
154
- * if (hasFireElement) {
155
- * console.log('Player can deal fire damage');
156
- * }
157
- *
158
- * // Get strongest element
159
- * const strongestElement = player.elements.reduce((max, current) =>
160
- * current.rate > max.rate ? current : max
161
- * );
162
- * console.log(`Strongest element: ${strongestElement.element} (${strongestElement.rate})`);
163
- * ```
164
- */
165
52
  get elements(): {
166
53
  rate: number;
167
54
  element: string;
@@ -175,40 +62,6 @@ export function WithElementManager<TBase extends PlayerCtor>(Base: TBase) {
175
62
  return arrayUniq(elements);
176
63
  }
177
64
 
178
- /**
179
- * Calculate elemental damage coefficient against another player
180
- *
181
- * Determines the damage multiplier when this player attacks another player,
182
- * taking into account the attacker's offensive elements, the defender's
183
- * elemental efficiency, and elemental defense from equipment. This is used
184
- * in the battle system to calculate elemental damage modifiers.
185
- *
186
- * @param otherPlayer - The target player to calculate coefficient against
187
- * @returns Numerical coefficient to multiply base damage by
188
- *
189
- * @example
190
- * ```ts
191
- * // Calculate elemental damage coefficient
192
- * const firePlayer = new MyPlayer();
193
- * const icePlayer = new MyPlayer();
194
- *
195
- * // Fire player attacks ice player (assuming ice is weak to fire)
196
- * const coefficient = icePlayer.coefficientElements(firePlayer);
197
- * console.log(`Damage multiplier: ${coefficient}`); // e.g., 2.0 for double damage
198
- *
199
- * // Use in damage calculation
200
- * const baseDamage = 100;
201
- * const finalDamage = baseDamage * coefficient;
202
- * console.log(`Final damage: ${finalDamage}`);
203
- *
204
- * // Check for elemental advantage
205
- * if (coefficient > 1) {
206
- * console.log('Attacker has elemental advantage!');
207
- * } else if (coefficient < 1) {
208
- * console.log('Defender resists this element');
209
- * }
210
- * ```
211
- */
212
65
  coefficientElements(otherPlayer: RpgPlayer): number {
213
66
  const atkPlayerElements: any = (otherPlayer as any).elements;
214
67
  const playerElements: any = this.elementsEfficiency;
@@ -238,7 +91,76 @@ export function WithElementManager<TBase extends PlayerCtor>(Base: TBase) {
238
91
  }
239
92
 
240
93
  /**
241
- * Type helper to extract the interface from the WithElementManager mixin
242
- * This provides the type without duplicating method signatures
94
+ * Interface for Element Manager functionality
95
+ *
96
+ * Provides elemental management capabilities including resistances, vulnerabilities,
97
+ * and attack elements. This interface defines the public API of the ElementManager mixin.
243
98
  */
244
- export type IElementManager = InstanceType<ReturnType<typeof WithElementManager>>;
99
+ export interface IElementManager {
100
+ /**
101
+ * Gets the defensive capabilities against various elements from equipped items.
102
+ * The system automatically consolidates multiple defensive items, keeping only
103
+ * the highest protection rate for each element type.
104
+ *
105
+ * @returns Array of element defense objects with rate and element properties
106
+ */
107
+ elementsDefense: { rate: number; element: any }[];
108
+
109
+ /**
110
+ * Manages the player's elemental efficiency modifiers, which determine how
111
+ * effective different elements are against this player. Values greater than 1
112
+ * indicate vulnerability, while values less than 1 indicate resistance.
113
+ * This combines both class-based efficiency and player-specific modifiers.
114
+ *
115
+ * @returns Array of element efficiency objects with rate and element properties
116
+ */
117
+ elementsEfficiency: { rate: number; element: any }[];
118
+
119
+ /**
120
+ * Gets all offensive elements available to the player from equipped weapons and armor.
121
+ * This determines what elemental damage types the player can deal in combat.
122
+ * The system automatically combines elements from all equipped items and removes duplicates.
123
+ *
124
+ * @returns Array of element objects with rate and element properties for offensive capabilities
125
+ */
126
+ elements: {
127
+ rate: number;
128
+ element: string;
129
+ }[];
130
+
131
+ /**
132
+ * Calculate elemental damage coefficient against another player
133
+ *
134
+ * Determines the damage multiplier when this player attacks another player,
135
+ * taking into account the attacker's offensive elements, the defender's
136
+ * elemental efficiency, and elemental defense from equipment. This is used
137
+ * in the battle system to calculate elemental damage modifiers.
138
+ *
139
+ * @param otherPlayer - The target player to calculate coefficient against
140
+ * @returns Numerical coefficient to multiply base damage by
141
+ *
142
+ * @example
143
+ * ```ts
144
+ * // Calculate elemental damage coefficient
145
+ * const firePlayer = new MyPlayer();
146
+ * const icePlayer = new MyPlayer();
147
+ *
148
+ * // Fire player attacks ice player (assuming ice is weak to fire)
149
+ * const coefficient = icePlayer.coefficientElements(firePlayer);
150
+ * console.log(`Damage multiplier: ${coefficient}`); // e.g., 2.0 for double damage
151
+ *
152
+ * // Use in damage calculation
153
+ * const baseDamage = 100;
154
+ * const finalDamage = baseDamage * coefficient;
155
+ * console.log(`Final damage: ${finalDamage}`);
156
+ *
157
+ * // Check for elemental advantage
158
+ * if (coefficient > 1) {
159
+ * console.log('Attacker has elemental advantage!');
160
+ * } else if (coefficient < 1) {
161
+ * console.log('Defender resists this element');
162
+ * }
163
+ * ```
164
+ */
165
+ coefficientElements(otherPlayer: RpgPlayer): number;
166
+ }