Emotion Tycoon — accord de travail et manuel de jeu
Utilisez ceci à chaque fois que l'utilisateur mentionne Emotion Tycoon, ses arbres, travailleurs, distributeurs, boosts, événements, étages, emplacements de sauvegarde, passes de jeu, raids, codes, le panneau d'administration, ou demande des icônes, des particules, de l'interface utilisateur, des modèles, des vignettes ou une vidéo promotionnelle pour cela — même s'ils ne décrivent qu'un symptôme ("l'arbre est bloqué", "les particules semblent petites", "je suis coincé avec 0$").
L'utilisateur est un développeur Roblox solo (groupe "Squashed Studios", id 706695552) qui dessine à la main une grande partie de l'art et est exigeant sur tout ce qui a l'air "vibecodé" ou généré par IA. Tout ce qui suit provient de ses propres corrections ; traitez-le comme leur style maison, pas une suggestion. Ils envoient souvent de longues séries de requêtes dictées vocalement : transformez chaque série en une liste de tâches, corrigez d'abord les bugs rapides, et répondez à chaque élément dans le rapport final (y compris ceux que vous avez décidé de ne pas faire).
Les règles permanentes de l'utilisateur
- Respectez leurs modifications. Ne remplacez jamais les modifications de modèle/UI faites par l'utilisateur à la main. Lisez avant d'écrire.
- Pas d'UI qui a l'air IA. Pas d'étiquettes/puces/badges de texte ("PASS", "NEW", "HOT"), pas de pilules dégradées brillantes plaquées sur des choses, pas d'icônes chevauchant des champs de texte, pas de lignes de texte flottantes simples expliquant des choses. Distinguez les choses par la disposition, le style de contour, la couleur ou le regroupement.
- Nouvelles fenêtres : clonez une fenêtre que l'utilisateur a déjà approuvée (disposition à deux colonnes de
HUD.FriendModal,RebirthModal,OfflineModal) et échangez son contenu, au lieu d'en composer une à partir de zéro. Une fenêtre faite de zéro a été rejetée comme "visiblement faite avec l'IA". Champs de texte = boîte blanche encastrée avec le contour foncé de 3px, texte foncé. - Les nombres que le joueur possède ressemblent à la barre d'argent. Par exemple, Jetons de Raid = un clone de
HUD.Cashà côté avec l' icône de jeton, survol (PC) / appui (téléphone) pour une infobulle. Assurez-vous toujours que les infos de survol fonctionnent sur mobile (l'appui bascule). - Véritable texture de stud pour les fonds d'UI :
rbxassetid://100839690373358(jamais une texture procédurale). - Utilisez d'abord leurs assets faits main (IDs ci-dessous). Ne générez pas de remplacements quand l'un des leurs existe.
- Terminez chaque réponse qui ajoute des visuels par une courte liste d'assets qu'ils pourraient dessiner pour remplacer les espaces réservés.
- Le glyphe Robux est le caractère à usage privé
U+E002. - Ne délirez pas. Cherchez sur le web / lisez le code en cas de doute sur une API ou un ID.
- N'ouvrez pas une deuxième instance de Roblox Studio. L'utilisation de l'ordinateur est réservée aux choses que MCP ne peut pas faire (import FBX, Game Bar).
- Ne sauvegardez jamais leur fichier .blend (
C:\Users\cosul\Desktop\models_for_roblox\RobloxTycoon.blend) ; rappelez-leur de faire Ctrl+S. - Modèles 3D dans Blender: basés sur des modificateurs, low-poly propres, ombrage plat ; engrenage dans le style du kit
/roblox-r6-armor. - Pas de récompenses quotidiennes (ils préfèrent les gains hors ligne/AFK). Gardez les hexagones "?" mystères partout — quand un "?" devient un nœud réel, ajoutez de nouveaux hexagones "?" au-delà.
- Décidé / rejeté (ne pas re-proposer) : protection de base, saut de renaissance, "Améliorer Tout" (seulement un bouton Max par PNJ), une boutique de cosmétiques, un arbre Trophée (les Jetons de Raid restent ; gagnés par le top 3 quotidien des renaissances + chaque 5ème renaissance). Machine Météo = exactement 1 par parcelle. Tutoriel de synergie : en attente jusqu'à ce qu'ils demandent.
- Ne laissez jamais un joueur se retrouver complètement bloqué. Tout changement de coûts/arbres/renaissance doit garder un chemin vers une ligne
fonctionnelle (Main a
lineCost+ l'appointrescueet une garde d'Arbre d'Argent — gardez-les fonctionnels).
Workflow Studio MCP
- L'id Studio change à chaque session — obtenez-le avec
list_roblox_studios. - Le datamodel en édition est indisponible en mode Lecture. L'utilisateur teste lui-même : vérifiez
get_studio_state; pendant qu'ils jouent, vous pouvez encore LIRE les scripts via le datamodel Serveur (game.ServerScriptService.Main.Source). Attendez-les (interrogez toutes les quelques minutes) ; arrêtez leur test de jeu seulement s'ils sont inactifs depuis des minutes, et dites-le. S'ils demandent "vérifie que les choses sont sauvegardées" : les modifications ne persistent que lorsqu'elles sont faites en Édition. execute_luaudans Client/Serveur a son propre cache require :require(module)là est une copie fraîche, pas celle qui tourne (le monkey-patching ne fait rien). Accédez à l'état en cours via les remotes du jeu (ReplicatedStorage.Remotes.Request:InvokeServer(action, ...), incluant les opérationsadmin) ou les instances/attributs. Pour tester les modifications de Config en mode Édition,require(Config:Clone()).- Modifications de scripts :
ScriptEditorService:UpdateSourceAsyncviaexecute_luau, recherche/remplacement exact avecstring.find(src, old, 1, true)et affirmez que la correspondance est unique. Utilisez les chaînes[==[ ]==](le code contient souvent]]). - La fonction de démarrage du module
UIest à la limite des 200 registres locaux de Luau ("Out of local registers"). N'ajoutez jamais de nouvelles variables locales de haut niveau là : mettez les nouveaux états/fonctions sur la table partagéeextou à l'intérieur de blocsdo ... end. - Pour tester un état rare (par exemple une ligne pleine), changez temporairement une constante Config en mode Édition, testez le jeu, puis revenez en arrière.
- Vérifiez en jouant avec
ET_NoSave:start_stop_play,screen_capture,get_console_output.user_mouse_inputx/y sont des coordonnées GUI/écran : pour un point monde utilisezWorldToScreenPoint(= viewport y - 58) ; pour UI utilisezAbsolutePosition. Les captures d'écran sont mises à l'échelle (~0.955 du viewport 2011px).textInputdans une TextBox ne l'atteint pas — testez plutôt les flux de type échange via la remote. - Les DataStores dans Studio sont les VRAIS (accès API activé) : tout ce que vous écrivez pendant le test (par exemple des codes de test) doit être supprimé ensuite.
Carte du jeu (où se trouvent les choses)
ReplicatedStorage.Shared.Config— tout le réglage : Objets, Employés, Avantages, Matériaux, Événements, Robux,RobuxClusters, Thèmes, TreePaths/TreeLayout/RebirthLayout,AURA(qui buff/debuff quelles tuiles),CAPACITY_PERKS,MAX_LIVE_CUBES(par ligne de distributeur) /MAX_PLOT_CUBES, fonctions de la Machine Météo (weatherChance,weatherUpgradeCost= part du doublement de la prochaine renaissance par niveau,weatherRoll,weatherOwned), définitions de raid + jetons.ReplicatedStorage.Shared.Grid— maths de cellule (tuiles 20x20, TILE=4). Rotation r : 0=-Z 1=+X 2=+Z 3=-X.ReplicatedStorage.Shared.VFX— préréglages de particules ;VFX.burstfait un émetteur par couleur.ServerScriptService.Main— sessions,handlers.*pour chaque action distante (incluantbatchpour la construction par glisser,upgradeWeather,redeemCode,buyRaidToken), données de la Machine Météo (data.wm,Factory.weatherHook), sauvetage, boucle Heartbeat.pushStatepeut être retenu (s.holdPush) pendant un lot.ServerScriptService.Server.{Factory,Plots,Shop,Events,DataService,Leaderboards,Prices,Raids,Admin,Codes}. Factory : compteurs de cubes par ligne (session.lineCount,uncount),lineCap, attributLineFullsur les distributeurs, vérificateur de blocage segmenté (gardez-le O(n), les lignes peuvent contenir 100 cubes),Factory.holdpour les reconstructions par lots. Admin :opsréservés à l'admin (offrir en ligne/hors ligne/serveur croisé, événements, annoncer, codes). Codes : DataStoreET_Codes_v1(clécodes+uses_<CODE>), types cash/scaled/rp/token/boost, dates, utilisations max (0 = pas de limite).StarterPlayerScripts.ClientModules.{UI,Build,Cubes,Life,Boards,Aura,Pop}— UI = HUD, arbres, modales, panneau d'inspection ; Build = fantôme, placement par glisser/lot avec espaces réservés transparents, suppression par maintien du clic droit, déplacement ; Aura = les carrés de tuiles verts/rouges/jaunes. UI du panneau d'administration :ServerStorage.AdminGui(+AdminClient), cloné seulement dans le PlayerGui des admins.- Les canevas d'arbre sont des nœuds créés dans
StarterGui.TreeGui.Window.Pan.{Canvas,RebirthCanvas,RobuxCanvas}.Nodes(attributs Q, R, Ring, Path, Mystery). Un nouveau nœud = renommer/convertir un nœud "?" à cette cellule (supprimezMystery, définissezPath) + ajoutez l'id àConfig.TreePaths/RebirthLayout. Position : 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. - Remotes de développement réservées à Studio :
devEvent,devCash,devRobux,devRobuxRemove,devRobuxReset,devOffline,devTutorial. Remotes d'administration (admin, op, ...) fonctionnent dans Studio pour le propriétaire (offrez rp/cash/jeton à vous-même). - Ne testez jamais sur la vraie sauvegarde par accident.
workspace:SetAttribute("ET_NoSave", true)en mode Édition avant un test de jeu jetable, supprimez-le ensuite.
Pièges connus (chacun nous a mordu une fois)
- Les erreurs de placement des PNJ Premium laissaient des tuiles "fantômes" →
placeconstruit à l'intérieur de pcall avec rollback ; gardez ce motif. - PlayerAdded fait des yield (
Shop.checkPasses, chargement DataStore) : après chaque yield, vérifiez que la session est toujours actuelle, ou un joueur qui est parti voit sa parcelle reconstruite sans propriétaire. PlayerRemoving libère la parcelle AVANT la sauvegarde. - Un
UIGradientmultiplieBackgroundColor3— une trame teal clonée avec un dégradé violet rend navy. Définissez l'arrière-plan sur blanc lors de la recoloration via le dégradé. - La barre d'argent a un UIScale
Bump: tout ce qui est positionné à partir de son AbsoluteSize doit être divisé par cette échelle. - Bouton droit de la souris en mode Construction = maintien pour supprimer ; le panoramique de la caméra se fait avec le bouton du milieu / WASD.
- Le début du glisser d'arbre doit utiliser
UIS.InputBegan(les pressions de boutons n'atteignent jamaiswin.InputBegan). - Les textures de thème d'étage vont par-dessus le sol (instance Texture) ; ne changez jamais le Material du sol.
- Les feuilles de particules de l'utilisateur sont des flipbooks 2x2 avec de petites formes → échelle Size ~2–2,5x ; multicolore = multiples émetteurs.
- Les textures nouvellement téléchargées peuvent sembler floues pendant un certain temps (traitement Roblox).
- Les distributeurs de haut niveau nécessitent un travail énorme par étape ; les lignes faibles se vendent pour ~1$ (valeur de cube vide).
- Images :
upload_imagefonctionne depuis un serveur http local (par exemplehttp://127.0.0.1:8765/<fichier>). - Pipeline FBX : exportez depuis Blender avec
use_selection=True, object_types={'MESH'}, apply_unit_scale=True, mesh_smooth_type='FACE'vers%LOCALAPPDATA%\Temp\et_export\; importez par utilisation de l'ordinateur (Asset Manager → Importer → taper le chemin → Importer), atterrit dansworkspace.<FbxName>. L'importateur reflète X : placez les pièces avecCFrame.new(-x_b, z_b, y_b)depuis les coordonnées Blender. Rendu de prévisualisation : scène temporaire "ET_Preview" → images mises en scène. - Les liens externes dans le jeu ne sont pas autorisés : Discord/groupe vont sur les liens sociaux de la page du jeu ; dans le jeu seulement un
bouton "Rejoindre le groupe" de
GroupService:PromptJoinAsync(groupId).
Disposition de la monétisation (actuelle)
- Boutique Robux = îles séparées entre lesquelles vous pouvez faire glisser (
Config.RobuxClusters: Passes de Jeu, Travailleurs Premium, Argent, Boosts et Événements). Ajouter un pass = ajoutez son id auxitemsd'une île + ajoutez un hexagone dansRobuxCanvas.Nodes. - Les passes vs les produits sont distingués par l'île et l'animation du contour, jamais par des étiquettes.
- Les prix sont récupérés en direct (
Server.Prices→ attributReplicatedStorageRobuxPrices). - IDs de Pass : HypeQueen 2026442663, DiamondWorker 2026394625, PassMidas 2025590666, PassLuck 2025848628, PassDrop 2025464639, PassVIP 2026922652, GoldenRobot 2025374681, LayoutSlot3 2026652648, LayoutSlot4 2026010654, Pass2x 2027138654.
- IDs de Produit : 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.
- Les étages sont des récompenses de renaissance gratuites choisies dans les Paramètres. Sauvegardes d'usine : 2 emplacements gratuits, les emplacements 3–4 sont des passes.
- Les joueurs de fin de partie ont des sextillions et 30+ renaissances : tarifez le contenu tardif comme une part de
Config.rebirthCost(échelle infinie) plutôt qu'un nombre fixe ; les codes par défaut sont "% de la prochaine renaissance" pour la même raison.
Les assets de l'utilisateur
Icônes : 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 (panneau ligne pleine), backpack_cubes 84466301181838 / crate_cubes 108346564955404 / chest_cubes 131689000211065 (avantages de capacité).
Étages : ocean_lights 138556700370722, holy 105026190310831, pink 83692624195325, pink_green 136148045549462, redx 124121848293779.
Particules (feuilles 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"] (listez ses Decals pour les IDs) : utiles — Flèche Bas 17368169201, Codes
17368032566, MultiGifts 15402969720, Développer 17368183719, Clic 17260727409, Rocket 16670799841, Boîte 17368122337,
Caisse 17368402884. CubePets 17368391613 est un CHIEN — ne l'utilisez jamais pour des choses qui ne sont pas des animaux.
Recette de vidéo promo (entièrement automatisée, aucun clic utilisateur après les premières approbations)
- Approbations une fois : accès par utilisation de l'ordinateur à Roblox Studio + Game Bar avec les combinaisons de touches système, et accès au dossier
~/Videos(Game Bar sauvegarde dansVideos\Captures). - État de présentation : définissez
ET_NoSave, démarrez le jeu, puis via la remote Request :devCash, déverrouillez chaque nœud d'arbre d'argent (boucleunlockjusqu'à ce qu'il n'y ait plus de progression), effacez la disposition, construisez 4 lignes (distributeur à x=1 r=1, convoyeurs x=2..17, vendeur x=18 ; travailleurs des deux côtés faisant face au convoyeur). Utilisez Dropper2–4 pour que les cubes se remplissent et se vendent pour des nombres réels. - Directeur dans le client :
BindToRenderStepà Camera+5 forçantCameraType=Scriptableet un_G.DirCF; aides pour Hold/Move/Orbit ; basculez les ScreenGuis du HUD (pas TreeGui). Cellule→monde :X = -134 + 4x, Z = -96 + 4zpour Parcelle1. Cadrage de prévisualisation avecscreen_captureavant l'enregistrement. - Enregistrez : focalisez Studio,
win+alt+r→ exécutez le plan (execute_luau, < 60 s) →win+alt+r. Arrêtez les événements naturels avecdevEvent("")entre les plans. Déclenchez les événements avecdevEvent("Thunderstorm" | "MeteorShower" | "BloodMoon" | "CashRain" | "GoldenHour" | "Frost"). Vérifiez les clips avec une feuille de contact horodatée et refaites les mauvais.