From ff9275d2f4f7e98689d593e0c243721a3da1f579 Mon Sep 17 00:00:00 2001 From: nijuy Date: Tue, 27 Jan 2026 20:23:01 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Revert=20"feat(SnackGameBase):=20=ED=94=BC?= =?UTF-8?q?=EB=B2=84=ED=83=80=EC=9E=84=EC=9D=BC=20=EB=95=90=20=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=EB=A6=AD=20=EB=B0=9C=EC=83=9D=20=EC=8B=9C=EB=A7=88?= =?UTF-8?q?=EB=8B=A4=20=EA=B2=80=EC=A6=9D=20=EC=9A=94=EC=B2=AD=EC=9D=84=20?= =?UTF-8?q?=EB=B3=B4=EB=82=B8=EB=8B=A4=20(#388)"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 264c53527d4767fd0479ae61c24ae31e77eca03f. --- src/pages/games/SnackGame/game/SnackGameBase.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/games/SnackGame/game/SnackGameBase.tsx b/src/pages/games/SnackGame/game/SnackGameBase.tsx index 01a8bbf..4aab018 100644 --- a/src/pages/games/SnackGame/game/SnackGameBase.tsx +++ b/src/pages/games/SnackGame/game/SnackGameBase.tsx @@ -135,7 +135,7 @@ const SnackGameBase = ({ replaceErrorHandler }: Props) => { const handleStreak = async (streak: StreakWithMeta, isGolden: boolean) => { cumulativeStreaks = [...cumulativeStreaks, streak]; - if (isGolden || streak.isFever) { + if (isGolden) { session = await handleStreaksMove(); } return session!; From 539d0579a3c0a183fbacbc24698a4a7615685c70 Mon Sep 17 00:00:00 2001 From: nijuy Date: Tue, 27 Jan 2026 20:52:46 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix(GameScreen):=20=EC=95=84=EC=9D=B4?= =?UTF-8?q?=ED=85=9C=20=EC=84=A0=ED=83=9D=20=EB=B0=8F=20=ED=95=B4=EC=A0=9C?= =?UTF-8?q?=20=ED=95=A8=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../games/SnackGame/game/screen/GameScreen.ts | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/pages/games/SnackGame/game/screen/GameScreen.ts b/src/pages/games/SnackGame/game/screen/GameScreen.ts index 510777b..323a436 100644 --- a/src/pages/games/SnackGame/game/screen/GameScreen.ts +++ b/src/pages/games/SnackGame/game/screen/GameScreen.ts @@ -2,7 +2,7 @@ import gsap from 'gsap'; import { Container, Rectangle, Ticker } from 'pixi.js'; import { ItemBar } from '@pages/games/SnackGame/game/ui/ItemBar'; -import { ItemResponse } from '@utils/types/item.type'; +import { ItemResponse, ItemType } from '@utils/types/item.type'; import { AppScreen, AppScreenConstructor } from './appScreen'; import { SnackgameApplication } from './SnackgameApplication'; @@ -114,15 +114,15 @@ export class GameScreen extends Container implements AppScreen { ); }; this.snackGame.onBomb = (position: SnackGamePosition, data: Snack[]) => { - this.snackGame.setSelectedItem(null); - this.itemBar.setItemsLocked(false); let isGolden = false; data.forEach((snack) => { if (snack.type === SNACK_TYPE.GOLDEN) isGolden = true; }); - return this.itemHandlers.bomb(position, isGolden); + const result = this.itemHandlers.bomb(position, isGolden); + this.releaseItem(); + return result; }; this.snackGame.onSnackGameBoardReset = this.onSnackGameBoardReset.bind(this); @@ -149,11 +149,12 @@ export class GameScreen extends Container implements AppScreen { return { ...item, onUse: async (type) => { - this.snackGame.setSelectedItem(type); + this.selectItem(type); + if (type === 'FEVER_TIME') { await this.itemHandlers.fever(); this.feverTimer.start(30, () => { - this.snackGame.setSelectedItem(null); + this.releaseItem(); }); } }, @@ -185,7 +186,7 @@ export class GameScreen extends Container implements AppScreen { gsap.killTweensOf(this.timer.scale); } - /** 화면 업테이트, 하위 컴포넌트의 update함수를 모두 실행합니다. */ + /** 화면 업데이트, 하위 컴포넌트의 update함수를 모두 실행합니다. */ public update(time: Ticker) { this.snackGame.update(time.deltaMS); this.timer.updateTime(this.snackGame.timer.getTimeRemaining()); @@ -193,6 +194,18 @@ export class GameScreen extends Container implements AppScreen { this.score.setScore(this.snackGame.stats.getScore()); } + /** 아이템 선택 */ + private selectItem(type: ItemType) { + this.snackGame.setSelectedItem(type); + this.itemBar.setItemsLocked(true); + } + + /** 아이템 선택 해제 */ + private releaseItem() { + this.snackGame.setSelectedItem(null); + this.itemBar.setItemsLocked(false); + } + private onSnackGameBoardReset() { for (const snack of this.snackGame.board.snacks) { this.vfx?.animationBeforeStart(snack); From 2ff412f04a4c46eeebcdcff9cbf4e3ff6e6acb93 Mon Sep 17 00:00:00 2001 From: nijuy Date: Tue, 27 Jan 2026 21:07:12 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20Biz=20=EC=8A=A4=ED=8A=B8=EB=A6=AD?= =?UTF-8?q?=20=EC=B2=98=EB=A6=AC=20=ED=83=80=EC=9E=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Streak -> StreakWithMeta --- src/pages/games/SnackGame/game/screen/BizGameScreen.ts | 9 +++++++-- src/pages/games/SnackgameBiz/SnackGameBizBase.tsx | 6 +++--- src/pages/games/SnackgameBiz/util/api.ts | 4 ++-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/pages/games/SnackGame/game/screen/BizGameScreen.ts b/src/pages/games/SnackGame/game/screen/BizGameScreen.ts index a95a7f2..e16f96e 100644 --- a/src/pages/games/SnackGame/game/screen/BizGameScreen.ts +++ b/src/pages/games/SnackGame/game/screen/BizGameScreen.ts @@ -17,6 +17,7 @@ import { SNACK_TYPE, SnackGameMode, Streak, + StreakWithMeta, snackGameGetConfig, } from '../snackGame/SnackGameUtil'; import { BeforeGameStart } from '../ui/BeforeGameStart'; @@ -55,7 +56,7 @@ export class BizGameScreen extends Container implements AppScreen { private app: SnackgameApplication, private getCurrentMode: () => SnackGameMode, private handleStreak: ( - streak: Streak, + streak: StreakWithMeta, isGolden: boolean, ) => Promise, private handleGameStart: () => Promise, @@ -94,6 +95,7 @@ export class BizGameScreen extends Container implements AppScreen { this.snackGame.onPop = this.onPop.bind(this); this.snackGame.onStreak = (data: Snack[]) => { let isGolden = false; + const occurredAt = new Date().toISOString(); const streak = data.reduce((acc: Streak, snack) => { if (snack.type === SNACK_TYPE.GOLDEN) isGolden = true; @@ -103,7 +105,10 @@ export class BizGameScreen extends Container implements AppScreen { return acc; }, []); - return this.handleStreak(streak, isGolden); + return this.handleStreak( + { coordinates: streak, isFever: false, occurredAt }, + isGolden, + ); }; this.snackGame.onSnackGameBoardReset = this.onSnackGameBoardReset.bind(this); diff --git a/src/pages/games/SnackgameBiz/SnackGameBizBase.tsx b/src/pages/games/SnackgameBiz/SnackGameBizBase.tsx index ff14a17..027489d 100644 --- a/src/pages/games/SnackgameBiz/SnackGameBizBase.tsx +++ b/src/pages/games/SnackgameBiz/SnackGameBizBase.tsx @@ -16,7 +16,7 @@ import { LobbyScreen } from '../SnackGame/game/screen/LobbyScreen'; import { SnackgameApplication } from '../SnackGame/game/screen/SnackgameApplication'; import { SnackGameMode, - Streak, + StreakWithMeta, } from '../SnackGame/game/snackGame/SnackGameUtil'; type Props = { @@ -68,7 +68,7 @@ const SnackGameBizBase = ({ replaceErrorHandler }: Props) => { // 게임 진행 관련 functions let session: SnackGameBizDefaultResponse | undefined; let sessionMode: SnackGameMode | undefined; - let cumulativeStreaks: Streak[] = []; + let cumulativeStreaks: StreakWithMeta[] = []; const handleGameStart = async () => { session = await gameApi.start(); @@ -85,7 +85,7 @@ const SnackGameBizBase = ({ replaceErrorHandler }: Props) => { }; // TODO: 지금은 인자로 숫자를 사용하지만, '스트릭' VO를 만들어 사용하면 더 좋겠네요. - const handleStreak = async (streak: Streak, isGolden: boolean) => { + const handleStreak = async (streak: StreakWithMeta, isGolden: boolean) => { cumulativeStreaks = [...cumulativeStreaks, streak]; if (isGolden) { diff --git a/src/pages/games/SnackgameBiz/util/api.ts b/src/pages/games/SnackgameBiz/util/api.ts index ec0001e..21d7197 100644 --- a/src/pages/games/SnackgameBiz/util/api.ts +++ b/src/pages/games/SnackgameBiz/util/api.ts @@ -1,6 +1,6 @@ import axios from 'axios'; -import { Streak } from '@pages/games/SnackGame/game/snackGame/SnackGameUtil'; +import { StreakWithMeta } from '@pages/games/SnackGame/game/snackGame/SnackGameUtil'; import { SnackGameBizDefaultResponse, @@ -39,7 +39,7 @@ export const createGameApiClient = () => { }, verifyStreaks: async ( sessionId: number, - streaks: Streak[], + streaks: StreakWithMeta[], ): Promise => { const { data } = await api.post( `/games/${GAME_ID}/${sessionId}/streaks`, From 6774c3f63494f0b6caa91b1c2ba86b250d75710f Mon Sep 17 00:00:00 2001 From: nijuy Date: Tue, 27 Jan 2026 21:09:55 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix(PausePopup):=20=EA=B2=8C=EC=9E=84=20?= =?UTF-8?q?=EC=A2=85=EB=A3=8C=20=EB=B0=8F=20=EC=9E=AC=EA=B0=9C=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=20=ED=99=9C=EC=84=B1=ED=99=94=20=EC=83=81=ED=83=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/games/SnackGame/game/popup/PausePopup.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/pages/games/SnackGame/game/popup/PausePopup.ts b/src/pages/games/SnackGame/game/popup/PausePopup.ts index f1d3fb5..fd32d13 100644 --- a/src/pages/games/SnackGame/game/popup/PausePopup.ts +++ b/src/pages/games/SnackGame/game/popup/PausePopup.ts @@ -41,6 +41,7 @@ export class PausePopup extends BasePopup { try { this.setButtonsEnabled(false); await this.handleGameEnd(); + this.setButtonsEnabled(true); } catch (error) { this.app.setError(error); } @@ -50,6 +51,7 @@ export class PausePopup extends BasePopup { try { this.setButtonsEnabled(false); await this.handleGameResume(); + this.setButtonsEnabled(true); this.app.dismissPopup(); } catch (error) { this.app.setError(error);