@rpgjs/server 5.0.0-alpha.4 → 5.0.0-alpha.41

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.
Files changed (101) hide show
  1. package/dist/Gui/DialogGui.d.ts +5 -0
  2. package/dist/Gui/GameoverGui.d.ts +23 -0
  3. package/dist/Gui/Gui.d.ts +6 -0
  4. package/dist/Gui/MenuGui.d.ts +22 -3
  5. package/dist/Gui/NotificationGui.d.ts +1 -2
  6. package/dist/Gui/SaveLoadGui.d.ts +13 -0
  7. package/dist/Gui/ShopGui.d.ts +28 -3
  8. package/dist/Gui/TitleGui.d.ts +23 -0
  9. package/dist/Gui/index.d.ts +10 -1
  10. package/dist/Player/BattleManager.d.ts +34 -12
  11. package/dist/Player/ClassManager.d.ts +46 -13
  12. package/dist/Player/ComponentManager.d.ts +123 -0
  13. package/dist/Player/Components.d.ts +345 -0
  14. package/dist/Player/EffectManager.d.ts +86 -0
  15. package/dist/Player/ElementManager.d.ts +104 -0
  16. package/dist/Player/GoldManager.d.ts +22 -0
  17. package/dist/Player/GuiManager.d.ts +259 -0
  18. package/dist/Player/ItemFixture.d.ts +6 -0
  19. package/dist/Player/ItemManager.d.ts +450 -9
  20. package/dist/Player/MoveManager.d.ts +324 -69
  21. package/dist/Player/ParameterManager.d.ts +344 -14
  22. package/dist/Player/Player.d.ts +460 -8
  23. package/dist/Player/SkillManager.d.ts +197 -15
  24. package/dist/Player/StateManager.d.ts +89 -25
  25. package/dist/Player/VariableManager.d.ts +74 -0
  26. package/dist/RpgServer.d.ts +502 -64
  27. package/dist/RpgServerEngine.d.ts +2 -1
  28. package/dist/decorators/event.d.ts +46 -0
  29. package/dist/decorators/map.d.ts +287 -0
  30. package/dist/index.d.ts +10 -0
  31. package/dist/index.js +21653 -20900
  32. package/dist/index.js.map +1 -1
  33. package/dist/logs/log.d.ts +2 -3
  34. package/dist/module.d.ts +43 -1
  35. package/dist/presets/index.d.ts +0 -9
  36. package/dist/rooms/BaseRoom.d.ts +132 -0
  37. package/dist/rooms/lobby.d.ts +10 -2
  38. package/dist/rooms/map.d.ts +1236 -17
  39. package/dist/services/save.d.ts +43 -0
  40. package/dist/storage/index.d.ts +1 -0
  41. package/dist/storage/localStorage.d.ts +23 -0
  42. package/package.json +14 -10
  43. package/src/Gui/DialogGui.ts +19 -4
  44. package/src/Gui/GameoverGui.ts +39 -0
  45. package/src/Gui/Gui.ts +23 -1
  46. package/src/Gui/MenuGui.ts +155 -6
  47. package/src/Gui/NotificationGui.ts +1 -2
  48. package/src/Gui/SaveLoadGui.ts +60 -0
  49. package/src/Gui/ShopGui.ts +146 -16
  50. package/src/Gui/TitleGui.ts +39 -0
  51. package/src/Gui/index.ts +15 -2
  52. package/src/Player/BattleManager.ts +91 -49
  53. package/src/Player/ClassManager.ts +118 -50
  54. package/src/Player/ComponentManager.ts +425 -19
  55. package/src/Player/Components.ts +380 -0
  56. package/src/Player/EffectManager.ts +81 -44
  57. package/src/Player/ElementManager.ts +109 -86
  58. package/src/Player/GoldManager.ts +32 -35
  59. package/src/Player/GuiManager.ts +308 -150
  60. package/src/Player/ItemFixture.ts +4 -5
  61. package/src/Player/ItemManager.ts +774 -355
  62. package/src/Player/MoveManager.ts +1544 -774
  63. package/src/Player/ParameterManager.ts +546 -104
  64. package/src/Player/Player.ts +1163 -88
  65. package/src/Player/SkillManager.ts +520 -195
  66. package/src/Player/StateManager.ts +170 -182
  67. package/src/Player/VariableManager.ts +101 -63
  68. package/src/RpgServer.ts +525 -63
  69. package/src/core/context.ts +1 -0
  70. package/src/decorators/event.ts +61 -0
  71. package/src/decorators/map.ts +327 -0
  72. package/src/index.ts +11 -1
  73. package/src/logs/log.ts +10 -3
  74. package/src/module.ts +126 -3
  75. package/src/presets/index.ts +1 -10
  76. package/src/rooms/BaseRoom.ts +232 -0
  77. package/src/rooms/lobby.ts +25 -7
  78. package/src/rooms/map.ts +2502 -194
  79. package/src/services/save.ts +147 -0
  80. package/src/storage/index.ts +1 -0
  81. package/src/storage/localStorage.ts +76 -0
  82. package/tests/battle.spec.ts +375 -0
  83. package/tests/change-map.spec.ts +72 -0
  84. package/tests/class.spec.ts +274 -0
  85. package/tests/effect.spec.ts +219 -0
  86. package/tests/element.spec.ts +221 -0
  87. package/tests/event.spec.ts +80 -0
  88. package/tests/gold.spec.ts +99 -0
  89. package/tests/item.spec.ts +609 -0
  90. package/tests/module.spec.ts +38 -0
  91. package/tests/move.spec.ts +601 -0
  92. package/tests/player-param.spec.ts +28 -0
  93. package/tests/prediction-reconciliation.spec.ts +182 -0
  94. package/tests/random-move.spec.ts +65 -0
  95. package/tests/skill.spec.ts +658 -0
  96. package/tests/state.spec.ts +467 -0
  97. package/tests/variable.spec.ts +185 -0
  98. package/tests/world-maps.spec.ts +896 -0
  99. package/vite.config.ts +16 -0
  100. package/dist/Player/Event.d.ts +0 -0
  101. package/src/Player/Event.ts +0 -0
