Emotion Tycoon — 작업 협약 및 플레이북
사용자가 Emotion Tycoon, 그 나무, 작업자, 드로퍼, 부스트, 이벤트, 층, 저장 슬롯, 게임 패스, 습격, 코드, 관리자 패널을 언급하거나, 아이콘, 파티클, UI, 모델, 썸네일, 프로모션 비디오를 요청할 때 — 심지어 증상만 설명해도 ("나무가 멈췄어요", "파티클이 작아 보여요", "0원에서 못 빠져나와요") 이 문서를 사용하세요.
사용자는 솔로 Roblox 개발자(그룹 "Squashed Stuidos", id 706695552)로, 아트를 직접 많이 그리며 "vibecoded" 또는 AI 생성처럼 보이는 것을 싫어합니다. 아래 내용은 모두 사용자의 직접적인 수정에서 비롯된 것입니다; 제안이 아닌 사용자의 스타일로 간주하세요. 사용자는 종종 긴 음성 입력으로 요청을 보냅니다: 각 배치를 작업 목록으로 바꾸고, 빠른 버그부터 처리하며, 최종 보고서에 모든 항목(거절한 항목 포함)에 답변하세요.
사용자의 고정 규칙
- 수정 사항을 존중하세요. 사용자가 직접 수정한 모델/UI 변경을 덮어쓰지 마세요. 쓰기 전에 읽으세요.
- AI 느낌의 UI 금지. 텍스트 태그/칩/배지("PASS", "NEW", "HOT"), 광택 그라데이션 알약, 아이콘이 텍스트 필드를 겹치는 것, 설명하는 평범한 떠 있는 텍스트 줄을 금지합니다. 레이아웃, 외곽선 스타일, 색상 또는 그룹화로 구분하세요.
- 새 창: 사용자가 이미 승인한 창을 복제하세요 (
HUD.FriendModal2열 레이아웃,RebirthModal,OfflineModal) 그리고 내용물을 교체하세요. 처음부터 새로 만든 창은 "AI가 만든 게 분명하다"며 거부되었습니다. 텍스트 필드 = 움푹 들어간 흰색 상자에 진한 3px 외곽선, 진한 텍스트. - 플레이어가 소유한 숫자는 현금 바처럼 보입니다. 예: Raid Tokens =
HUD.Cash의 복제본 옆에 토큰 아이콘, 호버(PC) / 탭(모바일) 시 툴팁. 항상 모바일에서도 호버 정보가 작동하도록 하세요 (탭으로 토글). - UI 배경에는 실제 스터드 텍스처 사용:
rbxassetid://100839690373358(절차적 생성 금지). - 먼저 사용자가 직접 만든 에셋을 사용하세요 (아래 ID). 사용자의 에셋이 있으면 대체품을 생성하지 마세요.
- 시각적 요소를 추가하는 모든 답변 끝에는 플레이스홀더를 대체할 에셋 목록을 짧게 적어주세요.
- Robux 글리프는 전용 문자
U+E002입니다. - 환각을 생성하지 마세요. API나 ID가 확실하지 않으면 웹 검색 / 코드 읽기를 하세요.
- Roblox Studio를 두 개 열지 마세요. 컴퓨터 사용은 MCP가 할 수 없는 작업(FBX 가져오기, Game Bar)에만 사용하세요.
- 절대 .blend 파일을 저장하지 마세요 (
C:\Users\cosul\Desktop\models_for_roblox\RobloxTycoon.blend); 저장하는 것을 잊지 말라고 알려주세요 (Ctrl+S). - Blender의 3D 모델: 모디파이어 기반, 깔끔한 로우 폴리, 플랫 쉐이딩;
/roblox-r6-armor키트 스타일의 기어. - 데일리 리워드 없음 (오프라인/AFK 수익 선호). 모든 곳에 "?" 미스터리 헥스를 유지하세요 — "?"가 실제 노드가 되면, 그 너머에 새로운 "?" 헥스를 추가하세요.
- 결정됨 / 거부됨 (재제안 금지): 베이스 보호, 리버스 스킵, "전체 업그레이드" (NPC당 Max 버튼만), 코스메틱 샵, Trophy 트리 (Raid Tokens 유지; 리버스 일일 상위 3위 + 5번째 리버스마다 획득). Weather Machine = 플롯당 정확히 1개. 시너지 튜토리얼: 사용자가 요청할 때까지 보류.
- 플레이어가 완전히 막히지 않도록 하세요. 비용/트리/리버스 변경은 항상 작동하는 라인으로 가는 경로를 유지해야 합니다 (Main에는
lineCost+rescue최고 및 Cash-Tree 가드가 있음 — 작동 상태 유지).
Studio MCP 워크플로우
- Studio id는 세션마다 변경됩니다 —
list_roblox_studios로 가져오세요. - Play 모드에서는 데이터모델 편집이 불가능합니다. 사용자가 직접 플레이테스트합니다:
get_studio_state를 확인하세요; 플레이 중에는 여전히 Server 데이터모델을 통해 스크립트를 읽을 수 있습니다 (Game.ServerScriptService.Main.Source). 사용자가 끝낼 때까지 기다리세요 (몇 분마다 폴링); 사용자가 몇 분 동안 움직이지 않으면 플레이테스트를 중지하고, 그 사실을 알리세요. "저장되었는지 확인해줘"라고 요청하면: 편집 모드에서만 수정 사항이 유지됩니다. execute_luauin Client/Server에는 자체 require 캐시가 있습니다: 거기서require(module)은 실행 중인 복사본이 아니라 새로운 복사본입니다 (몽키패칭은 효과 없음). 게임의 리모트를 통해 실행 상태에 도달하세요 (ReplicatedStorage.Remotes.Request:InvokeServer(action, ...),adminops 포함) 또는 인스턴스/속성을 통해. 편집 모드에서 Config 편집을 테스트하려면require(Config:Clone())을 사용하세요.- 스크립트 편집:
execute_luau를 통한ScriptEditorService:UpdateSourceAsync,string.find(src, old, 1, true)로 정확한 찾기/바꾸기 및 일치가 고유한지 확인.[==[ ]==]문자열 사용 (코드에 종종]]포함). UI모듈의 시작 함수는 Luau의 200개 로컬 레지스터 제한에 도달합니다 ("Out of local registers"). 거기에 새로운 최상위 로컬을 추가하지 마세요: 새로운 상태/함수는 공유ext테이블 또는do ... end블록 안에 넣으세요.- 드문 상태(예: 전체 라인)를 테스트하려면 편집 모드에서 Config 상수를 일시적으로 변경하고, 플레이테스트한 다음 되돌리세요.
ET_NoSave로 플레이테스트하여 확인:start_stop_play,screen_capture,get_console_output.user_mouse_inputx/y는 GUI/화면 좌표입니다: 월드 포인트는WorldToScreenPoint사용 (= 뷰포트 y - 58); UI는AbsolutePosition사용. 스크린샷은 스케일링됩니다 (~2011px 뷰포트의 0.955). TextBox에textInput은 도달하지 않음 — 대신 리모트를 통해 리딤 스타일 플로우를 테스트하세요.- Studio의 DataStore는 실제 것입니다 (API 접근 켜짐): 테스트 중에 작성하는 모든 것(예: 테스트 코드)은 나중에 삭제되어야 합니다.
게임 맵 (항목 위치)
ReplicatedStorage.Shared.Config— 모든 튜닝: Items, Employees, Perks, Materials, Events, Robux,RobuxClusters, Themes, TreePaths/TreeLayout/RebirthLayout,AURA(누가 어떤 타일을 버프/디버프하는지),CAPACITY_PERKS,MAX_LIVE_CUBES(드로퍼 라인당) /MAX_PLOT_CUBES, Weather Machine 함수 (weatherChance,weatherUpgradeCost= 레벨당 다음 리버스 비용의 일부,weatherRoll,weatherOwned), Raid 정의 + 토큰.ReplicatedStorage.Shared.Grid— 셀 수학 (20x20 타일, TILE=4). 회전 r: 0=-Z 1=+X 2=+Z 3=-X.ReplicatedStorage.Shared.VFX— 파티클 프리셋;VFX.burst는 색상당 하나의 이미터를 만듭니다.ServerScriptService.Main— 세션, 모든 리모트 액션에 대한handlers.*(batch드래그-빌드,upgradeWeather,redeemCode,buyRaidToken포함), Weather Machine 데이터 (data.wm,Factory.weatherHook), rescue, Heartbeat 루프.pushState는 배치 중에 보류될 수 있습니다 (s.holdPush).ServerScriptService.Server.{Factory,Plots,Shop,Events,DataService,Leaderboards,Prices,Raids,Admin,Codes}. Factory: 라인당 큐브 수 (session.lineCount,uncount),lineCap, 드로퍼의LineFull속성, 버킷 블로커 검사 (O(n) 유지, 라인은 100개 큐브 보유 가능), 배치 리빌드를 위한Factory.hold. Admin: 관리자 전용ops(온라인/오프라인/크로스-서버 선물, 이벤트, 공지, 코드). Codes: DataStoreET_Codes_v1(키codes+uses_<CODE>), 종류 cash/scaled/rp/token/boost, 날짜, 최대 사용 (0 = 무제한).StarterPlayerScripts.ClientModules.{UI,Build,Cubes,Life,Boards,Aura,Pop}— UI = HUD, 트리, 모달, 검사 패널; Build = 고스트, 드래그/배치 배치(투명 플레이스홀더 포함), 오른쪽-홀드 삭제, 이동; Aura = 녹색/빨간색/노란색 타일 사각형. 관리자 패널 UI:ServerStorage.AdminGui(+AdminClient), 관리자의 PlayerGui에만 복제됨.- 트리 캔버스는
StarterGui.TreeGui.Window.Pan.{Canvas,RebirthCanvas,RobuxCanvas}.Nodes에 있는 작성된 노드입니다 (속성 Q, R, Ring, Path, Mystery). 새 노드 = 해당 셀에서 "?" 노드 이름 변경/변환 (Mystery제거,Path설정) + ID를Config.TreePaths/RebirthLayout에 추가. 위치: cash x = 0.4654 + 0.0691q, y = 0.6062 + 0.0850r + 0.0425q; rebirth x = 0.5 + 0.1230q, y = 0.5 + 0.1300r + 0.0650q. - Studio 전용 개발 리모트:
devEvent,devCash,devRobux,devRobuxRemove,devRobuxReset,devOffline,devTutorial. 관리자 리모트 (admin, op, ...)는 Studio에서 소유자에게 작동합니다 (자신에게 rp/cash/token 선물). - 실제 저장 데이터에 실수로 테스트하지 마세요.
workspace:SetAttribute("ET_NoSave", true)를 편집 모드에서 설정한 후 임시 플레이테스트하고, 이후에 제거하세요.
알려진 문제점 (각각 한 번씩 우리를 괴롭혔습니다)
- 프리미엄 NPC 배치 오류가 "고스트" 타일을 남겼습니다 →
place는 pcall 내에서 롤백과 함께 빌드합니다; 그 패턴을 유지하세요. - PlayerAdded가 일시 중단됩니다 (
Shop.checkPasses, DataStore 로드): 각 일시 중단 후 세션이 여전히 유효한지 확인하거나, 떠난 플레이어가 소유자 없이 플롯이 재구성됩니다. PlayerRemoving은 저장 전에 플롯을 해제합니다. UIGradient는BackgroundColor3를 곱합니다 — 복제된 청록색 프레임에 보라색 그라데이션을 적용하면 네이비색이 렌더링됩니다. 그라데이션을 통해 색상을 변경할 때 배경을 흰색으로 설정하세요.- 현금 바에는
BumpUIScale이 있습니다: AbsoluteSize에서 위치를 지정하는 모든 것은 해당 스케일로 나누어야 합니다. - 빌드 모드에서 마우스 오른쪽 버튼 = 홀드하여 삭제; 카메라 팬은 가운데 마우스 / WASD입니다.
- 트리 드래그 시작은
UIS.InputBegan을 사용해야 합니다 (버튼 누름이win.InputBegan에 도달하지 않음). - 바닥 테마 텍스처는 바닥 위에 있어야 합니다 (Texture 인스턴스); 절대 바닥의 Material을 변경하지 마세요.
- 사용자 파티클 시트는 작은 모양의 2x2 플립북입니다 → Size를 ~2–2.5x 스케일; 멀티컬러 = 여러 이미터.
- 새로 업로드된 텍스처는 잠시 동안 흐릿하게 보일 수 있습니다 (Roblox 처리).
- 높은 등급의 드로퍼는 단계당 엄청난 작업이 필요합니다; 약한 라인은 ~$1에 판매됩니다 (빈 큐브 가치).
- 이미지:
upload_image는 로컬 http 서버에서 작동합니다 (예:http://127.0.0.1:8765/<file>). - FBX 파이프라인: Blender에서
use_selection=True, object_types={'MESH'}, apply_unit_scale=True, mesh_smooth_type='FACE'로%LOCALAPPDATA%\Temp\et_export\로 내보내기; 컴퓨터 사용으로 가져오기 (Asset Manager → Import → 경로 입력 → Import),workspace.<FbxName>에 배치됩니다. 가져오기는 X축을 미러링합니다: Blender 좌표에서CFrame.new(-x_b, z_b, y_b)로 부품을 배치하세요. 미리보기 렌더링: 임시 "ET_Preview" 장면 → 단계별 이미지. - 게임 내 외부 링크는 허용되지 않습니다: Discord/그룹은 게임 페이지의 Social Links에; 게임 내에는
GroupService:PromptJoinAsync(groupId)"Join group" 버튼만.
현재 수익화 레이아웃
- Robux 상점 = 서로 팬으로 넘길 수 있는 별도의 섬 (
Config.RobuxClusters: Game Passes, Premium Workers, Cash, Boosts & Events). 패스 추가 = 해당 패스의 id를 섬의items에 추가 +RobuxCanvas.Nodes에 헥스 추가. - 패스와 제품은 섬과 외곽선 애니메이션으로 구분되며, 레이블로는 절대 구분하지 않습니다.
- 가격은 실시간으로 가져옵니다 (
Server.Prices→ReplicatedStorage속성RobuxPrices). - 패스 ID: HypeQueen 2026442663, DiamondWorker 2026394625, PassMidas 2025590666, PassLuck 2025848628, PassDrop 2025464639, PassVIP 2026922652, GoldenRobot 2025374681, LayoutSlot3 2026652648, LayoutSlot4 2026010654, Pass2x 2027138654.
- 제품 ID: OfflineDouble 3717787338, BuyBlood 3717787331, BuyMeteor 3717787319, BuyThunder 3717787307, BuyGolden 3717787299, BuyRain 3717787292, Boost3x 3717787279, Boost2x 3717787271, CashVault 3717787265, CashBag 3717787258, CashPouch 3717787249, RaidPortal 3717992673, RaidSiphon 3717992684, RaidJunk 3717992698, RaidGloom 3717992711.
- 층은 설정에서 선택할 수 있는 무료 리버스 보상입니다. 공장 저장: 2개의 무료 슬롯, 슬롯 3–4는 패스.
- 후반 게임 플레이어는 수십 경 이상과 30+ 리버스를 보유합니다: 후반 콘텐츠 가격을 고정 숫자가 아닌
Config.rebirthCost의 일부(영원히 스케일링)로 책정하세요; 같은 이유로 코드는 기본적으로 "다음 리버스의 %"입니다.
사용자의 에셋
아이콘: moneyboost3 105474801162476, moneybag 79223369019300, goldenhour 71253971041485, thunderstorm 106415624997312, moneyvault 114456854945836, moneyboost2 88658276906960, meteor 110778083355096, rain 112383447314124, coinpouch 115820638833486, faster_hoppers 85633043652627, x2coins 100838792374750, crown 89385624200044, midas_touch 108493524899149, bloodmoon_2 79508274280864, moon2 97357609209998, hammer 89643796486723, floppydisk 127943322640811, star 119578070875725, zzz 130218032337173, frost 109343690555707, raid_token 112843349186486, weather_machine 112719886234229, conveyor_full 79879060986006 (line-full sign), backpack_cubes 84466301181838 / crate_cubes 108346564955404 / chest_cubes 131689000211065 (capacity perks).
바닥: ocean_lights 138556700370722, holy 105026190310831, pink 83692624195325, pink_green 136148045549462, redx 124121848293779.
파티클 (2x2 시트): anger 97456853400445, happy_love 83569352224420, bolts 125645422252125, steam 115369146046246, confetti 108450399478144, swirls_sparkles 131593243447656, waterdrops 125415103859140, happy_confetti 103582469151146, money 128140468436252, music_notes 92525208060800, ice_shards 123359736235888.
workspace["Simulator Icon Pack"] (Decals 목록에서 ID 확인): 유용한 것들 — Down arrow 17368169201, Codes 17368032566, MultiGifts 15402969720, Expand 17368183719, Click 17260727409, Rocket 16670799841, Box 17368122337, Crate 17368402884. CubePets 17368391613은 개 — 펫이 아닌 것에는 절대 사용하지 마세요.
프로모션 비디오 레시피 (완전 자동화, 첫 승인 후 사용자 클릭 없음)
- 한 번 승인: 컴퓨터 사용으로 Roblox Studio + 시스템 키 조합이 있는 Game Bar에 접근, 그리고
~/Videos폴더 접근 (Game Bar는Videos\Captures에 저장). - 쇼케이스 상태:
ET_NoSave설정, Play 시작, 그런 다음 Request 리모트를 통해:devCash, 모든 현금-트리 노드 잠금 해제 (진행이 없을 때까지unlock반복), 레이아웃 지우기, 4개 라인 구축 (드로퍼 x=1 r=1, 벨트 x=2..17, 셀러 x=18; 양쪽에 작업자가 벨트를 향하도록). Dropper2–4를 사용하여 큐브가 실제로 채워지고 실제 숫자로 판매되도록 합니다. - 클라이언트의 디렉터:
CameraType=Scriptable과_G.DirCF를 강제하는BindToRenderStepat Camera+5; Hold/Move/Orbit 헬퍼; HUD ScreenGui 토글 (TreeGui 제외). 셀→월드: Plot1의 경우X = -134 + 4x, Z = -96 + 4z. 녹화 전screen_capture로 미리보기 프레이밍. - 녹화: Studio 포커스,
win+alt+r→ 샷 실행 (execute_luau, < 60 초) →win+alt+r. 샷 사이에devEvent("")로 자연스러운 이벤트 중지.devEvent("Thunderstorm" | "MeteorShower" | "BloodMoon" | "CashRain" | "GoldenHour" | "Frost")로 이벤트 트리거. 타임스탬프가 있는 연락처 시트로 클립 확인하고 나쁜 것은 다시 찍기. 5.*
…
[번역을 위해 잘림]