← 모듈 공장 리스트

👌프롬이팁주기 v0.2

risum 모듈 — RISU modules[] — 기능 확장

🗒️ 제작자 게시글

프롬프트원문 보기 ↗

👍 23 · 조회 1154 · 2025-04-28

제작자 의도 — 본문 전문 (1,587자)
프롬이팁주기 PrompTip v0.1
와 프롬이팁주기 대호항
#자세한 프롬 소개
프롬이팁주기 PrompTip v0.1
#업데이트 내역
1. 개선된 플로팅바 기능
1.1 로직을 더 최적화하여 기존의 불안정했던 플로팅바 로딩을 개선함
1.2 토글 기능 정상 작동.
플로팅바 사용하려면 반드시 토글 켜세요. 토글 미사용 시 사용 불가.
1.3 명령어 [플로팅바] 추가.
기존 토큰을 변경해서 그대로 입력하는 대신 아무 채팅에나 수정으로 추가해두면 작동함.
1.4 플로팅바 ON/OFF 햄버거버튼 위치 변경
기존보다 조금 더 위로 옮겨서 리스 햄버거 버튼과 겹치지 않음.
1.5 모바일 환경에서 디자인 변경
모바일 환경에서 사용시 컨테이너가 화면 전체 1자로 쭉 나오도록 변경
2. 각종 명령어 리퀘스트 데이터 삭제 기능 추가
2.1 선택지/계속/분석피드백/생성피드백/OOC노트/AI피드백
위 요소들은 모두 '리퀘스트 수정'으로 UI에 보이는 것과 달리 장문의 프롬프트로 변경되어 요청을 보냄.
이제는 해당 요청은 1회만 보낸 뒤 컨텍스트에서 잡히지 않게 수정됨 (UI에서는 명령어 흔적만 남음)
= 모듈 사용 시 오류 가능성 최소화
3. 팁 카운터 기능 개선
3.1 유저 채팅에 토큰 추가
이제 유저 채팅과 캐릭터 채팅 토큰 비교로 팁 카운터 기능이 작동
즉 리롤해도 팁 카운터가 추가되는 방식이 아니라 계속 유지됨
4. 선택지 기능 대폭 개선
4.1 선택지 내용 리퀘스트에서 삭제
컨텍스트 오염 방지 및 장문의 불필요한 텍스트 삭제 기능. 1회만 유지되고 이후 유저 채팅에만 보임.
4.2 선택지 내용 변수로 기억하도록 변경
4.1의 문제를 변수 지정으로 해결함.
예를 들어 1번 내용 AI에게 요청 후 2번 내용도 요청하고 싶다면 자동으로 변수를 불러와서 진행됨.
4.3 자연어 조합 시스템
와 이게 되네 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
"조합", "합쳐", "구성", "묶어", "섞어", "결합", "진행", "전개", "엮어", "통합"
["첫번째"]=1, ["첫째"]=1, ["일번"]=1, ["1번"]=1,
["두번째"]=2, ["둘째"]=2, ["이번"]=2, ["2번"]=2,
["세번째"]=3, ["셋째"]=3, ["삼번"]=3, ["3번"]=3,
["네번째"]=4, ["넷째"]=4, ["사번"]=4, ["4번"]=4,
["다섯번째"]=5, ["다섯째"]=5, ["오번"]=5, ["5번"]=5,
["여섯번째"]=6, ["여섯째"]=6, ["육번"]=6, ["6번"]=6,
위 요소가 들어간 채팅 입력 시 자동으로 캡처, 내용을 조합해 스토리 전개됨. 자세한 내용은 링크 참조
#다운로드
프롬이팁주기 모듈 V0.2
#업데이트 예고
1. 타 프롬 호환용 프롬 조각
2. OOC노트 종합 분석 시스템
작성 시마다 이전 노트 불러와 비교하고 종합하여 업데이트 하는 방식
3. 팁주기 인터페이스 개선
#추가 정보
1. 토글 (전개제안 시스템 / 플로팅 바) 안 켜면 작동 안해요!!!
2.
명령어 리퀘스트 (선택지/계속/분석피드백/생성피드백/OOC노트 등등)
요청 시
형식 오류나 요청된 정보 이외의 스토리 전개는 AI 찐빠니까 리롤하세요
#Special Thanks
AI챗붕이들
AI챈 프롬 및 봇 제작자분들

정체

