diff --git a/src/lib/counter-do.ts b/src/lib/counter-do.ts index 062f7c4..2708503 100644 --- a/src/lib/counter-do.ts +++ b/src/lib/counter-do.ts @@ -1,26 +1,11 @@ import type { DurableObjectNamespace, DurableObjectState } from '@cloudflare/workers-types'; +import type { Session, BettingInfo } from './types'; +import { applyBetResults } from './game-results'; export interface Env { COUNTER: DurableObjectNamespace; } -interface Session { - id: string; - webSocket: WebSocket; - nickname?: string; - capital?: number; - // 배팅 정보 - oddBet: number; - evenBet: number; - bigBet: number; - smallBet: number; - // 결과 - oddResult?: 'win' | 'lose' | null; - evenResult?: 'win' | 'lose' | null; - bigResult?: 'win' | 'lose' | null; - smallResult?: 'win' | 'lose' | null; - lastWinAmount?: number; -} export class CounterDurableObject { private ctx: DurableObjectState; @@ -165,60 +150,9 @@ export class CounterDurableObject { // 주사위 합계 const sum = this.dice1 + this.dice2 + this.dice3; - const isOdd = sum % 2 === 1; - const isBig = sum >= 10; - // 각 세션별로 배팅 결과 계산 - this.sessions.forEach((session) => { - if (!session.capital) return; - - let winAmount = 0; - - // 홀수 배팅 결과 - if (session.oddBet > 0) { - if (isOdd) { - session.oddResult = 'win'; - winAmount += session.oddBet * 2; - } else { - session.oddResult = 'lose'; - } - } - - // 짝수 배팅 결과 - if (session.evenBet > 0) { - if (!isOdd) { - session.evenResult = 'win'; - winAmount += session.evenBet * 2; - } else { - session.evenResult = 'lose'; - } - } - - // 대 배팅 결과 - if (session.bigBet > 0) { - if (isBig) { - session.bigResult = 'win'; - winAmount += session.bigBet * 2; - } else { - session.bigResult = 'lose'; - } - } - - // 소 배팅 결과 - if (session.smallBet > 0) { - if (!isBig) { - session.smallResult = 'win'; - winAmount += session.smallBet * 2; - } else { - session.smallResult = 'lose'; - } - } - - // 자본금 업데이트 - const totalBet = session.oddBet + session.evenBet + session.bigBet + session.smallBet; - session.lastWinAmount = winAmount - totalBet; - session.capital += winAmount; - }); + // 추출된 함수로 배팅 결과 계산 및 세션 갱신 + applyBetResults(this.sessions, sum); // 상태 저장 this.ctx.storage.put('noMoreBet', this.noMoreBet); @@ -289,13 +223,7 @@ export class CounterDurableObject { const connectedWebSockets = this.ctx.getWebSockets(); // 전체 사용자 배팅 내역 수집 - const allBettings: Array<{ - nickname: string; - oddBet: number; - evenBet: number; - bigBet: number; - smallBet: number; - }> = []; + const allBettings: BettingInfo[] = []; this.sessions.forEach((session) => { if (session.nickname && (session.oddBet > 0 || session.evenBet > 0 || session.bigBet > 0 || session.smallBet > 0)) { @@ -341,4 +269,3 @@ export class CounterDurableObject { }); } } - diff --git a/src/lib/game-results.ts b/src/lib/game-results.ts new file mode 100644 index 0000000..03c1f04 --- /dev/null +++ b/src/lib/game-results.ts @@ -0,0 +1,62 @@ +import type { Session } from './types'; + +/** + * 주사위 합계를 기준으로 모든 세션의 배팅 결과를 계산하고 세션 객체를 직접 갱신합니다. + * 승리 시 배팅금액 * 2 지급, 패배 시 이미 차감된 상태 유지. + * lastWinAmount = (총 승리 수령액 - 총 배팅액) + */ +export function applyBetResults(sessions: Map, sum: number) { + const isOdd = sum % 2 === 1; + const isBig = sum >= 10; // 10~18: 대 + + sessions.forEach((session) => { + if (session.capital === undefined) return; // 아직 사용자 설정 안됨 + + let winAmount = 0; + + // 홀수 배팅 + if (session.oddBet > 0) { + if (isOdd) { + session.oddResult = 'win'; + winAmount += session.oddBet * 2; + } else { + session.oddResult = 'lose'; + } + } + + // 짝수 배팅 + if (session.evenBet > 0) { + if (!isOdd) { + session.evenResult = 'win'; + winAmount += session.evenBet * 2; + } else { + session.evenResult = 'lose'; + } + } + + // 대 배팅 + if (session.bigBet > 0) { + if (isBig) { + session.bigResult = 'win'; + winAmount += session.bigBet * 2; + } else { + session.bigResult = 'lose'; + } + } + + // 소 배팅 + if (session.smallBet > 0) { + if (!isBig) { + session.smallResult = 'win'; + winAmount += session.smallBet * 2; + } else { + session.smallResult = 'lose'; + } + } + + const totalBet = session.oddBet + session.evenBet + session.bigBet + session.smallBet; + session.lastWinAmount = winAmount - totalBet; + session.capital = (session.capital ?? 0) + winAmount; + }); +} + diff --git a/src/lib/types.ts b/src/lib/types.ts new file mode 100644 index 0000000..1beb687 --- /dev/null +++ b/src/lib/types.ts @@ -0,0 +1,26 @@ +export interface Session { + id: string; + webSocket: WebSocket; + nickname?: string; + capital?: number; + // 배팅 정보 + oddBet: number; + evenBet: number; + bigBet: number; + smallBet: number; + // 결과 + oddResult?: 'win' | 'lose' | null; + evenResult?: 'win' | 'lose' | null; + bigResult?: 'win' | 'lose' | null; + smallResult?: 'win' | 'lose' | null; + lastWinAmount?: number; +} + +export interface BettingInfo { + nickname: string; + oddBet: number; + evenBet: number; + bigBet: number; + smallBet: number; +} + diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 27b5dcb..786dc01 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -390,7 +390,8 @@ {#if oddBet > 0 || evenBet > 0 || bigBet > 0 || smallBet > 0}
{#if oddBet > 0} -
+
홀수 배팅
{oddBet.toLocaleString()}원
{#if oddResult === 'win'} @@ -401,7 +402,8 @@
{/if} {#if evenBet > 0} -
+
짝수 배팅
{evenBet.toLocaleString()}원
{#if evenResult === 'win'} @@ -412,7 +414,8 @@
{/if} {#if bigBet > 0} -
+
대 배팅
{bigBet.toLocaleString()}원
{#if bigResult === 'win'} @@ -423,7 +426,8 @@
{/if} {#if smallBet > 0} -
+
소 배팅
{smallBet.toLocaleString()}원
{#if smallResult === 'win'}