From 9cf127b16d794697b1b6ce1c566d97b8d306b8f5 Mon Sep 17 00:00:00 2001 From: Twyco Date: Tue, 1 Sep 2026 11:59:00 +0200 Subject: [PATCH] big shot --- app/Events/PaperBallThrown.php | 4 +- app/Http/Controllers/RoomEmoteController.php | 1 + app/Http/Requests/ThrowPaperBallRequest.php | 1 + app/Services/Rooms/RoomEmoteService.php | 16 +- resources/js/components/rooms/RoomSeat.vue | 289 +++++++++++++++++-- resources/js/components/rooms/RoomTable.vue | 36 ++- resources/js/composables/usePaperBallToss.ts | 114 +++++++- resources/js/types/emote.ts | 9 + resources/js/types/room.ts | 9 +- tests/Feature/RoomEmoteTest.php | 63 +++- 10 files changed, 509 insertions(+), 33 deletions(-) diff --git a/app/Events/PaperBallThrown.php b/app/Events/PaperBallThrown.php index 353a8eb..c92f38f 100644 --- a/app/Events/PaperBallThrown.php +++ b/app/Events/PaperBallThrown.php @@ -17,6 +17,7 @@ class PaperBallThrown implements ShouldBroadcastNow public readonly string $roomId, public readonly int $fromPlayerId, public readonly int $targetPlayerId, + public readonly int $chargeLevel, ) {} public function broadcastOn(): Channel @@ -30,7 +31,7 @@ class PaperBallThrown implements ShouldBroadcastNow } /** - * @return array{id: string, from_player_id: int, target_player_id: int} + * @return array{id: string, from_player_id: int, target_player_id: int, charge_level: int} */ public function broadcastWith(): array { @@ -38,6 +39,7 @@ class PaperBallThrown implements ShouldBroadcastNow 'id' => $this->id, 'from_player_id' => $this->fromPlayerId, 'target_player_id' => $this->targetPlayerId, + 'charge_level' => $this->chargeLevel, ]; } } diff --git a/app/Http/Controllers/RoomEmoteController.php b/app/Http/Controllers/RoomEmoteController.php index ec53897..ccc5705 100644 --- a/app/Http/Controllers/RoomEmoteController.php +++ b/app/Http/Controllers/RoomEmoteController.php @@ -27,6 +27,7 @@ class RoomEmoteController extends Controller $room, $player, (int) $request->validated('target_player_id'), + (int) ($request->validated('charge_percentage') ?? 0), ); return response()->noContent(); diff --git a/app/Http/Requests/ThrowPaperBallRequest.php b/app/Http/Requests/ThrowPaperBallRequest.php index 0405772..318c806 100644 --- a/app/Http/Requests/ThrowPaperBallRequest.php +++ b/app/Http/Requests/ThrowPaperBallRequest.php @@ -19,6 +19,7 @@ class ThrowPaperBallRequest extends FormRequest { return [ 'target_player_id' => ['required', 'integer'], + 'charge_percentage' => ['sometimes', 'integer', 'between:0,300'], ]; } } diff --git a/app/Services/Rooms/RoomEmoteService.php b/app/Services/Rooms/RoomEmoteService.php index d23818c..5011340 100644 --- a/app/Services/Rooms/RoomEmoteService.php +++ b/app/Services/Rooms/RoomEmoteService.php @@ -11,8 +11,12 @@ use Illuminate\Validation\ValidationException; class RoomEmoteService { - public function throwPaperBall(Room $room, Player $player, int $targetPlayerId): void - { + public function throwPaperBall( + Room $room, + Player $player, + int $targetPlayerId, + int $chargePercentage, + ): void { if ($targetPlayerId === $player->id) { throw ValidationException::withMessages([ 'target_player_id' => 'Du kannst dich nicht selbst abwerfen.', @@ -39,11 +43,19 @@ class RoomEmoteService RateLimiter::hit($rateLimitKey, 10); + $chargeLevel = match (true) { + $chargePercentage >= 300 => 3, + $chargePercentage >= 200 => 2, + $chargePercentage >= 100 => 1, + default => 0, + }; + PaperBallThrown::dispatch( Str::uuid()->toString(), $room->id, $player->id, $targetPlayerId, + $chargeLevel, ); } } diff --git a/resources/js/components/rooms/RoomSeat.vue b/resources/js/components/rooms/RoomSeat.vue index 2c4a227..3e15cb1 100644 --- a/resources/js/components/rooms/RoomSeat.vue +++ b/resources/js/components/rooms/RoomSeat.vue @@ -1,14 +1,181 @@