import { regexTag, RULES } from './rules' import type { Tag } from './tags' import type { Pad } from './types' export const clamp = (x: number, lo = -1, hi = 1) => Math.max(lo, Math.min(hi, x)) // 心情事件即評估標籤,增減量由 rules.ts 的規則表決定 export const MOOD_EVENTS = RULES export type MoodEvent = Tag // 八分區(Mehrabian 的 PAD 八分類)→ 情緒標籤與顏文字 const OCTANTS: Record = { '+++': { label: '興奮', kaomoji: '(≧▽≦)' }, '++-': { label: '撒嬌', kaomoji: '(๑>ᴗ<๑)' }, '+-+': { label: '放鬆', kaomoji: '(´ᴗ`)' }, '+--': { label: '溫順', kaomoji: '(︶ᴗ︶)' }, '---': { label: '無聊', kaomoji: '(-_-)' }, '--+': { label: '不屑', kaomoji: '(¬_¬)' }, '-++': { label: '生氣', kaomoji: '(╬`益´)' }, '-+-': { label: '焦慮', kaomoji: '(;´Д`)' }, } const CALM = { label: '平靜', kaomoji: '(・ω・)' } const CALM_RADIUS = 0.1 export function moodLabel(m: Pad): { label: string; kaomoji: string } { if (Math.abs(m.p) < CALM_RADIUS && Math.abs(m.a) < CALM_RADIUS && Math.abs(m.d) < CALM_RADIUS) return CALM const s = (x: number) => (x >= 0 ? '+' : '-') return OCTANTS[s(m.p) + s(m.a) + s(m.d)]! } /** 以使用者文字的關鍵字對應心情事件 */ export const keywordEvent = (text: string): MoodEvent | null => regexTag(text)