labag 2.4.3 → 2.5.0

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.
package/dist/labag.d.ts CHANGED
@@ -20,7 +20,7 @@ export declare class LaBaG {
20
20
  /** 當前轉出的圖案組合 */
21
21
  patterns: [Pattern | null, Pattern | null, Pattern | null];
22
22
  /** 遊戲模式列表 */
23
- modes: Mode[];
23
+ modes: Mode<any>[];
24
24
  /** 事件監聽器列表 */
25
25
  eventListeners: Record<LaBaGEvent, ((game: LaBaG) => void)[]>;
26
26
  /**
@@ -49,7 +49,7 @@ export declare class LaBaG {
49
49
  * 新增遊戲模式。
50
50
  * @param mode - 要新增的模式。
51
51
  */
52
- addMode(mode: Mode): void;
52
+ addMode(mode: Mode<any>): void;
53
53
  /**
54
54
  * 檢查遊戲是否正在進行中(未達次數上限)。
55
55
  * @returns 如果遊戲仍在進行中則返回 true,否則返回 false。
@@ -59,7 +59,7 @@ export declare class LaBaG {
59
59
  * 取得目前遊戲的相關設定
60
60
  */
61
61
  getCurrentConfig(): {
62
- modes: Mode[];
62
+ modes: Mode<any>[];
63
63
  ranges: {
64
64
  threshold: number;
65
65
  pattern: Pattern;
package/dist/labag.js CHANGED
@@ -52,7 +52,10 @@ class LaBaG {
52
52
  * @param event - 要觸發的事件名稱。
53
53
  */
54
54
  emit(event) {
55
- [...this.eventListeners[event]].forEach((fn) => fn(this));
55
+ const listeners = this.eventListeners[event];
56
+ for (let i = 0; i < listeners.length; i++) {
57
+ listeners[i](this);
58
+ }
56
59
  }
57
60
  /**
58
61
  * 新增事件監聽器。
@@ -110,11 +113,12 @@ class LaBaG {
110
113
  kachu: 0,
111
114
  rrr: 0,
112
115
  };
113
- activeModes.forEach((mode) => {
114
- Object.entries(mode.rates).forEach(([patternName, rate]) => {
115
- combinedRates[patternName] += rate;
116
- });
117
- });
116
+ for (let i = 0; i < activeModes.length; i++) {
117
+ const mode = activeModes[i];
118
+ for (const patternName in mode.rates) {
119
+ combinedRates[patternName] += mode.rates[patternName];
120
+ }
121
+ }
118
122
  // 預先計算合併後的區間
119
123
  const ranges = [];
120
124
  let acc = 0;
@@ -154,22 +158,19 @@ class LaBaG {
154
158
  rollSlots() {
155
159
  const { ranges } = this.getCurrentConfig();
156
160
  const rangesAcc = ranges.length > 0 ? ranges[ranges.length - 1].threshold : 0;
157
- // 產生 3 個隨機數字
158
- this.randNums = [
159
- (0, randInt_1.randInt)(1, rangesAcc),
160
- (0, randInt_1.randInt)(1, rangesAcc),
161
- (0, randInt_1.randInt)(1, rangesAcc),
162
- ];
163
- this.randNums.forEach((num, index) => {
164
- // 根據預先計算的區間找到對應的圖案
165
- const match = ranges.find((r) => num <= r.threshold);
166
- if (match) {
167
- this.patterns[index] = match.pattern;
161
+ // 產生 3 個隨機數字並直接尋找對應圖案
162
+ for (let i = 0; i < 3; i++) {
163
+ const num = (0, randInt_1.randInt)(1, rangesAcc);
164
+ this.randNums[i] = num;
165
+ let matchedPattern = null;
166
+ for (let j = 0; j < ranges.length; j++) {
167
+ if (num <= ranges[j].threshold) {
168
+ matchedPattern = ranges[j].pattern;
169
+ break;
170
+ }
168
171
  }
169
- else {
170
- this.patterns[index] = null;
171
- }
172
- });
172
+ this.patterns[i] = matchedPattern;
173
+ }
173
174
  this.emit("rollSlots");
174
175
  }
175
176
  /**
package/dist/mode.d.ts CHANGED
@@ -1,9 +1,16 @@
1
1
  import { LaBaG } from "./labag";
2
2
  import { LaBaGEvent, Pattern, PatternName } from "./types";
3
+ interface ModeConfig<VariableType extends Record<string, any>> {
4
+ active: boolean;
5
+ name: string;
6
+ rates: Record<PatternName, number>;
7
+ eventListener?: Partial<Record<LaBaGEvent, (game: LaBaG, mode: Mode<VariableType>) => void>>;
8
+ variable?: VariableType;
9
+ }
3
10
  /**
4
11
  * 代表遊戲的一種模式,包含機率設定和事件監聽器。
5
12
  */
6
- export declare class Mode {
13
+ export declare class Mode<VariableType extends Record<string, any> = Record<string, any>> implements ModeConfig<VariableType> {
7
14
  /** 模式是否啟用 */
8
15
  active: boolean;
9
16
  /** 模式名稱 */
@@ -15,9 +22,9 @@ export declare class Mode {
15
22
  pattern: Pattern;
16
23
  }[];
17
24
  /** 事件監聽器 */
18
- eventListener: Partial<Record<LaBaGEvent, (game: LaBaG, mode: Mode) => void>>;
25
+ eventListener: Partial<Record<LaBaGEvent, (game: LaBaG, mode: Mode<VariableType>) => void>>;
19
26
  /** 模式專屬的變數儲存空間 */
20
- variable: Record<string, any>;
27
+ variable: VariableType;
21
28
  /** 機率總和 */
22
29
  /**
23
30
  * 建立一個新的模式。
@@ -26,5 +33,6 @@ export declare class Mode {
26
33
  * @param rates - 各圖案的機率設定。
27
34
  * @param eventListener - 事件監聽器。
28
35
  */
29
- constructor(active: boolean, name: string, rates: Record<PatternName, number>, eventListener?: Partial<Record<LaBaGEvent, (game: LaBaG, mode: Mode) => void>>, variable?: Record<string, any>);
36
+ constructor(active: boolean, name: string, rates: Record<PatternName, number>, eventListener?: Partial<Record<LaBaGEvent, (game: LaBaG, mode: Mode<VariableType>) => void>>, variable?: VariableType);
30
37
  }
38
+ export {};
@@ -1,3 +1,20 @@
1
1
  import { Mode } from "../mode";
2
- declare const _default: Mode;
2
+ declare const _default: Mode<{
3
+ times: number;
4
+ rate: number;
5
+ randNum: number;
6
+ count: number;
7
+ pattern: {
8
+ name: string;
9
+ scores: number[];
10
+ };
11
+ extendTimes: number;
12
+ bindPattern: {
13
+ readonly name: "gss";
14
+ readonly scores: [800, 400, 180];
15
+ };
16
+ bonusTimes: number;
17
+ requiredBindPatternCount: number;
18
+ mutiplier: number;
19
+ }>;
3
20
  export default _default;
@@ -1,8 +1,94 @@
1
1
  export declare const modes: {
2
- pikachu: import("..").Mode;
3
- superhhh: import("..").Mode;
4
- greenwei: import("..").Mode;
5
- normal: import("..").Mode;
2
+ pikachu: import("..").Mode<{
3
+ times: number;
4
+ pattern: {
5
+ name: string;
6
+ scores: number[];
7
+ };
8
+ bindPattern: {
9
+ readonly name: "kachu";
10
+ readonly scores: [12000, 8000, 1250];
11
+ };
12
+ bonusRounds: number;
13
+ }>;
14
+ superhhh: import("..").Mode<{
15
+ times: number;
16
+ rate: number;
17
+ score: number;
18
+ randNum: number;
19
+ bindPattern: {
20
+ readonly name: "hhh";
21
+ readonly scores: [1500, 800, 300];
22
+ };
23
+ bonusTimes: number;
24
+ pattern: {
25
+ name: string;
26
+ scores: number[];
27
+ };
28
+ extendTimes: number;
29
+ }>;
30
+ greenwei: import("..").Mode<{
31
+ times: number;
32
+ rate: number;
33
+ randNum: number;
34
+ count: number;
35
+ pattern: {
36
+ name: string;
37
+ scores: number[];
38
+ };
39
+ extendTimes: number;
40
+ bindPattern: {
41
+ readonly name: "gss";
42
+ readonly scores: [800, 400, 180];
43
+ };
44
+ bonusTimes: number;
45
+ requiredBindPatternCount: number;
46
+ mutiplier: number;
47
+ }>;
48
+ normal: import("..").Mode<Record<string, any>>;
6
49
  };
7
50
  export type ModeName = keyof typeof modes;
8
- export declare const modeList: import("..").Mode[];
51
+ export declare const modeList: (import("..").Mode<{
52
+ times: number;
53
+ rate: number;
54
+ randNum: number;
55
+ count: number;
56
+ pattern: {
57
+ name: string;
58
+ scores: number[];
59
+ };
60
+ extendTimes: number;
61
+ bindPattern: {
62
+ readonly name: "gss";
63
+ readonly scores: [800, 400, 180];
64
+ };
65
+ bonusTimes: number;
66
+ requiredBindPatternCount: number;
67
+ mutiplier: number;
68
+ }> | import("..").Mode<Record<string, any>> | import("..").Mode<{
69
+ times: number;
70
+ pattern: {
71
+ name: string;
72
+ scores: number[];
73
+ };
74
+ bindPattern: {
75
+ readonly name: "kachu";
76
+ readonly scores: [12000, 8000, 1250];
77
+ };
78
+ bonusRounds: number;
79
+ }> | import("..").Mode<{
80
+ times: number;
81
+ rate: number;
82
+ score: number;
83
+ randNum: number;
84
+ bindPattern: {
85
+ readonly name: "hhh";
86
+ readonly scores: [1500, 800, 300];
87
+ };
88
+ bonusTimes: number;
89
+ pattern: {
90
+ name: string;
91
+ scores: number[];
92
+ };
93
+ extendTimes: number;
94
+ }>)[];
@@ -1,3 +1,3 @@
1
1
  import { Mode } from "../mode";
2
- declare const _default: Mode;
2
+ declare const _default: Mode<Record<string, any>>;
3
3
  export default _default;
@@ -1,3 +1,14 @@
1
1
  import { Mode } from "../mode";
2
- declare const _default: Mode;
2
+ declare const _default: Mode<{
3
+ times: number;
4
+ pattern: {
5
+ name: string;
6
+ scores: number[];
7
+ };
8
+ bindPattern: {
9
+ readonly name: "kachu";
10
+ readonly scores: [12000, 8000, 1250];
11
+ };
12
+ bonusRounds: number;
13
+ }>;
3
14
  export default _default;
@@ -1,3 +1,18 @@
1
1
  import { Mode } from "../mode";
2
- declare const _default: Mode;
2
+ declare const _default: Mode<{
3
+ times: number;
4
+ rate: number;
5
+ score: number;
6
+ randNum: number;
7
+ bindPattern: {
8
+ readonly name: "hhh";
9
+ readonly scores: [1500, 800, 300];
10
+ };
11
+ bonusTimes: number;
12
+ pattern: {
13
+ name: string;
14
+ scores: number[];
15
+ };
16
+ extendTimes: number;
17
+ }>;
3
18
  export default _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "labag",
3
- "version": "2.4.3",
3
+ "version": "2.5.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/labag.ts CHANGED
@@ -23,7 +23,7 @@ export class LaBaG {
23
23
  /** 當前轉出的圖案組合 */
24
24
  patterns: [Pattern | null, Pattern | null, Pattern | null];
25
25
  /** 遊戲模式列表 */
26
- modes: Mode[];
26
+ modes: Mode<any>[];
27
27
  /** 事件監聽器列表 */
28
28
  eventListeners: Record<LaBaGEvent, ((game: LaBaG) => void)[]>;
29
29
 
@@ -55,7 +55,10 @@ export class LaBaG {
55
55
  * @param event - 要觸發的事件名稱。
56
56
  */
57
57
  private emit(event: LaBaGEvent) {
58
- [...this.eventListeners[event]].forEach((fn) => fn(this));
58
+ const listeners = this.eventListeners[event];
59
+ for (let i = 0; i < listeners.length; i++) {
60
+ listeners[i](this);
61
+ }
59
62
  }
60
63
 
61
64
  /**
@@ -83,7 +86,7 @@ export class LaBaG {
83
86
  * 新增遊戲模式。
84
87
  * @param mode - 要新增的模式。
85
88
  */
86
- addMode(mode: Mode) {
89
+ addMode(mode: Mode<any>) {
87
90
  this.modes.push(mode);
88
91
  // 註冊特定模式的監聽器
89
92
  Object.entries(mode.eventListener).forEach(([event, listener]) => {
@@ -120,11 +123,12 @@ export class LaBaG {
120
123
  kachu: 0,
121
124
  rrr: 0,
122
125
  };
123
- activeModes.forEach((mode) => {
124
- Object.entries(mode.rates).forEach(([patternName, rate]) => {
125
- combinedRates[patternName as PatternName] += rate;
126
- });
127
- });
126
+ for (let i = 0; i < activeModes.length; i++) {
127
+ const mode = activeModes[i];
128
+ for (const patternName in mode.rates) {
129
+ combinedRates[patternName as PatternName] += mode.rates[patternName as PatternName];
130
+ }
131
+ }
128
132
 
129
133
  // 預先計算合併後的區間
130
134
  const ranges: { threshold: number; pattern: Pattern }[] = [];
@@ -170,22 +174,21 @@ export class LaBaG {
170
174
  const { ranges } = this.getCurrentConfig();
171
175
  const rangesAcc =
172
176
  ranges.length > 0 ? ranges[ranges.length - 1].threshold : 0;
173
- // 產生 3 個隨機數字
174
- this.randNums = [
175
- randInt(1, rangesAcc),
176
- randInt(1, rangesAcc),
177
- randInt(1, rangesAcc),
178
- ];
179
-
180
- this.randNums.forEach((num, index) => {
181
- // 根據預先計算的區間找到對應的圖案
182
- const match = ranges.find((r) => num <= r.threshold);
183
- if (match) {
184
- this.patterns[index] = match.pattern;
185
- } else {
186
- this.patterns[index] = null;
177
+
178
+ // 產生 3 個隨機數字並直接尋找對應圖案
179
+ for (let i = 0; i < 3; i++) {
180
+ const num = randInt(1, rangesAcc);
181
+ this.randNums[i] = num;
182
+
183
+ let matchedPattern: Pattern | null = null;
184
+ for (let j = 0; j < ranges.length; j++) {
185
+ if (num <= ranges[j].threshold) {
186
+ matchedPattern = ranges[j].pattern;
187
+ break;
188
+ }
187
189
  }
188
- });
190
+ this.patterns[i] = matchedPattern;
191
+ }
189
192
 
190
193
  this.emit("rollSlots");
191
194
  }
package/src/mode.ts CHANGED
@@ -1,11 +1,22 @@
1
1
  import { LaBaG } from "./labag";
2
2
  import { patterns } from "./pattern";
3
3
  import { LaBaGEvent, Pattern, PatternName } from "./types";
4
+ interface ModeConfig<VariableType extends Record<string, any>> {
5
+ active: boolean;
6
+ name: string;
7
+ rates: Record<PatternName, number>;
8
+ eventListener?: Partial<
9
+ Record<LaBaGEvent, (game: LaBaG, mode: Mode<VariableType>) => void>
10
+ >;
11
+ variable?: VariableType;
12
+ }
4
13
 
5
14
  /**
6
15
  * 代表遊戲的一種模式,包含機率設定和事件監聽器。
7
16
  */
8
- export class Mode{
17
+ export class Mode<
18
+ VariableType extends Record<string, any> = Record<string, any>,
19
+ > implements ModeConfig<VariableType> {
9
20
  /** 模式是否啟用 */
10
21
  active: boolean;
11
22
  /** 模式名稱 */
@@ -16,11 +27,11 @@ export class Mode{
16
27
  ranges: { threshold: number; pattern: Pattern }[];
17
28
  /** 事件監聽器 */
18
29
  eventListener: Partial<
19
- Record<LaBaGEvent, (game: LaBaG, mode: Mode) => void>
30
+ Record<LaBaGEvent, (game: LaBaG, mode: Mode<VariableType>) => void>
20
31
  >;
21
32
 
22
33
  /** 模式專屬的變數儲存空間 */
23
- variable: Record<string, any>;
34
+ variable: VariableType;
24
35
  /** 機率總和 */
25
36
 
26
37
  /**
@@ -35,15 +46,15 @@ export class Mode{
35
46
  name: string,
36
47
  rates: Record<PatternName, number>,
37
48
  eventListener?: Partial<
38
- Record<LaBaGEvent, (game: LaBaG, mode: Mode) => void>
49
+ Record<LaBaGEvent, (game: LaBaG, mode: Mode<VariableType>) => void>
39
50
  >,
40
- variable?: Record<string, any>
51
+ variable?: VariableType,
41
52
  ) {
42
53
  this.active = active;
43
54
  this.name = name;
44
55
  this.rates = rates;
45
56
  this.eventListener = eventListener ?? {};
46
- this.variable = variable ?? {};
57
+ this.variable = variable ?? ({} as VariableType);
47
58
 
48
59
  // 預先計算機率區間
49
60
  this.ranges = [];