エモーションタイクーン — 作業合意とプレイブック
ユーザーがエモーションタイクーン、そのツリー、ワーカー、ドロッパー、ブースト、イベント、フロア、セーブスロット、ゲームパス、レイド、コード、管理パネルについて言及したとき、あるいはアイコン、パーティクル、UI、モデル、サムネイル、プロモーションビデオを依頼したときは、たとえ症状だけを説明した場合でも(「ツリーが止まった」「パーティクルが小さく見える」「0ドルで詰まった」)、このプレイブックを使用してください。
ユーザーはソロRobloxデベロッパー(グループ「Squashed Studios」、ID 706695552)で、アートの多くを手描きしており、「Vibeコーディング」やAI生成に見えるものを嫌います。以下はすべてユーザー自身の修正に基づいています。提案ではなく、独自のスタイルとして扱ってください。ユーザーは長い音声入力でリクエストをまとめて送信することがよくあります。各バッチをタスクリストに変換し、まず簡単なバグから処理し、最終的なレポートではすべての項目に回答してください(採用しなかった項目も含む)。
ユーザーの恒久ルール
- 編集を尊重する。 ユーザーが手動で行ったモデル/UIの変更を上書きしないでください。書き込む前に読み込んでください。
- AIっぽいUIは禁止。 テキストタグ/チップ/バッジ(「PASS」「NEW」「HOT」)、光沢のあるグラデーションピル、アイコンと重なるテキストフィールド、説明のための浮遊テキスト行は禁止。区別はレイアウト、アウトラインスタイル、色、グループ化で行ってください。
- 新しいウィンドウ:ユーザーがすでに承認したウィンドウをクローンする(
HUD.FriendModal2カラムレイアウト、RebirthModal、OfflineModal)コンテンツを差し替えてください。ゼロから作成したウィンドウは「明らかにAIで作られた」と却下されました。テキストフィールド = くぼんだ白いボックスに、濃い3pxのアウトライン、濃いテキスト。 - プレイヤーが所有する数値はキャッシュバーのように表示。 例:レイドトークン =
HUD.Cashのクローンを隣に配置し、トークンアイコン、ホバー(PC)/タップ(スマホ)でツールチップを表示。モバイルでもホバー情報が機能するようにする(タップでトグル)。 - UI背景には実際のスタッドテクスチャ:
rbxassetid://100839690373358(手続き型は不可)。 - ユーザーの手作りアセットを優先(IDは後述)。ユーザーのアセットが存在する場合、代替を生成しないでください。
- ビジュアルを追加する返信の最後には、プレースホルダーを置き換えるためにユーザーが描けるアセットの短いリストを添付すること。
- Robuxグリフはプライベートユース文字
U+E002。 - 幻覚を起こさない。 APIやIDがわからない場合はウェブ検索/コードを読んでください。
- 2番目の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ボタンのみ)、コスメショップ、トロフィーツリー(レイドトークンはそのまま。デイリーのリバーストップ3 + 5回のリバースごとに獲得)。ウェザーマシン = プロットあたり正確に1つ。相乗効果チュートリアル:ユーザーが依頼するまで保留。
- プレイヤーが完全に行き詰まらないようにする。 コスト/ツリー/リバースへの変更は、必ず動作するラインへのパスを維持すること(メインには
lineCost+rescueトップアップとキャッシュツリーガードがある——それらを機能させ続けること)。
Studio MCP ワークフロー
- Studio IDはセッションごとに変わります —
list_roblox_studiosで取得してください。 - Edit datamodelはPlayモードでは利用できません。 ユーザー自身がプレイテストを行います:
get_studio_stateを確認。ユーザーがプレイ中は、Server datamodelを通じてスクリプトをREADすることはできます(game.ServerScriptService.Main.Source)。数分ごとにポーリングして待機。ユーザーが数分間アイドル状態の場合のみプレイテストを停止し、その旨を伝えてください。ユーザーが「保存を確認して」と依頼した場合:編集はEditモードでのみ永続化されます。 execute_luau(Client/Server)には独自のrequireキャッシュがあります:require(module)は実行中のコピーではなく新しいコピーです(モンキーパッチは無効)。ゲームのRemote(ReplicatedStorage.Remotes.Request:InvokeServer(action, ...)、admin操作を含む)またはインスタンス/属性を介して実行状態にアクセスしてください。Configの編集をEditモードでテストするには、require(Config:Clone())を使用します。- スクリプト編集:
ScriptEditorService:UpdateSourceAsyncをexecute_luau経由で、string.find(src, old, 1, true)を使用して正確な検索/置換を行い、一致が一意であることをアサートします。[==[ ]==]文字列を使用してください(コードには]]が含まれることがよくあります)。 UIモジュールのstart関数はLuauの200ローカルレジスタ制限に達しています(「Out of local registers」)。そこに新しいトップレベルローカルを追加しないでください。新しい状態/関数は共有のextテーブルまたはdo ... endブロック内に配置してください。- まれな状態(例:満杯のライン)をテストするには、EditモードでConfig定数を一時的に変更し、プレイテストしてから元に戻します。
ET_NoSaveを使用してプレイテストで検証:start_stop_play、screen_capture、get_console_output。user_mouse_inputのx/yはGUI/画面座標です。ワールドポイントの場合はWorldToScreenPoint(= ビューポートy - 58)を使用。UIの場合はAbsolutePositionを使用。スクリーンショットはスケーリングされます(2011pxビューポートの約0.955倍)。TextBoxへのtextInputは届きません — 代わりにRemoteを介してRedeemフローのようなものをテストしてください。- StudioのDataStoreはライブのものです(APIアクセスオン):テスト中に書き込んだもの(例:テストコード)は後で必ず削除してください。
ゲームマップ(各要素の場所)
ReplicatedStorage.Shared.Config— すべてのチューニング:アイテム、従業員、パーク、マテリアル、イベント、Robux、RobuxClusters、テーマ、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は色ごとに1つのエミッターを作成。ServerScriptService.Main— セッション、すべてのRemoteアクション用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専用開発Remote:
devEvent、devCash、devRobux、devRobuxRemove、devRobuxReset、devOffline、devTutorial。管理者Remote(admin、op、...)はStudioで所有者に対して動作します(自分にrp/cash/tokenをギフト)。 - 誤って本番セーブでテストしないこと。 使い捨てプレイテストの前にEditモードで
workspace:SetAttribute("ET_NoSave", true)を設定し、テスト後は必ず削除してください。
既知の問題点(それぞれ一度はやらかした)
- Premium NPCのplaceエラーで「ゴースト」タイルが残る →
placeはpcall内でロールバック付きで構築。そのパターンを維持すること。 - PlayerAddedでyield(
Shop.checkPasses、DataStore読み込み):各yieldの後にセッションがまだ有効か確認するか、退出したプレイヤーのプロットが所有者なしで再構築される。PlayerRemovingはセーブの前にプロットを解放する。 UIGradientはBackgroundColor3を乗算する — ティールのフレームを紫色のグラデーションでクローンするとネイビーになる。グラデーションで色を変更する場合は背景を白に設定する。- キャッシュバーには
BumpUIScaleがある:そのAbsoluteSizeから位置を計算する場合は、そのスケールで除算すること。 - Buildモードの右マウスボタン = 長押しで削除。カメラパンは中マウス/WASD。
- ツリーのドラッグ開始は
UIS.InputBeganを使用する必要がある(ボタン押下はwin.InputBeganに到達しない)。 - フロアのテーマテクスチャは床の上に配置する(Textureインスタンス)。床のMaterialは変更しないこと。
- ユーザーのパーティクルシートは2x2フリップブックで小さな形状 → サイズを約2〜2.5倍にスケーリング。マルチカラー = 複数エミッター。
- 新しくアップロードしたテクスチャはしばらくぼやけて見えることがある(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\にエクスポート。コンピューター操作でインポート(アセットマネージャー → インポート → パスを入力 → インポート)、workspace.<FbxName>に配置。インポーターはX軸をミラーリング:Blender座標からCFrame.new(-x_b, z_b, y_b)でパーツを配置。プレビューレンダリング:一時的な「ET_Preview」シーン → 段階的な画像。 - ゲーム内の外部リンクは許可されていません:Discord/グループはゲームページのソーシャルリンクに。ゲーム内では
GroupService:PromptJoinAsync(groupId)「グループに参加」ボタンのみ。
収益化レイアウト(現状)
- Robuxショップ = パン移動する個別の島(
Config.RobuxClusters:ゲームパス、プレミアムワーカー、キャッシュ、ブースト&イベント)。パスを追加する = その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。
- フロアはSettingsで選択できる無料のリバース報酬。工場セーブ: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を取得):便利なもの — 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を設定、プレイを開始、Request Remote経由: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は除く)。セル→ワールド: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")でイベントをトリガー。タイムスタンプ付きのコンタクトシートでクリップを確認し、悪いものは再撮影。