/* ============================================================ * data.js โ€” object catalog, careers, skills, socials, need meta * ============================================================ */ 'use strict'; /* ---------------- NEEDS ---------------- */ const NEEDS = { hunger: { label:'Hunger', icon:'๐Ÿ”', color:'#e8a33d', decay: -7 }, energy: { label:'Energy', icon:'๐Ÿ’ค', color:'#7f6fd0', decay: -4 }, bladder: { label:'Bladder', icon:'๐Ÿšฝ', color:'#4fa3d9', decay: -6 }, hygiene: { label:'Hygiene', icon:'๐Ÿšฟ', color:'#5ad0c8', decay: -4 }, fun: { label:'Fun', icon:'๐ŸŽ‰', color:'#e05aa8', decay: -5 }, social: { label:'Social', icon:'๐Ÿ’ฌ', color:'#63c15a', decay: -5 }, comfort: { label:'Comfort', icon:'๐Ÿ›‹๏ธ', color:'#c9a24a', decay: -5 }, room: { label:'Room', icon:'๐ŸŒธ', color:'#9b7fd0', decay: 0 }, // computed from environment }; /* ---------------- SKILLS ---------------- */ const SKILLS = [ { id:'cooking', name:'Cooking', icon:'๐Ÿณ' }, { id:'mechanical', name:'Mechanical', icon:'๐Ÿ”ง' }, { id:'charisma', name:'Charisma', icon:'๐Ÿ’ฌ' }, { id:'body', name:'Body', icon:'๐Ÿ’ช' }, { id:'logic', name:'Logic', icon:'๐Ÿง ' }, { id:'creativity', name:'Creativity', icon:'๐ŸŽจ' }, { id:'cleaning', name:'Cleaning', icon:'๐Ÿงน' }, ]; /* ---------------- PERSONALITY TRAITS ---------------- */ const TRAITS = ['neat','outgoing','active','playful','nice']; /* ---------------- CAREERS ---------------- * 10 ranks each; generated salaries; skill requirements ramp. */ function makeCareer(id, icon, title1, titles, basePay, startHour, endHour, skillKey) { const ranks = []; for (let i = 0; i < 10; i++) { const req = {}; if (skillKey && i >= 1) req[skillKey] = Math.min(10, Math.ceil(i * 1.1)); if (i >= 5 && skillKey !== 'charisma') req.charisma = Math.ceil((i - 4) * 0.8); ranks.push({ title: titles[i], salary: Math.round(basePay * Math.pow(1.42, i)), hours: [startHour, endHour], offDays: (id === 'criminal') ? [2, 4] : [5, 6], // index of DAY_NAMES; criminal works weekends req, carpoolHour: startHour - 1, }); } return { id, icon, name: titles[0], trackName: title1 + ' Track', ranks }; } const CAREERS = [ makeCareer('business', '๐Ÿ’ผ', 'Business', ['Mailroom Tech','Trainee','Junior Executive','Executive','Assistant Manager','Manager','Vice President','President','CEO','Business Tycoon'], 154, 9, 16, 'charisma'), makeCareer('culinary', '๐Ÿณ', 'Culinary', ['Dish Washer','Fast Food Shift Manager','Drive-Thru Clerk','Counter Person','Waiter','Head Waiter','Sous-Chef','Executive Chef','Celebrity Chef','Five-Star Chef'], 126, 14, 21, 'cooking'), makeCareer('science', '๐Ÿ”ฌ', 'Science', ['Test Subject','Lab Assistant','Field Researcher','Science Teacher','Lab Tech','Research Assistant','Project Leader','Inventor','Scientist','Mad Scientist'], 140, 9, 15, 'logic'), makeCareer('medicine', '๐Ÿฉบ', 'Medicine', ['Emergency Medical Technician','Paramedic','Nurse','Orderly','Intern','Resident','General Practitioner','Specialist','Surgeon','Chief of Staff'], 168, 8, 17, 'mechanical'), makeCareer('athletic', '๐Ÿ†', 'Athletic', ['Locker Room Attendant','Team Mascot','Waterperson','Towel Boy','Equipment Manager','Team Physician','Coach','Mascot Manager','Most Valuable Player','Hall of Famer'], 132, 12, 19, 'body'), makeCareer('criminal', '๐Ÿ•ต๏ธ', 'Criminal', ['Con Artist','Pickpocket','Bookmaker','Cutpurse','Safecracker','Bank Robber','Cat Burglar','Safe Cracker','Getaway Driver','Crime Lord'], 150, 21, 4, 'body'), makeCareer('military', '๐ŸŽ–๏ธ', 'Military', ['Recruit','Private','Corporal','Sergeant','Junior Officer','Lieutenant','Captain','Major','Colonel','Astronaut'], 155, 7, 14, 'mechanical'), makeCareer('art', '๐ŸŽญ', 'Arts', ['Subway Performer','Coffee Shop Singer','Portrait Painter','Street Mime','Wedding Singer','Commercial Actor','Supporting Role','Lead Role','Famous Star','Icon'], 118, 13, 20, 'creativity'), ]; const ASPIRATIONS = { fortune: { name:'Fortune', icon:'๐Ÿ’ฐ', desc:'Wants riches and promotions.' }, knowledge: { name:'Knowledge', icon:'๐Ÿ“š', desc:'Wants maxed skills.' }, popularity: { name:'Popularity', icon:'๐ŸŽŠ', desc:'Wants many friends.' }, family: { name:'Family', icon:'๐Ÿก', desc:'Wants a cozy home life.' }, romance: { name:'Romance', icon:'๐Ÿ’˜', desc:'Wants love and charm.' }, }; /* ---------------- WHIMS (short-term wants) ---------------- */const WHIMS = { fortune: [ { id:'promote', icon:'โญ', label:'Get promoted', ev:'promotion', reward:130 }, { id:'earn', icon:'๐Ÿ’ฐ', label:'Earn ยง400 on the side', ev:'earn', amount:400, reward:80 }, { id:'job', icon:'๐Ÿ“‹', label:'Get hired', ev:'job', reward:60 }, ], knowledge: [ { id:'maxskill', icon:'๐Ÿง ', label:'Max out a skill (10)', ev:'skill', level:10, reward:150 }, { id:'anylevel', icon:'๐Ÿ“ˆ', label:'Gain any skill level', ev:'skill', reward:50 }, { id:'chessy', icon:'โ™Ÿ๏ธ', label:'Play chess', ev:'social', match:'chess', reward:40 }, ], popularity: [ { id:'friend', icon:'๐Ÿค', label:'Make a new friend', ev:'friend', reward:120 }, { id:'mixer', icon:'๐Ÿ’ฌ', label:'Socialize 5 times', ev:'social', count:5, reward:70 }, { id:'host', icon:'๐Ÿ‘‹', label:'Invite a neighbor over', ev:'visitor', reward:45 }, ], family: [ { id:'meal', icon:'๐Ÿฒ', label:'Cook a nice meal', ev:'meal', reward:60 }, { id:'rested', icon:'๐Ÿ˜ด', label:'Wake up fully rested', ev:'rested', reward:60 }, { id:'tidy', icon:'โœจ', label:'Clean something filthy', ev:'cleaned', reward:45 }, ], romance: [ { id:'flirt', icon:'๐Ÿ’—', label:'Flirt with someone', ev:'social', match:'flirt', reward:85 }, { id:'hug', icon:'๐Ÿค—', label:'Share a hug', ev:'social', match:'hug', reward:50 }, { id:'love', icon:'๐Ÿ’ž', label:'Fall in love', ev:'love', reward:200 }, ], }; /* ---------------- SOCIAL INTERACTIONS ---------------- */ const SOCIALS = [ { id:'talk', label:'Talk', icon:'๐Ÿ’ฌ', str:+4, ltr:+1.5, dur:10, minRel:-100 }, { id:'joke', label:'Joke', icon:'๐Ÿ˜„', str:+6, ltr:+2, dur:8, playfulBoost:true }, { id:'compliment', label:'Compliment', icon:'๐ŸŒน', str:+7, ltr:+2.5, dur:6, niceBoost:true }, { id:'hug', label:'Hug', icon:'๐Ÿค—', str:+9, ltr:+3.5, dur:5, minRel:25 }, { id:'flirt', label:'Flirt', icon:'๐Ÿ’—', str:+11, ltr:+5, dur:8, minRel:45, romanceOnly:false }, { id:'dance', label:'Dance Together', icon:'๐Ÿ•บ', str:+8, ltr:+3, dur:20 }, { id:'insult', label:'Insult', icon:'๐Ÿ˜ ', str:-12, ltr:-6, dur:5 }, { id:'argue', label:'Argue', icon:'๐Ÿ—ฏ๏ธ', str:-18, ltr:-9, dur:8, minRelMax:0 }, ]; /* ---------------- OBJECT CATALOG ---------------- * shape keys are painted procedurally in render.js * interactions: generic runner in ai.js โ€” dur = minutes, fx = need points/min while using */ /* --- meals by cooking skill (needs groceries from the fridge stock) --- */ const MEALS = [ { id:'quick', name:'Instant Noodles', skill:0, hunger:22, fun:2, emoji:'๐Ÿœ' }, { id:'spaghetti', name:'Spaghetti', skill:2, hunger:34, fun:8, emoji:'๐Ÿ' }, { id:'roast', name:'Sunday Roast', skill:4, hunger:46, fun:16, emoji:'๐Ÿ—' }, { id:'gourmet', name:'Gourmet Lobster', skill:6, hunger:58, fun:28, emoji:'๐Ÿฆž' }, ]; /* --- career chance cards (picked at random while at work) --- */ const CHANCE_CARDS = [ { q:'Your boss needs someone to stay late and finish a report.', a:[{ label:'Stay late', icon:'๐ŸŒ™', fx:{ perf:8, energy:-18 }, say:'๐Ÿ’ผ' }, { label:'Go home', icon:'๐Ÿ ', fx:{ perf:-3 }, say:'๐Ÿ˜' }] }, { q:'A coworker asks you to cover their mistake in front of the client.', a:[{ label:'Cover for them', icon:'๐Ÿค', fx:{ perf:5 }, say:'๐Ÿ˜‡' }, { label:'Tell the truth', icon:'๐Ÿ“ข', fx:{ perf:2, bonus:150 }, say:'๐Ÿ˜Ž' }] }, { q:'You found a wallet in the parking lot with ยง200 inside.', a:[{ label:'Return it', icon:'๐Ÿ™Œ', fx:{ perf:6 }, say:'๐Ÿ˜Š' }, { label:'Keep it', icon:'๐Ÿ’ฐ', fx:{ money:200, perf:-7 }, say:'๐Ÿค‘' }] }, { q:'Upper management is watching today. Impress them?', a:[{ label:'Give a bold presentation', icon:'๐Ÿ“Š', fx:{ dice:.55, win:{ perf:14 }, lose:{ perf:-10 } } }, { label:'Keep a low profile', icon:'๐Ÿ™ˆ', fx:{ perf:1 } }] }, { q:'The office espresso machine broke. Fix it yourself?', a:[{ label:'Fix it', icon:'๐Ÿ”ง', fx:{ dice:.7, win:{ skill:'mechanical', amt:1, perf:4 }, lose:{ perf:-5, say:'โšก' } } }, { label:'Drink tea instead', icon:'๐Ÿต', fx:{ fun:10 } }] }, { q:'A rival offers you insider tips for a quick promotion.', a:[{ label:'Take the tips', icon:'๐Ÿ•ต๏ธ', fx:{ dice:.6, win:{ perf:12 }, lose:{ perf:-12, firedRisk:.06 } } }, { label:'Refuse', icon:'๐Ÿ™…', fx:{ perf:3, say:'๐Ÿ™‚' } }] }, { q:'Charity gala tonight โ€” attend or rest?', a:[{ label:'Attend the gala', icon:'๐Ÿฅ‚', fx:{ energy:-15, perf:7, social:20 }, say:'โœจ' }, { label:'Sleep early', icon:'๐Ÿ˜ด', fx:{ energy:25, perf:-2 } }] }, ]; const OBJECTS = { /* --- seating --- */ chair: { id:'chair', name:'Chair', emoji:'๐Ÿช‘', price:85, w:1, h:1, cat:'seating', shape:'chair', rot:true, sit:true, env:2, interactions:[{ id:'sit', label:'Sit', icon:'๐Ÿ›‹๏ธ', dur:60, fx:{comfort:.35}, pose:'sit' }] }, stool: { id:'stool', name:'Stool', emoji:'๐ŸŸซ', price:50, w:1, h:1, cat:'seating', shape:'stool', rot:true, sit:true, env:1, interactions:[{ id:'sit', label:'Sit', icon:'๐Ÿ›‹๏ธ', dur:60, fx:{comfort:.28}, pose:'sit' }] }, sofa: { id:'sofa', name:'Sofa', emoji:'๐Ÿ›‹๏ธ', price:450, w:1, h:3, cat:'seating', shape:'sofa', rot:true, sit:true, env:4, comfortSeat:1, interactions:[ { id:'sit', label:'Sit', icon:'๐Ÿ›‹๏ธ', dur:60, fx:{comfort:.45}, pose:'sit' }, { id:'nap', label:'Nap', icon:'๐Ÿ’ค', dur:120, fx:{energy:.22, comfort:.3}, pose:'sit' }] }, loveseat: { id:'loveseat', name:'Loveseat', emoji:'๐Ÿ’บ', price:350, w:1, h:2, cat:'seating', shape:'loveseat', rot:true, sit:true, env:3, interactions:[{ id:'sit', label:'Sit', icon:'๐Ÿ›‹๏ธ', dur:60, fx:{comfort:.4}, pose:'sit' }] }, /* --- tables --- */ table: { id:'table', name:'Table', emoji:'๐Ÿฝ๏ธ', price:250, w:1, h:1, cat:'tables', shape:'table', rot:true, env:2, eatSpot:true, interactions:[] }, coffeeTable: { id:'coffeeTable', name:'Coffee Table', emoji:'โ˜•', price:120, w:2, h:1, cat:'tables', shape:'coffeeTable', rot:true, env:2, interactions:[] }, desk: { id:'desk', name:'Desk', emoji:'๐Ÿ—„๏ธ', price:180, w:2, h:1, cat:'tables', shape:'desk', rot:true, env:2, interactions:[] }, /* --- beds --- */ bedSingle: { id:'bedSingle', name:'Single Bed', emoji:'๐Ÿ›๏ธ', price:400, w:1, h:2, cat:'beds', shape:'bedSingle', rot:true, env:3, sleep:true, interactions:[ { id:'sleep', label:'Sleep', icon:'๐Ÿ˜ด', special:'sleep', pose:'lie' }, { id:'nap', label:'Nap 2h', icon:'๐Ÿ’ค', special:'sleep', nap:true, pose:'lie' }] }, bedDouble: { id:'bedDouble', name:'Double Bed', emoji:'๐Ÿ›Œ', price:900, w:2, h:2, cat:'beds', shape:'bedDouble', rot:true, env:5, sleep:true, love:true, interactions:[ { id:'sleep', label:'Sleep', icon:'๐Ÿ˜ด', special:'sleep', pose:'lie' }, { id:'nap', label:'Nap 2h', icon:'๐Ÿ’ค', special:'sleep', nap:true, pose:'lie' }, { id:'tryBaby', label:'Try for Baby', icon:'๐Ÿ‘ถ', special:'tryBaby', pose:'lie', dur:25 }] }, /* --- plumbing --- */ toilet: { id:'toilet', name:'Toilet', emoji:'๐Ÿšฝ', price:300, w:1, h:1, cat:'bath', shape:'toilet', rot:true, env:-2, interactions:[ { id:'pee', label:'Use Toilet', icon:'๐Ÿšฝ', dur:10, fx:{bladder:9}, pose:'sit' }, { id:'clean',label:'Clean Toilet', icon:'๐Ÿงฝ', special:'clean', requiresDirty:true }] }, shower: { id:'shower', name:'Shower', emoji:'๐Ÿšฟ', price:500, w:1, h:1, cat:'bath', shape:'shower', rot:true, env:1, interactions:[{ id:'shower', label:'Take Shower', icon:'๐Ÿšฟ', dur:22, fx:{hygiene:4.4, fun:.15, energy:.05}, pose:'stand' }] }, bathtub:{ id:'bathtub', name:'Bathtub', emoji:'๐Ÿ›', price:600, w:1, h:2, cat:'bath', shape:'bathtub', rot:true, env:3, interactions:[{ id:'bathe', label:'Take Bath', icon:'๐Ÿ›', dur:40, fx:{hygiene:2.4, comfort:.5, fun:.3}, pose:'lie' }] }, sink: { id:'sink', name:'Sink', emoji:'๐Ÿšฐ', price:150, w:1, h:1, cat:'bath', shape:'sink', rot:true, env:1, interactions:[{ id:'wash', label:'Wash Up', icon:'๐Ÿงผ', dur:5, fx:{hygiene:3.5}, pose:'stand' }] }, mirror: { id:'mirror', name:'Wall Mirror', emoji:'๐Ÿชž', price:175, w:1, h:1, cat:'bath', shape:'mirror', wallObj:true, rot:true, env:2, interactions:[{ id:'practice', label:'Practice Charisma', icon:'๐Ÿ’ฌ', dur:60, fx:{social:.1, fun:.08}, skill:{id:'charisma', rate:.028}, pose:'stand' }] }, /* --- kitchen --- */ fridge: { id:'fridge', name:'Fridge', emoji:'๐ŸงŠ', price:600, w:1, h:1, cat:'kitchen', shape:'fridge', rot:true, env:1, interactions:[ { id:'meal', label:'Have a Meal', icon:'๐Ÿฒ', special:'cookMeal', pose:'stand' }, { id:'snack', label:'Grab a Snack', icon:'๐ŸŽ', dur:8, fx:{hunger:2.6}, pose:'stand' }, { id:'groceries', label:'Order Groceries (ยง60)', icon:'๐Ÿ›๏ธ', special:'groceries', cost:60, pose:'stand' }] }, stove: { id:'stove', name:'Stove', emoji:'๐Ÿ”ฅ', price:500, w:1, h:1, cat:'kitchen', shape:'stove', rot:true, env:1, interactions:[] }, counter:{ id:'counter', name:'Counter', emoji:'๐Ÿงพ', price:140, w:1, h:1, cat:'kitchen', shape:'counter', rot:true, env:1, prepTarget:true, interactions:[] }, trash: { id:'trash', name:'Trash Can', emoji:'๐Ÿ—‘๏ธ', price:60, w:1, h:1, cat:'kitchen', shape:'trash', rot:true, env:-3, interactions:[{ id:'empty', label:'Empty Trash', icon:'๐Ÿ—‘๏ธ', special:'emptyTrash', requiresFull:true }] }, /* --- electronics --- */ tv: { id:'tv', name:'Television', emoji:'๐Ÿ“บ', price:800, w:2, h:1, cat:'electronics', shape:'tv', rot:true, env:3, fragile:.0035, watchTarget:true, interactions:[{ id:'watch', label:'Watch TV', icon:'๐Ÿ“บ', dur:90, fx:{fun:.55, comfort:.06, social:.04}, pose:'sitOrStand' }] }, stereo: { id:'stereo', name:'Stereo', emoji:'๐Ÿ”Š', price:550, w:1, h:1, cat:'electronics', shape:'stereo', rot:true, env:2, fragile:.0025, interactions:[{ id:'dance', label:'Dance!', icon:'๐Ÿ’ƒ', dur:45, fx:{fun:.75, social:.05}, skill:{id:'body', rate:.006}, pose:'stand', anim:'dance' }] }, computer:{ id:'computer', name:'Computer', emoji:'๐Ÿ–ฅ๏ธ', price:2100, w:1, h:1, cat:'electronics', shape:'computer', rot:true, env:2, fragile:.0018, interactions:[ { id:'findJob', label:'Find a Jobโ€ฆ', icon:'๐Ÿ“ฐ', special:'findJob', pose:'sit' }, { id:'games', label:'Play Games', icon:'๐ŸŽฎ', dur:60, fx:{fun:.65}, skill:{id:'logic', rate:.008}, pose:'sit' }, { id:'write', label:'Write Novel', icon:'โœ๏ธ', special:'writeNovel', pose:'sit', dur:90 }] }, phone: { id:'phone', name:'Telephone', emoji:'โ˜Ž๏ธ', price:90, w:1, h:1, cat:'electronics', shape:'phone', rot:true, env:0, interactions:[ { id:'chatPhone', label:'Chat With Friend', icon:'๐Ÿ“ž', dur:30, fx:{social:1.4, fun:.15}, pose:'stand' }, { id:'invite', label:'Invite Neighbor Over', icon:'๐Ÿ‘‹', special:'inviteOver', pose:'stand' }, { id:'party', label:'Throw Party Tonight ๐ŸŽ‰', icon:'๐Ÿฅณ', special:'throwParty', pose:'stand' }, { id:'orderPizza',label:'Order Pizza (ยง40)', icon:'๐Ÿ•', special:'pizza', cost:40, pose:'stand' }] }, /* --- skill / fun objects --- */ bookshelf:{ id:'bookshelf', name:'Bookshelf', emoji:'๐Ÿ“š', price:250, w:1, h:1, cat:'study', shape:'bookshelf', rot:true, env:3, interactions:[ { id:'readLogic', label:'Study Logic', icon:'๐Ÿง ', dur:60, fx:{fun:.05, energy:.02}, skill:{id:'logic', rate:.03}, pose:'stand' }, { id:'readCook', label:'Study Cooking', icon:'๐Ÿณ', dur:60, fx:{fun:.08}, skill:{id:'cooking', rate:.03}, pose:'stand' }, { id:'readMech', label:'Study Mechanical', icon:'๐Ÿ”ง', dur:60, fx:{fun:.05}, skill:{id:'mechanical', rate:.03}, pose:'stand' }, { id:'readFun', label:'Read for Fun', icon:'๐Ÿ“–', dur:60, fx:{fun:.55}, pose:'stand' }] }, easel: { id:'easel', name:'Easel', emoji:'๐Ÿ–ผ๏ธ', price:350, w:1, h:1, cat:'study', shape:'easel', rot:true, env:2, interactions:[ { id:'paint', label:'Paint', icon:'๐ŸŽจ', dur:90, fx:{fun:.4, energy:-.05}, skill:{id:'creativity', rate:.033}, special:'paint', pose:'stand' }] }, treadmill:{ id:'treadmill', name:'Treadmill', emoji:'๐Ÿƒ', price:1200, w:1, h:1, cat:'study', shape:'treadmill', rot:true, env:1, fragile:.0022, interactions:[{ id:'workout', label:'Work Out', icon:'๐Ÿ’ช', dur:60, fx:{fun:-.05, hygiene:-.35, energy:-.12}, skill:{id:'body', rate:.033}, pose:'stand', anim:'exercise' }] }, piano: { id:'piano', name:'Piano', emoji:'๐ŸŽน', price:1300, w:2, h:1, cat:'study', shape:'piano', rot:true, env:4, interactions:[{ id:'playPiano', label:'Play Piano', icon:'๐ŸŽน', dur:60, fx:{fun:.45, social:.05}, skill:{id:'creativity', rate:.026}, pose:'sit' }] }, chessboard: { id:'chessboard', name:'Chess Table', emoji:'โ™Ÿ๏ธ', price:450, w:1, h:1, cat:'study', shape:'chessboard', rot:true, env:3, interactions:[ { id:'chess', label:'Play Chess', icon:'โ™Ÿ๏ธ', dur:60, fx:{fun:.4, logic:.0}, skill:{id:'logic', rate:.028}, pose:'sit' }] }, /* --- decor --- */ plant: { id:'plant', name:'Potted Plant', emoji:'๐Ÿชด', price:120, w:1, h:1, cat:'decor', shape:'plant', rot:false, env:4 }, lamp: { id:'lamp', name:'Floor Lamp', emoji:'๐Ÿ’ก', price:75, w:1, h:1, cat:'decor', shape:'lamp', rot:false, env:2, light:70 }, painting:{ id:'painting', name:'Painting', emoji:'๐Ÿž๏ธ', price:200, w:1, h:1, cat:'decor', shape:'painting', wallObj:true, rot:true, env:5 }, fountain:{ id:'fountain', name:'Fountain', emoji:'โ›ฒ', price:2500, w:2, h:2, cat:'decor', shape:'fountain', rot:false, env:8, light:40 }, easel: { id:'easel', name:'Easel', emoji:'๐ŸŽจ', price:450, w:1, h:1, cat:'decor', shape:'easel', rot:true, env:4, interactions:[ { id:'paint', label:'Paint a Canvas', icon:'๐Ÿ–Œ๏ธ', special:'paint', pose:'stand', dur:90 }, { id:'sellArt', label:'Sell Paintings', icon:'๐Ÿ’ต', special:'sellArt', pose:'stand', dur:10 }] }, gravestone:{ id:'gravestone', name:'Gravestone', emoji:'๐Ÿชฆ', price:0, w:1, h:1, cat:'hidden', shape:'gravestone', rot:false, env:-6 }, crib: { id:'crib', name:'Crib', emoji:'๐Ÿงธ', price:350, w:1, h:1, cat:'kids', shape:'crib', rot:true, env:3, sleep:true, interactions:[ { id:'sleep', label:'Baby Nap', icon:'๐Ÿ˜ด', special:'sleep', nap:true, pose:'lie', babyOnly:true }] }, toybox: { id:'toybox', name:'Toy Box', emoji:'๐Ÿช€', price:180, w:1, h:1, cat:'kids', shape:'toybox', rot:false, env:4, interactions:[{ id:'playToys', label:'Play with Toys', icon:'๐Ÿงธ', dur:45, fx:{fun:.7}, pose:'stand', childOnly:true }] }, }; /* ---------------- BUY CATEGORIES ---------------- */ const BUY_CATS = [ { id:'seating', label:'Seating', icon:'๐Ÿ›‹๏ธ' }, { id:'tables', label:'Tables', icon:'๐Ÿฝ๏ธ' }, { id:'beds', label:'Beds', icon:'๐Ÿ›๏ธ' }, { id:'bath', label:'Bathroom', icon:'๐Ÿšฟ' }, { id:'kitchen', label:'Kitchen', icon:'๐Ÿณ' }, { id:'electronics', label:'Electronics', icon:'๐Ÿ“บ' }, { id:'study', label:'Skill & Fun', icon:'๐Ÿ“š' }, { id:'decor', label:'Decor', icon:'๐Ÿชด' }, { id:'kids', label:'Kids', icon:'๐Ÿงธ' }, ]; /* ---------------- FLOOR STYLES & WALL STYLES ---------------- */ const FLOORS = [ { id:'grass', c1:'#69a84f', c2:'#5f9c47', outdoor:true }, { id:'wood', c1:'#b98a52', c2:'#a87b46' }, { id:'tile', c1:'#dfe6ea', c2:'#cdd6dc' }, { id:'carpet', c1:'#b0576a', c2:'#a34e60' }, { id:'stone', c1:'#9aa2ab', c2:'#8b939c' }, { id:'darkwood', c1:'#7a5636', c2:'#6c4a2e' }, ]; const WALL_COLORS = ['#efe6d4','#d9cdb8','#bcd3e8','#d8bfcf','#c9dfc0','#e8d2a4','#b9aabf'];