Skip to content

Commit b1dd9aa

Browse files
committed
Finish blackjack implementation
1 parent a27ec71 commit b1dd9aa

File tree

21 files changed

+402
-507
lines changed

21 files changed

+402
-507
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
*.iws
44
.idea/
55
.vscode/
6+
target/

api/lib/src/event/process/client.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,21 +96,21 @@ class KickServerResponse extends ServerResponse {
9696
}
9797

9898
class UpdateServerResponse extends ServerResponse {
99-
final NetworkerPacket<ServerWorldEvent> main;
99+
final NetworkerPacket<ServerWorldEvent>? main;
100100
final Set<Channel> needsUpdate;
101101

102102
UpdateServerResponse(this.main, [this.needsUpdate = const {}]);
103103
UpdateServerResponse.builder(
104-
ServerWorldEvent event, [
104+
ServerWorldEvent? event, [
105105
Channel channel = kAnyChannel,
106106
this.needsUpdate = const {},
107-
]) : main = NetworkerPacket(event, channel);
107+
]) : main = event == null ? null : NetworkerPacket(event, channel);
108108

109109
List<NetworkerPacket<ServerWorldEvent>> buildPackets(
110110
WorldState state,
111111
Iterable<Channel> connected,
112112
) {
113-
return [main, ...buildUpdatePackets(state, connected)];
113+
return [?main, ...buildUpdatePackets(state, connected)];
114114
}
115115

116116
List<NetworkerPacket<WorldInitialized>> buildUpdatePackets(
@@ -419,6 +419,6 @@ Future<ServerResponse?> processClientEvent(
419419
}
420420
return UpdateServerResponse.builder(buildInitialize(), channel);
421421
case ToolbarActionRequest():
422-
return null;
422+
return UpdateServerResponse.builder(null);
423423
}
424424
}

app/lib/bloc/world/bloc.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@ class WorldBloc extends Bloc<PlayableWorldEvent, ClientWorldState> {
216216
allowServerEvents: true,
217217
);
218218
if (event is! UpdateServerResponse) break;
219-
add(event.main.data);
219+
final result = event.main?.data;
220+
if (result != null) add(result);
220221
final updatePacket = event.buildUpdatePackets(state.world, {
221222
kAuthorityChannel,
222223
}).firstOrNull;

app/pack/scripts/blackjack.luau

Lines changed: 61 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ local StackPosition = {
1010
y="1"
1111
}
1212
local StackPositionLocation = "("..StackPosition.x..", "..StackPosition.y..")"
13-
local CurrentPlayer = 1
13+
local CurrentPlayer = nil
1414
local PlayerScores : {[number]: number} = {}
1515
local Colors = {
1616
"heart",
@@ -79,7 +79,7 @@ end
7979
function Reset()
8080
ResetWorld()
8181
PlayerScores = {}
82-
CurrentPlayer = 1
82+
CurrentPlayer = nil
8383
Setup()
8484
end
8585
function Setup()
@@ -180,26 +180,34 @@ function CalculateStack(optionalCard : any) : number
180180
end
181181
return lowestOver or 0
182182
end
183-
function GetNextPlayer() : number?
184-
local index = table.find(State.Players, CurrentPlayer)
185-
if not index then
186-
return nil
187-
end
188-
index = index + 1
189-
if index > #State.Players then
190-
index = 1
183+
function FinishTurn(score)
184+
if not score then
185+
score = CalculateStack()
191186
end
192-
return State.Players[index]
193-
end
194-
function NextRound()
195-
PlayerScores[CurrentPlayer] = CalculateStack()
187+
PlayerScores[CurrentPlayer] = score
188+
Server:Send({
189+
type="MessageSent",
190+
user=0,
191+
message="Player "..CurrentPlayer.." finished with "..score.." points."
192+
}, nil)
196193
RemoveStack()
197-
CurrentPlayer = GetNextPlayer() or CurrentPlayer
198-
if CurrentPlayer == 1 then
199-
-- All players had their turn, round is over.
194+
195+
local allPlayed = true
196+
if State.Players then
197+
for _, player in ipairs(State.Players) do
198+
if not PlayerScores[player] then
199+
allPlayed = false
200+
break
201+
end
202+
end
203+
end
204+
205+
CurrentPlayer = nil
206+
if allPlayed then
200207
FinishRound()
208+
else
209+
print("Waiting for next player to take a card.")
201210
end
202-
print("Player "..CurrentPlayer.."'s turn")
203211
end
204212
function FinishRound()
205213
-- Determine winner(s)
@@ -242,7 +250,12 @@ function OnNewCard()
242250
}, nil)
243251
if score > MaxScore then
244252
print("Player "..CurrentPlayer.." busted!")
245-
NextRound()
253+
Server:Send({
254+
type="MessageSent",
255+
user=0,
256+
message="Player "..CurrentPlayer.." busted with "..score.." points!"
257+
}, nil)
258+
FinishTurn(score)
246259
end
247260
end
248261

