pixi-rainman-game-engine 0.1.23 → 0.1.25

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.
@@ -59,18 +59,17 @@
59
59
 
60
60
  .autoplay-settings__stop-limits {
61
61
  display: flex;
62
- flex-direction: row;
62
+ justify-content: center;
63
63
  width: 100%;
64
64
  height: 50px;
65
- justify-content: center;
66
65
  }
67
66
 
68
67
  .autoplay-settings__limit {
69
- width: 40px;
70
- border: solid 2px white;
71
68
  display: flex;
72
69
  align-items: center;
73
70
  justify-content: center;
71
+ width: 40px;
72
+ border: solid 2px white;
74
73
  font-size: 20px;
75
74
  font-weight: bolder;
76
75
  margin: 0px 5px;
@@ -95,10 +94,14 @@
95
94
  }
96
95
 
97
96
  .left {
97
+ background-color: #00000000;
98
+ text-align: center;
98
99
  border-radius: 34px 0px 0px 34px;
99
100
  }
100
101
 
101
102
  .right {
103
+ background-color: #00000000;
104
+ text-align: center;
102
105
  border-radius: 0px 34px 34px 0px;
103
106
  }
104
107
 
@@ -109,6 +112,7 @@
109
112
  }
110
113
 
111
114
  .circle {
115
+ background-color: #00000000;
112
116
  border-radius: 34px;
113
117
  font-size: 40px;
114
118
  }
@@ -164,10 +168,6 @@
164
168
  width: 90%;
165
169
  }
166
170
 
167
- .autoplay-settings__column {
168
- flex-direction: column-reverse;
169
- }
170
-
171
171
  .autoplay-settings__switches {
172
172
  width: 100%;
173
173
  flex-direction: column;
@@ -179,46 +179,66 @@
179
179
  margin: 5px 0px;
180
180
  }
181
181
 