@@ -1,86 +1,45 @@
1
- import { arrayUniq, RpgCommonPlayer } from "@rpgjs/common";
1
+ import { arrayUniq, PlayerCtor, RpgCommonPlayer } from "@rpgjs/common";
2
2
  import { Constructor } from "@rpgjs/common";
3
3
  import { RpgPlayer } from "./Player";
4
4
 
5
- export function WithElementManager<TBase extends Constructor<RpgCommonPlayer>>(
6
- Base: TBase
7
- ) {
8
- return class extends Base implements IWithElementManager {
5
+ /**
6
+ * Element Manager Mixin
7
+ *
8
+ * Provides elemental management capabilities to any class. This mixin handles
9
+ * elemental resistances, vulnerabilities, and attack elements. It manages both
10
+ * defensive capabilities (elementsDefense) and offensive elements from equipment,
11
+ * as well as player-specific elemental efficiency modifiers.
12
+ *
13
+ * @param Base - The base class to extend with element management
14
+ * @returns Extended class with element management methods
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * class MyPlayer extends WithElementManager(BasePlayer) {
19
+ * constructor() {
20
+ * super();
21
+ * this.elementsEfficiency = [{ rate: 0.5, element: 'fire' }];
22
+ * }
23
+ * }
24
+ *
25
+ * const player = new MyPlayer();
26
+ * const fireResistance = player.elementsDefense.find(e => e.element === 'fire');
27
+ * ```
28
+ */
29
+ export function WithElementManager<TBase extends PlayerCtor>(Base: TBase) {
30
+ return class extends Base {
9
31
  _elementsEfficiency: { rate: number; element: any }[] = [];
10
32
 
11
- /**
12
- * Recovers the player's elements defense on inventory. This list is generated from the `elementsDefense` property defined on the weapons or armors equipped.
13
- * If several items have the same element, only the highest rate will be taken into account.
14
- *
15
- * ```ts
16
- * import { Armor } from '@rpgjs/server'
17
- *
18
- * enum Elements {
19
- * Fire = 'fire'
20
- * }
21
- *
22
- * @Armor({
23
- * name: 'Shield',
24
- * elementsDefense: [{ rate: 1, element: Elements.Fire }]
25
- * })
26
- * class Shield {}
27
- *
28
- * @Armor({
29
- * name: 'FireShield',
30
- * elementsDefense: [{ rate: 0.5, element: Elements.Fire }]
31
- * })
32
- * class FireShield {}
33
- *
34
- * player.addItem(Shield)
35
- * player.addItem(FireShield)
36
- * player.equip(Shield)
37
- * player.equip(FireShield)
38
- *
39
- * console.log(player.elementsDefense) // [{ rate: 1, element: 'fire' }]
40
- * ```
41
- * @title Get Elements Defense
42
- * @prop {Array<{ rate: number, element: Element}>} player.elementsDefense
43
- * @readonly
44
- * @memberof ElementManager
45
- * */
46
33
  get elementsDefense(): { rate: number; element: any }[] {
47
- return this.getFeature("elementsDefense", "element");
34
+ return (this as any).getFeature("elementsDefense", "element");
48
35
  }
49
36
 
50
- /**
51
- * Set or retrieves all the elements where the player is vulnerable or not.
52
- *
53
- * ```ts
54
- * import { Class } from '@rpgjs/server'
55
- *
56
- * enum Elements {
57
- * Fire = 'fire',
58
- * Ice = 'ice'
59
- * }
60
- *
61
- * @Class({
62
- * name: 'Fighter',
63
- * elementsEfficiency: [{ rate: 1, element: Elements.Fire }]
64
- * })
65
- * class Hero {}
66
- *
67
- * player.setClass(Hero)
68
- *
69
- * console.log(player.elementsEfficiency) // [{ rate: 1, element: 'fire' }]
70
- *
71
- * player.elementsEfficiency = [{ rate: 2, element: Elements.Ice }]
72
- *
73
- * console.log(player.elementsEfficiency) // [{ rate: 1, element: 'fire' }, { rate: 2, element: 'ice' }]
74
- * ```
75
- * @title Set/Get Elements Efficiency
76
- * @prop {Array<{ rate: number, element: Element}>} player.elementsEfficiency
77
- * @memberof ElementManager
78
- * */
79
37
  get elementsEfficiency(): { rate: number; element: any }[] {
80
- if (this._class) {
38
+ if (this._class()) {
39
+ const classData = this._class() as any;
81
40
  return <any>[
82
41
  ...this._elementsEfficiency,
83
- ...(this._class()?.elementsEfficiency || []),
42
+ ...(classData?.elementsEfficiency || []),
84
43
  ];
85
44
  }
86
45
  return this._elementsEfficiency;
@@ -90,17 +49,6 @@ export function WithElementManager<TBase extends Constructor<RpgCommonPlayer>>(
90
49
  this._elementsEfficiency = val;
91
50
  }
92
51
 
93
- /**
94
- * Retrieves a array of elements assigned to the player and the elements of the weapons / armor equipped
95
- *
96
- * ```ts
97
- * console.log(player.elements)
98
- * ```
99
- * @title Get Elements
100
- * @prop {Array<Element>} player.elements
101
- * @readonly
102
- * @memberof ElementManager
103
- * */
104
52
  get elements(): {
105
53
  rate: number;
106
54
  element: string;
@@ -115,7 +63,7 @@ export function WithElementManager<TBase extends Constructor<RpgCommonPlayer>>(
115
63
  }
116
64
 
117
65
  coefficientElements(otherPlayer: RpgPlayer): number {
118
- const atkPlayerElements: any = otherPlayer.elements;
66
+ const atkPlayerElements: any = (otherPlayer as any).elements;
119
67
  const playerElements: any = this.elementsEfficiency;
120
68
  let coefficient = 1;
121
69
 
@@ -127,7 +75,7 @@ export function WithElementManager<TBase extends Constructor<RpgCommonPlayer>>(
127
75
  (el) => el.element == atkElement.element
128
76
  );
129
77
  if (!elementPlayer) continue;
130
- const fn = this.getFormulas("coefficientElements");
78
+ const fn = (this as any).getFormulas("coefficientElements");
131
79
  if (!fn) {
132
80
  return coefficient;
133
81
  }
@@ -139,5 +87,80 @@ export function WithElementManager<TBase extends Constructor<RpgCommonPlayer>>(
139
87
  }
140
88
  return coefficient;
141
89
  }
142
- };
90
+ } as unknown as TBase;
143
91
  }
92
+
93
+ /**
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.
98
+ */
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
+ }
@@ -1,44 +1,41 @@
1
- import { type Constructor } from "@rpgjs/common";
2
- import { RpgCommonPlayer } from "@rpgjs/common";
1
+ import { PlayerCtor } from "@rpgjs/common";
3
2
 
4
- /**
5
- * Interface defining what MoveManager adds to a class
6
- */
7
- export interface IGoldManager {
8
-
3
+ export interface GoldManager {
4
+ /**
5
+ * You can change the game money
6
+ *
7
+ * ```ts
8
+ * player.gold += 100
9
+ * ```
10
+ *
11
+ * @title Change Gold
12
+ * @prop {number} player.gold
13
+ * @default 0
14
+ * @memberof GoldManager
15
+ * */
16
+ gold: number;
9
17
  }
10
18
 
11
- /**
12
- * Move Manager mixin
13
- *
14
- * Adds methods to manage player gold
15
- *
16
- * @param Base - The base class to extend
17
- * @returns A new class with gold management capabilities
18
- */
19
- export function WithGoldManager<TBase extends Constructor<RpgCommonPlayer>>(Base: TBase) {
20
- return class extends Base implements IGoldManager {
21
- /**
22
- * You can change the game money
23
- *
24
- * ```ts
25
- * player.gold += 100
26
- * ```
27
- *
28
- * @title Change Gold
29
- * @prop {number} player.gold
30
- * @default 0
31
- * @memberof GoldManager
32
- * */
19
+ export function WithGoldManager<TBase extends PlayerCtor>(
20
+ Base: TBase
21
+ ): new (...args: ConstructorParameters<TBase>) => InstanceType<TBase> &
22
+ GoldManager {
23
+ return class extends Base {
33
24
  set gold(val: number) {
34
- if (val < 0) {
35
- val = 0
36
- }
37
- this._gold.set(val)
25
+ if (val < 0) {
26
+ val = 0;
27
+ }
28
+ this._gold.set(val);
38
29
  }
39
30
 
40
31
  get gold(): number {
41
- return this._gold()
32
+ return this._gold();
42
33
  }
43
- };
34
+ } as unknown as any;
44
35
  }
36
+
37
+ /**
38
+ * Type helper to extract the interface from the WithGoldManager mixin
39
+ * This provides the type without duplicating method signatures
40
+ */
41
+ export type IGoldManager = InstanceType<ReturnType<typeof WithGoldManager>>;