@@ -268,6 +281,16 @@ Events.ObjectsMoved.Connect(function(event, details)
268281
details.cancelled = true
269282
return
270283
end
284+
285+
if CurrentPlayer == nil then
286+
CurrentPlayer = details.source
287+
print("Player "..CurrentPlayer.." started turn.")
288+
elseif CurrentPlayer ~= details.source then
289+
print("It's not your turn! Current player: "..tostring(CurrentPlayer))
290+
details.cancelled = true
291+
return
292+
end
293+
271294
OnNewCard()
272295
details:ScheduleEvent({
273296
type="CellHideChanged",
@@ -279,7 +302,7 @@ Events.MessageRequest.Connect(function(event, details)
279302
local message = event.message:lower()
280303
if message == "!stand" or message == "!stay" then
281304
if details.source == CurrentPlayer then
282-
NextRound()
305+
FinishTurn()
283306
else
284307
print("It's not your turn!")
285308
end
@@ -292,11 +315,6 @@ Events.UserJoined.Connect(function(event, details)
292315
toolbar={
293316
editable=false,
294317
actions={
295-
{
296-
id="blackjack_hit",
297-
label="Hit",
298-
enabled=true,
299-
},
300318
{
301319
id="blackjack_stand",
302320
label="Stand",
@@ -306,5 +324,23 @@ Events.UserJoined.Connect(function(event, details)
306324
}
307325
}, details.source)
308326
end)
327+
Events.ToolbarActionRequest.Connect(function(event, details)
328+
print("Toolbar action requested: "..event.actionId)
329+
if event.actionId == "blackjack_hit" then
330+
if details.source == CurrentPlayer then
331+
OnNewCard()
332+
else
333+
print("It's not your turn!")
334+
end
335+
details.cancelled = true
336+
elseif event.actionId == "blackjack_stand" then
337+
if details.source == CurrentPlayer then
338+
FinishTurn()
339+
else
340+
print("It's not your turn!")
341+
end
342+
details.cancelled = true
343+
end
344+
end)
309345

310346
Setup()

app/pubspec.lock

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -278,10 +278,10 @@ packages:
278278
dependency: "direct main"
279279
description:
280280
name: device_info_plus
281-
sha256: dd0e8e02186b2196c7848c9d394a5fd6e5b57a43a546082c5820b1ec72317e33
281+
sha256: "4df8babf73058181227e18b08e6ea3520cf5fc5d796888d33b7cb0f33f984b7c"
282282
url: "https://pub.dev"
283283
source: hosted
284-
version: "12.2.0"
284+
version: "12.3.0"
285285
device_info_plus_platform_interface:
286286
dependency: transitive
287287
description:
@@ -493,18 +493,18 @@ packages:
493493
dependency: "direct main"
494494
description:
495495
name: flutter_secure_storage
496-
sha256: f7eceb0bc6f4fd0441e29d43cab9ac2a1c5ffd7ea7b64075136b718c46954874
496+
sha256: "79d53f3393ac2b73bcba45317b6c1a29002f89c680225cdea0bd6770a1682ce0"
497497
url: "https://pub.dev"
498498
source: hosted
499-
version: "10.0.0-beta.4"
499+
version: "10.0.0-beta.5"
500500
flutter_secure_storage_darwin:
501501
dependency: transitive
502502
description:
503503
name: flutter_secure_storage_darwin
504-
sha256: f226f2a572bed96bc6542198ebaec227150786e34311d455a7e2d3d06d951845
504+
sha256: "81ef5abfb9cbeb78110d8043ba29f0b36cd7ffa989baa1b2d9482542b2200051"
505505
url: "https://pub.dev"
506506
source: hosted
507-
version: "0.1.0"
507+
version: "0.1.1"
508508
flutter_secure_storage_linux:
509509
dependency: transitive
510510
description:
@@ -937,10 +937,10 @@ packages:
937937
dependency: transitive
938938
description:
939939
name: path_provider_foundation
940-
sha256: "97390a0719146c7c3e71b6866c34f1cde92685933165c1c671984390d2aca776"
940+
sha256: "6d13aece7b3f5c5a9731eaf553ff9dcbc2eff41087fd2df587fd0fed9a3eb0c4"
941941
url: "https://pub.dev"
942942
source: hosted
943-
version: "2.4.4"
943+
version: "2.5.1"
944944
path_provider_linux:
945945
dependency: transitive
946946
description:
@@ -1159,10 +1159,10 @@ packages:
11591159
dependency: transitive
11601160
description:
11611161
name: shared_preferences_android
1162-
sha256: "46a46fd64659eff15f4638bbe19de43f9483f0e0bf024a9fb6b3582064bacc7b"
1162+
sha256: "83af5c682796c0f7719c2bbf74792d113e40ae97981b8f266fa84574573556bc"
11631163
url: "https://pub.dev"
11641164
source: hosted
1165-
version: "2.4.17"
1165+
version: "2.4.18"
11661166
shared_preferences_foundation:
11671167
dependency: transitive
11681168
description:

docs/package.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,25 @@
1010
"astro": "astro"
1111
},
1212
"dependencies": {
13-
"@astrojs/check": "^0.9.5",
13+
"@astrojs/check": "^0.9.6",
1414
"@astrojs/react": "^4.4.2",
15-
"@astrojs/starlight": "^0.36.3",
15+
"@astrojs/starlight": "^0.37.0",
1616
"@phosphor-icons/react": "^2.1.10",
1717
"@types/react": "^19.2.7",
1818
"@types/react-dom": "^19.2.3",
19-
"astro": "^5.16.0",
20-
"react": "^19.2.0",
21-
"react-dom": "^19.2.0",
19+
"astro": "^5.16.4",
20+
"react": "^19.2.1",
21+
"react-dom": "^19.2.1",
2222
"remark-gemoji": "^8.0.0",
2323
"remark-heading-id": "^1.0.1",
2424
"typescript": "^5.9.3"
2525
},
2626
"packageManager": "[email protected]",
2727
"devDependencies": {
28-
"@vite-pwa/astro": "^1.1.1",
28+
"@vite-pwa/astro": "^1.2.0",
2929
"sass": "^1.94.2",
3030
"sharp": "^0.34.5",
31-
"vite-plugin-pwa": "^1.1.0",
31+
"vite-plugin-pwa": "^1.2.0",
3232
"workbox-window": "^7.4.0"
3333
}
3434
}

0 commit comments

Comments
 (0)