182
- .left {
183
- width: 40px;
184
- border-radius: 34px 0px 0px 34px;
182
+ .autoplay-settings__limit {
183
+ align-items: center;
184
+ justify-content: center;
185
+ text-align: center;
186
+ margin: 0px;
187
+ padding: 0px;
185
188
  }
186
189
 
187
190
  .right {
188
- width: 40px;
191
+ width: 34px;
192
+ height: 34px;
193
+ font-size: 12px;
194
+ background-color: #00000000;
189
195
  border-radius: 0px 34px 34px 0px;
190
196
  }
191
197
 
192
198
  .middle {
193
- width: 70px;
199
+ width: 34px;
200
+ height: 34px;
194
201
  font-size: 12px;
202
+ background-color: #00000000;
195
203
  border-radius: 0px 0px 0px 0px;
196
204
  }
197
205
 
206
+ .left {
207
+ width: 34px;
208
+ height: 34px;
209
+ background-color: #00000000;
210
+ font-size: 12px;
211
+ border-radius: 34px 0px 0px 34px;
212
+ }
213
+
198
214
  .circle {
199
215
  border-radius: 34px;
200
- font-size: 40px;
201
- width: 30px;
216
+ width: 34px;
217
+ height: 34px;
218
+ font-size: 20px;
219
+ background-color: #00000000;
202
220
  }
203
221
 
204
222
  .autoplay-settings__stop-limits {
205
- height: 35px;
223
+ width: 100%;
224
+ flex-wrap: wrap;
225
+ height: fit-content;
226
+ overflow: hidden;
206
227
  }
207
228
 
208
229
  .autoplay-settings__limit.circle p {
209
230
  position: relative;
210
- top: -4px;
211
- font-size: 20px;
212
231
  }
213
232
 
214
233
  .autoplay-settings__limit.left p {
215
234
  position: relative;
216
- top: -2px;
235
+ text-align: center;
217
236
  }
218
237
 
219
238
  .autoplay-settings__limit.right p {
220
239
  position: relative;
221
- top: -2px;
240
+ text-align: center;
241
+ margin: 0px;
222
242
  }
223
243
 
224
244
  .autoplay-settings__confirmation {
@@ -230,36 +250,6 @@
230
250
  margin-top: 0px;
231
251
  }
232
252
 
233
- .left {
234
- border-radius: 34px 0px 0px 34px;
235
- }
236
-
237
- .right {
238
- border-radius: 0px 34px 34px 0px;
239
- }
240
-
241
- .middle {
242
- width: 60px;
243
- border-radius: 0px 0px 0px 0px;
244
- }
245
-
246
- .circle {
247
- border-radius: 34px;
248
- font-size: 40px;
249
- }
250
-
251
- .autoplay-settings__limit.circle p {
252
- top: -2px;
253
- }
254
-
255
- .autoplay-settings__limit.left p {
256
- top: -2px;
257
- }
258
-
259
- .autoplay-settings__limit.right p {
260
- top: -2px;
261
- }
262
-
263
253
  .autoplay-settings__exit {
264
254
  right: -10px;
265
255
  top: 10px;
@@ -56,7 +56,7 @@ export const AutoplaySettings = observer(() => {
56
56
  <h2>{i18next.t("autoPlay")}</h2>
57
57
  </div>
58
58
  <div className="autoplay-settings__stop-limits">
59
- <div className={`autoplay-settings__limit left ${infinitySpinsEnabled ? "autoplay-settings__limit--infinity" : ""}`} onClick={() => {
59
+ <button className={`autoplay-settings__limit left ${infinitySpinsEnabled ? "autoplay-settings__limit--infinity" : ""}`} onClick={() => {
60
60
  let indexOfSelectedSpinsLimit = availableAutoSpinLimits.findIndex((limitCount) => limitCount === howManyAutoSpinsLeft);
61
61
  indexOfSelectedSpinsLimit -= 1;
62
62
  if (indexOfSelectedSpinsLimit === -1) {
@@ -65,13 +65,11 @@ export const AutoplaySettings = observer(() => {
65
65
  updateLimitsBounds(availableAutoSpinLimits[indexOfSelectedSpinsLimit]);
66
66
  }}>
67
67
  <p>-</p>
68
- </div>
69
- {limit_numbers.map((limiter, index) => {
70
- return (<button key={`${limiter}${index}`} value={limiter} className={`autoplay-settings__limit ${limiter === howManyAutoSpinsLeft ? "autoplay-settings__limit--active" : ""} middle ${infinitySpinsEnabled ? "autoplay-settings__limit--infinity" : ""}`} onClick={(event) => updateLimitsBounds(Number(event.currentTarget.value))}>
71
- <p>{limiter}</p>
72
- </button>);
73
- })}
74
- <div className={`autoplay-settings__limit right ${infinitySpinsEnabled ? "autoplay-settings__limit--infinity" : ""}`} onClick={() => {
68
+ </button>
69
+ {limit_numbers.map((limiter, index) => (<button key={`${limiter}${index}`} value={limiter} className={`autoplay-settings__limit ${limiter === howManyAutoSpinsLeft ? "autoplay-settings__limit--active" : ""} middle ${infinitySpinsEnabled ? "autoplay-settings__limit--infinity" : ""}`} disabled={settingStore.infinitySpinsEnabled} onClick={(event) => updateLimitsBounds(Number(event.currentTarget.value))}>
70
+ <p>{limiter}</p>
71
+ </button>))}
72
+ <button className={`autoplay-settings__limit right ${infinitySpinsEnabled ? "autoplay-settings__limit--infinity" : ""}`} onClick={() => {
75
73
  let indexOfSelectedSpinsLimit = availableAutoSpinLimits.findIndex((limitCount) => limitCount === howManyAutoSpinsLeft);
76
74
  indexOfSelectedSpinsLimit += 1;
77
75
  if (indexOfSelectedSpinsLimit === availableAutoSpinLimits.length) {
@@ -81,12 +79,11 @@ export const AutoplaySettings = observer(() => {
81
79
  updateLimitsBounds(newAutoSpinsLimitNumber);
82
80
  }}>
83
81
  <p>+</p>
84
- </div>
85
- <div className={`autoplay-settings__limit circle ${infinitySpinsEnabled ? "autoplay-settings__limit--active" : ""}`} onClick={() => flipInfinitySpinsFlag()}>
82
+ </button>
83
+ <button className={`autoplay-settings__limit circle ${infinitySpinsEnabled ? "autoplay-settings__limit--active" : ""}`} onClick={() => flipInfinitySpinsFlag()}>
86
84
  <p>∞</p>
87
- </div>
85
+ </button>
88
86
  </div>
89
-
90
87
  <div className="autoplay-settings__title">
91
88
  <h2>{i18next.t("stopAutoPlay")}</h2>
92
89
  </div>
@@ -106,16 +103,16 @@ export const AutoplaySettings = observer(() => {
106
103
  </div>
107
104
 
108
105
  <div className="autoplay-settings__confirmation">
109
- <div className="autoplay-settings__confirmation-button" onClick={() => {
106
+ <button className="autoplay-settings__confirmation-button" onClick={() => {
110
107
  resetAutoplaySettings();
111
108
  updateLimitsBounds(initialAutoSpinCount);
112
109
  settingStore.handleModalInvocation?.(UI_ITEMS.autoplay);
113
110
  }}>
114
111
  <p>{i18next.t("cancel")}</p>
115
- </div>
116
- <div id={COMPONENTS.autoSpinConfirm} className="autoplay-settings__confirmation-button" onClick={() => settingStore.handleModalInvocation?.(UI_ITEMS.autoplay)}>
112
+ </button>
113
+ <button id={COMPONENTS.autoSpinConfirm} className="autoplay-settings__confirmation-button">
117
114
  <p>{i18next.t("confirm")}</p>
118
- </div>
115
+ </button>
119
116
  </div>
120
117
  </div>);
121
118
  });
@@ -5,16 +5,24 @@ import React from "react";
5
5
  import { useStores } from "../../hooks";
6
6
  export const BetControls = observer(() => {
7
7
  const { settingStore } = useStores();
8
+ const onClick = (type) => {
9
+ if (type === "increase") {
10
+ settingStore.increaseBet?.();
11
+ }
12
+ else {
13
+ settingStore.decreaseBet?.();
14
+ }
15
+ };
8
16
  return (<div className="bet-container">
9
17
  <h2>{i18next.t("totalBet")}</h2>
10
18
  <div className="bet-container__controls">
11
- <button name="bet-minus" className="bet-container__button">
19
+ <button name="bet-minus" className="bet-container__button" onClick={() => onClick("decrease")}>
12
20
  -
13
21
  </button>
14
22
  <div className="bet-container__value">
15
23
  <p>{settingStore.betText}</p>
16
24
  </div>
17
- <button name="bet-plus" className="bet-container__button">
25
+ <button name="bet-plus" className="bet-container__button" onClick={() => onClick("increase")}>
18
26
  +
19
27
  </button>
20
28
  </div>
@@ -47,7 +47,7 @@
47
47
  flex-direction: row;
48
48
  }
49
49
 
50
- .bet-container__button:hover {
50
+ .bet-container__button:active {
51
51
  background-color: #fdf42550;
52
52
  color: #fdf425;
53
53
  border: 2px solid #fdf425;
@@ -14,7 +14,8 @@
14
14
 
15
15
  @media only screen and (max-width: 900px) {
16
16
  .close-modal-button {
17
- right: 20px;
18
- top: 10px;
17
+ right: 10px;
18
+ top: -5px;
19
+ padding: 0;
19
20
  }
20
21
  }
@@ -1,10 +1,14 @@
1
1
  import "./closeModalButton.css";
2
2
  import React from "react";
3
+ import { UI_ITEMS } from "../../../utils";
3
4
  import { useStores } from "../../hooks";
4
5
  export const CloseModalButton = ({ layerId, afterClose }) => {
5
6
  const { settingStore } = useStores();
6
7
  const onClose = () => {
7
8
  settingStore.handleModalInvocation?.(layerId);
9
+ if (layerId === UI_ITEMS.speedSettings) {
10
+ settingStore.setSpeedPopupVisibility?.("none");
11
+ }
8
12
  afterClose?.();
9
13
  };
10
14
  return (<button className="close-modal-button" onClick={onClose}>
@@ -131,6 +131,15 @@ body {
131
131
  background: rgba(173, 216, 230, 0.5);
132
132
  }
133
133
 
134
+ .ios-nonInteractive {
135
+ pointer-events: none;
136
+ opacity: 0 !important;
137
+ }
138
+ .ios-interactive {
139
+ pointer-events: auto;
140
+ opacity: 1 !important;
141
+ }
142
+
134
143
  .ios-scroller-animation {
135
144
  position: fixed;
136
145
  width: 100%;
@@ -152,3 +161,9 @@ html.is-locked .ios-scroller-animation {
152
161
  opacity: 0;
153
162
  z-index: -9999;
154
163
  }
164
+
165
+ @media (orientation: landscape) {
166
+ .modal-style {
167
+ overflow-y: auto;
168
+ }
169
+ }
@@ -29,6 +29,7 @@ export class ButtonsEventManager {
29
29
  disableButtons = this.setButtonAvailability(true);
30
30
  constructor() {
31
31
  RainMan.settingsStore.handleModalInvocation = this.handleModalInvocation.bind(this);
32
+ RainMan.settingsStore.setSpeedPopupVisibility = this.setSpeedPopupVisibility.bind(this);
32
33
  }
33
34
  /**
34
35
  * Method for initializing events in Settings UI
@@ -245,6 +246,7 @@ export class ButtonsEventManager {
245
246
  const confirmAutoplayButton = window.document.getElementById(COMPONENTS.autoSpinConfirm);
246
247
  if (confirmAutoplayButton !== null) {
247
248
  confirmAutoplayButton.addEventListener("click", () => {
249
+ RainMan.settingsStore.handleModalInvocation?.(UI_ITEMS.autoplay);
248
250
  confirmAutoplayButtonCallback();
249
251
  });
250
252
  }
@@ -284,23 +286,16 @@ export class ButtonsEventManager {
284
286
  * @param {string} layerName
285
287
  */
286
288
  handleModalInvocation(layerName) {
287
- const alreadyInvokedLayer = this.getInvokedSettingItem();
288
- if (alreadyInvokedLayer !== null) {
289
- if (alreadyInvokedLayer.style.display === "flex") {
290
- alreadyInvokedLayer.style.display = "none";
291
- this.enableButtons();
292
- }
293
- }
294
- else {
295
- this.lastLayerInvoked = "";
296
- }
297
289
  const layer = window.document.getElementById(layerName);
298
290
  if (layer !== null) {
299
- if (layer.style.display !== "flex" && this.lastLayerInvoked !== layerName) {
300
- this.lastLayerInvoked = layerName;
291
+ if (layer.style.display !== "flex") {
301
292
  layer.style.display = "flex";
302
293
  this.disableButtons();
303
294
  }
295
+ else {
296
+ layer.style.display = "none";
297
+ this.enableButtons();
298
+ }
304
299
  }
305
300
  }
306
301
  }
@@ -25,7 +25,6 @@ export class AnimatedBackground extends ResumableContainer {
25
25
  this.mobileSpineName = mobileSpineName;
26
26
  this.name = AnimatedBackground.registryName;
27
27
  this.parentLayer = BackgroundLayer;
28
- RainMan.settingsStore.containersWithSpines.push(this);
29
28
  }
30
29
  resize() {
31
30
  this.changeSpineForOrientation();
@@ -70,7 +70,7 @@ export class ConnectionWrapper {
70
70
  landscape: true,
71
71
  matched_ratio: "16:9",
72
72
  },
73
- locale: i18next.language,
73
+ language_code: i18next.language,
74
74
  vendor_id: RainMan.config.gameInitVendorId,
75
75
  }));
76
76
  RainMan.globals.currency = Currencies[this._initData.currency];
@@ -26,7 +26,7 @@ export type InitServerRequest = BaseServerRequest & {
26
26
  landscape: boolean;
27
27
  matched_ratio: string;
28
28
  };
29
- locale: string;
29
+ language_code: string;
30
30
  };
31
31
  export type SpinServerRequest = BaseServerRequest & {
32
32
  action: "spin";
@@ -6,6 +6,7 @@ export interface InitDataInterface {
6
6
  token: string;
7
7
  bets: Array<number>;
8
8
  currency: string;
9
+ language: string;
9
10
  symbols_names: Array<string>;
10
11
  symbols: Array<number>;
11
12
  streaks: Array<Array<Point>>;
@@ -53,7 +53,10 @@ export type RouletteWin = BaseWin & {
53
53
  export type JackpotWin = BaseWin & {
54
54
  type: typeof PossibleWins.jackpotMini | typeof PossibleWins.jackpotMinor | typeof PossibleWins.jackpotMajor | typeof PossibleWins.jackpotGrand;
55
55
  };
56
- export type Win = StreakWin | FreeSpinWin | GambleWin | MysteryWin | EggWin | GoldWin | BigWin | BonusWin | SuperBonusWin | ScatterWin | RouletteWin | JackpotWin;
56
+ export type CoinWin = BaseWin & {
57
+ type: typeof PossibleWins.coin;
58
+ };
59
+ export type Win = StreakWin | FreeSpinWin | GambleWin | MysteryWin | EggWin | GoldWin | BigWin | BonusWin | SuperBonusWin | ScatterWin | RouletteWin | JackpotWin | CoinWin;
57
60
  /**
58
61
  * Type represents data that come from backend
59
62
  *
@@ -36,6 +36,7 @@ export declare abstract class AbstractController<T> {
36
36
  protected mysteryFxSymbolMustFormWinningLine: boolean;
37
37
  protected mysteryWinSymbol: Nullable<SymbolId>;
38
38
  private componentRegistry;
39
+ protected skipFreeSpinSummary: boolean;
39
40
  protected _lastWinAmount: number;
40
41
  protected constructor(buttonsEventManager: ButtonsEventManager, mainContainer: AbstractMainContainer, connection: SubscribableConnectionWrapper);
41
42
  init(): void;
@@ -35,6 +35,7 @@ export class AbstractController {
35
35
  mysteryFxSymbolMustFormWinningLine = false;
36
36
  mysteryWinSymbol = null;
37
37
  componentRegistry;
38
+ skipFreeSpinSummary = false;
38
39
  _lastWinAmount = 0;
39
40
  constructor(buttonsEventManager, mainContainer, connection) {
40
41
  this.buttonsEventManager = buttonsEventManager;
@@ -47,6 +48,8 @@ export class AbstractController {
47
48
  this.componentRegistry = RainMan.componentRegistry;
48
49
  this.setupSpaceOrEnterListener();
49
50
  RainMan.settingsStore.showSuperBonusWin = this.showSuperBonusWin.bind(this);
51
+ RainMan.settingsStore.increaseBet = () => this.uiController.updateBet("increase");
52
+ RainMan.settingsStore.decreaseBet = () => this.uiController.updateBet("decrease");
50
53
  }
51
54
  init() {
52
55
  const initData = this.connection.initData();
@@ -520,7 +523,7 @@ export class AbstractController {
520
523
  this.uiController.updateShownFreeSpinAmount(freeSpinAward, isAdditionalFreeSpins);
521
524
  this.uiController.messageBox.showFreeSpinText();
522
525
  }
523
- if (this.invokeFreeSpinSummaryPlateAfterWin) {
526
+ if (this.invokeFreeSpinSummaryPlateAfterWin && !this.skipFreeSpinSummary) {
524
527
  await this.handleFreeSpinSummaryPlateInvocation();
525
528
  }
526
529
  if (RainMan.settingsStore.isAutoplayEnabled) {
@@ -36,6 +36,7 @@ export declare class SettingsStore {
36
36
  howManyFreeSpinsLeft: number;
37
37
  howManyAutoSpinsLeft: number;
38
38
  volumeLevel: number;
39
+ setSpeedPopupVisibility?: (visibility: "flex" | "none") => void;
39
40
  popupPaytablePosition?: Point;
40
41
  popupPaytableData?: PaytableData[];
41
42
  currentSpeed: SpeedLevel;
@@ -43,6 +44,8 @@ export declare class SettingsStore {
43
44
  updateVolumeButtonTexture?: () => void;
44
45
  handleModalInvocation?: (layerId: string) => void;
45
46
  showSuperBonusWin?: (callback: Promise<void>) => void;
47
+ increaseBet?: () => void;
48
+ decreaseBet?: () => void;
46
49
  private readonly initialAutoplaySettingsState;
47
50
  private modalsAvailable;
48
51
  private paytableMap;
@@ -51,6 +54,7 @@ export declare class SettingsStore {
51
54
  get indexOfSpeedLevel(): number;
52
55
  get isFreeSpinsPlayEnabled(): boolean;
53
56
  addCumulativeWinAmount(amount: number): void;
57
+ isIosScrollerInteractive(flag: boolean): void;
54
58
  resetCumulativeWinAmount(): void;
55
59
  updateBet(newBet: number): void;
56
60
  setBatteryFlag(flag: boolean): void;
@@ -42,6 +42,7 @@ export class SettingsStore {
42
42
  howManyFreeSpinsLeft = 0;
43
43
  howManyAutoSpinsLeft = INITIAL_AUTO_SPIN_COUNT;
44
44
  volumeLevel = getFromLocalStorage(LOCAL_STORAGE.volumeLevel, 100);
45
+ setSpeedPopupVisibility;
45
46
  popupPaytablePosition;
46
47
  popupPaytableData;
47
48
  currentSpeed = "slow";
@@ -49,6 +50,8 @@ export class SettingsStore {
49
50
  updateVolumeButtonTexture;
50
51
  handleModalInvocation;
51
52
  showSuperBonusWin;
53
+ increaseBet;
54
+ decreaseBet;
52
55
  initialAutoplaySettingsState = {
53
56
  infinitySpinsEnabled: false,
54
57
  onAnyWin: false,
@@ -110,6 +113,14 @@ export class SettingsStore {
110
113
  addCumulativeWinAmount(amount) {
111
114
  this.cumulativeWinAmount = this.cumulativeWinAmount + amount;
112
115
  }
116
+ isIosScrollerInteractive(flag) {
117
+ const scroller = document.querySelector(".ios-scroller");
118
+ const animation = document.querySelector(".ios-scroller-animation");
119
+ scroller?.classList.add(flag ? "ios-interactive" : "ios-nonInteractive");
120
+ animation?.classList.add(flag ? "ios-interactive" : "ios-nonInteractive");
121
+ scroller?.classList.remove(flag ? "ios-nonInteractive" : "ios-interactive");
122
+ animation?.classList.remove(flag ? "ios-nonInteractive" : "ios-interactive");
123
+ }
113
124
  resetCumulativeWinAmount() {
114
125
  this.cumulativeWinAmount = 0;
115
126
  }
@@ -64,7 +64,7 @@ export const setTimeScale = (spine, flag) => {
64
64
  spine.state.timeScale = spine.state.originalTimeScale;
65
65
  }
66
66
  else {
67
- spine.state.originalTimeScale = spine.state.timeScale;
67
+ spine.state.timeScale = 0;
68
68
  }
69
69
  };
70
70
  export const changeResolution = (high) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pixi-rainman-game-engine",
3
- "version": "0.1.23",
3
+ "version": "0.1.25",
4
4
  "description": "This repository contains all of the mechanics that used in rainman games.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",