From c8507aed437665224119dd948ca1fbd954da158d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A4=A7=E5=93=A5=E5=A4=A7=E5=93=A5=E7=9A=84=E5=A4=A7?= =?UTF-8?q?=E5=93=A5=E5=93=A5?= Date: Mon, 27 Jul 2026 01:51:08 +0800 Subject: [PATCH] feat(tongji): add milk tea afternoon challenge --- .../endless-game/assets/food/milkTea.jpg | Bin 0 -> 22400 bytes .../tongji/endless-game/build/stress-game.mjs | 21 ++++++++----- .../build/tongjiFoodAssetsPlugin.ts | 3 +- .../tongji/endless-game/game-endless.scss | 14 +++++++++ TUICallKit-Vue3/tongji/endless-game/index.vue | 28 +++++++++++++----- 5 files changed, 51 insertions(+), 15 deletions(-) create mode 100644 TUICallKit-Vue3/tongji/endless-game/assets/food/milkTea.jpg diff --git a/TUICallKit-Vue3/tongji/endless-game/assets/food/milkTea.jpg b/TUICallKit-Vue3/tongji/endless-game/assets/food/milkTea.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c41abb4946c3936bfa39a6510a7a0d70cd19f121 GIT binary patch literal 22400 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 H?0^5+tqCbM literal 0 HcmV?d00001 diff --git a/TUICallKit-Vue3/tongji/endless-game/build/stress-game.mjs b/TUICallKit-Vue3/tongji/endless-game/build/stress-game.mjs index a09c8319..13591d07 100644 --- a/TUICallKit-Vue3/tongji/endless-game/build/stress-game.mjs +++ b/TUICallKit-Vue3/tongji/endless-game/build/stress-game.mjs @@ -16,6 +16,7 @@ const FOOD_GROUPS = [ { title: '粗粮早餐', safe: ['broccoli', 'milk', 'brownRice', 'potato'], danger: 'milletCongee' }, { title: '水果饮品', safe: ['apple', 'strawberry', 'banana', 'mango'], danger: 'orangeJuice' }, { title: '日常饮品', safe: ['milk', 'tea', 'blackCoffee', 'coffee'], danger: 'soda' }, + { title: '下午茶甜饮', safe: ['milk', 'tea', 'apple', 'strawberry'], danger: 'milkTea' }, { title: '南方汤粉', safe: ['pepper', 'greenBean', 'shrimp', 'udon'], danger: 'riceNoodleSoup' }, { title: '北方面食', safe: ['onion', 'celery', 'corn', 'grainMantou'], danger: 'noodleSoup' }, { title: '家常餐桌', safe: ['tofu', 'spinach', 'carrot', 'fish'], danger: 'redBeanCongee' } @@ -423,6 +424,12 @@ function createMetrics() { function runTargetedTailTests(metrics) { for (let groupIndex = 0; groupIndex < FOOD_GROUPS.length; groupIndex += 1) { const nextIndex = (groupIndex + 1) % FOOD_GROUPS.length + const previousGroup = FOOD_GROUPS[groupIndex] + const nextGroup = FOOD_GROUPS[nextIndex] + // 相邻主题允许在相同槽位保留同一种食物。定向测试应选择真正退出下一组的食物, + // 不能固定测试第 0 槽,否则“牛奶→牛奶”会被误报为尾巴未转换。 + const slot = previousGroup.safe.findIndex(key => !nextGroup.safe.includes(key)) + if (slot < 0) continue for (const remaining of [0, 1, 2]) { const state = { run: -1, @@ -430,21 +437,21 @@ function runTargetedTailTests(metrics) { rng: createRng(BASE_SEED + groupIndex * 17 + remaining), metrics, themeIndex: nextIndex, - activeSafeKeys: [...FOOD_GROUPS[nextIndex].safe], + activeSafeKeys: [...nextGroup.safe], transition: { - from: FOOD_GROUPS[groupIndex].safe[0], - to: FOOD_GROUPS[nextIndex].safe[0], - slot: 0, + from: previousGroup.safe[slot], + to: nextGroup.safe[slot], + slot, age: 0 }, - queuedSafeGroups: [[...FOOD_GROUPS[nextIndex].safe]], + queuedSafeGroups: [[...nextGroup.safe]], board: [] } - const fill = FOOD_GROUPS[nextIndex].safe + const fill = nextGroup.safe state.board = Array.from({ length: ROWS * COLS }, (_, index) => tile(fill[index % fill.length])) for (let index = 0; index < remaining; index += 1) state.board[index] = tile(state.transition.from) finishTransitionIfReady(state) - if (state.board.some(item => item.key === FOOD_GROUPS[groupIndex].safe[0])) { + if (state.board.some(item => item.key === state.transition?.from || item.key === previousGroup.safe[slot])) { recordFailure(state, 'targeted_tail_not_converted', `${groupIndex}:${remaining}`) } } diff --git a/TUICallKit-Vue3/tongji/endless-game/build/tongjiFoodAssetsPlugin.ts b/TUICallKit-Vue3/tongji/endless-game/build/tongjiFoodAssetsPlugin.ts index 92286517..df103ccf 100644 --- a/TUICallKit-Vue3/tongji/endless-game/build/tongjiFoodAssetsPlugin.ts +++ b/TUICallKit-Vue3/tongji/endless-game/build/tongjiFoodAssetsPlugin.ts @@ -7,7 +7,8 @@ const FOOD_ICON_FILES = [ 'spinach.jpg', 'carrot.jpg', 'fish.jpg', - 'redBeanCongee.jpg' + 'redBeanCongee.jpg', + 'milkTea.jpg' ] /** diff --git a/TUICallKit-Vue3/tongji/endless-game/game-endless.scss b/TUICallKit-Vue3/tongji/endless-game/game-endless.scss index a87d6dcd..dabdec37 100644 --- a/TUICallKit-Vue3/tongji/endless-game/game-endless.scss +++ b/TUICallKit-Vue3/tongji/endless-game/game-endless.scss @@ -212,6 +212,13 @@ .eg-cell.is-level-high { background: #fff0e4; } .eg-cell.is-milk { background: #edf7ff; } .eg-cell.is-high { border-color: #ef7b45; } +.eg-cell.is-villain { + background: radial-gradient(circle at 50% 38%, #fff7e8 0%, #ffe9d8 70%, #ffddc6 100%); + box-shadow: inset 0 -5rpx 0 rgba(154,57,25,.08), 0 6rpx 15rpx rgba(191,72,31,.16); +} +.eg-cell.is-villain .eg-food-image { animation: egVillainPeek 2.2s ease-in-out infinite; } +.eg-cell.is-villain.is-clearing .eg-food-image, +.eg-cell.is-villain.is-dragging .eg-food-image { animation: none; } .eg-food-image { width: 132rpx; height: 92rpx; margin-top: 7rpx; border-radius: 17rpx; filter: saturate(1.06) contrast(1.03); } .eg-food-image.is-large-square { width: 136rpx; height: 102rpx; margin-top: 2rpx; filter: saturate(1.1) contrast(1.06); } .eg-food-name { margin-top: 8rpx; color: #203d34; font-size: 29rpx; font-weight: 900; letter-spacing: 1rpx; line-height: 1.1; } @@ -469,6 +476,13 @@ 100% { opacity: 0; transform: scale(.32) rotate(7deg); } } +@keyframes egVillainPeek { + 0%, 72%, 100% { transform: translateY(0) rotate(0); filter: saturate(1.08) contrast(1.05); } + 80% { transform: translateY(-3rpx) rotate(-1.5deg); filter: saturate(1.15) contrast(1.08); } + 88% { transform: translateY(0) rotate(1.5deg); } + 95% { transform: translateY(-2rpx) rotate(0); } +} + @keyframes egTaskRewardFlight { 0% { opacity: 0; transform: translate3d(-20rpx, 0, 0) scale(.62) rotate(-8deg); } 16% { opacity: 1; transform: translate3d(0, -24rpx, 0) scale(1.1) rotate(3deg); } diff --git a/TUICallKit-Vue3/tongji/endless-game/index.vue b/TUICallKit-Vue3/tongji/endless-game/index.vue index e15ddade..7ef90138 100644 --- a/TUICallKit-Vue3/tongji/endless-game/index.vue +++ b/TUICallKit-Vue3/tongji/endless-game/index.vue @@ -302,7 +302,7 @@ {{ food.short }} - 橙框食物已更新,普通食物会随掉落逐步加入 + {{ stageMeta.tip || '橙框食物已更新,普通食物会随掉落逐步加入' }} @@ -342,7 +342,8 @@ const LOCAL_FOOD_IMAGES = { spinach: `${LOCAL_FOOD_IMAGE_BASE_URL}spinach.jpg`, carrot: `${LOCAL_FOOD_IMAGE_BASE_URL}carrot.jpg`, fish: `${LOCAL_FOOD_IMAGE_BASE_URL}fish.jpg`, - redBeanCongee: `${LOCAL_FOOD_IMAGE_BASE_URL}redBeanCongee.jpg` + redBeanCongee: `${LOCAL_FOOD_IMAGE_BASE_URL}redBeanCongee.jpg`, + milkTea: `${LOCAL_FOOD_IMAGE_BASE_URL}milkTea.jpg` } const ROWS = 5 @@ -365,7 +366,8 @@ const FLOW_TICK_MS = 100 const ACTIVE_GAME_KEY = 'tongji_endless_active_game_v2' const LEGACY_ACTIVE_GAME_KEY = 'tongji_endless_active_game_v1' const ENDED_GAME_KEY = 'tongji_endless_ended_game_v1' -const ACTIVE_GAME_VERSION = 2 +// 新增“下午茶甜饮”后关卡序号发生变化;旧局不能按新序号恢复,否则高糖目标会错位。 +const ACTIVE_GAME_VERSION = 3 const DANGER_DROP_CHANCE = 0.05 + GAME_DIFFICULTY * 0.01 const COLUMN_GROUP_BIAS = 0.86 - GAME_DIFFICULTY * 0.028 const CHEER_MESSAGES = [ @@ -418,7 +420,11 @@ const FOODS = { soda: { name: '含糖汽水', short: '汽水', emoji: '🥤', color: 'orange', level: 'high', levelLabel: '高糖', high: true, replaceable: true, tip: '含糖饮料中的糖吸收较快,日常应优先选择不加糖的饮品。' }, riceNoodleSoup: { name: '汤粉', short: '汤粉', emoji: '🍜', color: 'orange', level: 'high', levelLabel: '高糖', high: true, replaceable: true, tip: '汤粉以精制米粉为主,实际影响与分量和配菜有关,应注意搭配。' }, noodleSoup: { name: '汤面', short: '汤面', emoji: '🍜', color: 'orange', level: 'high', levelLabel: '高糖', high: true, replaceable: true, tip: '汤面以精细面食为主,汤汁和分量需要注意,具体建议以医生审核为准。' }, - milkTea: { name: '含糖奶茶', short: '奶茶', emoji: '🧋', color: 'orange', level: 'high', levelLabel: '高糖', high: true, replaceable: true, tip: '含糖奶茶可能同时含有较多添加糖和能量,应关注配方与饮用量。' }, + milkTea: { + name: '含糖奶茶', short: '奶茶', emoji: '🧋', color: 'orange', level: 'high', levelLabel: '高糖', + high: true, replaceable: true, largeIcon: true, villain: true, + tip: '含糖奶茶可能同时含有较多添加糖和能量,应关注配方、杯量和饮用频率。游戏中的食物等级需由甄养堂医生最终审核。' + }, tofu: { name: '豆腐', short: '豆腐', emoji: '◻️', color: 'cream', category: '豆制品', level: 'low', levelLabel: '低糖', largeIcon: true }, spinach: { name: '菠菜', short: '菠菜', emoji: '🥬', color: 'yellow', category: '蔬菜', level: 'low', levelLabel: '低糖', largeIcon: true }, carrot: { name: '胡萝卜', short: '胡萝卜', emoji: '🥕', color: 'red', category: '蔬菜', level: 'low', levelLabel: '低糖', largeIcon: true }, @@ -439,6 +445,12 @@ const FOOD_GROUPS = [ { title: '粗粮早餐', safe: ['broccoli', 'milk', 'brownRice', 'potato'], danger: 'milletCongee' }, { title: '水果饮品', safe: ['apple', 'strawberry', 'banana', 'mango'], danger: 'orangeJuice' }, { title: '日常饮品', safe: ['milk', 'tea', 'blackCoffee', 'coffee'], danger: 'soda' }, + { + title: '下午茶甜饮', + safe: ['milk', 'tea', 'apple', 'strawberry'], + danger: 'milkTea', + hint: '奶茶混进下午茶了,别把它三连消除!' + }, { title: '南方汤粉', safe: ['pepper', 'greenBean', 'shrimp', 'udon'], danger: 'riceNoodleSoup' }, { title: '北方面食', safe: ['onion', 'celery', 'corn', 'grainMantou'], danger: 'noodleSoup' }, { title: '家常餐桌', safe: ['tofu', 'spinach', 'carrot', 'fish'], danger: 'redBeanCongee' }, @@ -513,7 +525,7 @@ const impactText = ref('') const impactLevel = ref(1) const camelJackpot = ref({ visible: false, count: 0, kicker: '', title: '', reward: '' }) const stageVisible = ref(false) -const stageMeta = ref({ number: 1, title: '', foods: [] }) +const stageMeta = ref({ number: 1, title: '', foods: [], tip: '' }) const reshuffleVisible = ref(false) const reshuffleDone = ref(false) const reshuffling = ref(false) @@ -1263,6 +1275,7 @@ function cellClasses(tile) { { 'is-selected': selected.value === tile.index, 'is-high': food.high, + 'is-villain': food.villain, 'is-camel-target': camelMode.value && food.replaceable, 'is-clearing': clearingIndices.value.includes(tile.index), 'is-fire-clearing': fireClearingIndices.value.includes(tile.index), @@ -1687,10 +1700,11 @@ function advanceFoodTheme() { stageMeta.value = { number: themeIndex.value + 1, title: nextTheme.title, - foods: [...nextTheme.safe, nextTheme.danger].map(key => ({ key, ...foodOf(key) })) + foods: [...nextTheme.safe, nextTheme.danger].map(key => ({ key, ...foodOf(key) })), + tip: nextTheme.hint || '橙框食物已更新,普通食物会随掉落逐步加入' } stageVisible.value = true - statusText.value = `已进入${nextTheme.title},新食物会随掉落逐步加入` + statusText.value = nextTheme.hint || `已进入${nextTheme.title},新食物会随掉落逐步加入` playSfxLayer('fanfare', 'sparkle', 100, .65) if (stageTimer) clearTimeout(stageTimer) stageTimer = setTimeout(() => { stageVisible.value = false }, 1800)