Emotion Tycoon — 工作協議與劇本
每當用戶提及 Emotion Tycoon、其樹木、工人、掉落器、加成、事件、樓層、存檔欄位、遊戲通行證、突襲、兌換碼、管理面板,或要求為其製作圖示、粒子、UI、模型、縮圖或宣傳影片時,請使用此文件——即使他們只描述了症狀(「樹卡住了」、「粒子看起來很小」、「我卡在 $0 了」)。
用戶是一名獨立 Roblox 開發者(群組「Squashed Stuidos」,id 706695552),他手繪了大量美術資源,並且對任何看起來像是「vibecoded」或 AI 生成的東西非常挑剔。以下所有內容都來自他們自己的修正;請將其視為他們的個人風格,而非建議。他們經常發送長串語音輸入的請求批次:將每個批次轉換為任務列表,先處理快速修復的錯誤,並在最終報告中回答每一項(包括你決定不執行的事項)。
用戶的常規規則
- 尊重他們的編輯。 永遠不要覆蓋用戶手動進行的模型/UI 更改。讀取前先寫入。
- 不要使用 AI 風格的 UI。 不要使用文字標籤/籌碼/徽章(「PASS」、「NEW」、「HOT」),不要使用貼在物件上的光滑漸層藥丸,不要使用與文字欄位重疊的圖示,不要使用解釋事物的純浮動文字行。改用佈局、輪廓樣式、顏色或分組來區分事物。
- 新視窗:複製一個用戶已批准的視窗(
HUD.FriendModal兩欄佈局、RebirthModal、OfflineModal)並更換其內容,而不是從頭組合一個。從頭製作的視窗曾被拒絕,原因是「明顯是用 AI 做的」。文字欄位 = 帶有深色 3px 輪廓的凹陷白色框,深色文字。 - 玩家擁有的數字看起來像現金欄。 例如:突襲代幣 = 複製一個
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 的最大按鈕)、裝飾品商店、獎盃樹(突襲代幣保留;透過每日重生前三名及每第五次重生獲得)。天氣機器 = 每個地塊恰好一個。協同作用教學:暫緩,直到他們詢問。
- 永遠不要讓玩家卡死。 任何對成本/樹木/重生的更改都必須保留一條通往有效生產線的路徑(主線有
lineCost+rescue充值以及 Cash-Tree 守衛——讓它們保持運作)。
Studio MCP 工作流程
- Studio id 每工作階段變化——使用
list_roblox_studios取得。 - 在「播放」模式下無法編輯資料模型。 用戶會自己進行遊戲測試:檢查
get_studio_state;當他們遊玩時,你仍然可以透過伺服器資料模型(game.ServerScriptService.Main.Source)讀取腳本。等待他們(每隔幾分鐘輪詢一次);只有在他們閒置數分鐘後才停止他們的遊戲測試,並告知他們。如果他們問「確保東西已儲存」:編輯僅在「編輯」模式下進行時才會持久化。 - 在 Client/Server 中執行
execute_luau有其自己的 require 快取:那裡的require(module)是一個全新的副本,而不是正在運行的副本(對其進行猴子補丁無效)。透過遊戲的遠端事件(ReplicatedStorage.Remotes.Request:InvokeServer(action, ...),包括admin操作)或實例/屬性來訪問運行狀態。要在編輯模式下測試 Config 編輯,請使用require(Config:Clone())。 - 腳本編輯:透過
execute_luau使用ScriptEditorService:UpdateSourceAsync,使用string.find(src, old, 1, true)進行精確查找/替換,並斷言匹配是唯一的。使用[==[ ]==]字串(程式碼通常包含]])。 UI模組的 start 函數已達到 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。螢幕截圖會被縮放(約 0.955 倍於 2011px 視口)。textInput輸入 TextBox 無法送達——通過遠端事件測試類似兌換碼的流程。 - Studio 中的 DataStores 是真實的(API 訪問已啟用):測試時寫入的任何內容(例如測試用兌換碼)必須在之後刪除。
遊戲地圖(事物所在位置)
ReplicatedStorage.Shared.Config— 所有調整項:Items、Employees、Perks、Materials、Events、Robux、RobuxClusters、Themes、TreePaths/TreeLayout/RebirthLayout、AURA(誰對哪些區塊施加增益/減益)、CAPACITY_PERKS、MAX_LIVE_CUBES(每條掉落器生產線)/MAX_PLOT_CUBES、天氣機器函數(weatherChance、weatherUpgradeCost= 下一級重生成本翻倍的比例、weatherRoll、weatherOwned)、突襲定義 + 代幣。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)、天氣機器資料(data.wm、Factory.weatherHook)、救援、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。位置:現金 x = 0.4654 + 0.0691q,y = 0.6062 + 0.0850r + 0.0425q;重生 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),之後將其移除。
已知陷阱(每個都讓我們吃過一次虧)
- Premium NPC 放置錯誤留下了「鬼魂」區塊 →
place在建構時包含在 pcall 內並帶有回滾;保持該模式。 - PlayerAdded 會暫停(
Shop.checkPasses、DataStore 加載):每次暫停後檢查工作階段是否仍然有效,否則離開的玩家會以無所有者的方式重建其地塊。PlayerRemoving 在儲存之前釋放地塊。 - 一個
UIGradient會乘以BackgroundColor3——一個帶有紫色漸層的青色框架會渲染成海軍藍。當透過漸層重新著色時,將背景設為白色。 - 現金欄有一個
BumpUIScale:任何從其 AbsoluteSize 定位的東西都必須除以該比例。 - 在 Build 模式中,右鍵 = 長按刪除;鏡頭平移是滑鼠中鍵 / 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 管道: 使用
use_selection=True, object_types={'MESH'}, apply_unit_scale=True, mesh_smooth_type='FACE'從 Blender 匯出到%LOCALAPPDATA%\Temp\et_export\;透過電腦操作導入(Asset Manager → Import → 輸入路徑 → Import),會落在workspace.<FbxName>。匯入器鏡像 X 軸:使用CFrame.new(-x_b, z_b, y_b)從 Blender 座標放置零件。預覽渲染:暫時性「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 (生產線滿標誌), backpack_cubes 84466301181838 / crate_cubes 108346564955404 / chest_cubes 131689000211065 (容量加成)。
樓層: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):有用的——向下箭頭 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,開始播放,然後透過 Request 遠端事件:devCash,解鎖所有現金樹節點(循環unlock直到沒有進度),清除佈局,建造 4 條生產線(掉落器在 x=1 r=1,傳送帶在 x=2..17,賣家在 x=18;工人在兩側面向傳送帶)。使用 Dropper2–4,這樣方塊實際上會填充並以真實數字出售。 - 客戶端中的導演:
BindToRenderStep在 Camera+5 強制CameraType=Scriptable和一個_G.DirCF;用於 Hold/Move/Orbit 的輔助函數;切換 HUD ScreenGuis(不是 TreeGui)。儲存格 → 世界:地塊 1 的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")觸發事件。使用帶時間戳的聯絡表檢查剪輯,並重拍不好的。 -
…(原文截斷)