Emotion Tycoon — acordo de trabalho e guia de jogo
Use isto sempre que o usuário mencionar Emotion Tycoon, suas árvores, trabalhadores, despejadores, reforços, eventos, andares, slots de salvamento, passes de jogo, invasões, códigos, o painel de administrador, ou pedir ícones, partículas, interface, modelos, miniaturas ou um vídeo promocional para ele — mesmo que descreva apenas um sintoma ("a árvore está travada", "as partículas parecem pequenas", "estou preso com $0").
O usuário é um desenvolvedor Roblox solo (grupo "Squashed Studios", id 706695552) que desenha à mão grande parte da arte e é exigente com qualquer coisa que pareça "vibecoded" ou gerada por IA. Tudo abaixo vem das próprias correções dele; trate como o estilo pessoal dele, não como sugestão. Ele costuma enviar longas rajadas de solicitações em voz: transforme cada rajada em uma lista de tarefas, corrija primeiro os bugs rápidos e responda cada item no relatório final (incluindo aqueles que você decidiu não fazer).
As regras fixas do usuário
- Respeite as edições dele. Nunca sobrescreva alterações de modelo/interface que o usuário fez manualmente. Leia antes de escrever.
- Sem interface com aparência de IA. Sem tags/emblemas de texto ("PASS", "NEW", "HOT"), sem pílulas gradientes brilhantes coladas nas coisas, sem ícones sobrepostos a campos de texto, sem linhas de texto flutuante explicando coisas. Diferencie as coisas por layout, estilo de contorno, cor ou agrupamento.
- Novas janelas: clone uma janela que o usuário já aprovou (layout de duas colunas
HUD.FriendModal,RebirthModal,OfflineModal) e troque o conteúdo, em vez de compor uma do zero. Uma janela feita do zero foi rejeitada como "visivelmente feita com IA". Campos de texto = caixa branca rebaixada com contorno escuro de 3px, texto escuro. - Números que o jogador possui parecem com a barra de dinheiro. Ex.: Raid Tokens = um clone de
HUD.Cashao lado com o ícone de token, hover (PC) / toque (celular) para uma dica de ferramenta. Sempre faça a informação de hover funcionar no celular (toque alterna). - Textura de stud real para fundos de interface:
rbxassetid://100839690373358(nunca uma procedural). - Use primeiro os assets feitos à mão (IDs abaixo). Não gere substitutos quando um deles existir.
- Termine toda resposta que adicionar visuais com uma pequena lista de assets que o usuário poderia desenhar para substituir placeholders.
- Glyph de Robux é o caractere de uso privado
U+E002. - Não alucine. Pesquise na web / leia o código quando estiver inseguro sobre uma API ou ID.
- Não abra uma segunda instância do Roblox Studio. O uso de computador é apenas para coisas que o MCP não pode fazer (importação FBX, Game Bar).
- Nunca salve o .blend deles (
C:\Users\cosul\Desktop\models_for_roblox\RobloxTycoon.blend); lembre-os de Ctrl+S. - Modelos 3D no Blender: baseados em modificadores, low-poly limpo, sombreamento plano; engrenagens no estilo do kit
/roblox-r6-armor. - Sem recompensas diárias (eles preferem ganhos offline/AFK). Mantenha hexágonos de "?" por toda parte — quando um "?" se tornar um nó real, adicione novos hexágonos de "?" além dele.
- Decidido / rejeitado (não repropor): proteção de base, pular rebirth, "Upgrade All" (apenas um botão de Max por NPC), uma loja de cosméticos, uma árvore de Troféus (Raid Tokens permanecem; ganhos pelo top 3 diário em Rebirths + a cada 5 rebirths). Weather Machine = exatamente 1 por terreno. Tutorial de Sinergia: em espera até que peçam.
- Nunca deixe um jogador ficir completamente preso. Qualquer alteração em custos/árvores/rebirth deve manter um caminho para uma linha funcional (Main tem
lineCost+ reabastecimentorescuee um guarda da Cash-Tree — mantenha-os funcionando).
Fluxo de trabalho com Studio MCP
- O ID do Studio muda por sessão — obtenha-o com
list_roblox_studios. - Editar datamodel está indisponível no modo Play. O usuário testa ele mesmo: verifique
get_studio_state; enquanto ele joga, você ainda pode LER scripts através do datamodel do Server (game.ServerScriptService.Main.Source). Aguarde (pesquise a cada poucos minutos); pare o teste dele apenas se ele estiver ocioso por minutos, e avise. Se ele pedir "verifique se as coisas foram salvas": edições persistem apenas quando feitas em Edit. execute_luauno Client/Server tem seu próprio cache de require:require(module)lá é uma cópia nova, não a que está em execução (monkey-patching não faz nada). Alcance o estado em execução através de remotes do jogo (ReplicatedStorage.Remotes.Request:InvokeServer(action, ...), incluindo operaçõesadmin) ou instâncias/atributos. Para testar edições no Config em modo Edit,require(Config:Clone()).- Edições de script:
ScriptEditorService:UpdateSourceAsyncviaexecute_luau, encontrar/substituir exato comstring.find(src, old, 1, true)e afirme que a correspondência é única. Use strings[==[ ]==](o código frequentemente contém]]). - A função
startdo móduloUIestá no limite de 200 registradores locais do Luau ("Out of local registers"). Nunca adicione novos locais de nível superior lá: coloque novos estados/funções na tabela compartilhadaextou dentro de blocosdo ... end. - Para testar um estado raro (ex.: uma linha cheia), altere temporariamente uma constante do Config em Edit, faça o playtest e depois reverta.
- Verifique com playtest usando
ET_NoSave:start_stop_play,screen_capture,get_console_output.user_mouse_inputx/y são coordenadas da GUI/tela: para um ponto no mundo useWorldToScreenPoint(= viewport y - 58); para UI useAbsolutePosition. Screenshots são escaladas (~0.955 da viewport 2011px).textInputem uma TextBox não a alcança — teste fluxos de resgate através do remote. - DataStores no Studio são as REAIS (acesso à API ativo): qualquer coisa que você escrever durante o teste (ex.: códigos de teste) deve ser apagada depois.
Mapa do jogo (onde as coisas estão)
ReplicatedStorage.Shared.Config— toda a sintonia: Items, Employees, Perks, Materials, Events, Robux,RobuxClusters, Themes, TreePaths/TreeLayout/RebirthLayout,AURA(quem buffa/debuffa quais tiles),CAPACITY_PERKS,MAX_LIVE_CUBES(por linha de despejador) /MAX_PLOT_CUBES, funções da Weather Machine (weatherChance,weatherUpgradeCost= parcela do próximo rebirth dobrada por nível,weatherRoll,weatherOwned), definições de Raid + tokens.ReplicatedStorage.Shared.Grid— matemática das células (20x20 tiles, TILE=4). Rotação r: 0=-Z 1=+X 2=+Z 3=-X.ReplicatedStorage.Shared.VFX— predefinições de partículas;VFX.burstfaz um emissor por cor.ServerScriptService.Main— sessões,handlers.*para cada ação remota (incl.batchpara construção por arrasto,upgradeWeather,redeemCode,buyRaidToken), dados da Weather Machine (data.wm,Factory.weatherHook), resgate, loop Heartbeat.pushStatepode ser retido (s.holdPush) durante um lote.ServerScriptService.Server.{Factory,Plots,Shop,Events,DataService,Leaderboards,Prices,Raids,Admin,Codes}. Factory: contagens de cubos por linha (session.lineCount,uncount),lineCap, atributoLineFullem despejadores, verificação de bloqueador em lotes (mantenha O(n), linhas podem conter 100 cubos),Factory.holdpara reconstruções em lote. Admin: operaçõesopssó para admins (presentear online/offline/cross-server, eventos, anunciar, códigos). Codes: DataStoreET_Codes_v1(chavecodes+uses_<CODE>), tipos cash/scaled/rp/token/boost, datas, usos máximos (0 = sem limite).StarterPlayerScripts.ClientModules.{UI,Build,Cubes,Life,Boards,Aura,Pop}— UI = HUD, árvores, modais, painel de inspeção; Build = fantasma, colocação por arrasto/lote com placeholders transparentes, segurar direita para deletar, mover; Aura = os quadrados verdes/vermelhos/amarelos dos tiles. UI do painel de admin:ServerStorage.AdminGui(+AdminClient), clonado apenas no PlayerGui dos admins.- Os canvases das árvores são nós autorados em
StarterGui.TreeGui.Window.Pan.{Canvas,RebirthCanvas,RobuxCanvas}.Nodes(atributos Q, R, Ring, Path, Mystery). Um novo nó = renomear/ converter um nó "?" naquela célula (removerMystery, definirPath) + adicionar o id àConfig.TreePaths/RebirthLayout. Posição: 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 desenvolvimento apenas no Studio:
devEvent,devCash,devRobux,devRobuxRemove,devRobuxReset,devOffline,devTutorial. Remotes de admin (admin, op, ...) funcionam no Studio para o dono (presentear rp/cash/token para si mesmo). - Nunca teste no save real por acidente.
workspace:SetAttribute("ET_NoSave", true)em Edit antes de um playtest descartável, remova depois.
Pegadinhas conhecidas (cada uma nos pegou uma vez)
- Erros de lugar de NPC Premium deixavam tiles "fantasmas" →
placeconstrói dentro de pcall com reversão; mantenha esse padrão. - PlayerAdded gera (
Shop.checkPasses, cargas do DataStore): após cada espera, verifique se a sessão ainda é atual, ou um jogador que saiu tem seu terreno reconstruído sem dono. PlayerRemoving libera o terreno ANTES de salvar. - Um
UIGradientmultiplicaBackgroundColor3— um quadro teal clonado com um gradiente roxo renderiza azul marinho. Defina o fundo para branco ao recolorir através do gradiente. - A barra de dinheiro tem um
BumpUIScale: qualquer coisa posicionada a partir de seu AbsoluteSize deve dividir por essa escala. - Botão direito do mouse no Build = segurar para deletar; panorâmica da câmera é botão do meio / WASD.
- O início do arrasto da árvore deve usar
UIS.InputBegan(pressionamentos de botão nunca alcançamwin.InputBegan). - Texturas de tema de andar vão por cima do andar (instância Texture); nunca mude o Material do andar.
- Folhas de partículas do usuário são flipbooks 2x2 com formas pequenas → escale o Size ~2-2.5x; multicolor = múltiplos emissores.
- Texturas recém-carregadas podem parecer borradas por um tempo (processamento do Roblox).
- Despejadores de alto nível precisam de muito trabalho por estágio; linhas fracas vendem por ~$1 (valor do cubo vazio).
- Imagens:
upload_imagefunciona a partir de um servidor http local (ex.:http://127.0.0.1:8765/<file>). - Pipeline FBX: exporte do Blender com
use_selection=True, object_types={'MESH'}, apply_unit_scale=True, mesh_smooth_type='FACE'para%LOCALAPPDATA%\Temp\et_export\; importe usando o computador (Asset Manager → Import → digite o caminho → Import), cai emworkspace.<FbxName>. O importador espelha X: coloque peças comCFrame.new(-x_b, z_b, y_b)a partir das coordenadas do Blender. Pré-visualizações de render: cena temporária "ET_Preview" → imagens em estágios. - Links externos no jogo não são permitidos: Discord/grupo vão nas Social Links da página do jogo; no jogo apenas um botão
GroupService:PromptJoinAsync(groupId)"Join group".
Layout de monetização (atual)
- Loja de Robux = ilhas separadas entre as quais você navega (
Config.RobuxClusters: Game Passes, Premium Workers, Cash, Boosts & Events). Adicionar um passe = adicione seu id aositemsde uma ilha + adicione um hexágono emRobuxCanvas.Nodes. - Passes e produtos são diferenciados pela ilha e animação de contorno, nunca por rótulos.
- Os preços são obtidos ao vivo (
Server.Prices→ atributoRobuxPricesdeReplicatedStorage). - IDs de Passes: HypeQueen 2026442663, DiamondWorker 2026394625, PassMidas 2025590666, PassLuck 2025848628, PassDrop 2025464639, PassVIP 2026922652, GoldenRobot 2025374681, LayoutSlot3 2026652648, LayoutSlot4 2026010654, Pass2x 2027138654.
- IDs de Produtos: 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.
- Andares são recompensas gratuitas de rebirth escolhidas em Settings. Salvamentos da fábrica: 2 slots gratuitos, slots 3–4 são passes.
- Jogadores avançados têm sextilhões e 30+ rebirths: precifique conteúdo tardio como uma parcela de
Config.rebirthCost(escala para sempre) em vez de um número fixo; códigos padrão para "% do próximo rebirth" pela mesma razão.
Os assets do usuário
Ícones: 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 (placa de linha cheia), backpack_cubes 84466301181838 / crate_cubes 108346564955404 / chest_cubes 131689000211065 (perks de capacidade).
Andares: ocean_lights 138556700370722, holy 105026190310831, pink 83692624195325, pink_green 136148045549462, redx 124121848293779.
Partículas (folhas 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"] (liste seus Decals para IDs): úteis — Down arrow 17368169201, Codes 17368032566, MultiGifts 15402969720, Expand 17368183719, Click 17260727409, Rocket 16670799841, Box 17368122337, Crate 17368402884. CubePets 17368391613 é um CACHORRO — nunca use para coisas que não são pets.
Receita de vídeo promocional (totalmente automatizada, sem cliques do usuário após as primeiras aprovações)
- Aprovações uma vez: acesso ao computador para Roblox Studio + Game Bar com combinações de teclas do sistema, e acesso à pasta
~/Videos(Game Bar salva emVideos\Captures). - Estado de vitrine: defina
ET_NoSave, inicie o play, então via remote Request:devCash, desbloqueie todos os nós da cash-tree (loopunlockaté não haver progresso), limpe o layout, construa 4 linhas (despejador em x=1 r=1, correias x=2..17, vendedor x=18; trabalhadores em ambos os lados voltados para a correia). Use Dropper2–4 para que os cubos realmente encham e vendam por números reais. - Diretor no cliente:
BindToRenderStepem Camera+5 forçandoCameraType=Scriptablee um_G.DirCF; auxiliares para Hold/Move/Orbit; alterne ScreenGuis do HUD (não TreeGui). Célula→mundo:X = -134 + 4x, Z = -96 + 4zpara Plot1. Quadro de pré-visualização comscreen_captureantes de gravar. - Gravação: foque o Studio,
win+alt+r→ execute a tomada (execute_luau, < 60 s) →win+alt+r. Pare eventos naturais comdevEvent("")entre as tomadas. Dispare eventos comdevEvent("Thunderstorm" | "MeteorShower" | "BloodMoon" | "CashRain" | "GoldenHour" | "Frost"). Verifique os clipes com uma folha de contato com carimbo de data/hora e regrave os ruins. - ...