{"version":"19e1e4068ed9","note":"Generated by tools/build_assets.py. Do not edit.","size":[1024,1393],"palette":[["ink","#181020"],["night","#282038"],["gray-1","#504860"],["gray-2","#787088"],["gray-3","#a8a0b8"],["gray-4","#d8d0e0"],["white","#f8f8f0"],["skin-lt","#f8d8b8"],["skin","#f0b090"],["skin-sh","#c88070"],["blush","#e88888"],["lips","#c85860"],["eyes","#603820"],["hair","#201020"],["hair-hi","#382838"],["hair-sheen","#584858"],["buzz","#705860"],["tattoo","#584858"],["black-sh","#201828"],["black","#383048"],["black-hi","#585070"],["leather","#785040"],["leather-dk","#503028"],["jacket-lt","#b0d8f8"],["jacket","#78b0e8"],["jacket-dk","#4878c0"],["denim-lt","#5070b0"],["denim","#305090"],["denim-dk","#203868"],["silver-lt","#e8f0f8"],["silver","#a8b0c8"],["silver-dk","#687088"],["gold-lt","#f8d860"],["gold","#d0a038"],["gold-dk","#906020"],["brown-lt","#d89868"],["brown","#b07048"],["brown-dk","#804830"],["deep-lt","#a86840"],["deep","#784028"],["deep-dk","#502818"],["fair-lt","#f8e8e0"],["fair","#f8d0c8"],["fair-sh","#d8a0a0"],["hair-brown","#402818"],["moon-lt","#f8f088"],["moon","#e0c040"],["purple-dk","#281848"],["purple","#483078"],["purple-lt","#7858b0"],["sky-dk","#182888"],["sky","#3050d0"],["sea-dk","#204858"],["sea","#307078"],["sea-lt","#68a8a8"],["brick-dk","#883828"],["brick","#b85840"],["leaf-dk","#387848"],["leaf","#68a858"],["heron","#98b0c8"],["pom-dk","#801828"],["pom","#c02838"],["wheat-dk","#b88850"],["wheat","#e8c890"],["sun-orange","#f89858"],["sun-pink","#f8b8a8"],["sun-gold","#f8d8a0"],["void","#100818"],["shadow","#301848"],["glow","#a868e8"],["glow-lt","#d0a0f8"],["heal","#78e8a0"]],"images":{"alejandro/alejandro_portraits.png":[736,1012,192,64],"alejandro/alejandro_sheet.png":[578,0,128,260],"angela/angela_portraits_all.png":[0,1166,192,64],"angela/angela_portraits_gold.png":[193,1166,192,64],"angela/angela_portraits_none.png":[386,1166,192,64],"angela/angela_sheet_all.png":[836,0,128,240],"angela/angela_sheet_gold.png":[0,385,128,240],"angela/angela_sheet_none.png":[129,385,128,240],"art/bg_sunrise.png":[844,626,180,192],"art/bg_title.png":[0,819,180,192],"art/bg_world1.png":[181,819,180,192],"art/bg_world2.png":[0,626,240,192],"art/bg_world3.png":[645,385,320,192],"art/bg_world4.png":[241,626,200,192],"art/bg_world5.png":[362,819,180,192],"art/bg_world6.png":[442,626,200,192],"art/bg_world7.png":[643,626,200,192],"art/bg_world8.png":[543,819,180,192],"art/boat_screen.png":[901,1231,112,64],"art/cards.png":[0,1012,664,153],"art/props.png":[724,819,256,187],"art/title_heart.png":[665,1012,70,66],"bartender/bartender_portraits.png":[579,1166,192,64],"bartender/bartender_sheet.png":[582,1296,128,48],"critic/critic_portraits.png":[772,1231,128,64],"critic/critic_sheet.png":[711,1296,128,48],"elias/elias_portraits.png":[772,1166,192,64],"elias/elias_sheet.png":[707,0,128,260],"forgetting/forgetting_fx.png":[0,1361,64,32],"forgetting/forgetting_portraits.png":[0,1296,64,64],"forgetting/forgetting_sheet.png":[321,0,256,320],"heron/heron_portraits.png":[65,1296,64,64],"heron/heron_sheet.png":[0,0,320,384],"jahdira/jahdira_portraits.png":[0,1231,192,64],"jahdira/jahdira_sheet.png":[258,385,128,240],"jahdira_ms/jahdira_ms_portraits.png":[193,1231,192,64],"jahdira_ms/jahdira_ms_sheet.png":[387,385,128,240],"lucky_bartender/lucky_bartender_portraits.png":[130,1296,64,64],"lucky_bartender/lucky_bartender_sheet.png":[840,1296,128,48],"moon/moon_portraits.png":[195,1296,64,64],"moon/moon_sheet.png":[389,1296,192,48],"naomi/naomi_portraits.png":[386,1231,192,64],"naomi/naomi_sheet.png":[516,385,128,240],"sailor/sailor_portraits.png":[579,1231,192,64],"sailor/sailor_sheet.png":[260,1296,128,52]},"frames":{"alejandro":{"character":"alejandro","frame_w":32,"frame_h":52,"anchor":"bottom-center (feet). His frames are 4 px taller than Angela's (32x48) because he is 6'0\" to her 5'7\".","sheet":"alejandro_sheet.png","animations":{"walk_down":{"fps":8,"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":52},{"x":32,"y":0,"w":32,"h":52},{"x":64,"y":0,"w":32,"h":52},{"x":96,"y":0,"w":32,"h":52}]},"walk_left":{"fps":8,"loop":true,"frames":[{"x":0,"y":52,"w":32,"h":52},{"x":32,"y":52,"w":32,"h":52},{"x":64,"y":52,"w":32,"h":52},{"x":96,"y":52,"w":32,"h":52}]},"walk_right":{"fps":8,"loop":true,"frames":[{"x":0,"y":104,"w":32,"h":52},{"x":32,"y":104,"w":32,"h":52},{"x":64,"y":104,"w":32,"h":52},{"x":96,"y":104,"w":32,"h":52}]},"walk_up":{"fps":8,"loop":true,"frames":[{"x":0,"y":156,"w":32,"h":52},{"x":32,"y":156,"w":32,"h":52},{"x":64,"y":156,"w":32,"h":52},{"x":96,"y":156,"w":32,"h":52}]},"stand_left":{"frames":[{"x":32,"y":52,"w":32,"h":52}]},"stand_right":{"frames":[{"x":32,"y":104,"w":32,"h":52}]},"stand_up":{"frames":[{"x":32,"y":156,"w":32,"h":52}]},"stand_down":{"frames":[{"x":0,"y":208,"w":32,"h":52}]},"idle":{"loop":true,"frames":[{"x":0,"y":208,"w":32,"h":52},{"x":32,"y":208,"w":32,"h":52},{"x":64,"y":208,"w":32,"h":52},{"x":96,"y":208,"w":32,"h":52}],"durations_ms":[1400,600,1400,140],"note":"stand, breathe (1 px), stand, blink. Use while standing still facing down."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"alejandro_portraits.png","expressions":{"happy":{"x":0,"y":0,"w":64,"h":64},"soft":{"x":64,"y":0,"w":64,"h":64},"laughing":{"x":128,"y":0,"w":64,"h":64}}}},"angela":{"character":"angela","frame_w":32,"frame_h":48,"sheets":{"none":"angela_sheet_none.png","gold":"angela_sheet_gold.png","all":"angela_sheet_all.png"},"chain_states":{"none":"game start, no chains","gold":"after finding the gold chain in World 1","all":"after Alejandro returns the two silver chains (ending)"},"animations":{"walk_down":{"fps":8,"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":96,"y":0,"w":32,"h":48}]},"walk_left":{"fps":8,"loop":true,"frames":[{"x":0,"y":48,"w":32,"h":48},{"x":32,"y":48,"w":32,"h":48},{"x":64,"y":48,"w":32,"h":48},{"x":96,"y":48,"w":32,"h":48}]},"walk_right":{"fps":8,"loop":true,"frames":[{"x":0,"y":96,"w":32,"h":48},{"x":32,"y":96,"w":32,"h":48},{"x":64,"y":96,"w":32,"h":48},{"x":96,"y":96,"w":32,"h":48}]},"walk_up":{"fps":8,"loop":true,"frames":[{"x":0,"y":144,"w":32,"h":48},{"x":32,"y":144,"w":32,"h":48},{"x":64,"y":144,"w":32,"h":48},{"x":96,"y":144,"w":32,"h":48}]},"stand_left":{"frames":[{"x":32,"y":48,"w":32,"h":48}]},"stand_right":{"frames":[{"x":32,"y":96,"w":32,"h":48}]},"stand_up":{"frames":[{"x":32,"y":144,"w":32,"h":48}]},"stand_down":{"frames":[{"x":0,"y":192,"w":32,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48},{"x":64,"y":192,"w":32,"h":48},{"x":96,"y":192,"w":32,"h":48}],"durations_ms":[1600,500,1600,500],"note":"hair flip: hair down, flip to her right (left buzz shows), hair down, flip to her left (right buzz shows). Use while standing still facing down."}},"portraits":{"frame_w":64,"frame_h":64,"sheets":{"none":"angela_portraits_none.png","gold":"angela_portraits_gold.png","all":"angela_portraits_all.png"},"expressions":{"happy":{"x":0,"y":0,"w":64,"h":64},"surprised":{"x":64,"y":0,"w":64,"h":64},"soft":{"x":128,"y":0,"w":64,"h":64}}}},"bartender":{"character":"bartender","frame_w":32,"frame_h":48,"anchor":"bottom-center (feet). Same 32x48 frame as Angela; he is 5'7\" like her, so his eyes sit level with hers. He stays behind the bar: draw the counter over him so it hides his legs.","sheet":"bartender_sheet.png","animations":{"stand_down":{"frames":[{"x":0,"y":0,"w":32,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":96,"y":0,"w":32,"h":48}],"durations_ms":[2000,250,1000,1100],"note":"pours a glass of red wine: ready with the bottle and an empty glass, tips the bottle, pours (thin red stream, glass half full), raises the full glass with a wink. Frame 1 holds longest, so the glass resetting to empty reads as a fresh pour. No walk animations: he never leaves the bar."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"bartender_portraits.png","expressions":{"welcoming":{"x":0,"y":0,"w":64,"h":64},"wink":{"x":64,"y":0,"w":64,"h":64},"laughing":{"x":128,"y":0,"w":64,"h":64}},"notes":{"welcoming":"greets Angela and takes the order (his default)","wink":"brings the wine and plays along with the date","laughing":"laughs at her \"You're so silly\""}}},"critic":{"character":"critic","name":"The Critic","frame_w":32,"frame_h":48,"anchor":"bottom-center (feet). Same 32x48 frame as Angela; she is about 5'4\" to Angela's 5'7\", so her head sits about 4 px lower.","sheet":"critic_sheet.png","note":"NPC in the Jaya palace dining room (World 7). Idle only, no walk rows. The table is world art, drawn separately.","animations":{"stand_down":{"frames":[{"x":0,"y":0,"w":32,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":0,"y":0,"w":32,"h":48},{"x":96,"y":0,"w":32,"h":48}],"durations_ms":[1600,1200,800,900,150],"names":["stand","peer","sniff","stand","blink"],"note":"stands with her opera glasses at her shoulder, raises them and peers, lowers them and sniffs with her nose in the air, stands, blinks. Frame 1 repeats, so play the list as given. She always faces down."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"critic_portraits.png","expressions":{"snooty":{"x":0,"y":0,"w":64,"h":64},"impressed":{"x":64,"y":0,"w":64,"h":64}},"notes":{"snooty":"peering through her gold opera glasses, half-lidded, one brow arched, pursed red lips. Use while she asks whether the food deserves its star","impressed":"glasses down, brows up, eyes open, an approving smile. Use after Angela says yes, it was very good"}}},"elias":{"character":"elias","frame_w":32,"frame_h":52,"anchor":"bottom-center (feet). His frames are 32x52 like Alejandro's: he is 5'9\" to Angela's 5'7\", so his eyes sit 2 px above hers, and the extra height is headroom for the baker's cap.","sheet":"elias_sheet.png","animations":{"walk_down":{"fps":8,"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":52},{"x":32,"y":0,"w":32,"h":52},{"x":64,"y":0,"w":32,"h":52},{"x":96,"y":0,"w":32,"h":52}]},"walk_left":{"fps":8,"loop":true,"frames":[{"x":0,"y":52,"w":32,"h":52},{"x":32,"y":52,"w":32,"h":52},{"x":64,"y":52,"w":32,"h":52},{"x":96,"y":52,"w":32,"h":52}]},"walk_right":{"fps":8,"loop":true,"frames":[{"x":0,"y":104,"w":32,"h":52},{"x":32,"y":104,"w":32,"h":52},{"x":64,"y":104,"w":32,"h":52},{"x":96,"y":104,"w":32,"h":52}]},"walk_up":{"fps":8,"loop":true,"frames":[{"x":0,"y":156,"w":32,"h":52},{"x":32,"y":156,"w":32,"h":52},{"x":64,"y":156,"w":32,"h":52},{"x":96,"y":156,"w":32,"h":52}]},"stand_left":{"frames":[{"x":32,"y":52,"w":32,"h":52}]},"stand_right":{"frames":[{"x":32,"y":104,"w":32,"h":52}]},"stand_up":{"frames":[{"x":32,"y":156,"w":32,"h":52}]},"stand_down":{"frames":[{"x":0,"y":208,"w":32,"h":52}]},"idle":{"loop":true,"frames":[{"x":0,"y":208,"w":32,"h":52},{"x":32,"y":208,"w":32,"h":52},{"x":64,"y":208,"w":32,"h":52},{"x":32,"y":208,"w":32,"h":52},{"x":64,"y":208,"w":32,"h":52},{"x":0,"y":208,"w":32,"h":52},{"x":96,"y":208,"w":32,"h":52}],"durations_ms":[1600,180,260,180,320,700,140],"note":"dusts the flour off his apron: stands, brings his hands to the apron, brushes twice (a little flour puffs out at his hips), back to standing, blink. The 4 idle frames on the sheet (stand, hands on the apron, brushing with the puff, blink) play in this order; frames repeat, so play the list as given. Use while standing still facing down."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"elias_portraits.png","expressions":{"oops":{"x":0,"y":0,"w":64,"h":64},"proud":{"x":64,"y":0,"w":64,"h":64},"friendly":{"x":128,"y":0,"w":64,"h":64}},"notes":{"oops":"right after he spills the flour: wide eyes, sheepish grimace, flour on his glasses and cheek","proud":"beaming when Naomi praises him anyway","friendly":"his everyday friendly smile (default)"}}},"forgetting":{"character":"forgetting","name":"The Forgetting","frame_w":64,"frame_h":80,"anchor":"bottom-center. The bottom row is the waterline: place it where the sea meets the beach in World 8. 64x80, about one and a half times Angela's height.","sheet":"forgetting_sheet.png","layout":"4 columns x 4 rows. Row 0 appear, row 1 idle (sing), row 2 attacks (song wave wind-up, song wave, hair lash wind-up, hair lash), row 3 hurt and defeat (hurt, crack, burst, gone). The boss never walks.","color_mechanic":"She is the one thing with no color of her own (void, shadow, ink, the gray ramp and glow). Draw her outside the world's saturation filter so her glow looks the same at every color level. The defeat frames are where color comes back: warm light through the cracks, then shards of every color flying out, which hands off to the sunrise.","frame_names":[["ripple","crown","shoulders","risen"],["sing","breathe","sing (drift)","high note"],["song_wave_windup","song_wave","hair_lash_windup","hair_lash"],["hurt","crack","burst","gone"]],"animations":{"stand":{"frames":[{"x":0,"y":80,"w":64,"h":80}]},"appear":{"loop":false,"frames":[{"x":0,"y":0,"w":64,"h":80},{"x":64,"y":0,"w":64,"h":80},{"x":128,"y":0,"w":64,"h":80},{"x":192,"y":0,"w":64,"h":80}],"durations_ms":[450,350,350,500],"note":"plays once after Alejandro disappears: a dark ripple, her crown breaks the surface, head and shoulders, fully risen with her mouth closed. Then go to idle."},"idle":{"loop":true,"frames":[{"x":0,"y":80,"w":64,"h":80},{"x":64,"y":80,"w":64,"h":80},{"x":128,"y":80,"w":64,"h":80},{"x":192,"y":80,"w":64,"h":80}],"durations_ms":[800,600,800,900],"names":["sing","breathe","sing (drift)","high note"],"note":"her song: sing (the approved key frame), breathe in, sing with the hair drifting further, the high note with a cold light in her mouth and a music note. Loop this while she talks or sings her lines, and between attacks. Fading in and out between attacks is done in code with transparency."},"song_wave_windup":{"loop":false,"frames":[{"x":0,"y":160,"w":64,"h":80}],"durations_ms":[800],"note":"telegraph: she breathes in, hands rise to her chest, sparkles gather around her head and her rim brightens. Give Angela time to see it before the wave."},"song_wave":{"loop":false,"frames":[{"x":64,"y":160,"w":64,"h":80}],"durations_ms":[450],"note":"she sings the note: arms open, rings of light in front of her. Spawn the song_wave effect at points.mouth on the first tick of this frame and send it toward Angela. Dodge avoids it."},"hair_lash_windup":{"loop":false,"frames":[{"x":128,"y":160,"w":64,"h":80}],"durations_ms":[900],"note":"telegraph: her drift of hair rises over her shoulder like a wave about to break, tip glowing at points.lash_tip_windup."},"hair_lash":{"loop":false,"frames":[{"x":192,"y":160,"w":64,"h":80}],"durations_ms":[400],"note":"the wave breaks: the lock crashes down in front of her to points.lash_tip with a splash of foam. Use that point (or a box around it reaching toward Angela) as the hit area."},"hurt":{"loop":false,"frames":[{"x":0,"y":240,"w":64,"h":80}],"durations_ms":[250],"note":"Angela's hit lands: she recoils and the whole shadow flashes a tone lighter. Return to idle."},"defeat":{"loop":false,"frames":[{"x":64,"y":240,"w":64,"h":80},{"x":128,"y":240,"w":64,"h":80},{"x":192,"y":240,"w":64,"h":80}],"durations_ms":[700,450,650],"note":"the final hit: the song breaks into cracks of warm light, she shatters into shards of color, and a few motes rise from a settling sea. Hold the last frame, fade it out, and start the sunrise."}},"points":{"mouth":{"x":31,"y":20,"note":"where the song wave leaves her (frame px)"},"lash_tip_windup":{"x":49,"y":3},"lash_tip":{"x":11,"y":70,"note":"where the hair lash lands (frame px)"}},"effects":{"song_wave":{"sheet":"forgetting_fx.png","frame_w":32,"frame_h":32,"anchor":"center","fps":6,"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":32},{"x":32,"y":0,"w":32,"h":32}],"note":"a ring of cold light with a music note in it, opening toward Angela. Move it in code from points.mouth to where Angela stood when the wave was sung."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"forgetting_portraits.png","expressions":{"sing":{"x":0,"y":0,"w":64,"h":64}},"notes":{"sing":"her only face: no eyes, mouth open on a note with a cold light inside, hair of tide parted in the middle. Use it for all of her sung lines."}}},"heron":{"character":"heron","frame_w":48,"frame_h":64,"anchor":"bottom-center of every frame (the feet when standing). Flying frames are wider (80x64) but use the same anchor, so switching between walking and flying does not jump","sheet":"heron_sheet.png","views":"Side view only. When The Heron moves up or down the screen, keep using the left or right animation it was last facing","animations":{"walk_left":{"fps":6,"loop":true,"frames":[{"x":0,"y":0,"w":48,"h":64},{"x":48,"y":0,"w":48,"h":64},{"x":96,"y":0,"w":48,"h":64},{"x":144,"y":0,"w":48,"h":64}],"note":"slow, stately walk (6 fps instead of 8): near foot forward, pass, far foot forward, pass"},"walk_right":{"fps":6,"loop":true,"frames":[{"x":0,"y":64,"w":48,"h":64},{"x":48,"y":64,"w":48,"h":64},{"x":96,"y":64,"w":48,"h":64},{"x":144,"y":64,"w":48,"h":64}]},"fly_left":{"fps":8,"loop":true,"frames":[{"x":0,"y":128,"w":80,"h":64},{"x":80,"y":128,"w":80,"h":64},{"x":160,"y":128,"w":80,"h":64},{"x":240,"y":128,"w":80,"h":64}],"note":"wings up, swept back, down, swept back. Neck folded and legs trailing, like a real heron"},"fly_right":{"fps":8,"loop":true,"frames":[{"x":0,"y":192,"w":80,"h":64},{"x":80,"y":192,"w":80,"h":64},{"x":160,"y":192,"w":80,"h":64},{"x":240,"y":192,"w":80,"h":64}]},"stand_left":{"frames":[{"x":0,"y":256,"w":48,"h":64}]},"stand_right":{"frames":[{"x":0,"y":320,"w":48,"h":64}]},"idle_left":{"loop":true,"frames":[{"x":0,"y":256,"w":48,"h":64},{"x":48,"y":256,"w":48,"h":64},{"x":96,"y":256,"w":48,"h":64},{"x":48,"y":256,"w":48,"h":64},{"x":0,"y":256,"w":48,"h":64},{"x":144,"y":256,"w":48,"h":64}],"durations_ms":[1800,700,140,500,1200,140],"note":"stands, tilts its head (curious), blinks mid-tilt, back to standing, blinks. Frames repeat, so play the list as given"},"idle_right":{"loop":true,"frames":[{"x":0,"y":320,"w":48,"h":64},{"x":48,"y":320,"w":48,"h":64},{"x":96,"y":320,"w":48,"h":64},{"x":48,"y":320,"w":48,"h":64},{"x":0,"y":320,"w":48,"h":64},{"x":144,"y":320,"w":48,"h":64}],"durations_ms":[1800,700,140,500,1200,140]}},"message_note":{"frame":{"x":192,"y":256,"w":13,"h":10},"how":"Carried in the beak while delivering each Hinge message. Draw it centered on the beak tip given for the current frame (frame-local pixels), above the heron","beak_tip":{"walk_left":[[1,9],[1,10],[1,9],[1,10]],"walk_right":[[46,9],[46,10],[46,9],[46,10]],"fly_left":[[15,32],[15,31],[15,30],[15,31]],"fly_right":[[64,32],[64,31],[64,30],[64,31]],"stand_left":[[1,9]],"stand_right":[[46,9]],"idle_left":[[1,9],[1,7],[1,7],[1,7],[1,9],[1,9]],"idle_right":[[46,9],[46,7],[46,7],[46,7],[46,9],[46,9]]}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"heron_portraits.png","expressions":{"friendly":{"x":0,"y":0,"w":64,"h":64}},"notes":{"friendly":"head and neck facing left like her close-up drawing: green eye, lash-like crest, a small smile at the beak and a soft blush. The only expression; use it for every line"}}},"jahdira":{"character":"jahdira","version":"today","frame_w":32,"frame_h":48,"anchor":"bottom-center (feet). Same 32x48 frame as Angela; she is 5'4\" to Angela's 5'7\", so her head sits lower in the frame.","sheet":"jahdira_sheet.png","animations":{"walk_down":{"fps":8,"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":96,"y":0,"w":32,"h":48}]},"walk_left":{"fps":8,"loop":true,"frames":[{"x":0,"y":48,"w":32,"h":48},{"x":32,"y":48,"w":32,"h":48},{"x":64,"y":48,"w":32,"h":48},{"x":96,"y":48,"w":32,"h":48}]},"walk_right":{"fps":8,"loop":true,"frames":[{"x":0,"y":96,"w":32,"h":48},{"x":32,"y":96,"w":32,"h":48},{"x":64,"y":96,"w":32,"h":48},{"x":96,"y":96,"w":32,"h":48}]},"walk_up":{"fps":8,"loop":true,"frames":[{"x":0,"y":144,"w":32,"h":48},{"x":32,"y":144,"w":32,"h":48},{"x":64,"y":144,"w":32,"h":48},{"x":96,"y":144,"w":32,"h":48}]},"stand_left":{"frames":[{"x":32,"y":48,"w":32,"h":48}]},"stand_right":{"frames":[{"x":32,"y":96,"w":32,"h":48}]},"stand_up":{"frames":[{"x":32,"y":144,"w":32,"h":48}]},"stand_down":{"frames":[{"x":0,"y":192,"w":32,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48},{"x":64,"y":192,"w":32,"h":48},{"x":96,"y":192,"w":32,"h":48}],"durations_ms":[1800,160,500,140],"note":"pushes her glasses up: stand, hand rises, index finger pushes the glasses up, blink. Use while standing still facing down."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"jahdira_portraits.png","expressions":{"wink":{"x":0,"y":0,"w":64,"h":64},"grin":{"x":64,"y":0,"w":64,"h":64},"side_eye":{"x":128,"y":0,"w":64,"h":64}},"notes":{"wink":"wink, peace sign and kissy lips (her photo pose)","grin":"big happy grin","side_eye":"deadpan side-eye (ignoring Angela in the lunch line)"}}},"jahdira_ms":{"character":"jahdira","version":"middle_school","frame_w":32,"frame_h":48,"anchor":"bottom-center (feet). Same 32x48 frame as Angela; she is 12 and a little under 5'0\" to Angela's 5'7\", so her head sits about 10 px lower in the frame.","sheet":"jahdira_ms_sheet.png","animations":{"walk_down":{"fps":8,"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":96,"y":0,"w":32,"h":48}]},"walk_left":{"fps":8,"loop":true,"frames":[{"x":0,"y":48,"w":32,"h":48},{"x":32,"y":48,"w":32,"h":48},{"x":64,"y":48,"w":32,"h":48},{"x":96,"y":48,"w":32,"h":48}]},"walk_right":{"fps":8,"loop":true,"frames":[{"x":0,"y":96,"w":32,"h":48},{"x":32,"y":96,"w":32,"h":48},{"x":64,"y":96,"w":32,"h":48},{"x":96,"y":96,"w":32,"h":48}]},"walk_up":{"fps":8,"loop":true,"frames":[{"x":0,"y":144,"w":32,"h":48},{"x":32,"y":144,"w":32,"h":48},{"x":64,"y":144,"w":32,"h":48},{"x":96,"y":144,"w":32,"h":48}]},"stand_left":{"frames":[{"x":32,"y":48,"w":32,"h":48}]},"stand_right":{"frames":[{"x":32,"y":96,"w":32,"h":48}]},"stand_up":{"frames":[{"x":32,"y":144,"w":32,"h":48}]},"stand_down":{"frames":[{"x":0,"y":192,"w":32,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48},{"x":64,"y":192,"w":32,"h":48},{"x":96,"y":192,"w":32,"h":48}],"durations_ms":[1500,900,600,140],"note":"lunch line: holds her tray, glances away (ignoring Angela), a little sigh, blink. Use while standing still facing down. The walk rows have no tray."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"jahdira_ms_portraits.png","expressions":{"away":{"x":0,"y":0,"w":64,"h":64},"sigh":{"x":64,"y":0,"w":64,"h":64},"shy":{"x":128,"y":0,"w":64,"h":64}},"notes":{"away":"unimpressed, looking off to the side (ignores Angela's first ask)","sigh":"heavy-lidded side-eye with a little sigh (second ask)","shy":"small shy smile with a soft blush (says yes on the third ask)"}}},"lucky_bartender":{"character":"lucky_bartender","frame_w":32,"frame_h":48,"anchor":"bottom-center (feet). Same 32x48 frame as Angela; she is about 5'5\" to Angela's 5'7\", and her high bun brings her close to Angela's height.","sheet":"lucky_bartender_sheet.png","note":"NPC behind her stall at 1-800-Lucky (World 3). Idle only, no walk rows. The stall is world art, drawn separately.","animations":{"stand_down":{"frames":[{"x":0,"y":0,"w":32,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":0,"y":0,"w":32,"h":48},{"x":96,"y":0,"w":32,"h":48}],"durations_ms":[1600,170,170,170,170,170,170,700,140],"note":"fans herself: stand with the fan closed, opens it and fans three times (frames 1 and 2 repeat), stand, blink. Play as listed."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"lucky_bartender_portraits.png","expressions":{"warm":{"x":0,"y":0,"w":64,"h":64}},"notes":{"warm":"warm smile, handing over the passion fruit tequila slushy in a takeout box"}}},"moon":{"character":"moon","name":"The Grinning Moon","frame_w":48,"frame_h":48,"anchor":"center. The Moon floats and never walks, so it has no walk rows and no feet. Bob it 1 px up and down in code (about 2 s per cycle) for a slow float.","sheet":"moon_sheet.png","animations":{"stand":{"frames":[{"x":0,"y":0,"w":48,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":0,"w":48,"h":48},{"x":48,"y":0,"w":48,"h":48},{"x":96,"y":0,"w":48,"h":48},{"x":144,"y":0,"w":48,"h":48}],"durations_ms":[1600,500,900,140],"names":["rest","glow","wide","blink"],"note":"rest, glow (brighter with a purple halo), slow wide grin with a squint, blink. The glow frame is 2 px wider than the moon itself; all frames share the same 48x48 box."},"glow":{"frames":[{"x":48,"y":0,"w":48,"h":48}],"note":"hold this frame while the Moon is talking, if you want it to light up on its lines"}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"moon_portraits.png","expressions":{"grin":{"x":0,"y":0,"w":64,"h":64}},"notes":{"grin":"its default face: sly eye, fanged grin, a drop of blood off the front fang"}}},"naomi":{"character":"naomi","frame_w":32,"frame_h":48,"anchor":"bottom-center (feet). Same 32x48 frame as Angela; she is 5'3\" to Angela's 5'7\", so her face sits about 5 px lower (the baker's cap adds a little back on top).","sheet":"naomi_sheet.png","animations":{"walk_down":{"fps":8,"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":48},{"x":32,"y":0,"w":32,"h":48},{"x":64,"y":0,"w":32,"h":48},{"x":96,"y":0,"w":32,"h":48}]},"walk_left":{"fps":8,"loop":true,"frames":[{"x":0,"y":48,"w":32,"h":48},{"x":32,"y":48,"w":32,"h":48},{"x":64,"y":48,"w":32,"h":48},{"x":96,"y":48,"w":32,"h":48}]},"walk_right":{"fps":8,"loop":true,"frames":[{"x":0,"y":96,"w":32,"h":48},{"x":32,"y":96,"w":32,"h":48},{"x":64,"y":96,"w":32,"h":48},{"x":96,"y":96,"w":32,"h":48}]},"walk_up":{"fps":8,"loop":true,"frames":[{"x":0,"y":144,"w":32,"h":48},{"x":32,"y":144,"w":32,"h":48},{"x":64,"y":144,"w":32,"h":48},{"x":96,"y":144,"w":32,"h":48}]},"stand_left":{"frames":[{"x":32,"y":48,"w":32,"h":48}]},"stand_right":{"frames":[{"x":32,"y":96,"w":32,"h":48}]},"stand_up":{"frames":[{"x":32,"y":144,"w":32,"h":48}]},"stand_down":{"frames":[{"x":0,"y":192,"w":32,"h":48}]},"idle":{"loop":true,"frames":[{"x":0,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48},{"x":64,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48},{"x":64,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48},{"x":64,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48},{"x":96,"y":192,"w":32,"h":48},{"x":32,"y":192,"w":32,"h":48}],"durations_ms":[1400,300,140,140,140,140,140,400,160,500],"note":"impatient foot tap: stands with the clipboard, crosses her arms over it, taps her foot three times, exasperated blink, back to standing. The 4 idle frames on the sheet (stand, arms crossed, toe up, blink) play in this order; frames repeat, so play the list as given. Use while standing still facing down."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"naomi_portraits.png","expressions":{"stern":{"x":0,"y":0,"w":64,"h":64},"beaming":{"x":64,"y":0,"w":64,"h":64},"grudging":{"x":128,"y":0,"w":64,"h":64}},"notes":{"stern":"reading the clipboard, brows down (her default)","beaming":"praising Elias, even after the flour","grudging":"admitting Angela carries the place, trying not to smile"}}},"sailor":{"character":"sailor","frame_w":32,"frame_h":52,"anchor":"bottom-center (feet). 32x52 frames like Alejandro and Elias: he is 5'10\" to Angela's 5'7\", so his eyes sit 2 px above hers. The frame includes the section of mast behind him; its top is cut flush with the frame so the World 5 background can continue the mast upward.","sheet":"sailor_sheet.png","layout":"Idle only: one row of 4 frames (strain, scream, wiggle left, wiggle right). He is tied to the mast and never walks, so there are no walk rows.","animations":{"stand_down":{"frames":[{"x":0,"y":0,"w":32,"h":52}]},"idle":{"loop":true,"frames":[{"x":0,"y":0,"w":32,"h":52},{"x":64,"y":0,"w":32,"h":52},{"x":96,"y":0,"w":32,"h":52},{"x":64,"y":0,"w":32,"h":52},{"x":96,"y":0,"w":32,"h":52},{"x":0,"y":0,"w":32,"h":52},{"x":32,"y":0,"w":32,"h":52},{"x":0,"y":0,"w":32,"h":52},{"x":32,"y":0,"w":32,"h":52}],"durations_ms":[900,140,140,140,140,300,800,200,1000],"note":"tied to the mast: strains, wiggles against the ropes, gives up, SCREAMS, catches his breath, SCREAMS again. Frames repeat, so play the list as given. He always faces down."}},"portraits":{"frame_w":64,"frame_h":64,"sheet":"sailor_portraits.png","expressions":{"scream":{"x":0,"y":0,"w":64,"h":64},"misty":{"x":64,"y":0,"w":64,"h":64},"grin":{"x":128,"y":0,"w":64,"h":64}},"notes":{"scream":"screaming against the ropes, eyes squeezed shut","misty":"fifth viewing and it still gets him: watery eyes, one tear, soft smile","grin":"big happy grin, best seat in the house"}}}},"art":{"props":{"portal0":[0,0,36,44],"portal1":[37,0,36,44],"portal2":[74,0,36,44],"portal3":[111,0,36,44],"shine0":[148,0,9,9],"shine1":[158,0,9,9],"chain":[168,0,14,8],"shard0":[183,0,5,7],"shard1":[189,0,5,7],"shard2":[195,0,5,7],"shard3":[201,0,5,7],"shard4":[207,0,5,7],"shard5":[213,0,5,7],"shard6":[219,0,5,7],"shard7":[225,0,5,7],"card_on":[231,0,10,13],"card_off":[242,0,10,13],"excl":[0,45,9,12],"heart":[10,45,9,8],"heart_empty":[20,45,9,8],"orb":[30,45,9,9],"potion0":[40,45,12,16],"potion1":[53,45,12,16],"key":[66,45,48,24],"message":[115,45,15,11],"lantern_red":[131,45,8,12],"lantern_gold":[140,45,8,12],"lantern_blue":[149,45,8,12],"bread":[158,45,16,10],"pastry":[175,45,15,10],"flourbag":[191,45,14,16],"puff0":[206,45,48,30],"puff1":[0,76,48,30],"puff2":[49,76,48,30],"mushrooms":[98,76,18,11],"bravas":[117,76,18,11],"pulpo":[136,76,18,11],"wine":[155,76,7,18],"slushy":[163,76,14,18],"car":[178,76,62,28],"car_flat":[0,107,62,28],"beam":[63,107,40,16],"star":[104,107,11,11],"bar":[116,107,70,22],"bake":[0,136,84,22],"lunch":[85,136,112,20],"lucky":[198,136,52,24],"table_tapas":[0,161,46,22],"table_critic":[47,161,36,26],"tray":[84,161,16,7],"note":[101,161,7,9],"letter_heart":[109,161,15,13]},"cards":{"card1":[0,0,132,76],"card2":[133,0,132,76],"card3":[266,0,132,76],"card4":[399,0,132,76],"card5":[532,0,132,76],"card6":[0,77,132,76],"card7":[133,77,132,76],"card8":[266,77,132,76],"card9":[399,77,132,76],"card10":[532,77,132,76]}}}