Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

Keep up with the latest updates here :D

## 2025-04-30

## Fixed

- Spam-submitting the same solution will no longer deal damage to the bot ([#68](https://github.com/beatcode-official/server/pull/68))

---

## 2025-04-17
Expand Down
6 changes: 3 additions & 3 deletions src/lib/assets/config/room.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ export const DefaultRoomSettings: RoomSettings = {
hp_multiplier_medium: 1.5,
hp_multiplier_hard: 2.0,
distribution_mode: "auto",
prob_easy: 1,
prob_medium: 1,
prob_hard: 1,
prob_easy: 0.4,
prob_medium: 0.3,
prob_hard: 0.3,
starting_sp: 100,
starting_mp: 100,
mana_recharge: 50
Expand Down
45 changes: 25 additions & 20 deletions src/lib/models/room.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,26 +39,31 @@ export interface RoomInfo {
player_count: number;
}

export const RoomSettingsSchema = z.object({
problem_count: z.number().int().min(1).max(100).default(DefaultRoomSettings.problem_count),
starting_hp: z.number().int().min(1).max(1000).default(DefaultRoomSettings.starting_hp),
base_hp_deduction: z
.number()
.int()
.min(1)
.max(100)
.default(DefaultRoomSettings.base_hp_deduction),
hp_multiplier_easy: z.number().min(1).default(DefaultRoomSettings.hp_multiplier_easy),
hp_multiplier_medium: z.number().min(1).default(DefaultRoomSettings.hp_multiplier_medium),
hp_multiplier_hard: z.number().int().min(1).default(DefaultRoomSettings.hp_multiplier_hard),
distribution_mode: z.enum(["auto", "fixed"]).default(DefaultRoomSettings.distribution_mode),
prob_easy: z.number().int().min(0).max(3).default(DefaultRoomSettings.prob_easy),
prob_medium: z.number().int().min(0).max(3).default(DefaultRoomSettings.prob_medium),
prob_hard: z.number().int().min(0).max(3).default(DefaultRoomSettings.prob_hard),
starting_sp: z.number().int().min(1).max(1000).default(DefaultRoomSettings.starting_sp),
starting_mp: z.number().int().min(1).max(1000).default(DefaultRoomSettings.starting_mp),
mana_recharge: z.number().int().min(1).max(1000).default(DefaultRoomSettings.mana_recharge)
});
export const RoomSettingsSchema = z
.object({
problem_count: z.number().int().min(1).max(100).default(DefaultRoomSettings.problem_count),
starting_hp: z.number().int().min(1).max(1000).default(DefaultRoomSettings.starting_hp),
base_hp_deduction: z
.number()
.int()
.min(1)
.max(100)
.default(DefaultRoomSettings.base_hp_deduction),
hp_multiplier_easy: z.number().min(1).default(DefaultRoomSettings.hp_multiplier_easy),
hp_multiplier_medium: z.number().min(1).default(DefaultRoomSettings.hp_multiplier_medium),
hp_multiplier_hard: z.number().int().min(1).default(DefaultRoomSettings.hp_multiplier_hard),
distribution_mode: z.enum(["auto", "fixed"]).default(DefaultRoomSettings.distribution_mode),
Copy link

Copilot AI Apr 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nitpick] The updated probability fields now allow fractional values. If fractional probabilities are intended, consider adding a clarifying comment to explain the removal of the .int() constraint.

Suggested change
distribution_mode: z.enum(["auto", "fixed"]).default(DefaultRoomSettings.distribution_mode),
distribution_mode: z.enum(["auto", "fixed"]).default(DefaultRoomSettings.distribution_mode),
// Fractional probabilities are allowed for prob_easy, prob_medium, and prob_hard.
// The .int() constraint was removed to support values like 0.3 or 0.5.

Copilot uses AI. Check for mistakes.
prob_easy: z.number().min(0).max(1).default(DefaultRoomSettings.prob_easy),
prob_medium: z.number().min(0).max(1).default(DefaultRoomSettings.prob_medium),
prob_hard: z.number().min(0).max(1).default(DefaultRoomSettings.prob_hard),
starting_sp: z.number().int().min(1).max(1000).default(DefaultRoomSettings.starting_sp),
starting_mp: z.number().int().min(1).max(1000).default(DefaultRoomSettings.starting_mp),
mana_recharge: z.number().int().min(1).max(1000).default(DefaultRoomSettings.mana_recharge)
})
.refine((data) => data.prob_easy + data.prob_medium + data.prob_hard === 1, {
Copy link

Copilot AI Apr 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Using an exact equality check for floating-point numbers may cause precision issues. Consider using an approximation (e.g., Math.abs(sum - 1) < ε) to ensure robust validation.

Suggested change
.refine((data) => data.prob_easy + data.prob_medium + data.prob_hard === 1, {
.refine((data) => {
const EPSILON = 1e-9;
return Math.abs(data.prob_easy + data.prob_medium + data.prob_hard - 1) < EPSILON;
}, {

Copilot uses AI. Check for mistakes.
message: "Probabilities must add up to 1",
path: ["prob_easy", "prob_medium", "prob_hard"]
});

export const JoinRoomSchema = z.object({
room_code: z.string().length(6, "Room code must be exactly 6 characters")
Expand Down
2 changes: 1 addition & 1 deletion src/routes/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@
<div
aria-hidden="true"
class={cn(
mounted ? "" : "opacity-0", // Initially hidden until mounted and animated
mounted ? "" : "opacity-0",
"hero-title relative mb-4 flex h-32 flex-col gap-2 text-center text-5xl font-semibold text-neutral-100 md:mb-0 md:text-6xl"
)}
>
Expand Down