diff --git a/frontend/src/app/feature/game/slots/slots.component.html b/frontend/src/app/feature/game/slots/slots.component.html
new file mode 100644
index 0000000..ae15b69
--- /dev/null
+++ b/frontend/src/app/feature/game/slots/slots.component.html
@@ -0,0 +1,52 @@
+
+
+
+
Payouts
+ @if (slotInfo(); as info) {
+
+
+ @for (item of info | keyvalue; track item.key) {
+
+ {{ item.key }}
+ {{ item.value }}
+
+ }
+
+
+ }
+
+
+
+
{{ slotResult().resultMatrix[0][0] }}
+
{{ slotResult().resultMatrix[0][1] }}
+
{{ slotResult().resultMatrix[0][2] }}
+
+
{{ slotResult().resultMatrix[1][0] }}
+
{{ slotResult().resultMatrix[1][1] }}
+
{{ slotResult().resultMatrix[1][2] }}
+
+
{{ slotResult().resultMatrix[2][0] }}
+
{{ slotResult().resultMatrix[2][1] }}
+
{{ slotResult().resultMatrix[2][2] }}
+
+
+
+
Game result: {{ slotResult().status | uppercase }}
+
Amount: {{ slotResult().amount }}
+
+
+
+ Bet Amount:
+
+
+
+
SPIN
+
+
diff --git a/frontend/src/app/feature/game/slots/slots.component.ts b/frontend/src/app/feature/game/slots/slots.component.ts
new file mode 100644
index 0000000..ca8e1d8
--- /dev/null
+++ b/frontend/src/app/feature/game/slots/slots.component.ts
@@ -0,0 +1,55 @@
+import {ChangeDetectionStrategy, Component, inject, OnInit, signal} from "@angular/core";
+import {NavbarComponent} from "@shared/components/navbar/navbar.component";
+import {HttpClient} from "@angular/common/http";
+import {KeyValuePipe, NgClass, UpperCasePipe} from "@angular/common";
+import {FormsModule} from "@angular/forms";
+
+interface SlotResult {
+ status: 'win' | 'lose';
+ amount: number;
+ resultMatrix: string[][];
+}
+
+@Component({
+ selector: 'app-slots',
+ standalone: true,
+ imports: [
+ NavbarComponent,
+ KeyValuePipe,
+ UpperCasePipe,
+ NgClass,
+ FormsModule
+ ],
+ templateUrl: './slots.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export default class SlotsComponent implements OnInit {
+ private httpClient: HttpClient = inject(HttpClient);
+ slotInfo = signal
| null>(null);
+ slotResult = signal({
+ status: 'lose',
+ amount: 12,
+ resultMatrix: [
+ ["BAR", "BAR", "BAR"],
+ ["SEVEN", "SEVEN", "SEVEN"],
+ ["BELL", "BELL", "BELL"]
+ ]
+ });
+ betAmount = signal(1);
+
+ ngOnInit(): void {
+ this.httpClient.get>('/backend/slots/info').subscribe(data => {
+ this.slotInfo.set(data);
+ });
+ }
+
+ spin(): void {
+ const payload = {
+ betAmount: this.betAmount()
+ };
+
+ this.httpClient.post('/backend/slots/spin', payload).subscribe(result => {
+ this.slotResult.set(result);
+ });
+ }
+}
diff --git a/frontend/src/app/feature/transaction-history/transaction-history.component.ts b/frontend/src/app/feature/transaction-history/transaction-history.component.ts
index 0bef06d..b0e12f8 100644
--- a/frontend/src/app/feature/transaction-history/transaction-history.component.ts
+++ b/frontend/src/app/feature/transaction-history/transaction-history.component.ts
@@ -1,23 +1,15 @@
-import {
- ChangeDetectionStrategy,
- Component,
- EventEmitter,
- inject,
- Input,
- Output,
-} from '@angular/core';
-import { TransactionService } from '@service/transaction.service';
-import { Observable } from 'rxjs';
-import { AsyncPipe, CurrencyPipe, DatePipe, NgForOf, NgIf } from '@angular/common';
-import { AnimatedNumberComponent } from '@blackjack/components/animated-number/animated-number.component';
-import { TransactionData } from '../../model/TransactionData';
+import {ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output,} from '@angular/core';
+import {TransactionService} from '@service/transaction.service';
+import {Observable} from 'rxjs';
+import {AsyncPipe, CurrencyPipe, DatePipe, NgIf} from '@angular/common';
+import {TransactionData} from '../../model/TransactionData';
const PER_PAGE = 5;
@Component({
standalone: true,
selector: 'app-transaction-history',
- imports: [NgForOf, AsyncPipe, CurrencyPipe, DatePipe, AnimatedNumberComponent, NgIf],
+ imports: [AsyncPipe, CurrencyPipe, DatePipe, NgIf],
templateUrl: './transaction-history.component.html',
styleUrl: './transaction-history.component.css',
changeDetection: ChangeDetectionStrategy.OnPush,
diff --git a/frontend/src/app/shared/components/navbar/navbar.component.ts b/frontend/src/app/shared/components/navbar/navbar.component.ts
index 6cc6f56..b414092 100644
--- a/frontend/src/app/shared/components/navbar/navbar.component.ts
+++ b/frontend/src/app/shared/components/navbar/navbar.component.ts
@@ -17,7 +17,7 @@ import { AnimatedNumberComponent } from '@blackjack/components/animated-number/a
selector: 'app-navbar',
templateUrl: './navbar.component.html',
standalone: true,
- imports: [RouterModule, CurrencyPipe, AnimatedNumberComponent],
+ imports: [RouterModule, AnimatedNumberComponent],
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class NavbarComponent implements OnInit, OnDestroy {
From efc2a8ecec77a7d1d6208d7acb8942341225e3d6 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 13:58:56 +0200
Subject: [PATCH 002/274] style: run prettier
---
.../game/blackjack/blackjack.component.ts | 32 +++++++++----------
.../animated-number.component.ts | 4 +--
.../feature/game/slots/slots.component.html | 8 +++--
.../app/feature/game/slots/slots.component.ts | 32 ++++++++-----------
.../transaction-history.component.ts | 17 +++++++---
5 files changed, 49 insertions(+), 44 deletions(-)
diff --git a/frontend/src/app/feature/game/blackjack/blackjack.component.ts b/frontend/src/app/feature/game/blackjack/blackjack.component.ts
index 64ef4ef..a2e760b 100644
--- a/frontend/src/app/feature/game/blackjack/blackjack.component.ts
+++ b/frontend/src/app/feature/game/blackjack/blackjack.component.ts
@@ -1,19 +1,19 @@
-import {ChangeDetectionStrategy, Component, inject, OnInit, signal} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {Router} from '@angular/router';
-import {DealerHandComponent} from './components/dealer-hand/dealer-hand.component';
-import {PlayerHandComponent} from './components/player-hand/player-hand.component';
-import {GameControlsComponent} from './components/game-controls/game-controls.component';
-import {GameInfoComponent} from './components/game-info/game-info.component';
-import {BlackjackGame, Card} from '@blackjack/models/blackjack.model';
-import {BlackjackService} from '@blackjack/services/blackjack.service';
-import {HttpErrorResponse} from '@angular/common/http';
-import {GameResultComponent} from '@blackjack/components/game-result/game-result.component';
-import {GameState} from '@blackjack/enum/gameState';
-import {NavbarComponent} from '@shared/components/navbar/navbar.component';
-import {UserService} from '@service/user.service';
-import {timer} from 'rxjs';
-import {DebtDialogComponent} from '@shared/components/debt-dialog/debt-dialog.component';
+import { ChangeDetectionStrategy, Component, inject, OnInit, signal } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { Router } from '@angular/router';
+import { DealerHandComponent } from './components/dealer-hand/dealer-hand.component';
+import { PlayerHandComponent } from './components/player-hand/player-hand.component';
+import { GameControlsComponent } from './components/game-controls/game-controls.component';
+import { GameInfoComponent } from './components/game-info/game-info.component';
+import { BlackjackGame, Card } from '@blackjack/models/blackjack.model';
+import { BlackjackService } from '@blackjack/services/blackjack.service';
+import { HttpErrorResponse } from '@angular/common/http';
+import { GameResultComponent } from '@blackjack/components/game-result/game-result.component';
+import { GameState } from '@blackjack/enum/gameState';
+import { NavbarComponent } from '@shared/components/navbar/navbar.component';
+import { UserService } from '@service/user.service';
+import { timer } from 'rxjs';
+import { DebtDialogComponent } from '@shared/components/debt-dialog/debt-dialog.component';
@Component({
selector: 'app-blackjack',
diff --git a/frontend/src/app/feature/game/blackjack/components/animated-number/animated-number.component.ts b/frontend/src/app/feature/game/blackjack/components/animated-number/animated-number.component.ts
index 0b8cd4c..6e61c0e 100644
--- a/frontend/src/app/feature/game/blackjack/components/animated-number/animated-number.component.ts
+++ b/frontend/src/app/feature/game/blackjack/components/animated-number/animated-number.component.ts
@@ -8,8 +8,8 @@ import {
SimpleChanges,
ViewChild,
} from '@angular/core';
-import {CommonModule} from '@angular/common';
-import {CountUp} from 'countup.js';
+import { CommonModule } from '@angular/common';
+import { CountUp } from 'countup.js';
@Component({
selector: 'app-animated-number',
diff --git a/frontend/src/app/feature/game/slots/slots.component.html b/frontend/src/app/feature/game/slots/slots.component.html
index ae15b69..2b6298c 100644
--- a/frontend/src/app/feature/game/slots/slots.component.html
+++ b/frontend/src/app/feature/game/slots/slots.component.html
@@ -31,8 +31,12 @@
-
Game result: {{ slotResult().status | uppercase }}
-
Amount: {{ slotResult().amount }}
+
+ Game result: {{ slotResult().status | uppercase }}
+
+
+ Amount: {{ slotResult().amount }}
+
diff --git a/frontend/src/app/feature/game/slots/slots.component.ts b/frontend/src/app/feature/game/slots/slots.component.ts
index ca8e1d8..cbf2cc8 100644
--- a/frontend/src/app/feature/game/slots/slots.component.ts
+++ b/frontend/src/app/feature/game/slots/slots.component.ts
@@ -1,8 +1,8 @@
-import {ChangeDetectionStrategy, Component, inject, OnInit, signal} from "@angular/core";
-import {NavbarComponent} from "@shared/components/navbar/navbar.component";
-import {HttpClient} from "@angular/common/http";
-import {KeyValuePipe, NgClass, UpperCasePipe} from "@angular/common";
-import {FormsModule} from "@angular/forms";
+import { ChangeDetectionStrategy, Component, inject, OnInit, signal } from '@angular/core';
+import { NavbarComponent } from '@shared/components/navbar/navbar.component';
+import { HttpClient } from '@angular/common/http';
+import { KeyValuePipe, NgClass, UpperCasePipe } from '@angular/common';
+import { FormsModule } from '@angular/forms';
interface SlotResult {
status: 'win' | 'lose';
@@ -13,13 +13,7 @@ interface SlotResult {
@Component({
selector: 'app-slots',
standalone: true,
- imports: [
- NavbarComponent,
- KeyValuePipe,
- UpperCasePipe,
- NgClass,
- FormsModule
- ],
+ imports: [NavbarComponent, KeyValuePipe, UpperCasePipe, NgClass, FormsModule],
templateUrl: './slots.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
@@ -30,25 +24,25 @@ export default class SlotsComponent implements OnInit {
status: 'lose',
amount: 12,
resultMatrix: [
- ["BAR", "BAR", "BAR"],
- ["SEVEN", "SEVEN", "SEVEN"],
- ["BELL", "BELL", "BELL"]
- ]
+ ['BAR', 'BAR', 'BAR'],
+ ['SEVEN', 'SEVEN', 'SEVEN'],
+ ['BELL', 'BELL', 'BELL'],
+ ],
});
betAmount = signal
(1);
ngOnInit(): void {
- this.httpClient.get>('/backend/slots/info').subscribe(data => {
+ this.httpClient.get>('/backend/slots/info').subscribe((data) => {
this.slotInfo.set(data);
});
}
spin(): void {
const payload = {
- betAmount: this.betAmount()
+ betAmount: this.betAmount(),
};
- this.httpClient.post('/backend/slots/spin', payload).subscribe(result => {
+ this.httpClient.post('/backend/slots/spin', payload).subscribe((result) => {
this.slotResult.set(result);
});
}
diff --git a/frontend/src/app/feature/transaction-history/transaction-history.component.ts b/frontend/src/app/feature/transaction-history/transaction-history.component.ts
index b0e12f8..338ef4e 100644
--- a/frontend/src/app/feature/transaction-history/transaction-history.component.ts
+++ b/frontend/src/app/feature/transaction-history/transaction-history.component.ts
@@ -1,8 +1,15 @@
-import {ChangeDetectionStrategy, Component, EventEmitter, inject, Input, Output,} from '@angular/core';
-import {TransactionService} from '@service/transaction.service';
-import {Observable} from 'rxjs';
-import {AsyncPipe, CurrencyPipe, DatePipe, NgIf} from '@angular/common';
-import {TransactionData} from '../../model/TransactionData';
+import {
+ ChangeDetectionStrategy,
+ Component,
+ EventEmitter,
+ inject,
+ Input,
+ Output,
+} from '@angular/core';
+import { TransactionService } from '@service/transaction.service';
+import { Observable } from 'rxjs';
+import { AsyncPipe, CurrencyPipe, DatePipe, NgIf } from '@angular/common';
+import { TransactionData } from '../../model/TransactionData';
const PER_PAGE = 5;
From 3f00a5b359378e912d1ed65cb89045f9e4500cdf Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 14:00:39 +0200
Subject: [PATCH 003/274] style: fix linter issues
---
.../game-result/game-result.component.ts | 2 +-
.../components/navbar/navbar.component.ts | 20 ++++++-------------
2 files changed, 7 insertions(+), 15 deletions(-)
diff --git a/frontend/src/app/feature/game/blackjack/components/game-result/game-result.component.ts b/frontend/src/app/feature/game/blackjack/components/game-result/game-result.component.ts
index 06f2d3a..1aab1a4 100644
--- a/frontend/src/app/feature/game/blackjack/components/game-result/game-result.component.ts
+++ b/frontend/src/app/feature/game/blackjack/components/game-result/game-result.component.ts
@@ -1,5 +1,5 @@
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
-import { CommonModule, CurrencyPipe } from '@angular/common';
+import { CommonModule } from '@angular/common';
import { animate, style, transition, trigger } from '@angular/animations';
import { GameState } from '../../enum/gameState';
import { AnimatedNumberComponent } from '../animated-number/animated-number.component';
diff --git a/frontend/src/app/shared/components/navbar/navbar.component.ts b/frontend/src/app/shared/components/navbar/navbar.component.ts
index b414092..04bf38f 100644
--- a/frontend/src/app/shared/components/navbar/navbar.component.ts
+++ b/frontend/src/app/shared/components/navbar/navbar.component.ts
@@ -1,17 +1,9 @@
-import {
- ChangeDetectionStrategy,
- Component,
- inject,
- OnDestroy,
- OnInit,
- signal,
-} from '@angular/core';
-import { RouterModule } from '@angular/router';
-import { AuthService } from '../../../service/auth.service';
-import { CurrencyPipe } from '@angular/common';
-import { UserService } from '@service/user.service';
-import { Subscription } from 'rxjs';
-import { AnimatedNumberComponent } from '@blackjack/components/animated-number/animated-number.component';
+import {ChangeDetectionStrategy, Component, inject, OnDestroy, OnInit, signal,} from '@angular/core';
+import {RouterModule} from '@angular/router';
+import {AuthService} from '../../../service/auth.service';
+import {UserService} from '@service/user.service';
+import {Subscription} from 'rxjs';
+import {AnimatedNumberComponent} from '@blackjack/components/animated-number/animated-number.component';
@Component({
selector: 'app-navbar',
From 864cb28aac039f2145e32859ae17d8486e7ec834 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 14:19:44 +0200
Subject: [PATCH 004/274] style: fix prettier
---
.../components/navbar/navbar.component.ts | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/frontend/src/app/shared/components/navbar/navbar.component.ts b/frontend/src/app/shared/components/navbar/navbar.component.ts
index 04bf38f..5405b07 100644
--- a/frontend/src/app/shared/components/navbar/navbar.component.ts
+++ b/frontend/src/app/shared/components/navbar/navbar.component.ts
@@ -1,9 +1,16 @@
-import {ChangeDetectionStrategy, Component, inject, OnDestroy, OnInit, signal,} from '@angular/core';
-import {RouterModule} from '@angular/router';
-import {AuthService} from '../../../service/auth.service';
-import {UserService} from '@service/user.service';
-import {Subscription} from 'rxjs';
-import {AnimatedNumberComponent} from '@blackjack/components/animated-number/animated-number.component';
+import {
+ ChangeDetectionStrategy,
+ Component,
+ inject,
+ OnDestroy,
+ OnInit,
+ signal,
+} from '@angular/core';
+import { RouterModule } from '@angular/router';
+import { AuthService } from '../../../service/auth.service';
+import { UserService } from '@service/user.service';
+import { Subscription } from 'rxjs';
+import { AnimatedNumberComponent } from '@blackjack/components/animated-number/animated-number.component';
@Component({
selector: 'app-navbar',
From fd7c3b3503f0cbbc689bec67f1aad8f4c8667986 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 14:25:25 +0200
Subject: [PATCH 005/274] refactor: loop through result matrix
---
.../app/feature/game/slots/slots.component.html | 16 +++++-----------
1 file changed, 5 insertions(+), 11 deletions(-)
diff --git a/frontend/src/app/feature/game/slots/slots.component.html b/frontend/src/app/feature/game/slots/slots.component.html
index 2b6298c..d2c7587 100644
--- a/frontend/src/app/feature/game/slots/slots.component.html
+++ b/frontend/src/app/feature/game/slots/slots.component.html
@@ -17,17 +17,11 @@
-
{{ slotResult().resultMatrix[0][0] }}
-
{{ slotResult().resultMatrix[0][1] }}
-
{{ slotResult().resultMatrix[0][2] }}
-
-
{{ slotResult().resultMatrix[1][0] }}
-
{{ slotResult().resultMatrix[1][1] }}
-
{{ slotResult().resultMatrix[1][2] }}
-
-
{{ slotResult().resultMatrix[2][0] }}
-
{{ slotResult().resultMatrix[2][1] }}
-
{{ slotResult().resultMatrix[2][2] }}
+ @for (row of slotResult().resultMatrix; track $index) {
+ @for (cell of row; track $index) {
+
{{ cell }}
+ }
+ }
From 201b305fe0dc002b2df4f6658a390075c1aee834 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 14:27:36 +0200
Subject: [PATCH 006/274] feat: add starting stuff
---
frontend/src/app/feature/game/slots/slots.component.ts | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/frontend/src/app/feature/game/slots/slots.component.ts b/frontend/src/app/feature/game/slots/slots.component.ts
index cbf2cc8..19ffb57 100644
--- a/frontend/src/app/feature/game/slots/slots.component.ts
+++ b/frontend/src/app/feature/game/slots/slots.component.ts
@@ -5,7 +5,7 @@ import { KeyValuePipe, NgClass, UpperCasePipe } from '@angular/common';
import { FormsModule } from '@angular/forms';
interface SlotResult {
- status: 'win' | 'lose';
+ status: 'win' | 'lose' | 'blank' | 'start';
amount: number;
resultMatrix: string[][];
}
@@ -21,8 +21,8 @@ export default class SlotsComponent implements OnInit {
private httpClient: HttpClient = inject(HttpClient);
slotInfo = signal | null>(null);
slotResult = signal({
- status: 'lose',
- amount: 12,
+ status: 'start',
+ amount: 0,
resultMatrix: [
['BAR', 'BAR', 'BAR'],
['SEVEN', 'SEVEN', 'SEVEN'],
From 23673ca0fca8bafc6ad5b88bddd2c40d40f1f115 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 14:28:39 +0200
Subject: [PATCH 007/274] revert: remove color styling
---
frontend/src/app/feature/game/slots/slots.component.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/frontend/src/app/feature/game/slots/slots.component.html b/frontend/src/app/feature/game/slots/slots.component.html
index d2c7587..b6d9318 100644
--- a/frontend/src/app/feature/game/slots/slots.component.html
+++ b/frontend/src/app/feature/game/slots/slots.component.html
@@ -24,7 +24,7 @@
}
-
+
Game result: {{ slotResult().status | uppercase }}
From 6e101a0cab9e800d9cffba87ec9bea3e66788c14 Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 14:47:22 +0200
Subject: [PATCH 008/274] refactor: subtract betamount on blank status
---
.../de/szut/casino/slots/SlotService.java | 27 +++++++------------
1 file changed, 9 insertions(+), 18 deletions(-)
diff --git a/backend/src/main/java/de/szut/casino/slots/SlotService.java b/backend/src/main/java/de/szut/casino/slots/SlotService.java
index c327742..729918d 100644
--- a/backend/src/main/java/de/szut/casino/slots/SlotService.java
+++ b/backend/src/main/java/de/szut/casino/slots/SlotService.java
@@ -52,30 +52,21 @@ public class SlotService {
private SpinResult processResult(BigDecimal betAmount, UserEntity user, Status status, Symbol winSymbol) {
SpinResult spinResult = new SpinResult();
+ spinResult.setStatus(status.name().toLowerCase());
- switch (status) {
- case WIN:
- BigDecimal winAmount = betAmount.multiply(winSymbol.getPayoutMultiplier());
- this.balanceService.addFunds(user, winAmount);
- spinResult.setAmount(winAmount);
- spinResult.setStatus(Status.WIN.name().toLowerCase());
- break;
-
- case BLANK:
- spinResult.setAmount(BigDecimal.ZERO);
- spinResult.setStatus(Status.BLANK.name().toLowerCase());
- break;
-
- case LOSE:
- this.balanceService.subtractFunds(user, betAmount);
- spinResult.setAmount(betAmount);
- spinResult.setStatus(Status.LOSE.name().toLowerCase());
- break;
+ if (status == Status.WIN) {
+ BigDecimal winAmount = betAmount.multiply(winSymbol.getPayoutMultiplier());
+ this.balanceService.addFunds(user, winAmount);
+ spinResult.setAmount(winAmount);
+ } else {
+ this.balanceService.subtractFunds(user, betAmount);
+ spinResult.setAmount(betAmount);
}
return spinResult;
}
+
private void buildResultMatrix(SpinResult spinResult, int index1, int index2, int index3) {
List> resultMatrix = new ArrayList<>(3);
From e2e249d8994cef867a48bd34e114deddce4971dd Mon Sep 17 00:00:00 2001
From: Phan Huy Tran
Date: Wed, 7 May 2025 14:48:17 +0200
Subject: [PATCH 009/274] refactor: oops
---
backend/src/main/java/de/szut/casino/slots/SlotService.java | 1 -
1 file changed, 1 deletion(-)
diff --git a/backend/src/main/java/de/szut/casino/slots/SlotService.java b/backend/src/main/java/de/szut/casino/slots/SlotService.java
index 729918d..4bdaa90 100644
--- a/backend/src/main/java/de/szut/casino/slots/SlotService.java
+++ b/backend/src/main/java/de/szut/casino/slots/SlotService.java
@@ -66,7 +66,6 @@ public class SlotService {
return spinResult;
}
-
private void buildResultMatrix(SpinResult spinResult, int index1, int index2, int index3) {
List> resultMatrix = new ArrayList<>(3);
From b58ceeeaab4f7dbf7bb7b3e948dd5db6962da739 Mon Sep 17 00:00:00 2001
From: Jan-Marlon Leibl
Date: Wed, 23 Apr 2025 09:47:32 +0200
Subject: [PATCH 010/274] feat(lootboxes): add lootbox selection feature and
routes
---
frontend/src/app/app.routes.ts | 5 +
frontend/src/app/feature/lootboxes/README.md | 40 ++++
.../lootbox-selection.component.html | 55 +++++
.../lootbox-selection.component.scss | 188 ++++++++++++++++++
.../lootbox-selection.component.ts | 71 +++++++
.../assets/images/lootboxes/common-box.png | 1 +
.../assets/images/lootboxes/legendary-box.png | 1 +
.../src/assets/images/lootboxes/rare-box.png | 1 +
8 files changed, 362 insertions(+)
create mode 100644 frontend/src/app/feature/lootboxes/README.md
create mode 100644 frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.html
create mode 100644 frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.scss
create mode 100644 frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.ts
create mode 100644 frontend/src/assets/images/lootboxes/common-box.png
create mode 100644 frontend/src/assets/images/lootboxes/legendary-box.png
create mode 100644 frontend/src/assets/images/lootboxes/rare-box.png
diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts
index ce4451c..280f4d0 100644
--- a/frontend/src/app/app.routes.ts
+++ b/frontend/src/app/app.routes.ts
@@ -26,4 +26,9 @@ export const routes: Routes = [
loadComponent: () => import('./feature/game/slots/slots.component'),
canActivate: [authGuard],
},
+ {
+ path: 'game/lootboxes',
+ loadComponent: () => import('./feature/lootboxes/lootbox-selection/lootbox-selection.component'),
+ canActivate: [authGuard],
+ },
];
diff --git a/frontend/src/app/feature/lootboxes/README.md b/frontend/src/app/feature/lootboxes/README.md
new file mode 100644
index 0000000..2aecc6b
--- /dev/null
+++ b/frontend/src/app/feature/lootboxes/README.md
@@ -0,0 +1,40 @@
+# Lootboxes Feature
+
+Diese Funktion ermöglicht es Spielern, Lootboxen zu kaufen und zu öffnen.
+
+## Komponenten
+
+- **LootboxSelection**: Zeigt alle verfügbaren Lootboxen an und ermöglicht Filterung nach Kategorien.
+- (Weitere Komponenten werden implementiert)
+
+## Implementierung
+
+### Lootbox-Kategorien
+- Gewöhnlich (Common): Niedrigere Preise, höhere Gewinnchance
+- Selten (Rare): Mittlere Preise, mittlere Gewinnchance
+- Legendär (Legendary): Hohe Preise, niedrige Gewinnchance
+
+### Routen
+- `/lootboxes`: Hauptseite mit Lootbox-Auswahl
+- `/lootboxes/open/:id`: Öffnen einer bestimmten Lootbox
+- `/lootboxes/fairness`: Informationen zur Fairness-Garantie
+
+## Hinweise zur Implementierung
+
+1. **Bilder**: Stelle sicher, dass die korrekten Bilder unter `/assets/images/lootboxes/` vorhanden sind.
+2. **Styling**: Das Styling ist an Counter-Strike-Lootboxen angelehnt.
+3. **Authentifizierung**: Alle Lootbox-Routen sind durch den Auth-Guard geschützt.
+
+## Lootbox-Objekt-Interface
+
+```typescript
+interface Lootbox {
+ id: string;
+ name: string;
+ category: 'common' | 'rare' | 'legendary';
+ price: number;
+ image: string;
+ chance: number;
+ maxPrize: number;
+}
+```
\ No newline at end of file
diff --git a/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.html b/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.html
new file mode 100644
index 0000000..3b6d80c
--- /dev/null
+++ b/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.html
@@ -0,0 +1,55 @@
+
+
+
+
+
Alle unsere Lootboxen unterliegen einem verifizierbaren Fairness-System.
+ Die Gewinnchancen sind transparent und werden von unabhängigen Prüfern bestätigt.
+
Mehr zur Fairness-Garantie
+
+
+
+
+
+
+
+
{{ lootbox.category | titlecase }}
+
+
+
{{ lootbox.name }}
+
+
+ Preis:
+ {{ lootbox.price }}€
+
+
+ Wahrscheinlichkeit:
+ {{ lootbox.chance }}%
+
+
+ Höchster Preis:
+ {{ lootbox.maxPrize }}€
+
+
+
Kaufen
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.scss b/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.scss
new file mode 100644
index 0000000..879dccc
--- /dev/null
+++ b/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.scss
@@ -0,0 +1,188 @@
+
+.lootbox-container {
+ max-width: 1200px;
+ margin: 0 auto;
+ padding: 2rem;
+ background-color: #1a1a1a;
+ color: #fff;
+ font-family: 'Inter', sans-serif;
+}
+
+.lootbox-header {
+ text-align: center;
+ margin-bottom: 2rem;
+
+ h1 {
+ font-size: 2.5rem;
+ font-weight: 700;
+ margin-bottom: 1rem;
+ color: #f8f8f8;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ }
+}
+
+.category-filters {
+ display: flex;
+ justify-content: center;
+ gap: 1rem;
+ margin: 1.5rem 0;
+
+ .category-btn {
+ background-color: #2a2a2a;
+ border: none;
+ color: #aaa;
+ padding: 0.5rem 1.5rem;
+ border-radius: 4px;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ font-weight: 500;
+
+ &:hover {
+ background-color: #3a3a3a;
+ color: #fff;
+ }
+
+ &.active {
+ background-color: #4a4a4a;
+ color: #fff;
+ box-shadow: 0 0 0 2px rgba(#ffcc00, 0.5);
+ }
+ }
+}
+
+.fairness-info {
+ background-color: rgba(#ffcc00, 0.1);
+ border-left: 4px solid #ffcc00;
+ padding: 1rem;
+ margin-bottom: 2rem;
+ border-radius: 4px;
+
+ p {
+ margin: 0 0 0.5rem 0;
+ color: #ddd;
+ font-size: 0.9rem;
+ }
+
+ .info-link {
+ color: #ffcc00;
+ text-decoration: none;
+ font-size: 0.9rem;
+ font-weight: 500;
+
+ &:hover {
+ text-decoration: underline;
+ }
+ }
+}
+
+.lootbox-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
+ gap: 2rem;
+}
+
+.lootbox-card {
+ background: linear-gradient(135deg, #2a2a2a 0%, #1c1c1c 100%);
+ border-radius: 8px;
+ overflow: hidden;
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
+
+ &:hover {
+ transform: translateY(-5px);
+ box-shadow: 0 15px 30px rgba(0, 0, 0, 0.4);
+ }
+}
+
+.lootbox-image-container {
+ position: relative;
+ padding-bottom: 75%;
+ overflow: hidden;
+
+ .lootbox-image {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+ transition: transform 0.3s ease;
+ }
+
+ .lootbox-category {
+ position: absolute;
+ top: 10px;
+ right: 10px;
+ padding: 5px 10px;
+ border-radius: 4px;
+ font-size: 0.8rem;
+ font-weight: 600;
+ text-transform: uppercase;
+
+ &.common {
+ background-color: #6b6b6b;
+ color: #fff;
+ }
+
+ &.rare {
+ background-color: #4b69ff;
+ color: #fff;
+ }
+
+ &.legendary {
+ background-color: #d32ce6;
+ color: #fff;
+ }
+ }
+
+ &:hover .lootbox-image {
+ transform: scale(1.05);
+ }
+}
+
+.lootbox-info {
+ padding: 1.5rem;
+}
+
+.lootbox-name {
+ font-size: 1.25rem;
+ margin: 0 0 1rem 0;
+ font-weight: 600;
+}
+
+.lootbox-details {
+ margin-bottom: 1.5rem;
+
+ .detail-item {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 0.5rem;
+
+ .label {
+ color: #aaa;
+ font-size: 0.9rem;
+ }
+
+ .value {
+ font-weight: 600;
+ font-size: 0.9rem;
+ }
+ }
+}
+
+.kaufen-btn {
+ width: 100%;
+ background-color: #ffcc00;
+ color: #000;
+ border: none;
+ border-radius: 4px;
+ padding: 0.75rem 0;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background-color 0.2s ease;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+
+ &:hover {
+ background-color: #ffd633;
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.ts b/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.ts
new file mode 100644
index 0000000..43fe751
--- /dev/null
+++ b/frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.ts
@@ -0,0 +1,71 @@
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { RouterModule } from '@angular/router';
+
+interface Lootbox {
+ id: string;
+ name: string;
+ category: 'common' | 'rare' | 'legendary';
+ price: number;
+ image: string;
+ chance: number;
+ maxPrize: number;
+}
+
+@Component({
+ selector: 'app-lootbox-selection',
+ standalone: true,
+ imports: [CommonModule, RouterModule],
+ templateUrl: './lootbox-selection.component.html',
+ styleUrl: './lootbox-selection.component.scss'
+})
+export default class LootboxSelectionComponent {
+ lootboxes: Lootbox[] = [
+ {
+ id: 'common-box',
+ name: 'Gewöhnliche Box',
+ category: 'common',
+ price: 5,
+ image: '/assets/images/lootboxes/common-box.png',
+ chance: 7,
+ maxPrize: 50
+ },
+ {
+ id: 'rare-box',
+ name: 'Seltene Box',
+ category: 'rare',
+ price: 20,
+ image: '/assets/images/lootboxes/rare-box.png',
+ chance: 3.5,
+ maxPrize: 200
+ },
+ {
+ id: 'legendary-box',
+ name: 'Legendäre Box',
+ category: 'legendary',
+ price: 50,
+ image: '/assets/images/lootboxes/legendary-box.png',
+ chance: 1,
+ maxPrize: 1000
+ }
+ ];
+
+ categories = [
+ { id: 'common', name: 'Gewöhnlich' },
+ { id: 'rare', name: 'Selten' },
+ { id: 'legendary', name: 'Legendär' }
+ ];
+
+ selectedCategory: string | null = null;
+
+ filterByCategory(category: string | null): void {
+ this.selectedCategory = category;
+ }
+
+ get filteredLootboxes(): Lootbox[] {
+ if (!this.selectedCategory) {
+ return this.lootboxes;
+ }
+ return this.lootboxes.filter(box => box.category === this.selectedCategory);
+ }
+}
\ No newline at end of file
diff --git a/frontend/src/assets/images/lootboxes/common-box.png b/frontend/src/assets/images/lootboxes/common-box.png
new file mode 100644
index 0000000..0519ecb
--- /dev/null
+++ b/frontend/src/assets/images/lootboxes/common-box.png
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/lootboxes/legendary-box.png b/frontend/src/assets/images/lootboxes/legendary-box.png
new file mode 100644
index 0000000..0519ecb
--- /dev/null
+++ b/frontend/src/assets/images/lootboxes/legendary-box.png
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/frontend/src/assets/images/lootboxes/rare-box.png b/frontend/src/assets/images/lootboxes/rare-box.png
new file mode 100644
index 0000000..0519ecb
--- /dev/null
+++ b/frontend/src/assets/images/lootboxes/rare-box.png
@@ -0,0 +1 @@
+
\ No newline at end of file
From 8e27c9c7c38874dd85dd040bcfecd2806afa844d Mon Sep 17 00:00:00 2001
From: Jan-Marlon Leibl
Date: Wed, 23 Apr 2025 13:17:44 +0200
Subject: [PATCH 011/274] feat(lootboxes): add lootbox opening feature and
images
---
frontend/public/images/1-box.png | Bin 0 -> 808284 bytes
frontend/public/images/2-box.png | Bin 0 -> 2011744 bytes
frontend/public/images/3-box.png | Bin 0 -> 1991426 bytes
frontend/src/app/app.routes.ts | 5 +
.../src/app/feature/home/home.component.ts | 2 +-
frontend/src/app/feature/lootboxes/README.md | 40 ----
.../lootbox-opening.component.css | 98 +++++++++
.../lootbox-opening.component.html | 50 +++++
.../lootbox-opening.component.ts | 156 +++++++++++++++
.../lootbox-selection.component.css | 22 ++
.../lootbox-selection.component.html | 94 +++++----
.../lootbox-selection.component.scss | 188 ------------------
.../lootbox-selection.component.ts | 163 ++++++++++-----
.../lootboxes/services/lootbox.service.ts | 33 +++
frontend/src/app/model/LootBox.ts | 12 ++
15 files changed, 536 insertions(+), 327 deletions(-)
create mode 100644 frontend/public/images/1-box.png
create mode 100644 frontend/public/images/2-box.png
create mode 100644 frontend/public/images/3-box.png
delete mode 100644 frontend/src/app/feature/lootboxes/README.md
create mode 100644 frontend/src/app/feature/lootboxes/lootbox-opening/lootbox-opening.component.css
create mode 100644 frontend/src/app/feature/lootboxes/lootbox-opening/lootbox-opening.component.html
create mode 100644 frontend/src/app/feature/lootboxes/lootbox-opening/lootbox-opening.component.ts
create mode 100644 frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.css
delete mode 100644 frontend/src/app/feature/lootboxes/lootbox-selection/lootbox-selection.component.scss
create mode 100644 frontend/src/app/feature/lootboxes/services/lootbox.service.ts
create mode 100644 frontend/src/app/model/LootBox.ts
diff --git a/frontend/public/images/1-box.png b/frontend/public/images/1-box.png
new file mode 100644
index 0000000000000000000000000000000000000000..b343dbd6571c16aa629e39909208d0dde3c8eb20
GIT binary patch
literal 808284
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