Add Skins as a side game for Bingo Bango Bongo

Players can now opt into a Skins side game when creating a BBB round.
The side game uses the same skins settings (carryover, net/gross, skin
value, double back nine). The scorecard gains a third Skins tab during
play and on the summary; the BBB leaderboard continues to rank by BBB
points.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Rolf
2026-03-23 22:09:16 +01:00
parent c298c473f4
commit 5432734240
5 changed files with 56 additions and 18 deletions
+9 -3
View File
@@ -284,10 +284,11 @@ async def create_game(request: Request, holes_count: int = Form(...),
skin_value = float(skin_value_str) if skin_value_str else None
skin_double_back_nine = 1 if form.get("skin_double_back_nine") == "1" else 0
skins_net = 1 if form.get("skins_net") == "1" else 0
side_skins_enabled = 1 if form.get("side_skins_enabled") == "1" else 0
await db.execute(
"INSERT INTO games (id, format, holes_count, status, created_by, created_at, course_id, carryover, skin_value, skin_double_back_nine, skins_net) VALUES (?,?,?,?,?,?,?,?,?,?,?)",
(game_id, format, holes_count, "active", user["id"], now, course_id, carryover, skin_value, skin_double_back_nine, skins_net),
"INSERT INTO games (id, format, holes_count, status, created_by, created_at, course_id, carryover, skin_value, skin_double_back_nine, skins_net, side_skins_enabled) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)",
(game_id, format, holes_count, "active", user["id"], now, course_id, carryover, skin_value, skin_double_back_nine, skins_net, side_skins_enabled),
)
# Pre-fetch course holes for handicap calculation
@@ -389,11 +390,14 @@ async def game_summary(game_id: str, request: Request, user: dict = Depends(get_
skin_value = game["skin_value"]
skin_double_back9 = bool(game["skin_double_back_nine"])
skins_net = bool(game["skins_net"])
if game["format"] == "skins":
side_skins_enabled = bool(game.get("side_skins_enabled", 0))
if game["format"] == "skins" or side_skins_enabled:
carryover = bool(game["carryover"])
net_sph = strokes_per_hole if skins_net else None
skins_won, skins_hole_results, unclaimed, money_won, unclaimed_money = _calc_skins(
players, scores, holes, carryover, skin_value, skin_double_back9, net_sph)
if game["format"] == "skins":
results = sorted(players, key=lambda p: skins_won.get(p["id"], 0), reverse=True)
else:
results = sorted(players, key=lambda p: totals.get(p["id"], {}).get("total", 0), reverse=True)
@@ -408,6 +412,7 @@ async def game_summary(game_id: str, request: Request, user: dict = Depends(get_
"skins_won": skins_won, "skins_hole_results": skins_hole_results, "unclaimed": unclaimed,
"money_won": money_won, "unclaimed_money": unclaimed_money, "skin_value": skin_value,
"skin_double_back9": skin_double_back9, "skins_net": skins_net,
"side_skins_enabled": side_skins_enabled,
"carryover": bool(game["carryover"]),
})
@@ -449,6 +454,7 @@ async def game_page(game_id: str, request: Request, user: dict = Depends(get_cur
"skin_value": game["skin_value"],
"skin_double_back9": bool(game["skin_double_back_nine"]),
"skins_net": bool(game["skins_net"]),
"side_skins_enabled": bool(game.get("side_skins_enabled", 0)),
})