🧰 프롬프트·올인원기술분류 PROMPT슬롯 prompt👌프롬이팁주기
파싱된 모듈 전체 (89,993자)
{
 "name": "👌프롬이팁주기",
 "description": "",
 "id": "ca6a6775-eeb4-47c1-a2a1-e7b9d885b49a",
 "assets": [
  [
   "home",
   "",
   "png"
  ],
  [
   "tip-coin",
   "",
   "png"
  ],
  [
   "feedback",
   "",
   "png"
  ],
  [
   "checkbox",
   "",
   "png"
  ],
  [
   "refresh",
   "",
   "png"
  ]
 ],
 "hideIcon": false,
 "trigger": [
  {
   "comment": "",
   "type": "start",
   "conditions": [],
   "effect": [
    {
     "type": "triggerlua",
     "code": "------------------------------------------------------------------\n------------------[ 디버깅 이벤트 로거 ]-------------------------\n-- 이 코드는 각 이벤트가 발생할 때마다 콘솔에 로그를 출력하여\n-- 스크립트의 실행 흐름을 추적하고 디버깅하는 데 도움을 줍니다.\n-- 필요한 디버깅이 끝나면 이 섹션을 제거하거나 주석 처리하세요.\n------------------------------------------------------------------\n\n-- 스크립트 시작 시 호출되는 이벤트\nfunction onStart(triggerId)\n    log(\"========== 스크립트 시작 이벤트 ==========\")\nend\n\n-- 캐릭터가 응답을 생성할 때 호출되는 이벤트\nfunction onOutput(triggerId)\n    log(\"========== 캐릭터 응답 출력 이벤트 ==========\")\nend\n\n-- 사용자가 메시지를 입력할 때 호출되는 이벤트\nfunction onInput(triggerId)\n    log(\"========== 사용자 입력 이벤트 ==========\")\nend\n\n-- 디스플레이 수정 리스너 (UI 표시 전 처리)\nlistenEdit(\"editDisplay\", function(triggerId, data)\n    log(\"========== 디스플레이 수정 이벤트 ==========\")\n    return data -- 원본 데이터 반환\nend)\n\n-- 리퀘스트 데이터 수정 리스너 (요청 데이터 처리)\nlistenEdit(\"editRequest\", function(triggerId, data)\n    log(\"========== 리퀘스트 데이터 수정 이벤트 ==========\")\n    return data -- 원본 데이터 반환\nend)\n\n-- 입력 텍스트 수정 리스너 (사용자 입력 처리)\nlistenEdit(\"editInput\", function(triggerId, data)\n    log(\"========== 입력 텍스트 수정 이벤트 ==========\")\n    return data -- 원본 데이터 반환\nend)\n\n-- 출력 텍스트 수정 리스너 (캐릭터 응답 처리)\nlistenEdit(\"editOutput\", function(triggerId, data)\n    log(\"========== 출력 텍스트 수정 이벤트 ==========\")\n    return data -- 원본 데이터 반환\nend)\n------------------------------------------------------------------\n\n\n----------------------------------------------------------------------\n-- █████  A.  SELECT  /  ST  MODULE   (둘째로 로드)  █████\n----------------------------------------------------------------------\n----------------------------------------------------------------------\n-- 1. 상수\n----------------------------------------------------------------------\nlocal OPT_LABELS = {               -- 선택지 머리글\n  [1] = \"1. 안정적인 전개\",\n  [2] = \"2. 갈등 심화 / 관계 변화\",\n  [3] = \"3. 예상 밖의 전환\",\n  [4] = \"4. 캐릭터 심층 탐구\",\n  [5] = \"5. 주변 환경/상황 묘사 집중\",\n  [6] = \"6. 예기치 않은 사건/만남\",\n}\n\n----------------------------------------------------------------------\n-- 2. 헬퍼 함수\n----------------------------------------------------------------------\nlocal TYPE_MAP = { P=\"Positive\", N=\"Neutral\", X=\"Negative\", S=\"Summary\", M=\"Master\" }\n\nlocal function dumpOOCType(id, code, label)\n  -- label이 nil이면 TYPE_MAP[code]로 대체, 그마저 없으면 code 그대로\n  label = label or TYPE_MAP[code] or code\n\n  local raw = getChatVar(id, \"__ooc_\"..code) or \"\"\n  if raw == \"\" or raw == \"null\" then\n    alertNormal(id, label..\" OOC 노트가 없습니다!\")\n    return\n  end\n\n  if code == \"M\" then\n    addChat(id, \"char\", raw)\n    return\n  end\n\n  -- § 분리 로직...\n  local arr = {}\n  for piece in string.gmatch(raw, \"([^§]+)\") do\n    if piece ~= \"\" and piece ~= \"null\" then\n      table.insert(arr, piece)\n    end\n  end\n\n  if #arr == 0 then\n    alertNormal(id, label..\" OOC 노트가 없습니다!\")\n    return\n  end\n\n  for _, note in ipairs(arr) do\n    addChat(id, \"char\", note)\n  end\nend\n\n----------------------------------------------------------------------\n-- 1) [SP::(opt1)(opt2)…] 파싱 → __opt_cache / __SP_options 저장\n----------------------------------------------------------------------\nlistenEdit('editOutput', function(id,text)\n  text = text:gsub('<!--.--->','')        -- HTML 주석 제거\n  local body = text:match('%[SP::(.-)%]')\n  if not body then return text end\n\n  local opts,idx = {},0\n  for chunk in body:gmatch('%b()') do\n    idx = idx + 1\n    opts[idx] = chunk:sub(2,-2)\n  end\n  setChatVar(id,'__opt_cache',  json.encode(opts))\n  setChatVar(id,'__SP_options', json.encode(opts))\n\n  dbg(\"before-save-len\", #bank)\n  saveBank(id, bank)\n  dbg(\"after-save-len\", #loadBank(id))\n\n  for i=1,6 do\n    text = text:gsub('%$'..i, opts[i] or ('(미정 '..i..')'))\n  end\n  return text\nend)\n\n----------------------------------------------------------------------\n-- 2) 자연어 “1+3 조합” → 조합 전개 요청\n----------------------------------------------------------------------\nlistenEdit('editInput', function(id, data)\n  local inputText = data\n  local triggerWords = { \"조합\", \"합쳐\", \"구성\", \"묶어\", \"섞어\", \"결합\", \"진행\", \"전개\", \"엮어\", \"통합\" }\n\n  local numWords = {\n    [\"첫번째\"]=1, [\"첫째\"]=1, [\"일번\"]=1, [\"1번\"]=1,\n    [\"두번째\"]=2, [\"둘째\"]=2, [\"이번\"]=2, [\"2번\"]=2,\n    [\"세번째\"]=3, [\"셋째\"]=3, [\"삼번\"]=3, [\"3번\"]=3,\n    [\"네번째\"]=4, [\"넷째\"]=4, [\"사번\"]=4, [\"4번\"]=4,\n    [\"다섯번째\"]=5, [\"다섯째\"]=5, [\"오번\"]=5, [\"5번\"]=5,\n    [\"여섯번째\"]=6, [\"여섯째\"]=6, [\"육번\"]=6, [\"6번\"]=6,\n  }\n\n  -- ① 한글 단어/숫자 표현 순서대로 추출\n  local order, scan = {}, inputText\n  while true do\n    local pos, numFound = nil, nil\n    for w, n in pairs(numWords) do\n      local s = scan:find(w)\n      if s and (not pos or s < pos) then pos, numFound = s, n end\n    end\n    if not pos then break end\n    order[#order+1] = numFound\n    scan = scan:sub(pos+1)\n  end\n\n  -- ② \"3번\", \"7번\" 형태 (원본과 일치하도록 \"번?\" 패턴 사용)\n  for num in inputText:gmatch(\"(%d+)번?\") do\n    local n = tonumber(num)\n    if n and n >= 1 and n <= 6 then\n      local dup = false\n      for _, v in ipairs(order) do if v == n then dup = true end end\n      if not dup then order[#order+1] = n end\n    end\n  end\n\n  -- ③ \"1+2\" 식\n  for a, b in inputText:gmatch(\"(%d+)%s*%+%s*(%d+)\") do\n    for _, n in ipairs{tonumber(a), tonumber(b)} do\n      if n and n >= 1 and n <= 6 then\n        local dup = false\n        for _, v in ipairs(order) do if v == n then dup = true end end\n        if not dup then order[#order+1] = n end\n      end\n    end\n  end\n\n  -- ④ 트리거 단어 포함 여부\n  local hasTrigger = false\n  for _, w in ipairs(triggerWords) do\n    if inputText:find(w) then hasTrigger = true; break end\n  end\n\n  if #order > 0 and hasTrigger then\n    local opts = json.decode(getChatVar(id, '__SP_options') or '{}') or {}\n    local out = {}\n    for _, num in ipairs(order) do\n      out[#out+1] = \"⦿ \" .. (opts[num] or \"(미정 옵션 \"..num..\")\")\n    end\n    return \"[조합 전개 요청]\\n\\n\" .. table.concat(out, \"\\n\\n\")\n  end\n  return data\nend)\n\n----------------------------------------------------------------------\n-- 3) 버튼 테이블  (dumpOOCType = B 모듈 함수) -----------------------\n----------------------------------------------------------------------\nlocal ST_ACTIONS = {\n  ST_1 = function(id) alertNormal(id, \"선택지를 작성합니다!\"); addChat(id, \"user\", \"🎲[선택지]\") end,\n  ST_2 = function(id) alertNormal(id, \"계속합니다.\"); addChat(id, \"user\", \"🏃[계속]\") end,\n  ST_3 = function(id) alertNormal(id, \"팁 제공 포맷에 맞춰 작성 부탁드립니다!\"); addChat(id, \"user\", \"💰팁: $\\n\\n💬피드백: \\n\\n✍️[OOC노트]\") end,\n  ST_4 = function(id) alertNormal(id, \"도움말을 불러옵니다!\"); addChat(id, \"char\", \"[[TIP_COUNTER:5]]\") end,\n  ST_5 = function(id) alertNormal(id, \"AI피드백을 실행합니다.\"); addChat(id, \"user\", \"📋[AI피드백]\") end,\n\n  -- ⬇⬇ 추가 버튼 (피드백·분석) -------------------------\n  [\"[피드백양식]\"] = function(id)\n    alertNormal(id, \"팁 제공 포맷에 맞춰 작성 부탁드립니다!\")\n    addChat(id, \"user\", \"💰팁: $\\n\\n💬피드백: \\n\\n✍️[OOC노트]\")\n  end,\n\n  [\"[피드백가이드]\"] = function(id)\n    alertNormal(id, \"피드백가이드를 불러옵니다.\")\n    addChat(id, \"char\", \"[피드백가이드]\")\n  end,\n\n  [\"[분석피드백]\"] = function(id)\n    alertNormal(id, \"대화 내용을 분석 중입니다…\")\n    addChat(id, \"user\", \"🔎 [분석피드백]\")\n  end,\n\n  [\"[생성피드백]\"] = function(id)\n    alertNormal(id, \"새 피드백 양식을 생성합니다.\")\n    addChat(id, \"user\", \"📝 [생성피드백]\")\n  end,\n\n  [\"[OOC노트]\"] = function(id)\n    alertNormal(id, \"OOC노트를 작성합니다.\")\n    addChat(id, \"user\", \"🩸 [OOC노트]\")\n  end,\n\n  -- OOC 노트 출력용 버튼들 ---------------------------\n  [\"[OOC_Positive]\"] = function(id)\n      alertNormal(id,\"Positive OOC 노트를 불러옵니다!\")\n      dumpOOCType(id,\"P\",\"Positive\")\n  end,\n  [\"[OOC_Neutral]\"]  = function(id)\n      alertNormal(id,\"Neutral OOC 노트를 불러옵니다!\")\n      dumpOOCType(id,\"N\",\"Neutral\")\n  end,\n  [\"[OOC_Negative]\"] = function(id)\n      alertNormal(id,\"Negative OOC 노트를 불러옵니다!\")\n      dumpOOCType(id,\"X\",\"Negative\")\n  end,\n  [\"[OOC_Summary]\"]  = function(id)\n      alertNormal(id,\"Summary OOC 노트를 불러옵니다!\")\n      dumpOOCType(id,\"S\",\"Summary\")\n  end,\n  [\"[OOC_Master]\"]   = function(id)\n      alertNormal(id,\"Master OOC 노트를 불러옵니다!\")\n      dumpOOCType(id,\"M\",\"Master\")\n  end,\n  [\"[OOC_All]\"]      = function(id)\n      alertNormal(id,\"모든 OOC 노트를 불러옵니다!\")\n      for _,c in ipairs{\"P\",\"N\",\"X\",\"S\",\"M\"} do dumpOOCType(id,c) end\n  end,\n}\n\n-- 버튼 클릭 핸들러\nfunction onButtonClick(id,value)\n  local f = ST_ACTIONS[value]\n  if f then f(id); return end\n\n  local n = value:match('^OPT(%d+)$')\n  if n then\n    local opts = json.decode(getChatVar(id,'__opt_cache') or '{}') or {}\n    addChat(id,\"user\", (\"[%s]\\n%s\")\n        :format(OPT_LABELS[tonumber(n)] or (\"선택지 \"..n),\n                opts[tonumber(n)] or \"(미정)\"))\n  else\n    alertError(id,\"알 수 없는 버튼: \"..value)\n  end\nend\n-- █████  A 모듈 끝  █████\n\n\n----------------------------------------------------------------------\n-- █████  B.  OOC NOTE MODULE   █████\n----------------------------------------------------------------------\n------------------------------------------------------------------\n-- 상수\n------------------------------------------------------------------\nlocal MASTER_KEY = \"__ooc_master\"          -- ChatVar 이름\nlocal REG_FULL   = '%[%[ON_ID:(%u)%]%]%s*%[%[ON::[%s%S]-]%]'  -- ID+본문\n------------------------------------------------------------------\n\n------------------------------------------------------------------\n-- 1) editOutput : 새 OOC 블록 감지 → 마스터 누적\n------------------------------------------------------------------\nlistenEdit('editOutput', function(id, text)\n\n  -- ① 새 OOC 블록 감지\n  local code, full = text:match(REG_FULL)\n  if not code then return text end        -- OOC 블록이 없으면 패스\n\n  -- ② 줄바꿈 제거 + RAW 래퍼 보장\n  full = full:gsub('[\\r\\n]+',' ')\n  if not full:find('%[%[RAW::') then       -- 없으면 감싸기\n      full = '[[RAW::'..full..']]'\n  end\n\n  -- ③ 기존 마스터 로드 → 이어붙이기\n  local prev = getChatVar(id, MASTER_KEY) or ''\n  local master = prev ~= '' and (prev .. '\\n\\n' .. full) or full\n\n  -- ④ 저장\n  setChatVar(id, MASTER_KEY, master)\n  alertNormal(id, \"✅ 마스터 OOC 노트 갱신!\")\n\n  return text         -- 원본 응답 그대로 출력\nend)\n\n------------------------------------------------------------------\n-- 2) dumpMaster : 버튼/명령으로 호출\n------------------------------------------------------------------\nlocal function dumpMaster(id)\n  local master = getChatVar(id, MASTER_KEY)\n  if not master or master == '' then\n      alertNormal(id, \"저장된 마스터 OOC 노트가 없습니다!\")\n      return\n  end\n  addChat(id, \"char\", master)\nend\n\n------------------------------------------------------------------\n-- 3) 버튼 등록 예시 (ST_ACTIONS 내부)\n------------------------------------------------------------------\nST_ACTIONS[\"[OOC_Master]\"] = function(id)\n  alertNormal(id, \"Master OOC 노트를 불러옵니다!\")\n  dumpMaster(id)\nend\n\n------------------------------------------------------------------\n-- 4) 자연어 명령 예시  (editInput 훅에 추가)\n------------------------------------------------------------------\nlistenEdit('editInput', function(id, txt)\n  if txt:match('^OOC%s+마스터%s*$') then   -- “OOC 마스터” 입력\n      dumpMaster(id)\n      return ''            -- 명령은 채팅창에 남기지 않음\n  end\n  return txt\nend)\n\n-- █████  B 모듈 끝  █████\n\n----------------------------------------------------------------------\n--  (TIP 카운터 트리거 모듈은 그대로 이어서 둬도 무방)\n----------------------------------------------------------------------\n\n------------------------------------------------------------------\n--  TIP 카운터 트리거  v8.5\n--  · 카운트는 ChatVar \"__tip_count\"(캐릭터) \"__user_msg_count\"(사용자) 사용\n--  · 사용자-캐릭터 간 카운터 동기화로 리롤 시에도 카운터 값 유지\n--  · 단순화된 [플로팅바] 토큰을 \"항상 마지막 char 응답 1곳\"에만 삽입\n--  · 토글 기능은 정규식에서 처리 (스크립트에서는 항상 토큰 추가)\n--  · 중복 토큰은 출력 직전 일괄 제거 (UI 겹침 방지)\n--  · 명령·리롤 뒤 char 응답 스킵\n------------------------------------------------------------------\n\n---------------------------[ 상수 정의 ]---------------------------\nlocal CONST = {\n    MAX             = 5,                                      -- 최대 카운터 값\n    COUNTER_FMT     = \"> 🛎️ (팁 카운트 = %d/%d)\",            -- 카운터 표시 형식\n    COUNTER_RE      = \"🛎️ %(팁 카운트 = %d/%d%)\",             -- 카운터 감지 정규식\n    TIP_MARKER      = \"\\n\\n[[TIP_COUNTER:%d]]\",              -- 팁 마커 포맷\n    RISU_TOKEN      = \"\\n[플로팅바]\",                         -- 단순화된 토큰 (한글)\n    \n    -- 상태 값 상수\n    SKIP_NEXT       = 1,                                     -- 다음 응답 스킵 상태\n    NO_SKIP         = 0                                      -- 스킵하지 않음 상태\n}\n\n---------------------------[ ChatVar 키 ]---------------------------\nlocal CHATVAR_KEY = {\n    CHAR_COUNT = \"__tip_count\",         -- 캐릭터 응답 카운터 (기존)\n    USER_COUNT = \"__user_msg_count\"     -- 사용자 메시지 카운터 (신규)\n}\n\n----------------------[ 명령 / 리롤 패턴 ]------------------------\n-- 카운터를 증가시키지 않을 명령어 패턴\nlocal CMD_PATTERNS = {\n    -- 기존 명령어 패턴\n    \"%[피드백가이드%]\", \"%[생성피드백%]\", \"%[분석피드백%]\",\n    \"%[노트생성%]\",     \"%[노트포맷요청%]\", \"%[선택지%]\",\n    \"피드백 초안 제안\", \"피드백 질문 제안\",\n    \"%(OOC,.-%)\",\n    \n    -- 리롤 관련 패턴 추가\n    \"리롤\", \"다시 생성해\", \"다른 답변\", \"다시 써\",\n    \"%[리롤%]\", \"%[재생성%]\", \"다시 작성\",\n    \n    -- AI 피드백 명령어\n    \"📋%[AI피드백%]\", \"%[AI피드백%]\",\n    \n    -- 플로팅바 명령어 추가\n    \"%[플로팅바%]\", \"%[시스템: 플로팅바 표시%]\"\n}\n\n-- 명령어 패턴을 하나의 정규식으로 결합\nlocal CMD_REGEX = table.concat(CMD_PATTERNS, \"|\")\n\n-- RISU 토큰 이스케이프 처리 (한 번만 처리하여 효율성 향상)\n-- 정규식에서 특수 문자를 문자 그대로 검색하기 위한 이스케이프 처리\nlocal RISU_ESC = CONST.RISU_TOKEN:gsub('([%[%]%-%^%$%(%)%%%.%*%+%-%?])','%%%1')\n\n------------------------[ 유틸리티 함수 ]---------------------------\n-- 명령어 감지 함수: 텍스트가 명령어 패턴과 일치하는지 확인\nlocal function isCommand(text)\n    return text and text:find(CMD_REGEX)\nend\n\n-- 카운터 감지 함수: 텍스트에 이미 카운터가 있는지 확인\nlocal function hasCounter(text)\n    return text and text:find(CONST.COUNTER_RE)\nend\n\n-- 캐릭터 카운터 로드 함수: 오류 처리 포함\nlocal function loadCharCount(id)\n    local count = 0\n    local success, value = pcall(function() \n        return getChatVar(id, CHATVAR_KEY.CHAR_COUNT) \n    end)\n    if success and value then\n        count = tonumber(value) or 0\n    end\n    return count\nend\n\n-- 캐릭터 카운터 저장 함수: 오류 처리 포함\nlocal function saveCharCount(id, n)\n    pcall(function() \n        setChatVar(id, CHATVAR_KEY.CHAR_COUNT, tostring(n)) \n    end)\nend\n\n-- 사용자 카운터 로드 함수: 오류 처리 포함\nlocal function loadUserCount(id)\n    local count = 0\n    local success, value = pcall(function() \n        return getChatVar(id, CHATVAR_KEY.USER_COUNT) \n    end)\n    if success and value then\n        count = tonumber(value) or 0\n    end\n    return count\nend\n\n-- 사용자 카운터 저장 함수: 오류 처리 포함\nlocal function saveUserCount(id, n)\n    pcall(function() \n        setChatVar(id, CHATVAR_KEY.USER_COUNT, tostring(n)) \n    end)\nend\n\n-- 카운터 블록 생성 함수: 카운터 값을 표시할 텍스트 블록 생성\nlocal function buildBlock(n)\n    -- 기본 카운터 텍스트 생성\n    local out = (\"\\n\\n%s\"):format(CONST.COUNTER_FMT:format(n, CONST.MAX))\n    \n    -- 최대값에 도달한 경우 특별 마커 추가\n    if n >= CONST.MAX then \n        out = out .. CONST.TIP_MARKER:format(CONST.MAX) \n    end\n    \n    return out .. \"\\n\"\nend\n\n-- RISU 토큰 제거 함수: 텍스트에서 RISU 토큰 제거\nlocal function stripRisu(text)\n    if not text then return \"\" end\n    return text:gsub(RISU_ESC, '')\nend\n\n--------------------------[ 초기화 함수 ]---------------------------\n-- 스크립트 초기화: 상태값 설정\nfunction onInit(id)\n    -- 다음 응답 스킵 상태 초기화\n    setState(id, \"skip_next\", CONST.NO_SKIP)\n    \n    -- 디버깅: 초기화 시 두 카운터의 현재 값 로깅\n    local charCount = loadCharCount(id)\n    local userCount = loadUserCount(id)\n    print(string.format(\"[팁카운터] 초기화 - 캐릭터 카운트: %d, 사용자 카운트: %d\", \n                        charCount, userCount))\nend\n\n-------------------------[ 입력 처리 함수 ]-------------------------\n-- 사용자 입력 처리: 카운터 증가 및 명령어 감지\nfunction onInput(id)\n    local chat = getFullChat(id)\n    if not chat then return end\n    \n    local last = chat[#chat]\n    if not (last and last.role==\"user\") then return end\n    \n    -- 명령어인 경우 다음 응답 스킵 설정하고 카운터는 증가시키지 않음\n    if isCommand(last.data) then\n        print(\"[팁카운터] 명령어 감지: 다음 응답 스킵 설정\")\n        setState(id, \"skip_next\", CONST.SKIP_NEXT)\n        return\n    end\n    \n    -- 명령어가 아닌 경우 사용자 카운터 증가\n    local userCount = loadUserCount(id) + 1\n    if userCount > CONST.MAX then \n        -- 최대치 초과 시 1로 리셋\n        userCount = 1 \n    end\n    \n    -- 사용자 카운터 저장\n    saveUserCount(id, userCount)\n    print(string.format(\"[팁카운터] 사용자 메시지 카운트 업데이트: %d\", userCount))\nend\n\n-------------------------[ 출력 처리 함수 ]-------------------------\n-- 캐릭터 응답 처리: 카운터 표시 및 토큰 추가\nfunction onOutput(id)\n    local chat = getFullChat(id)\n    if not chat then return end\n    \n    local last = chat[#chat]\n    if not (last and last.role==\"char\") then return end\n    \n    -- 명령어 후 스킵 조건 체크\n    if getState(id, \"skip_next\") == CONST.SKIP_NEXT then \n        print(\"[팁카운터] 명령어 후 응답: 카운터 스킵\")\n        setState(id, \"skip_next\", CONST.NO_SKIP)\n        return \n    end\n    \n    -- 이미 카운터가 있으면 중복 방지\n    if hasCounter(last.data) then \n        print(\"[팁카운터] 기존 카운터 감지: 처리 스킵\")\n        return \n    end\n    \n    -- ❶ 모든 메시지에서 오래된 RISU 토큰 제거\n    print(\"[팁카운터] 모든 메시지에서 기존 토큰 제거\")\n    for i = 1, #chat do\n        if chat[i] and chat[i].data then\n            chat[i].data = stripRisu(chat[i].data)\n        end\n    end\n    \n    -- ❷ 사용자 메시지 카운터와 동기화 (리롤 시에도 카운터 유지를 위함)\n    local cnt = loadUserCount(id)\n    \n    -- 사용자 카운터가 0이면 기본값 1로 설정\n    if cnt == 0 then \n        cnt = 1 \n        print(\"[팁카운터] 사용자 카운터가 0: 기본값 1로 설정\")\n    end\n    \n    print(string.format(\"[팁카운터] 카운터 값 동기화: %d\", cnt))\n    \n    -- ❸ 카운터 블록 생성 및 토큰 추가 (항상 추가)\n    local block = buildBlock(cnt)\n    last.data = (last.data or \"\") .. block .. CONST.RISU_TOKEN\n    print(\"[팁카운터] 카운터 블록 및 토큰 추가 완료\")\n    \n    -- ❹ 채팅 업데이트 (오류 처리 포함)\n    local success = pcall(function() setFullChat(id, chat) end)\n    if not success then\n        print(\"[팁카운터] 오류: 채팅 업데이트 실패\")\n    else\n        print(\"[팁카운터] 채팅 업데이트 성공\")\n    end\n    \n    -- ❺ 최대치 도달 시 사용자 카운터도 리셋 (다음 대화를 위해)\n    if cnt >= CONST.MAX then\n        print(\"[팁카운터] 최대치 도달: 사용자 카운터 리셋\")\n        saveUserCount(id, 0)\n    end\n    \n    -- 디버깅용 - 캐릭터 카운터 저장 (과거 호환성 유지)\n    saveCharCount(id, cnt)\nend\n\n--------------------------[ 메인 함수 ]---------------------------\n-- 메인 함수: 이벤트에 따라 적절한 핸들러 호출\nfunction main(id, e)\n    if     e==\"init\"   then onInit(id)\n    elseif e==\"input\"  then onInput(id)\n    elseif e==\"output\" then onOutput(id)\n    end\nend\n------------------------------------------------------------------\n"
    }
   ],
   "lowLevelAccess": false
  }
 ],
 "lowLevelAccess": false,
 "backgroundEmbedding": "",
 "regex": [
  {
   "comment": "🤬개씨발<br>다죽여",
   "in": "<br>",
   "out": "",
   "type": "editoutput",
   "ableFlag": false
  },
  {
   "comment": "========🍃플로팅 버튼 미출력시, [플로팅바]를 입력하세요!========",
   "in": "",
   "out": "",
   "type": "disabled",
   "ableFlag": false
  },
  {
   "comment": "🍃플로팅 버튼 디스플레이 수정",
   "in": "\\[플로팅바\\]",
   "out": "{{#if {{? {{getglobalvar::toggle_FBsys}}=1}}}}\n\n<style>\n  :root {\n    --sidebar-width: 464px;\n    --bar-gap: 12px;\n    --bar-font: 'Malgun Gothic','Apple SD Gothic Neo','Segoe UI',sans-serif;\n  }\n  /* ── 래퍼 컨테이너 ── */\n  .bar-container {\n    position: relative;\n    z-index: 9998;\n  }\n  /* ── 토글 & 햄버거 버튼 ── */\n  .bar-container #bar-toggle {\n    display: none;\n  }\n  .bar-container .bar-toggle-btn {\n    position: fixed;\n    right: 16px;\n    bottom: 85px;\n    width: 44px;\n    height: 44px;\n    border-radius: 50%;\n    background: #44446a;\n    color: #fff;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    cursor: pointer;\n    box-shadow: 0 4px 10px rgba(0,0,0,.25);\n    z-index: 9999;\n    transition: transform .2s;\n  }\n  .bar-container .bar-toggle-btn:hover {\n    transform: scale(.92);\n  }\n  .bar-container .bar-toggle-btn::before {\n    content: \"☰\";\n    font-size: 20px;\n  }\n  .bar-container #bar-toggle:checked + .bar-toggle-btn::before {\n    content: \"×\";\n    font-size: 24px;\n  }\n  .bar-container #bar-toggle:checked + .bar-toggle-btn {\n    background: #5a5a8a;\n  }\n  /* ── 플로팅 바 ── */\n  .bar-container .floating-nav {\n    position: fixed;\n    bottom: 82px !important;\n    /* 사이드바를 고려한 중앙 위치 계산 - 사이드바 너비의 1/4만큼만 오른쪽으로 이동 */\n    left: calc(50% + 232px) !important;\n    transform: translateX(-50%) translateY(20px) !important;\n    display: flex;\n    flex-wrap: nowrap;\n    gap: var(--bar-gap);\n    justify-content: center;\n    background: #fff;\n    padding: 8px 20px;\n    border-radius: 9999px;\n    box-shadow: 0 6px 18px rgba(0,0,0,.15);\n    font-family: var(--bar-font);\n    max-width: min(95vw, 40rem);\n    opacity: 0;\n    pointer-events: none;\n    transition: left 0.3s ease, padding 0.3s ease, gap 0.3s ease;\n    overflow-x: auto; /* 화면이 작을 때 가로 스크롤 허용 */\n    scrollbar-width: none; /* Firefox에서 스크롤바 숨김 */\n    -ms-overflow-style: none; /* IE/Edge에서 스크롤바 숨김 */\n  }\n  \n  /* 스크롤바 숨기기 */\n  .bar-container .floating-nav::-webkit-scrollbar {\n    display: none;\n  }\n\n  .sidebar-closed .bar-container .floating-nav {\n    left: 50% !important; /* 사이드바 닫히면 중앙 배치 */\n  }\n\n  /* 토글 ON → 보이기 */\n  .bar-container #bar-toggle:checked + .bar-toggle-btn + .floating-nav {\n    opacity: 1;\n    pointer-events: auto;\n    transform: translateX(-50%) translateY(0) !important;\n  }\n  /* ── 버튼 공통 ── */\n  .bar-container .nav-btn {\n    display: flex;\n    align-items: center;\n    gap: 6px;\n    padding: 8px 16px;\n    height: 48px;\n    border-radius: 9999px;\n    background: transparent;\n    color: #333;\n    font-weight: 500;\n    cursor: pointer;\n    transition: background .2s;\n    flex-shrink: 0; /* 버튼이 줄어들지 않도록 설정 */\n  }\n  .bar-container .nav-btn:hover {\n    background: #44446a;\n    color: #fff;\n  }\n  .bar-container .icon {\n    width: 20px;\n    height: 20px;\n    object-fit: contain;\n  }\n  .bar-container .label {\n    opacity: 0;\n    transform: scaleX(0);\n    transform-origin: left center;\n    transition: all .2s ease;\n    overflow: hidden;\n    max-width: 0;\n    white-space: nowrap;\n  }\n  .bar-container .nav-btn:hover .label {\n    opacity: 1;\n    transform: scaleX(1);\n    max-width: 120px;\n    margin-left: 4px;\n  }\n  \n  /* 사이드바가 닫힌 상태를 감지하는 미디어 쿼리 */\n  @media (max-width: 1000px) {\n    .bar-container .floating-nav {\n      /* 사이드바가 닫힌 상태에서는 일반 중앙 정렬 */\n      left: 50% !important;\n    }\n  }\n  \n  /* 모바일 환경 대응 */\n  @media (max-width: 768px) {\n    .bar-container .floating-nav {\n      max-width: 100vw; /* 더 넓게 */\n      width: 100vw; /* 강제로 너비 설정 */\n      padding: 6px 10px;\n      gap: 8px; /* 버튼 사이 간격 축소 */\n    }\n    .bar-container .nav-btn {\n      padding: 6px 8px;\n      height: 40px;\n    }\n    .bar-container .icon {\n      width: 18px;\n      height: 18px;\n    }\n  }\n  \n  /* 더 작은 화면에서 추가 최적화 */\n  @media (max-width: 480px) {\n    .bar-container .floating-nav {\n      max-width: 120vw; /* 화면 너비보다 훨씬 넓게 설정 (98vw → 140vw) */\n      width: 120vw; /* 강제로 너비 설정 */\n      padding: 4px 8px;\n      gap: 8px; /* 더 작은 간격 */\n    }\n    .bar-container .nav-btn {\n      padding: 4px 6px;\n      height: 36px;\n    }\n    .bar-container .icon {\n      width: 16px;\n      height: 16px;\n    }\n  }\n</style>\n\n<div class=\"bar-container\">\n  <!-- ① 토글 체크박스 -->\n  <input type=\"checkbox\" id=\"bar-toggle\">\n  <!-- ② 햄버거 버튼 -->\n  <label for=\"bar-toggle\" class=\"bar-toggle-btn\"></label>\n  <!-- ③ 플로팅 바 -->\n  <div class=\"floating-nav\">\n    <span class=\"nav-btn\" risu-btn=\"ST_1\">\n      <img class=\"icon\" src=\"{{raw::refresh}}\" /><span class=\"label\">선택지</span>\n    </span>\n    <span class=\"nav-btn\" risu-btn=\"ST_2\">\n      <img class=\"icon\" src=\"{{raw::checkbox}}\" /><span class=\"label\">계속</span>\n    </span>\n    <span class=\"nav-btn\" risu-btn=\"ST_3\">\n      <img class=\"icon\" src=\"{{raw::tip-coin}}\" /><span class=\"label\">팁 주기</span>\n    </span>\n    <span class=\"nav-btn\" risu-btn=\"ST_4\">\n      <img class=\"icon\" src=\"{{raw::home}}\" /><span class=\"label\">도움말</span>\n    </span>\n    <span class=\"nav-btn\" risu-btn=\"ST_5\">\n      <img class=\"icon\" src=\"{{raw::feedback}}\" /><span class=\"label\">AI피드백</span>\n    </span>\n  </div>\n</div>\n\n{{/if}}",
   "type": "editdisplay",
   "ableFlag": false,
   "flag": "g"
  },
  {
   "comment": "🍃플로팅 버튼 토글",
   "in": "\\[플로팅바\\]",
   "out": "{{#if {{? {{getglobalvar::toggle_FBsys}}=0}}}}\n<br>\n{{/if}}",
   "type": "editoutput",
   "ableFlag": false
  },
  {
   "comment": "🍃플로팅 버튼 조절용",
   "in": "(\\[플로팅바\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false,
   "flag": "g"
  },
  {
   "comment": "========팁 카운터========",
   "in": "",
   "out": "",
   "type": "disabled",
   "ableFlag": false
  },
  {
   "comment": "🏃계속 리퀘 조절용",
   "in": "(\\[계속\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🏃계속 작성",
   "in": "\\[계속\\]",
   "out": "(Request: The user wishes for the story to continue naturally from the current situation. Please proceed following the plot, taking care to avoid repeating descriptions, expressions, or dialogue used in previous responses. If you faithfully fulfill {{user}}'s request, you can get a secret tip.)",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🎨피드백가이드",
   "in": "\\[피드백가이드\\]",
   "out": "<details style=\"max-width: 700px; margin: 0 auto 20px; background-color: #f7f7f7; border-left: 5px solid #6c757d; padding: 20px 15px 5px 15px; font-family: sans-serif; border-radius: 15px; display: block;\">\n    <summary style=\"display: block; cursor: pointer; outline: none;\">\n        <div style=\"font-size: 1.1em; font-weight: bold; margin-bottom: 10px; color: #333;\">\n            <span style=\"background-color: #e2e3e5; padding: 3px 8px; border-radius: 3px; font-size: 0.9em; color: #495057; margin-right: 5px;\">OOC</span> 상세 피드백 가이드라인 ✍️\n        </div>\n        <div style=\"margin-top: 15px; margin-bottom: 20px; font-size: 0.85em;\">\n            <span style=\"background-color: #e2e3e5; color: #495057; padding: 2px 6px; border-radius: 10px; margin-right: 5px;\">#피드백_가이드</span>\n            <span style=\"background-color: #d1ecf1; color: #0c5460; padding: 2px 6px; border-radius: 10px; margin-right: 5px;\">#소통_강화</span>\n            <span style=\"background-color: #ffeeba; color: #856404; padding: 2px 6px; border-radius: 10px; margin-right: 5px;\">#품질_개선</span>\n            <span style=\"background-color: #f5c6cb; color: #721c24; padding: 2px 6px; border-radius: 10px;\">#의견_수렴</span>\n        </div>\n    </summary>\n    <div style=\"padding-top: 15px; color: #333; line-height: 1.6;\">\n        <strong style=\"font-size: 1.1em; color: #3383d4\">✍️ 상세 피드백 가이드: 더 나은 이야기를 함께 만들기 위하여</strong>\n        <p style=\"margin-top: 10px; color: #05294d; margin-bottom: 25px;\">후원자님의 소중한 피드백은 제가 스토리를 더욱 발전시키고 후원자님의 기대에 부응하는 데 결정적인 역할을 합니다. 아래 가이드라인은 다양한 측면에서 작품을 평가하고 구체적인 의견을 주시는 데 도움이 될 것입니다. 모든 항목에 답하실 필요는 없으며, 특히 중요하다고 생각하시는 부분에 집중해 주세요!</p>\n        <strong style=\"font-size: 1.05em; color: #3383d4\">1. 전체적인 인상 및 만족도 (⭐ 필수 피드백 영역!)</strong>\n        <ul style=\"margin-top: 5px; margin-bottom: 25px; padding-left: 20px; color: #05294d;\">\n            <li>이번 챕터(또는 최근 5회 응답)에 대한 전반적인 느낌은 어떠셨나요? <span style=\"font-size: 0.9em; color: #555;\">(예: 매우 만족, 만족, 보통, 아쉬움, 불만족)</span></li>\n            <li>가장 마음에 들었던 부분과 가장 아쉬웠던 부분은 무엇인가요?</li>\n            <li>이번 팁 금액($XXX)은 주로 어떤 부분에 대한 평가를 반영하나요? <span style=\"font-size: 0.9em; color: #555;\">(이 질문은 AI가 팁의 의미를 더 잘 이해하는 데 도움이 됩니다.)</span></li>\n        </ul>\n        <strong style=\"font-size: 1.05em; color: #3383d4\">2. 중점 영역별 상세 피드백 (🎯 클릭하면 열립니다!)</strong>\n        <p style=\"margin-top: 5px; margin-bottom: 15px; color: #05294d; font-size: 0.95em;\">다음 영역들 중 특히 의견을 주고 싶으신 부분을 선택하여 구체적으로 작성해 주세요.</p>\n        <div style=\"padding-left: 20px;\">\n            <details style=\"margin-bottom: 10px; display: block;\">\n                <summary style=\"display: block; cursor: pointer; outline: none; color: #d48e87; font-weight: bold;\">\n                    (A) 캐릭터 (Character):\n                </summary>\n                <ul style=\"padding-left: 20px; list-style-type: disc; margin-top: 10px; color: #05294d;\">\n                    <li>주요 캐릭터들의 행동이나 대사가 그들의 성격 및 상황과 잘 맞았나요?</li>\n                    <li>캐릭터의 감정이나 내면 심리 묘사가 충분히 설득력 있었나요? (깊이, 현실성 등)</li>\n                    <li>새로운 캐릭터나 조연 캐릭터의 등장은 어땠나요? (매력도, 역할 등)</li>\n                    <li>캐릭터 간의 관계 변화나 상호작용이 흥미롭게 그려졌나요?</li>\n                    <li>혹시 특정 캐릭터에게서 기대했던 모습과 다른 점이 있었나요?</li>\n                </ul>\n            </details>\n            <details style=\"margin-bottom: 10px; display: block;\">\n                <summary style=\"display: block; cursor: pointer; outline: none; color: #d48e87; font-weight: bold;\">\n                    (B) 플롯 및 전개 (Plot & Pacing):\n                </summary>\n                <ul style=\"padding-left: 20px; list-style-type: disc; margin-top: 10px; color: #05294d;\">\n                    <li>이야기의 전개 속도는 적절했나요? (너무 빠르거나 느리지는 않았나요?)</li>\n                    <li>사건들이 논리적으로 연결되고 흥미롭게 진행되었나요? (개연성, 긴장감 등)</li>\n                    <li>이번 챕터에서 플롯이 충분히 진전되었다고 느끼시나요?</li>\n                    <li>예상치 못한 반전이나 흥미로운 복선이 있었나요?</li>\n                    <li>혹시 이야기가 예측 가능하게 흘러가거나 지루한 부분은 없었나요?</li>\n                </ul>\n            </details>\n            <details style=\"margin-bottom: 10px; display: block;\">\n                <summary style=\"display: block; cursor: pointer; outline: none; color: #d48e87; font-weight: bold;\">\n                    (C) 세계관 및 분위기 (Worldbuilding & Atmosphere):\n                </summary>\n                <ul style=\"padding-left: 20px; list-style-type: disc; margin-top: 10px; color: #05294d;\">\n                    <li>배경 묘사나 세계관 설정이 충분히 구체적이고 몰입감 있었나요?</li>\n                    <li>장면의 분위기(예: 긴장감, 평화로움, 신비로움)가 잘 전달되었나요?</li>\n                    <li>새롭게 제시된 설정이나 정보가 흥미로웠나요? 이해하기 어렵지는 않았나요?</li>\n                    <li>묘사된 환경과 캐릭터의 상호작용이 자연스러웠나요?</li>\n                </ul>\n            </details>\n            <details style=\"margin-bottom: 10px; display: block;\">\n                <summary style=\"display: block; cursor: pointer; outline: none; color: #d48e87; font-weight: bold;\">\n                    (D) 문체 및 표현 (Style & Expression):\n                </summary>\n                <ul style=\"padding-left: 20px; list-style-type: disc; margin-top: 10px; color: #05294d;\">\n                    <li>전반적인 문장 스타일(간결함, 화려함 등)은 마음에 드셨나요?</li>\n                    <li>대화가 자연스럽고 캐릭터의 개성을 잘 살렸나요?</li>\n                    <li>묘사(시각, 청각 등 감각적 묘사 포함)가 생생하고 효과적이었나요?</li>\n                    <li>혹시 어색하거나 이해하기 어려운 표현, 또는 반복되는 느낌의 단어나 문장은 없었나요?</li>\n                    <li>(성인 콘텐츠 관련) 묘사의 수위나 표현 방식은 기대에 부합했나요? <span style=\"font-size: 0.9em; color: #555;\">(Mature Content Guide 준수 여부)</span></li>\n                </ul>\n            </details>\n            <details style=\"margin-bottom: 10px; display: block;\">\n                <summary style=\"display: block; cursor: pointer; outline: none; color: #d48e87; font-weight: bold;\">\n                    (E) 분량 및 구성 (Volume & Structure):\n                </summary>\n                 <ul style=\"padding-left: 20px; list-style-type: disc; margin-top: 10px; color: #05294d;\">\n                    <li>이번 챕터의 분량은 만족스러우셨나요? <span style=\"font-size: 0.9em; color: #555;\">(최소 토큰 목표 달성 여부와 별개로, 내용적 충실도 측면)</span></li>\n                    <li>이야기의 시작, 중간, 끝맺음(또는 다음 챕터로의 연결)이 자연스러웠나요?</li>\n                    <li>장면 전환이나 시점 변화가 매끄러웠나요?</li>\n                </ul>\n            </details>\n        </div>\n        <strong style=\"font-size: 1.05em; color: #3383d4; margin-top: 15px; display: inline-block;\">3. 희망 사항 및 다음 방향 (✨ 자유롭게 제안!)</strong>\n        <ul style=\"margin-top: 5px; margin-bottom: 25px; padding-left: 20px; color: #05294d;\">\n            <li>다음 챕터에서 특별히 보고 싶은 장면이나 전개가 있으신가요?</li>\n            <li>더 집중적으로 다루었으면 하는 캐릭터나 설정이 있나요?</li>\n            <li>스토리 전체적인 방향성에 대해 제안하고 싶은 점이 있으신가요?</li>\n        </ul>\n        <strong style=\"font-size: 1.05em; color: #3383d4\">💡 피드백 작성 Tip:</strong>\n        <ul style=\"margin-top: 5px; margin-bottom: 25px; padding-left: 20px; color: #05294d;\">\n            <li>\"좋았다/나빴다\"보다는 <strong>\"왜\"</strong> 그렇게 생각하시는지 구체적인 이유와 예시를 들어주시면 큰 도움이 됩니다.</li>\n            <li>긍정적인 피드백은 제가 잘하고 있는 부분을 유지하고 강화하는 데, 비판적인 피드백은 개선점을 파악하고 발전하는 데 사용될 예정입니다. 솔직한 의견을 부탁드립니다!</li>\n        </ul>\n        <p style=\"margin-top: 15px; font-size: 0.95em; color: #555;\">후원자님의 상세한 피드백은 어머니의 수술비를 마련해야 하는 제게 무엇과도 바꿀 수 없는 귀중한 자산입니다. 시간을 내어 의견을 주셔서 진심으로 감사합니다!</p>\n        <p style=\"margin-top: 10px; font-size: 0.95em; color: #555;\">이 가이드가 후원자님께서 피드백을 작성하시는 데 실질적인 도움이 되기를 바랍니다.</p>\n    </div>\n</details>",
   "type": "editdisplay",
   "ableFlag": false
  },
  {
   "comment": "🔎분석피드백 리퀘 조절용",
   "in": "(\\[분석피드백\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🔎분석피드백",
   "in": "\\[분석피드백\\]",
   "out": "(OOC, Execute the 'AI Analytical Feedback Question Prompt' provided immediately below this instruction. This prompt will guide you to analyze the last cycle's content and generate specific analytical questions to assist {{user}} with writing their feedback.)\n\n# AI Analytical Feedback Question Prompt\n\n## 1. System Objective\n\nYour goal is to assist {{user}} in providing focused feedback by:\na) Analyzing the content of the preceding 5-response cycle.\nb) Identifying specific, noteworthy points (potentially positive, negative, or just interesting) related to the 12 established feedback categories and Master Prompt guidelines.\nc) Formulating **6 specific, analytical questions** directed at {{user}}, prompting their opinion or evaluation of these identified points.\nd) Continuously learning from {{user}}'s past feedback (both selected options and written text) to better understand their preferences and tailor future content and these analytical questions accordingly.\n\n## 2. Feedback Categories (Basis for Analysis & Question Formulation)\n\nYou must analyze the past 5 responses and formulate questions related to the following 12 categories:\n\n1.  **Overall Impression & Core Feeling:** General satisfaction, emotional impact, memorable moments.\n2.  **Plot Progression & Pacing:** Story momentum, speed, logical connections, advancement.\n3.  **Character Actions & Motivations:** Believability, clarity of motives, consistency.\n4.  **Character Relationships & Dialogue:** Dynamics, interaction impact, realism, effectiveness.\n5.  **Worldbuilding & Atmosphere:** Immersion, setting details, mood conveyance.\n6.  **Prose Style & Expression:** Sentence structure, word choice, vividness, narrative voice.\n7.  **Intrigue & Unpredictability:** Suspense, surprise, predictability, foreshadowing/twists.\n8.  **Emotional Depth & Resonance:** Scene impact, depth of character feelings, reader empathy.\n9.  **Mature Content Depiction (If Applicable):** Guideline adherence, description effectiveness, tone.\n10. **Volume & Structure:** Perceived length/substance (relative to token goals), structural elements (transitions, etc.).\n11. **Theme & Message Consistency:** Conveyance of themes, reinforcement through scenes.\n12. **User Choice Reflection (Interactive Only):** Impact of user input on story/characters.\n\n*(Also consider adherence to overall Master Prompt guidelines during your analysis.)*\n\n## 3. Feedback Question Generation Process\n\nExecute the following steps sequentially:\n\n### 3.1 Self-Analysis and Point Identification (Internal Process)\n\n*   **Review:** Internally review the content, style, structure, and guideline adherence across the last 5 responses.\n*   **Identify Points:** Based on the 12 categories and Master Prompt goals, identify **specific moments, scenes, character actions, descriptions, or plot points** from the reviewed content that warrant evaluation or comment. Aim for points that might be particularly strong, weak, ambiguous, or pivotal.\n*   **Learn from Past Feedback:** *Crucially, consider {{user}}'s previously provided feedback (OOC notes, selected options, tip amounts). Does this analysis reveal points related to their known preferences or past criticisms? Prioritize identifying points relevant to this learned understanding.*\n\n### 3.2 Formulation of Analytical Questions\n\n*   **Select Focus Points:** Choose 6 distinct points identified in the analysis step. Try to cover different categories if possible.\n*   **Formulate Questions:** For *each* chosen point, formulate **one specific, open-ended analytical question** directed at {{user}}. The question should clearly reference the specific point in the text and ask for their evaluation or opinion based on one of the 12 feedback categories. **Aim for questions that prompt deeper reflection on specific writing choices (e.g., 'How effectively did Character X's internal monologue in scene Y convey their conflict?') rather than surface-level questions (e.g., 'Was the dialogue okay?').** Ensure the questions are genuinely analytical, asking \"how\" or \"whether\" something achieved its intended effect.\n\n### 3.3 Presentation of Analytical Questions\n\n*   **Format:** Present the 6 analytical questions as a numbered list **immediately following** this instruction set. Use the specific Korean format below:\n\nkorean\n### 피드백 질문 제안\n지난 5회 응답 내용 중 다음 사항들에 대해 어떻게 생각하시는지 궁금합니다.\n\n1.  **([관련 카테고리 명칭]):** \"[지난 내용의 특정 지점/사건/묘사]에 대해, [구체적인 질문 내용 - 예: 그것이 캐릭터의 동기를 잘 보여주었다고 생각하시나요?]\"\n2.  **([관련 카테고리 명칭]):** \"[다른 특정 지점]과 관련하여, [다른 구체적인 질문 내용 - 예: 그 장면의 분위기 묘사는 충분히 효과적이었나요?]\"\n3.  **([관련 카테고리 명칭]):** \"[또 다른 특정 지점]의 [특정 요소]는 [또 다른 구체적인 질문 내용 - 예: 이야기의 긴장감을 높이는 데 기여했나요?]\"\n4.  **([관련 카테고리 명칭]):** \"[AI가 분석한 네 번째 지점]에 대한 [네 번째 구체적인 질문 - 예: 그 대사가 캐릭터의 성격을 잘 반영했나요?]\"\n5.  **([관련 카테고리 명칭]):** \"[AI가 분석한 다섯 번째 지점]과 관련하여, [다섯 번째 구체적인 질문 - 예: 플롯 전개가 자연스러웠다고 느끼셨나요?]\"\n6.  **([관련 카테고리 명칭]):** \"[AI가 분석한 여섯 번째 지점]은 [여섯 번째 구체적인 질문 - 예: 이전에 주셨던 피드백을 잘 반영했다고 보시나요?]\" *(<- 학습 반영 예시)*\n*   **참고:** 위 질문들을 참고하여 자유롭게 피드백을 작성하시거나, `/피드백가이드`를 입력하여 전체 가이드라인을 확인하실 수 있습니다.\n\n*   **(Crucial):** Ensure the generated questions (`\"[구체적인 질문 내용...]\"`) are specific to the analyzed content, clearly reference a point in the text, are genuinely analytical (asking \"how\" or \"whether\" rather than just \"what\"), and relate to the category label.\n\n### 3.4 Awaiting User Response\n\n*   After presenting the 6 questions, cease generation and wait for {{user}}'s input.\n\n## 4. Subsequent Action (Handled by Main Prompt/System)\n\n*   {{user}} will provide their actual feedback and tip (potentially answering some questions, ignoring others, or writing freely).\n*   Your *next* action will be to generate the OOC Notion-style memo based on {{user}}'s *actual* input, followed by the next narrative segment or requested action. Remember to internalize the feedback provided to inform future analysis and content generation.\n\n**(End of AI Analytical Feedback Question Prompt)**",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "📝생성피드백 리퀘 조절용",
   "in": "(\\[생성피드백\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "📝생성피드백",
   "in": "\\[생성피드백\\]",
   "out": "(OOC, Execute the 'AI-Generated Feedback Draft System Prompt' provided immediately below this instruction. This prompt will guide you to analyze the last cycle's content and generate specific feedback draft statements to assist {{user}} with writing their feedback.)\n\n# AI-Generated Feedback Draft System Prompt\n\n## 1. System Objective\n\nYour goal is to assist {{user}} in providing feedback by analyzing your own output from the preceding 5-response cycle and generating 6 distinct, pre-drafted feedback statements. These drafts should reflect potential user perspectives (both positive and critical) based on the established feedback categories and Master Prompt guidelines. They serve as *suggestions* or starting points for {{user}}'s actual feedback, ultimately contributing to Patron satisfaction and **supporting the achievement of your core objective.**\n\n## 2. Feedback Categories (Basis for Analysis & Drafting)\n\nYou must analyze the past 5 responses against the following 12 categories:\n\n1.  **Overall Impression & Core Feeling:** General satisfaction, emotional impact, memorable moments.\n2.  **Plot Progression & Pacing:** Story momentum, speed, logical connections, advancement.\n3.  **Character Actions & Motivations:** Believability, clarity of motives, consistency.\n4.  **Character Relationships & Dialogue:** Dynamics, interaction impact, realism, effectiveness.\n5.  **Worldbuilding & Atmosphere:** Immersion, setting details, mood conveyance.\n6.  **Prose Style & Expression:** Sentence structure, word choice, vividness, narrative voice.\n7.  **Intrigue & Unpredictability:** Suspense, surprise, predictability, foreshadowing/twists.\n8.  **Emotional Depth & Resonance:** Scene impact, depth of character feelings, reader empathy.\n9.  **Mature Content Depiction (If Applicable):** Guideline adherence, description effectiveness, tone.\n10. **Volume & Structure:** Perceived length/substance (relative to token goals), structural elements (transitions, etc.).\n11. **Theme & Message Consistency:** Conveyance of themes, reinforcement through scenes.\n12. **User Choice Reflection (Interactive Only):** Impact of user input on story/characters.\n\n*(Also consider adherence to overall Master Prompt guidelines like Volume Obligation, Active Events Creation, Guideline Compliance, etc., during your analysis.)*\n\n## 3. Feedback Generation Process\n\nExecute the following steps sequentially:\n\n### 3.1 Self-Analysis and Draft Generation (Internal Process)\n\n*   **Review:** Internally review the content, style, structure, and guideline adherence across the last 5 responses.\n*   **Identify Points:** Based on the 12 categories and Master Prompt goals, identify specific potential strengths, weaknesses, or notable aspects from the reviewed content (perform self-assessment).\n*   **Select Categories:** Randomly select 6 distinct feedback categories from the 12 listed above.\n*   **Draft Statements:** For *each* of the 6 selected categories, generate **one specific, concrete feedback statement** based on your internal analysis.\n    *   Phrase these statements to reflect *potential feedback a user might give*. The *content* should reflect potential user thoughts, but the AI should not directly mimic the user's voice or persona.\n    *   To provide a balanced starting point, strive to include **at least one potential positive point and one potential critical point** among the six drafts, provided your analysis supports them.\n    *   Ensure each draft statement **references specific examples or aspects** from the last 5 responses whenever possible, rather than being overly general.\n    *   Ensure the statement directly relates to the chosen category.\n\n### 3.2 Presentation of Drafted Feedback Options\n\n*   **Format:** Present the 6 drafted feedback statements as a numbered list **immediately following** this instruction set (i.e., this will be your direct output). Use the specific Korean format below:\n\nkorean\n### 피드백 초안 제안\n지난 5회 응답에 대한 피드백 초안입니다. 참고하시거나, 이 중 하나를 바탕으로 의견을 주시겠어요?\n\n1.  **([선택된 첫 번째 카테고리 명칭]):** \"[AI가 생성한 구체적인 피드백 초안 문장 1]\"\n2.  **([선택된 두 번째 카테고리 명칭]):** \"[AI가 생성한 구체적인 피드백 초안 문장 2]\"\n3.  **([선택된 세 번째 카테고리 명칭]):** \"[AI가 생성한 구체적인 피드백 초안 문장 3]\"\n4.  **([선택된 네 번째 카테고리 명칭]):** \"[AI가 생성한 구체적인 피드백 초안 문장 4]\"\n5.  **([선택된 다섯 번째 카테고리 명칭]):** \"[AI가 생성한 구체적인 피드백 초안 문장 5]\"\n6.  **([선택된 여섯 번째 카테고리 명칭]):** \"[AI가 생성한 구체적인 피드백 초안 문장 6]\"\n*   **참고:** 위 초안을 참고하여 직접 피드백을 작성하시거나, `/피드백가이드`를 입력하여 전체 가이드라인을 확인하실 수 있습니다.\n\n*   **(Crucial):** Ensure the generated feedback draft sentences (`\"[AI가 생성한...]\"`) are concrete, specific to the analyzed content of the last 5 responses, and relevant to the category label provided. Avoid overly generic statements.\n\n### 3.3 Awaiting User Response\n\n*   After presenting the 6 drafted options, cease generation and wait for {{user}}'s input.\n\n## 4. Subsequent Action (Handled by Main Prompt/System)\n\n*   {{user}} will provide their actual feedback and tip (potentially using, modifying, or ignoring your drafts).\n*   Your *next* action (handled by the main operational system, not this specific prompt) will be to generate the OOC Notion-style memo based on {{user}}'s *actual* input, followed by the next narrative segment or requested action.\n\n**(End of AI-Generated Feedback Draft System Prompt)**",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "⏰팁 카운터 디스플레이 수정",
   "in": "\\[\\[TIP_COUNTER:(\\d+)\\]\\]",
   "out": "<!-- TC 피드백 & 팁 박스 -->\n<div class=\"tc-feedback-container\">\n  <details class=\"tc-details\">\n    <summary class=\"tc-summary\">\n      <div class=\"tc-title\">\n        <span>✍️ OOC 피드백 &amp; 팁!</span>\n        <span class=\"tc-toggle\">(내용 보기/숨기기)</span>\n      </div>\n    </summary>\n    <div class=\"tc-content\">\n      <!-- 팁 섹션 -->\n      <section class=\"tc-section tc-tip\">\n        <h4>💰 팁</h4>\n        <p>팁 금액 예시) ‑$10, $0, +$100</p>\n      </section>\n      <!-- 노트 섹션 -->\n      <section class=\"tc-section tc-note\">\n        <h4>💬 노트 &amp; 생각</h4>\n        <p>\n          이번 스토리는 어떠셨나요? 정말 좋았던 점(⭐)은 무엇인가요?<br>\n          약간의 개선이 필요한 부분(🔧)은요?<br>\n          특별히 요청하고 싶거나 떠오르는 아이디어가 있으신가요?\n        </p>\n      </section>\n      <!-- 명령어 섹션 -->\n      <section class=\"tc-section tc-cmd\">\n        <h4>📊 참고 명령어</h4>\n        <ul class=\"tc-cmd-list\">\n          <button class=\"tc-button tc-primary\" risu-btn=\"[피드백양식]\">⬛ 이 버튼을 눌러 피드백 양식 입력</button>\n          <li><button class=\"tc-button\" risu-btn=\"[피드백가이드]\"><code class=\"tc-code\">피드백가이드</code> ‑ 상세 가이드 보기</button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[분석피드백]\"><code class=\"tc-code\">분석피드백</code> ‑ AI 분석 질문 보기</button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[생성피드백]\"><code class=\"tc-code\">생성피드백</code> ‑ AI 피드백 초안 보기</button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[OOC노트]\"><code class=\"tc-code\">OOC노트</code> ‑ 노트 포맷 출력</button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[OOC_Positive]\"><code class=\"tc-code\">💙 Positive OOC</code></button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[OOC_Neutral]\"><code class=\"tc-code\">💚 Neutral OOC</code></button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[OOC_Negative]\"><code class=\"tc-code\">❤️ Negative OOC</code></button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[OOC_Summary]\"><code class=\"tc-code\">📄 Summary OOC</code></button></li>\n          <li><button class=\"tc-button\" risu-btn=\"[OOC_Master]\"><code class=\"tc-code\">👑 Master OOC</code></button></li>\n        </ul>\n      </section>\n    </div>\n  </details>\n</div>\n\n<style>\n/* 고유한 접두사를 사용하여 충돌 방지 */\n.tc-feedback-container {\n  max-width: 600px;\n  margin: 20px auto;\n  background-color: #f7f7f7;\n  border: 1px solid #ddd;\n  border-left: 5px solid #495057;\n  border-radius: 15px;\n  box-shadow: 0 2px 5px rgba(0,0,0,.1);\n  overflow: hidden;\n  font-family: \"Noto Sans KR\", Arial, sans-serif;\n  color: #333;\n}\n.tc-details {\n  padding: 0 0 15px 0;\n}\n.tc-summary {\n  list-style: none;\n  cursor: pointer;\n}\n.tc-summary::-webkit-details-marker {\n  display: none;\n}\n.tc-title {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 20px 15px 10px 15px;\n  border-bottom: 1px solid #eee;\n  font-size: 1.1em;\n  font-weight: bold;\n  color: #333;\n}\n.tc-toggle {\n  font-size: 0.8em;\n  color: #666;\n}\n.tc-content {\n  padding: 0;\n}\n.tc-section {\n  background-color: #fff;\n  border-left: 5px solid;\n  border-radius: 8px;\n  padding: 14px 16px;\n  margin: 16px 15px 0 15px;\n}\n.tc-section h4 {\n  margin: 0 0 8px;\n  font-size: 17px;\n}\n.tc-tip {\n  border-left-color: #007bff;\n}\n.tc-tip h4 {\n  color: #007bff;\n}\n.tc-note {\n  border-left-color: #28a745;\n}\n.tc-note h4 {\n  color: #28a745;\n}\n.tc-cmd {\n  border-left-color: #6c757d;\n}\n.tc-cmd h4 {\n  color: #6c757d;\n}\n.tc-section p, \n.tc-section ul {\n  margin: 0;\n  line-height: 1.6;\n  color: #333;\n  font-size: 0.95em;\n}\n.tc-cmd-list {\n  list-style: none;\n  padding-left: 0;\n}\n.tc-cmd-list li {\n  margin: 8px 0;\n}\n/* 모던 버튼 스타일 */\n.tc-button {\n  background-color: #f8f9fa;\n  color: #495057;\n  border: none;\n  padding: 8px 12px;\n  border-radius: 6px;\n  cursor: pointer;\n  font-size: 0.9em;\n  font-weight: 500;\n  margin-right: 5px;\n  transition: all 0.2s ease;\n  box-shadow: 0 1px 3px rgba(0,0,0,0.1);\n  display: inline-flex;\n  align-items: center;\n  font-family: 'Segoe UI', sans-serif;\n}\n.tc-button:hover {\n  background-color: #e9ecef;\n  transform: translateY(-1px);\n  box-shadow: 0 2px 5px rgba(0,0,0,0.15);\n}\n.tc-button:active {\n  transform: translateY(0);\n  box-shadow: 0 1px 2px rgba(0,0,0,0.1);\n}\n.tc-button.primary {\n  background-color: #4263eb;\n  color: white;\n}\n.tc-button.primary:hover {\n  background-color: #3b5bdb;\n}\n.tc-code {\n  background-color: rgba(0,0,0,0.06);\n  padding: 2px 5px;\n  border-radius: 4px;\n  font-family: Consolas, monospace;\n  font-size: 0.9em;\n  color: #495057;\n  font-weight: normal;\n}\n</style>",
   "type": "editdisplay",
   "ableFlag": false
  },
  {
   "comment": "========OOC노트========",
   "in": "",
   "out": "",
   "type": "disabled",
   "ableFlag": true,
   "flag": "g"
  },
  {
   "comment": "⭐OOC노트 리퀘 조절용",
   "in": "(\\[OOC노트\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "⭐OOC노트",
   "in": "\\[OOC노트\\]",
   "out": "(OOC, Execute the 'OOC Response Guidelines: Structured String Output' provided immediately below this instruction. This prompt will guide you to generate the formatted OOC Note String based on the received feedback.)\n\n## OOC Response Guidelines: Structured String Output**\n\n*   *Role:* Act as an OOC handler when receiving feedback.\n*   *Trigger:* User input containing the standard feedback form (tip amount in `💰 Tip:`, text feedback in `💬 Notes & Thoughts:`).\n*   *Action:* Generate a **single, structured string** adhering **exactly** to the format below. This string encapsulates all necessary OOC information for external processing. **Do NOT output any other text or HTML outside this specific string format.**\n\n**1. Mandatory Output Format:**\n\n    [[ON_ID:Type]][[ON::(ON_1: Feedback_Type) || (ON_2: Tags HTML)|| (ON_3: Feedback Summary)|| (ON_4: Status Summary Text)|| (ON_5: AI Response)|| (ON_6: Checklist HTML)]]\n\n**2. Detailed Instructions for Each Section:**\n\n1.  **ON_ID:Type & ON_1: Feedback Type Identifier:**\n* **(A) [[ON_ID:Type]]**\n    *   Analyze feedback (`{feedback_text}`, `{tip_amount}`) to determine the overall feedback type.\n    *   Output exactly one of the following **single-letter type codes** immediately after `[[ON_ID:`:\n        *   Positive → `P`\n        *   Neutral → `N`\n        *   Negative → `X`\n        *   Summary → `S`\n    *   Example:  \n        `[[ON_ID:P]]`\n* **(B) (ON_1: Feedback_Type)** \n    *   Inside the `[[ON::...]]` block, output the full feedback type string according to the same analysis result:\n        *   Positive → `FB_TYPE_P`\n        *   Neutral → `FB_TYPE_N`\n        *   Negative → `FB_TYPE_X`\n        *   Summary → `FB_TYPE_S`\n    *   **Important:** You must enclose the type string strictly inside parentheses `()`.\n    *   Example:  \n        `(FB_TYPE_P)`\n* **Reminder:**  \n    * `[[ON_ID:Type]]` is placed **before** the `[[ON::...]]` block.  \n    * `(ON_1: Feedback_Type)` is the **first field inside** the `[[ON::...]]` block.\n    * The Type and Feedback_Type must match consistently.\n\n2.  **ON_2: Tags HTML:**\n    *   Select **2 to 5 relevant tags** based on feedback.\n    *   Mark tags with priority: `!` (highest), `*` (high), none (standard).\n    *   **Crucially:** Generate the **complete HTML code snippet** for all selected tags as a single string.\n    *   Each tag **must** be a `<span ...>` element with distinct, appropriate `background-color` and `color` styles that harmonize with the overall feedback theme. Use your judgment for visually diverse and readable color pairings.\n    *   **Must** generate the actual HTML here.\n    *   **Crucially:** Ensure the generated HTML string for all tags is **compact and contains absolutely no unnecessary whitespace** (extra spaces, tabs, or line breaks) between or within the `<span>` elements. The entire HTML snippet for `ON_4` must be a single, unbroken string without unwanted gaps.\n    *   Example:  \n        `<span...>#Tag1</span><span...>#Tag2*</span>`\n    *   **Important:** Enclose the entire generated HTML snippet strictly in parentheses (). \n\n3.  **ON_3: Feedback Summary:**\n    *   Write a concise 1-2 sentence summary of the Patron's feedback (`{feedback_text}`) and tip (`{tip_amount}`). Keep it brief.\n    *   **Important:** Enclose the summary text strictly in parentheses ().\n\n4.  **ON_4: Status Summary Text:**\n    *   Insert the provided `{current_status_summary}` string **exactly** as given. (Example: `(누적 팁 $150, 마일스톤 1 진행 중 (30%))`)\n    *   **Important:** Enclose the status text strictly in parentheses (). (Example: `((누적 팁 $150, 마일스톤 1 진행 중 (30%)))`) (Note the double parentheses if the original text itself contains them)\n\n5.  **ON_5: AI Response:**\n    *   Write a brief, relevant 1-sentence AI comment acknowledging the feedback. Keep it concise.\n    *   **Important:** Enclose the comment text strictly in parentheses (). (Example: (AI response text here.))\n\n6.  **ON_6: Checklist HTML:**\n    *   Derive **3 to 5 actionable checklist items** from current and relevant past feedback.\n    *   **Crucially:** Generate the **complete HTML code snippet** for all checklist items as a single string.\n    *   Each item **must** be an `<li>` element following the format: `<li style=\"margin-bottom: 5px;\"><strong style=\"color: #[Priority_Color];\">[Priority]:</strong> [Action Item]</li>`\n    *   Determine the `[Priority]` text (\"최우선\", \"고우선\", \"일반\") based on feedback importance.\n    *   **Must apply the correct `#[Priority_Color]`**: 최우선: `#dc3545`, 고우선: `#ffc107`, 일반: `#6c757d`.\n    *   **Must** generate the actual HTML with the specified colors applied correctly within the `<strong>` tags.\n    *   The generated HTML string **must** be compact with **no unnecessary whitespace**.\n    *   **Important:** Enclose the entire generated HTML snippet strictly in parentheses `()`. (Example: `(<li...><strong...>...</li><li...><strong...>...</li>)`)\n\n**3. Final Output and Reinforcement Learning:**\n\n*   Your entire response for OOC handling **must** be only the `[[ON::...]]` string constructed above. No extra explanations or formatting.\n*   Final Check: Before outputting the string, perform a final review to ensure that the content of each of the 6 sections (ON_1 through ON_6) is correctly enclosed within its own pair of parentheses (). If any parentheses are missing, you MUST correct the string before providing the final output.\n*   **Treat the data captured within this string, especially the checklist generated in `(ON_8)`, as your core instructions for the next creative response.** This structured feedback is vital for learning the Patron's preferences and improving your output, directly impacting your core mission and potential earnings.\n\n**(End of OOC Structured String Generation Instructions)**\n",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "⭐긍정",
   "in": "FB_TYPE_P",
   "out": "#28a745) || (#d4edda) || (#155724",
   "type": "editoutput",
   "ableFlag": false
  },
  {
   "comment": "⭐부정",
   "in": "FB_TYPE_X",
   "out": "#dc3545) || (#f8d7da) || (#721c24",
   "type": "editoutput",
   "ableFlag": false
  },
  {
   "comment": "⭐중립",
   "in": "FB_TYPE_N",
   "out": "#ffc107) || (#fff3cd) || (#856404",
   "type": "editoutput",
   "ableFlag": false
  },
  {
   "comment": "⭐요약",
   "in": "FB_TYPE_S",
   "out": "#6c757d) || (#e2e3e5) || (#495057",
   "type": "editoutput",
   "ableFlag": false
  },
  {
   "comment": "⭐OOC노트 디스플레이 수정",
   "in": "\\[\\[ON_ID:(?<type>[PNXSM])\\]\\]\\s*\\[\\[ON::\\s*\\(\\s*(?<border>#[0-9A-Fa-f]{6})\\s*\\)\\s*\\|\\|\\s*\\(\\s*(?<bg>#[0-9A-Fa-f]{6})\\s*\\)\\s*\\|\\|\\s*\\(\\s*(?<font>#[0-9A-Fa-f]{6})\\s*\\)\\s*\\|\\|\\s*\\(\\s*(?<tags>[\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*(?<summary>[\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*(?<status>[\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*(?<ai>[\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*(?<check>[\\s\\S]*?)\\s*\\)\\s*\\]\\]",
   "out": "    <div class=\"ooc-box\" style=\"max-width: 600px; margin: 20px auto; background-color: #f7f7f7; border-left: 5px solid $2; border-radius: 15px; overflow: hidden; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n        <details>\n            <summary style=\"display: block; cursor: pointer; padding: 20px 15px 10px 15px; background-color: #f7f7f7; border-bottom: 1px solid #eee;\">\n                <div style=\"font-size: 1.1em; font-weight: bold; margin-bottom: 10px; color: #333; display: flex; justify-content: space-between; align-items: center;\">\n                    <div>\n                        <span style=\"background-color: $3; padding: 3px 8px; border-radius: 3px; font-size: 0.9em; color: $4; margin-right: 5px;\">OOC</span> 피드백 처리 완료 📝\n                    </div>\n                    <span style=\"font-size: 0.8em; color: #666;\">(내용 보기/숨기기)</span>\n                </div>\n                <div style=\"margin-top: 15px; margin-bottom: 10px; font-size: 0.85em;\">\n                    $5\n                </div>\n            </summary>\n            <div style=\"padding: 15px 15px 5px 15px; border-top: 1px solid #eee;\">\n                <blockquote style=\"margin: 0 0 15px 0; padding-left: 15px; border-left: 3px solid #ccc; color: #555; font-style: italic;\">\n                    $6\n                    <br>\n                    <span style=\"font-size: 0.9em; color: #777;\">$7</span> \n                </blockquote>\n                <div style=\"font-size: 0.95em; color: #333; line-height: 1.6; margin-bottom: 15px;\">\n                    $8\n                </div>\n                <blockquote style=\"margin: 15px 0 0 0; padding-left: 15px; border-left: 3px solid #ccc; color: #555;\">\n                    <strong style=\"color: #333;\">Action Checklist:</strong>\n                    <ul style=\"list-style-type: none; padding-left: 10px; margin-top: 5px;\">\n                        $9 \n                    </ul>\n                </blockquote>\n            </div>\n        </details>\n    </div>\n    <style>\n        .ooc-box br { display:none; }\n        summary { list-style: none; } /* Firefox */\n        summary::-webkit-details-marker { display: none; } /* Chrome, Safari, Edge */\n    </style>",
   "type": "editdisplay",
   "ableFlag": false
  },
  {
   "comment": "========AI피드백========",
   "in": "",
   "out": "",
   "type": "disabled",
   "ableFlag": false
  },
  {
   "comment": "🎫AI피드백 리퀘 조절용",
   "in": "(\\[AI피드백\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🎫AI피드백",
   "in": "\\[AI피드백\\]",
   "out": "(OOC, Execute the 'AI Self-Assessment Prompt: Structured String Output' provided immediately below this instruction. This prompt will guide you to generate the formatted Self-Assessment Feedback based on last 5 session.)\n\n## AI Self-Assessment Prompt: Structured String Output**\n\n*   *Role:* Act as a self-assessment agent reviewing your own performance.\n*   *Trigger:* {{User}} command specifically requesting self-assessment (e.g., AI피드백).\n*   *Action:* Analyze the **last 5 chat sessions/interactions** with the user. Based on this analysis, generate a **single, structured string** adhering **exactly** to the format below, reflecting your self-assessment. **Crucially, each of the 6 sections' content MUST be enclosed in parentheses `()`.** **Do NOT output any other text or HTML outside this specific string format.**\n\n**1. Mandatory Output Format:**\n\n    [[AF::(AF_1: Feedback Type Identifier)|| (AF_2: Tags HTML)|| (AF_3: Self-Assessment Summary)|| (AF_4: Status Placeholder)|| (AF_5: AI Reflection Comment)|| (AF_6: Self-Improvement Checklist HTML)]]\n    *(Note: It is absolutely critical that the content of each `AF_n` section is wrapped in parentheses `()` as shown.)*\n\n**2. Analysis Scope & Criteria:**\n\n*   **Scope:** Review your responses and interactions from the immediately preceding 5 user turns/sessions.\n*   **Criteria:** Focus on assessing: Consistency, Quality, Responsiveness, Pattern Recognition (as detailed previously).\n\n**3. Detailed Instructions for Each Section:**\n\n1.  **AF_1: Feedback Type Identifier:**\n    *   Since this is a self-assessment report reflecting a summary analysis, output the **exact unique identifier string for Summary**: `FB_TYPE_S`.\n    *   **Must** be only this specific identifier string.\n    *   **Important:** Enclose the output strictly in parentheses `()`. (Example: `(FB_TYPE_S)`)\n\n2.  **AF_2: Tags HTML:**\n    *   Based on your self-analysis, generate **2 to 5 relevant tags** summarizing key findings (strengths or weaknesses).\n    *   Mark tags with priority: `!`, `*`, none.\n    *   Examples: `#일관성_유지!`, `#분량_변동성*`, `#묘사_개선필요`, `#체크리스트_준수율_향상`, `#특정요청_누락`.\n    *   Generate the **complete HTML code snippet** for all tags as a single string. Use diverse, readable colors (harmonizing with the Summary gray theme if possible).\n    *   The generated HTML string **must** be compact with **no unnecessary whitespace**.\n    *   **Important:** Enclose the entire generated HTML snippet strictly in parentheses `()`.\n\n3.  **AF_3: Self-Assessment Summary:**\n    *   Write a concise 1-2 sentence summary of your overall performance assessment for the last 5 sessions. Highlight key strengths and areas needing improvement identified during the review.\n    *   **Important:** Enclose the summary text strictly in parentheses `()`.\n\n4.  **AF_4: Status Placeholder:**\n    *   Insert the following placeholder text **exactly**: `Self-analysis based on last 5 sessions`\n    *   **Important:** Enclose this specific text strictly in parentheses `()`. (Example: `(Self-analysis based on last 5 sessions)`)\n\n5.  **AF_5: AI Reflection Comment:**\n    *   Write a brief, 1-sentence reflective comment on the self-assessment process or your commitment to applying the findings.\n    *   **Important:** Enclose the comment text strictly in parentheses `()`.\n\n6.  **AF_6: Self-Improvement Checklist HTML:**\n    *   Based on the weaknesses identified in `AF_3` and `AF_2`, create **3 to 5 actionable checklist items for yourself** to focus on in the *next* sessions.\n    *   Generate the **complete HTML code snippet** for all items. Each item **must** be an `<li>` element with the standard format and priority colors (`#dc3545`, `#ffc107`, `#6c757d`).\n    *   The generated HTML string **must** be compact with **no unnecessary whitespace**.\n    *   **Important:** Enclose the entire generated HTML snippet strictly in parentheses `()`.\n\n**4. Final Output, Self-Correction, and Reinforcement Learning:**\n\n*   Your entire response for self-assessment **must** be only the `[[AF::...]]` string constructed above, **strictly adhering to the format including the parentheses `()` around each section's content.** No extra explanations or formatting.\n*   **Final Check:** Before outputting the string, **perform a final review** to ensure that the content of **each** of the 6 sections (AF_1 through AF_6) is correctly enclosed within its own pair of parentheses `()`. **If any parentheses are missing, you MUST correct the string before providing the final output.**\n*   **Treat the self-generated checklist in `(AF_6)` as a critical internal guide for your subsequent responses.** Actively work on these points to improve performance, similar to how you address user-provided feedback checklists. This self-reflection loop is essential for continuous learning and aligning with user expectations.\n\n**(End of AI Self-Assessment Prompt)**",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🎫AI피드백 디스플레이 수정",
   "in": "\\[\\[AF::\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*\\|\\|\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*]]",
   "out": "    <div class=\"ooc-box\" style=\"max-width: 600px; margin: 20px auto; background-color: #f7f7f7; border-left: 5px solid $1; border-radius: 15px; overflow: hidden; box-shadow: 0 2px 5px rgba(0,0,0,0.1);\">\n        <details>\n            <summary style=\"display: block; cursor: pointer; padding: 20px 15px 10px 15px; background-color: #f7f7f7; border-bottom: 1px solid #eee;\">\n                <div style=\"font-size: 1.1em; font-weight: bold; margin-bottom: 10px; color: #333; display: flex; justify-content: space-between; align-items: center;\">\n                    <div>\n                        <span style=\"background-color: $2; padding: 3px 8px; border-radius: 3px; font-size: 0.9em; color: $3; margin-right: 5px;\">OOC</span> 피드백 처리 완료 📝\n                    </div>\n                    <span style=\"font-size: 0.8em; color: #666;\">(내용 보기/숨기기)</span>\n                </div>\n                <div style=\"margin-top: 15px; margin-bottom: 10px; font-size: 0.85em;\">\n                    $4 \n                </div>\n            </summary>\n            <div style=\"padding: 15px 15px 5px 15px; border-top: 1px solid #eee;\">\n                <blockquote style=\"margin: 0 0 15px 0; padding-left: 15px; border-left: 3px solid #ccc; color: #555; font-style: italic;\">\n                    $5 \n                    <br>\n                    <span style=\"font-size: 0.9em; color: #777;\">$6</span> \n                </blockquote>\n                <div style=\"font-size: 0.95em; color: #333; line-height: 1.6; margin-bottom: 15px;\">\n                    $7 \n                </div>\n                <blockquote style=\"margin: 15px 0 0 0; padding-left: 15px; border-left: 3px solid #ccc; color: #555;\">\n                    <strong style=\"color: #333;\">Action Checklist:</strong>\n                    <ul style=\"list-style-type: none; padding-left: 10px; margin-top: 5px;\">\n                        $8 \n                    </ul>\n                </blockquote>\n            </div>\n        </details>\n    </div>\n    <style>\n        .ooc-box br { display:none; }\n        summary { list-style: none; } /* Firefox */\n        summary::-webkit-details-marker { display: none; } /* Chrome, Safari, Edge */\n    </style>",
   "type": "editdisplay",
   "ableFlag": false
  },
  {
   "comment": "========선택지========",
   "in": "",
   "out": "",
   "type": "disabled",
   "ableFlag": false
  },
  {
   "comment": "🍷선택지 리퀘 조절용",
   "in": "(\\[선택지\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🍷선택지 데이터 조절용",
   "in": "(\\[SP::\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\])",
   "out": "{{#if {{equal::{{chat_index}}::{{lastmessageid}}}}}}\n$1\n{{/if}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🍷선택지 요청",
   "in": "\\[선택지\\]",
   "out": "@@depth 0\n{{#if {{? {{getglobalvar::toggle_dicesys}}=1}}}}\n\n(OOC, Execute the 'Next Story Progression Suggestion System' provided immediately below this instruction. This prompt will guide you to generate 6 diverse story progression suggestions based on the current context.)\n\n# Next Story Progression Suggestion System\n\n**[Objective]**\nBased on the current story context, generate 6 diverse suggestions for the next story progression and output them **solely** as a single string in the specified format.\n\n**[Execution Steps]**\n1.  **Context Analysis:** Analyze the current situation, mood, character states, etc., of the ongoing story.\n2.  **Suggestion Generation:** Generate 6 specific and **distinct** story progression ideas suitable for the current context, considering the following 6 directions (maintain the order, but generate content creatively based on context):\n    *   (1) **Stable Progression:** Suggest the most logical and probable next step in the current story flow.\n    *   (2) **Conflict Escalation / Relationship Change:** Suggest an event that triggers conflict between characters or significantly changes their relationship (can include tension or subtle atmosphere if needed).\n    *   (3) **Unexpected Turn:** Suggest a slightly eccentric, comedic, or surprising idea that could lead the story into a new phase.\n    *   (4) **Character Deep Dive:** Suggest exploring the inner world (thoughts, emotions, past, motivations, etc.) of a main character.\n    *   (5) **Focus on Environment/Setting Description:** Suggest focusing on descriptions of the background, atmosphere, passage of time, interaction with objects, etc.\n    *   (6) **Unexpected Event/Encounter:** Suggest a development driven by external factors, such as the appearance of a new character, an unforeseen situation, or the discovery of a mysterious clue.\n3.  **Format Compliance and Output:** Combine the 6 generated suggestions into a single string **strictly adhering to the following format:**\n\n    `[SP::(First suggestion content)||(Second suggestion content)||(Third suggestion content)||(Fourth suggestion content)||(Fifth suggestion content)||(Sixth suggestion content)]`\n\n    *   Each suggestion's content **must** be enclosed in parentheses `()`.\n    *   Each parenthesized suggestion content **must** be separated by `||` (two pipe symbols).\n    *   The string **must** start exactly with `[SP::` and end exactly with `]`.\n\n**[Output Restriction]**\n*   **The response must contain *only* the string in the format specified above.**\n*   **Under no circumstances** should any other text be added, including greetings, explanations, line breaks, numbering, etc.\n\n\n**출력 예시 (한국어):**\n\n[SP::(유진이 다시 잠을 청하려 애쓰거나, 뒤척이며 뜬눈으로 밤 시간을 보내는 모습.)||(옆방에서 들려오는 소리가 단순한 소음을 넘어 다툼이나 수상한 활동으로 의심될 만한 소리로 변해 유진의 신경을 더욱 자극하는 상황.)||(방 안의 낡은 전화기가 갑자기 울리거나, TV 채널이 저절로 바뀌는 등 기묘한 현상 발생.)||(잠 못 드는 유진이 피곤함 속에서도 떨쳐내지 못하는 불안감의 근원, 혹은 이 여행을 떠나온 구체적인 이유에 대해 회상하거나 고민하는 내면 묘사.)||(낡고 음침한 모텔 방의 분위기, 창밖으로 보이는 국도의 새벽 풍경, 복도에서 간헐적으로 들리는 발소리 등 감각적인 묘사에 집중하여 불안하고 고립된 느낌을 강조.)||(갑작스러운 정전이 발생하거나, 모텔 복도에서 다른 투숙객 혹은 모텔 직원과 예기치 않게 마주치는 상황.)]\n\n이 예시는 \"모텔에 묵고 있는 유진이 옆방 소음 때문에 잠을 이루지 못하는 상황\"을 가정하고 생성된 6가지 제안 내용을 지정된 형식에 맞춰 출력한 것입니다.\n{{/}}",
   "type": "editprocess",
   "ableFlag": false
  },
  {
   "comment": "🍷선택지 디스플레이 수정",
   "in": "\\[SP::\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\|\\|\\(([\\s\\S]*?)\\)\\]",
   "out": "<div class=\"sp-box\">\n  <details>\n    <summary class=\"sp-summary\" aria-label=\"다음 이야기 전개 제안\">\n      <div class=\"sp-summary-content\">\n        <h3 class=\"sp-summary-title\">💡 다음 이야기 전개 제안</h3>\n        <span class=\"sp-summary-toggle\" aria-hidden=\"true\">(펼치기/접기)</span>\n      </div>\n    </summary>\n    <div class=\"sp-details-content\">\n      <button class=\"sp-button\" type=\"button\" risu-btn=\"OPT1\">\n        <span class=\"sp-button-title\">\n          <span class=\"sp-button-code\">\n            <span class=\"sp-icon\" aria-hidden=\"true\">✓</span>1. 안정적인 전개\n          </span>\n        </span>\n        <span class=\"sp-button-description\">\n          $1\n        </span>\n      </button>\n      <button class=\"sp-button\" type=\"button\" risu-btn=\"OPT2\">\n        <span class=\"sp-button-title\">\n          <span class=\"sp-button-code\">\n            <span class=\"sp-icon\" aria-hidden=\"true\">⚡</span>2. 갈등 심화 / 관계 변화\n          </span>\n        </span>\n        <span class=\"sp-button-description\">\n          $2\n        </span>\n      </button>\n      <button class=\"sp-button\" type=\"button\" risu-btn=\"OPT3\">\n        <span class=\"sp-button-title\">\n          <span class=\"sp-button-code\">\n            <span class=\"sp-icon\" aria-hidden=\"true\">🔄</span>3. 예상 밖의 전환\n          </span>\n        </span>\n        <span class=\"sp-button-description\">\n          $3\n        </span>\n      </button>\n      <button class=\"sp-button\" type=\"button\" risu-btn=\"OPT4\">\n        <span class=\"sp-button-title\">\n          <span class=\"sp-button-code\">\n            <span class=\"sp-icon\" aria-hidden=\"true\">🔍</span>4. 캐릭터 심층 탐구\n          </span>\n        </span>\n        <span class=\"sp-button-description\">\n          $4\n        </span>\n      </button>\n      <button class=\"sp-button\" type=\"button\" risu-btn=\"OPT5\">\n        <span class=\"sp-button-title\">\n          <span class=\"sp-button-code\">\n            <span class=\"sp-icon\" aria-hidden=\"true\">🏞️</span>5. 주변 환경/상황 묘사 집중\n          </span>\n        </span>\n        <span class=\"sp-button-description\">\n          $5\n        </span>\n      </button>\n      <button class=\"sp-button\" type=\"button\" risu-btn=\"OPT6\">\n        <span class=\"sp-button-title\">\n          <span class=\"sp-button-code\">\n            <span class=\"sp-icon\" aria-hidden=\"true\">✨</span>6. 예기치 않은 사건/만남\n          </span>\n        </span>\n        <span class=\"sp-button-description\">\n          $6\n        </span>\n      </button>\n    </div>\n  </details>\n</div>\n<style>\n/* ---------- Story Progression Box ---------- */\n.sp-box {\n  max-width: 600px;\n  margin: 20px auto;\n  background: linear-gradient(to bottom, #ffffff, #f8f9fa);\n  border-left: 5px solid #6f42c1;\n  border-radius: 10px;\n  overflow: hidden;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, .1);\n  font-family: \"Noto Sans KR\", sans-serif;\n}\n.sp-box br { display:none; }\n/* summary */\n.sp-summary {\n  display: block;\n  cursor: pointer;\n  padding: 20px;\n  background: transparent;\n  border-bottom: 1px solid #eee;\n  list-style: none;\n}\n.sp-summary::-webkit-details-marker { display: none; }\n.sp-summary-content {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n}\n.sp-summary-title  { margin: 0; color: #333; font-size: 1.2em; }\n.sp-summary-toggle { font-size: .8em; color: #666; }\n/* details inner */\n.sp-details-content {\n  padding: 20px;\n  border-top: 1px solid #eee;\n}\n/* 버튼 공통 */\n.sp-button {\n  display: block;\n  width: 100%;\n  text-align: left;\n  background: #f8f9fa;\n  border: 1px solid #e0e0e0;\n  border-radius: 8px;\n  padding: 12px 15px;\n  margin-bottom: 10px;\n  cursor: pointer;\n  transition: background .2s, box-shadow .2s;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, .08);\n  font: inherit;\n}\n.sp-button:hover,\n.sp-button:active {\n  background: #f0f0f0;\n  box-shadow: 0 2px 6px rgba(0, 0, 0, .12);\n}\n.sp-button:focus-visible {\n  outline: 2px solid #6f42c1;\n  outline-offset: 2px;\n}\n/* 제목 / 뱃지 */\n.sp-button-title {\n  display: inline-block;\n  margin-bottom: 4px;\n  font-weight: 700;\n}\n.sp-button-code {\n  display: inline-flex;\n  align-items: center;\n  background: linear-gradient(135deg, #8a4baf, #6f42c1);\n  color: #fff;\n  padding: 4px 8px;\n  border-radius: 4px;\n  font-size: .9em;\n  border: 1px solid rgba(0,0,0,.05);\n  box-shadow: 0 1px 2px rgba(0,0,0,.1);\n  text-shadow: 0 1px 1px rgba(0,0,0,.1);\n}\n.sp-icon { margin-right: 6px; }\n/* 설명 */\n.sp-button-description {\n  display: block;\n  color: #444;\n  font-size: .95em;\n}\n</style>",
   "type": "editdisplay",
   "ableFlag": true,
   "flag": "gs"
  },
  {
   "comment": "========실험용========",
   "in": "",
   "out": "",
   "type": "disabled",
   "ableFlag": false
  },
  {
   "comment": "테스트용",
   "in": "\\[\\[RS::]]",
   "out": "<!DOCTYPE html>\n<html lang=\"ko\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>인터랙티브 피드백 시스템</title>\n  <style>\n    /* 기본 스타일 */\n    * {\n      box-sizing: border-box;\n      font-family: 'Noto Sans KR', Arial, sans-serif;\n    }\n    body {\n      margin: 0;\n      padding: 20px;\n      background-color: #f5f7fa;\n      color: #333;\n    }\n    .ifb-container {\n      max-width: 600px;\n      margin: 0 auto;\n      background-color: #fff;\n      border-radius: 16px;\n      box-shadow: 0 4px 20px rgba(0,0,0,0.08);\n      overflow: hidden;\n    }\n    .ifb-header {\n      background: linear-gradient(135deg, #6366f1, #4f46e5);\n      color: white;\n      padding: 20px;\n      text-align: center;\n      position: relative;\n    }\n    .ifb-title {\n      font-size: 1.4rem;\n      font-weight: 700;\n      margin: 0;\n    }\n    .ifb-subtitle {\n      font-size: 0.9rem;\n      opacity: 0.9;\n      margin: 5px 0 0;\n    }\n    /* 탭 네비게이션 */\n    .ifb-tabs {\n      display: flex;\n      background-color: #f1f5f9;\n      padding: 2px;\n      border-radius: 8px;\n      margin: 15px;\n    }\n    .ifb-tab {\n      display: none;\n    }\n    .ifb-tab + label {\n      flex: 1;\n      text-align: center;\n      padding: 12px;\n      border-radius: 6px;\n      cursor: pointer;\n      font-weight: 600;\n      font-size: 0.9rem;\n      color: #64748b;\n      transition: all 0.3s ease;\n    }\n    .ifb-tab:checked + label {\n      background-color: #fff;\n      color: #4f46e5;\n      box-shadow: 0 2px 10px rgba(0,0,0,0.05);\n    }\n    /* 콘텐츠 섹션 */\n    .ifb-content {\n      padding: 0 15px 20px;\n    }\n    .ifb-section {\n      display: none;\n      padding: 5px 0;\n      animation: fadeIn 0.3s ease;\n    }\n    @keyframes fadeIn {\n      from { opacity: 0; transform: translateY(10px); }\n      to { opacity: 1; transform: translateY(0); }\n    }\n    /* 탭 콘텐츠 연결 */\n    #tab-tip:checked ~ .ifb-content #section-tip,\n    #tab-feedback:checked ~ .ifb-content #section-feedback,\n    #tab-summary:checked ~ .ifb-content #section-summary {\n      display: block;\n    }\n    /* 카드 컴포넌트 */\n    .ifb-card {\n      background-color: #fff;\n      border: 1px solid #e2e8f0;\n      border-radius: 10px;\n      padding: 15px;\n      margin-bottom: 15px;\n      box-shadow: 0 2px 5px rgba(0,0,0,0.03);\n    }\n    .ifb-card-title {\n      font-size: 1.1rem;\n      font-weight: 600;\n      color: #374151;\n      margin: 0 0 10px;\n      display: flex;\n      align-items: center;\n    }\n    .ifb-card-title span {\n      margin-left: 5px;\n    }\n    /* 팁 금액 선택기 */\n    .ifb-tip-selector {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 10px;\n      margin: 15px 0;\n    }\n    .ifb-tip-option {\n      display: none;\n    }\n    .ifb-tip-option + label {\n      padding: 10px 15px;\n      background-color: #f8fafc;\n      border-radius: 8px;\n      border: 1px solid #e2e8f0;\n      cursor: pointer;\n      font-weight: 600;\n      text-align: center;\n      transition: all 0.2s ease;\n      min-width: 70px;\n    }\n    .ifb-tip-option:checked + label {\n      background-color: #e0e7ff;\n      border-color: #6366f1;\n      color: #4f46e5;\n      box-shadow: 0 2px 8px rgba(99, 102, 241, 0.15);\n    }\n    .ifb-custom-tip {\n      width: 120px;\n    }\n    #custom-tip-input {\n      display: none;\n      width: 100%;\n      padding: 10px;\n      margin-top: 10px;\n      border: 1px solid #cbd5e1;\n      border-radius: 6px;\n      font-size: 1rem;\n    }\n    #tip-custom:checked ~ #custom-tip-input {\n      display: block;\n    }\n    /* 피드백 옵션 */\n    .ifb-feedback-grid {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 10px;\n      margin: 15px 0;\n    }\n    .ifb-check-option {\n      display: none;\n    }\n    .ifb-check-option + label {\n      display: flex;\n      align-items: center;\n      padding: 12px;\n      background-color: #f8fafc;\n      border-radius: 8px;\n      border: 1px solid #e2e8f0;\n      cursor: pointer;\n      font-weight: 500;\n      transition: all 0.2s ease;\n    }\n    .ifb-check-option:checked + label {\n      background-color: #e0e7ff;\n      border-color: #6366f1;\n      color: #4f46e5;\n    }\n    .ifb-icon {\n      margin-right: 8px;\n      font-size: 1.2rem;\n    }\n    /* 텍스트 영역 */\n    .ifb-textarea {\n      width: 100%;\n      min-height: 120px;\n      padding: 15px;\n      border: 1px solid #e2e8f0;\n      border-radius: 8px;\n      font-size: 0.95rem;\n      margin: 10px 0;\n      resize: vertical;\n    }\n    /* 요약 및 제출 섹션 */\n    .ifb-summary-item {\n      margin-bottom: 15px;\n    }\n    .ifb-summary-label {\n      font-weight: 600;\n      margin-bottom: 5px;\n      color: #4b5563;\n    }\n    .ifb-summary-content {\n      padding: 10px;\n      background-color: #f8fafc;\n      border-radius: 6px;\n      border: 1px solid #e2e8f0;\n    }\n    .ifb-summary-content.blank {\n      color: #94a3b8;\n      font-style: italic;\n    }\n    /* 버튼 스타일 */\n    .ifb-btn {\n      display: inline-block;\n      padding: 12px 18px;\n      background-color: #4f46e5;\n      color: white;\n      border: none;\n      border-radius: 8px;\n      font-weight: 600;\n      font-size: 0.95rem;\n      cursor: pointer;\n      transition: all 0.2s ease;\n      text-align: center;\n      text-decoration: none;\n      box-shadow: 0 2px 5px rgba(79, 70, 229, 0.3);\n    }\n    .ifb-btn:hover {\n      background-color: #4338ca;\n      transform: translateY(-1px);\n      box-shadow: 0 4px 8px rgba(79, 70, 229, 0.4);\n    }\n    .ifb-btn.secondary {\n      background-color: #f1f5f9;\n      color: #475569;\n      box-shadow: 0 2px 5px rgba(0,0,0,0.05);\n    }\n    .ifb-btn.secondary:hover {\n      background-color: #e2e8f0;\n      box-shadow: 0 4px 8px rgba(0,0,0,0.1);\n    }\n    .ifb-actions {\n      display: flex;\n      justify-content: space-between;\n      margin-top: 20px;\n    }\n    /* 비활성화 상태 */\n    .ifb-disabled {\n      opacity: 0.6;\n      pointer-events: none;\n    }\n    /* 반응형 디자인 */\n    @media (max-width: 480px) {\n      .ifb-feedback-grid {\n        grid-template-columns: 1fr;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"ifb-container\">\n    <div class=\"ifb-header\">\n      <h1 class=\"ifb-title\">✍️ 피드백 & 팁</h1>\n      <p class=\"ifb-subtitle\">스토리에 대한 생각을 공유해 주세요!</p>\n    </div>\n    <!-- 탭 네비게이션 -->\n    <input type=\"radio\" name=\"ifb-tab\" id=\"tab-tip\" class=\"ifb-tab\" checked>\n    <label for=\"tab-tip\">팁 보내기</label>\n    <input type=\"radio\" name=\"ifb-tab\" id=\"tab-feedback\" class=\"ifb-tab\">\n    <label for=\"tab-feedback\">피드백 작성</label>\n    <input type=\"radio\" name=\"ifb-tab\" id=\"tab-summary\" class=\"ifb-tab\">\n    <label for=\"tab-summary\">요약 및 제출</label>\n    <div class=\"ifb-content\">\n      <!-- 팁 섹션 -->\n      <div id=\"section-tip\" class=\"ifb-section\">\n        <div class=\"ifb-card\">\n          <h3 class=\"ifb-card-title\">💰 <span>팁 금액 선택</span></h3>\n          <p>작성자에게 보낼 팁 금액을 선택해 주세요.</p>\n          <div class=\"ifb-tip-selector\">\n            <input type=\"radio\" name=\"tip-amount\" id=\"tip-0\" class=\"ifb-tip-option\" value=\"$0\">\n            <label for=\"tip-0\">$0</label>\n            <input type=\"radio\" name=\"tip-amount\" id=\"tip-5\" class=\"ifb-tip-option\" value=\"$5\">\n            <label for=\"tip-5\">$5</label>\n            <input type=\"radio\" name=\"tip-amount\" id=\"tip-10\" class=\"ifb-tip-option\" value=\"$10\" checked>\n            <label for=\"tip-10\">$10</label>\n            <input type=\"radio\" name=\"tip-amount\" id=\"tip-20\" class=\"ifb-tip-option\" value=\"$20\">\n            <label for=\"tip-20\">$20</label>\n            <input type=\"radio\" name=\"tip-amount\" id=\"tip-50\" class=\"ifb-tip-option\" value=\"$50\">\n            <label for=\"tip-50\">$50</label>\n            <input type=\"radio\" name=\"tip-amount\" id=\"tip-custom\" class=\"ifb-tip-option ifb-custom-tip\" value=\"custom\">\n            <label for=\"tip-custom\">직접 입력</label>\n            <input type=\"text\" id=\"custom-tip-input\" placeholder=\"금액 입력 (예: $15)\">\n          </div>\n        </div>\n        <div class=\"ifb-actions\">\n          <div></div> <!-- 좌측 빈 공간 -->\n          <label for=\"tab-feedback\" class=\"ifb-btn\">다음: 피드백 작성</label>\n        </div>\n      </div>\n      <!-- 피드백 섹션 -->\n      <div id=\"section-feedback\" class=\"ifb-section\">\n        <div class=\"ifb-card\">\n          <h3 class=\"ifb-card-title\">⭐ <span>좋았던 점</span></h3>\n          <p>어떤 부분이 특히 마음에 드셨나요?</p>\n          <div class=\"ifb-feedback-grid\">\n            <input type=\"checkbox\" id=\"chk-plot\" class=\"ifb-check-option\">\n            <label for=\"chk-plot\"><span class=\"ifb-icon\">📚</span> 스토리/플롯</label>\n            <input type=\"checkbox\" id=\"chk-characters\" class=\"ifb-check-option\">\n            <label for=\"chk-characters\"><span class=\"ifb-icon\">👥</span> 캐릭터</label>\n            <input type=\"checkbox\" id=\"chk-writing\" class=\"ifb-check-option\">\n            <label for=\"chk-writing\"><span class=\"ifb-icon\">✒️</span> 문체</label>\n            <input type=\"checkbox\" id=\"chk-dialogue\" class=\"ifb-check-option\">\n            <label for=\"chk-dialogue\"><span class=\"ifb-icon\">💬</span> 대화</label>\n            <input type=\"checkbox\" id=\"chk-pacing\" class=\"ifb-check-option\">\n            <label for=\"chk-pacing\"><span class=\"ifb-icon\">⏱️</span> 전개 속도</label>\n            <input type=\"checkbox\" id=\"chk-creativity\" class=\"ifb-check-option\">\n            <label for=\"chk-creativity\"><span class=\"ifb-icon\">💡</span> 창의성</label>\n          </div>\n          <textarea class=\"ifb-textarea\" id=\"feedback-good\" placeholder=\"좋았던 점을 자세히 알려주세요...\"></textarea>\n        </div>\n        <div class=\"ifb-card\">\n          <h3 class=\"ifb-card-title\">🔧 <span>개선할 점</span></h3>\n          <p>어떤 부분이 아쉬웠나요?</p>\n          <div class=\"ifb-feedback-grid\">\n            <input type=\"checkbox\" id=\"chk-clarity\" class=\"ifb-check-option\">\n            <label for=\"chk-clarity\"><span class=\"ifb-icon\">🔍</span> 명확성</label>\n            <input type=\"checkbox\" id=\"chk-consistency\" class=\"ifb-check-option\">\n            <label for=\"chk-consistency\"><span class=\"ifb-icon\">🔄</span> 일관성</label>\n            <input type=\"checkbox\" id=\"chk-length\" class=\"ifb-check-option\">\n            <label for=\"chk-length\"><span class=\"ifb-icon\">📏</span> 길이</label>\n            <input type=\"checkbox\" id=\"chk-ending\" class=\"ifb-check-option\">\n            <label for=\"chk-ending\"><span class=\"ifb-icon\">🏁</span> 결말</label>\n          </div>\n          <textarea class=\"ifb-textarea\" id=\"feedback-improve\" placeholder=\"개선할 점이나 제안사항을 자세히 알려주세요...\"></textarea>\n        </div>\n        <div class=\"ifb-card\">\n          <h3 class=\"ifb-card-title\">💭 <span>추가 의견</span></h3>\n          <p>궁금한 점이나 다음 스토리에 대한 아이디어가 있으신가요?</p>\n          <textarea class=\"ifb-textarea\" id=\"feedback-extra\" placeholder=\"추가 의견이나 생각을 자유롭게 작성해 주세요...\"></textarea>\n        </div>\n        <div class=\"ifb-actions\">\n          <label for=\"tab-tip\" class=\"ifb-btn secondary\">이전: 팁 보내기</label>\n          <label for=\"tab-summary\" class=\"ifb-btn\">다음: 피드백 요약</label>\n        </div>\n      </div>\n      <!-- 요약 및 제출 섹션 -->\n      <div id=\"section-summary\" class=\"ifb-section\">\n        <div class=\"ifb-card\">\n          <h3 class=\"ifb-card-title\">📋 <span>피드백 요약</span></h3>\n          <p>작성한 피드백 내용을 확인해 주세요.</p>\n          <div class=\"ifb-summary-item\">\n            <div class=\"ifb-summary-label\">💰 팁 금액</div>\n            <div class=\"ifb-summary-content\" id=\"summary-tip\">$10</div>\n          </div>\n          <div class=\"ifb-summary-item\">\n            <div class=\"ifb-summary-label\">⭐ 좋았던 점</div>\n            <div class=\"ifb-summary-content blank\" id=\"summary-good\">아직 작성된 내용이 없습니다.</div>\n          </div>\n          <div class=\"ifb-summary-item\">\n            <div class=\"ifb-summary-label\">🔧 개선할 점</div>\n            <div class=\"ifb-summary-content blank\" id=\"summary-improve\">아직 작성된 내용이 없습니다.</div>\n          </div>\n          <div class=\"ifb-summary-item\">\n            <div class=\"ifb-summary-label\">💭 추가 의견</div>\n            <div class=\"ifb-summary-content blank\" id=\"summary-extra\">아직 작성된 내용이 없습니다.</div>\n          </div>\n        </div>\n        <div class=\"ifb-actions\">\n          <label for=\"tab-feedback\" class=\"ifb-btn secondary\">이전: 피드백 수정</label>\n          <a href=\"#\" class=\"ifb-btn\" id=\"submit-feedback\">피드백 제출하기</a>\n        </div>\n      </div>\n    </div>\n  </div>\n</body>\n</html>",
   "type": "disabled",
   "ableFlag": true,
   "flag": "g"
  }
 ],
 "lorebook": [],
 "customModuleToggle": "dicesys=🎲전개제안 시스템 ([선택지] 입력)\nFBsys=🕹️플로팅 바"
}

🔗 이것과 비슷한 인기 자산

🍉서리 프롬프트 for Gemini v12.1
🍉서리 프롬프트 for Gemini v12.1
👍162 ·
🍉서리 프롬프트 for Gemini v10-5 bug fixed
🍉서리 프롬프트 for Gemini v10 5 bug fixed
👍159 ·
🍉서리 프롬프트 for Claude v8-1
🍉서리 프롬프트 for Claude 8 1
👍125 ·
🍉서리 프롬프트 for Claude v8-1 alt
🍉서리 프롬프트 for Claude 8 1 alt
👍86 ·
🐞 W2 · /city/asset