JavaScript is required. Please enable it to continue.
Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
Loading…
{ "name": "Angela's Desire", "ifid": "cfbde3c2-6205-4c67-81cc-ea84f18e59d2", "format": "SugarCube", "format-version": "2.36.1", "start": "Start" }
<<set $player = { "name": "You", "current_location": "", "core_traits": {"energy": 100, "confidence": 30}, "flags": {"kiss_unlocked": false, "groping_unlocked": false, "manual_unlocked": false, "oral_unlocked": false, "sex_unlocked": false, "outdoor_unlocked": false, "power_play_unlocked": false, "pegging_unlocked": false, "game_started": false, "intro_complete": false, "first_kiss_complete": false, "she_wants_more_complete": false, "on_her_knees_complete": false, "tasting_her_complete": false, "first_night_complete": false, "morning_after_complete": false, "everything_unlocked_complete": false, "the_facial_complete": false, "catching_her_complete": false, "first_morning_complete": false, "taking_control_complete": false, "all_night_long_complete": false, "slippery_when_wet_complete": false, "she_takes_over_complete": false, "the_strap_complete": false, "car_wash_complete": false, "under_open_sky_complete": false, "relationship_together": false, "outdoor_comfortable": false, "in_love_with_player": false} }>><<set $npcs = {"58e831b3-f623-4bf0-bb33-875740bb6f2e": {"name": "Angela", "core_traits": {"trust": 5, "desire": 15, "affection": 10}, "flags": {"comfortable_with_player": false, "interested_in_player": false, "vulnerable_with_player": false, "in_love_with_player": false, "spa_discovered": false, "fantasy_shared": false, "outdoor_comfortable": false}, "schedule": [{"activity": "Sleeping peacefully", "end_time": "06:00", "location": "loc_bedroom", "weekdays": [0, 1, 2, 3, 4, 5, 6], "start_time": "22:00"}, {"activity": "Morning shower and self-care", "end_time": "08:00", "location": "loc_spa", "weekdays": [0, 1, 2, 3, 4, 5, 6], "start_time": "06:00"}, {"activity": "Making coffee, breakfast, can't function without caffeine", "end_time": "11:00", "location": "loc_kitchen", "weekdays": [0, 1, 2, 3, 4, 5, 6], "start_time": "08:00"}, {"activity": "Reading, watching TV, feet tucked under her on the couch", "end_time": "14:00", "location": "loc_living", "weekdays": [0, 1, 2, 3, 4, 5, 6], "start_time": "11:00"}, {"activity": "Sunbathing, car maintenance, enjoying the weather", "end_time": "17:00", "location": "loc_outdoor", "weekdays": [0, 1, 2, 3, 4, 5, 6], "start_time": "14:00"}, {"activity": "Preparing dinner, humming while she cooks", "end_time": "19:00", "location": "loc_kitchen", "weekdays": [0, 1, 2, 3, 4, 5, 6], "start_time": "17:00"}, {"activity": "Evening TV, wine, best conversations happen now", "end_time": "22:00", "location": "loc_living", "weekdays": [0, 1, 2, 3, 4, 5, 6], "start_time": "19:00"}]}}>><<set $npc_slug_map = {"npc_angela": "58e831b3-f623-4bf0-bb33-875740bb6f2e"}>><<set $locations = {"loc_hallway": {"name": "The Hallway", "id": "85d2d9fb-d403-4484-9676-7ef4d5083069"}, "loc_kitchen": {"name": "The Kitchen", "id": "3de88b39-6abd-483a-bfab-3e31d3c0304b"}, "loc_living": {"name": "The Living Room", "id": "7e3b3f43-5dab-4f82-836b-7df2f2175132"}, "loc_spa": {"name": "The Spa", "id": "0883afa5-53a8-4247-8023-8ff7ed00de16"}, "loc_bedroom": {"name": "The Bedroom", "id": "9749655e-1fe7-4d8d-859b-a455c7484bb6"}, "loc_outdoor": {"name": "The Backyard", "id": "71700a6a-b26f-4afe-a0c4-4f8b6ca71795"}, "loc_fantasy": {"name": "Fantasy Space", "id": "fa6216c0-d41a-45f7-a07d-af365bd724c8"}}>><<set $flags = { "game_started": true, "debug_mode": false }>><<set $game_state = { "current_canvas": "", "visited_locations": [], "trigger_history": {}, "time_state": { "current_hour": 8, "current_minute": 0, "current_day": "Monday", "current_week": 1 } }>><<set $story_arc = {"hints": {}, "nodes": [{"id": "node_intro", "npc": "npc_angela", "name": "Moving In", "group": null, "chapter": "chapter_prologue", "linked_flag": "intro_complete", "is_milestone": true, "journal_entry": "I've just moved into my new home. My roommate Angela is... not what I expected. She's warm, approachable, and absolutely gorgeous. This is going to be interesting.", "linked_canvas": "story_intro", "requires_group": null, "requires_nodes": [], "trait_requirements": []}, {"id": "node_first_kiss", "npc": "npc_angela", "name": "First Kiss", "group": null, "chapter": "chapter_act1", "linked_flag": "kiss_unlocked", "is_milestone": true, "journal_entry": "We finally stopped pretending. In the kitchen, reaching for the same shelf, we ended up inches apart - and then we weren't pretending anymore. She kissed me like she'd been waiting for it.", "linked_canvas": "story_first_kiss", "requires_group": null, "requires_nodes": ["node_intro"], "trait_requirements": []}, {"id": "node_she_wants_more", "npc": "npc_angela", "name": "She Wants More", "group": null, "chapter": "chapter_act1", "linked_flag": "groping_unlocked", "is_milestone": true, "journal_entry": "She invited me to her room 'to talk.' Her hand found my thigh, then higher. She said she doesn't want to be safe with me. Neither do I.", "linked_canvas": "story_she_wants_more", "requires_group": null, "requires_nodes": ["node_first_kiss"], "trait_requirements": []}, {"id": "node_on_her_knees", "npc": "npc_angela", "name": "On Her Knees", "group": null, "chapter": "chapter_act1", "linked_flag": "oral_unlocked", "is_milestone": true, "journal_entry": "She told me about a dream she had - on her knees in the kitchen. Then she made it real. The way she looked up at me... I'll never forget it.", "linked_canvas": "story_on_her_knees", "requires_group": null, "requires_nodes": ["node_she_wants_more"], "trait_requirements": []}, {"id": "node_tasting_her", "npc": "npc_angela", "name": "Tasting Her", "group": null, "chapter": "chapter_act1", "linked_flag": "manual_unlocked", "is_milestone": true, "journal_entry": "My turn to worship her. I lifted her onto the counter and knelt between her thighs. When she came, crying out my name, it was the most beautiful sound I've ever heard.", "linked_canvas": "story_tasting_her", "requires_group": null, "requires_nodes": ["node_on_her_knees"], "trait_requirements": []}, {"id": "node_first_night", "npc": "npc_angela", "name": "First Night Together", "group": null, "chapter": "chapter_act2", "linked_flag": "sex_unlocked", "is_milestone": true, "journal_entry": "No more waiting. No more teasing. She wanted all of me, and I wanted all of her. We made love for the first time - tender, meaningful, the culmination of weeks of tension.", "linked_canvas": "story_first_night", "requires_group": null, "requires_nodes": ["node_tasting_her"], "trait_requirements": []}, {"id": "node_morning_after", "npc": "npc_angela", "name": "Morning After", "group": null, "chapter": "chapter_act2", "linked_flag": "relationship_together", "is_milestone": true, "journal_entry": "'What are we now?' she asked. 'Yours,' she answered herself. 'I want to be yours.' The morning light caught her smile, and I knew I was hers too.", "linked_canvas": "story_morning_after", "requires_group": null, "requires_nodes": ["node_first_night"], "trait_requirements": []}, {"id": "node_everything_unlocked", "npc": "npc_angela", "name": "Everything Unlocked", "group": null, "chapter": "chapter_act2", "linked_flag": "everything_unlocked_complete", "is_milestone": true, "journal_entry": "Now that we're official, she wants to try everything. Every position. Every way. We lost count of how many times... it all blurred into one continuous wave.", "linked_canvas": "story_everything_unlocked", "requires_group": null, "requires_nodes": ["node_morning_after"], "trait_requirements": []}, {"id": "node_the_facial", "npc": "npc_angela", "name": "The Facial", "group": null, "chapter": "chapter_act2", "linked_flag": "the_facial_complete", "is_milestone": false, "journal_entry": "She asked for something she'd never tried - wanted me to finish on her face. An act of trust more intimate than I expected. She looked up at me after with a satisfied smile.", "linked_canvas": "story_the_facial", "requires_group": null, "requires_nodes": ["node_everything_unlocked"], "trait_requirements": []}, {"id": "node_catching_her", "npc": "npc_angela", "name": "Catching Her", "group": null, "chapter": "chapter_act3", "linked_flag": "catching_her_complete", "is_milestone": false, "journal_entry": "I came home early to find her in the spa, pleasuring herself. When she saw me watching, she didn't stop. 'Next time,' she said, 'maybe you can replace the toy.'", "linked_canvas": "story_catching_her", "requires_group": null, "requires_nodes": ["node_first_kiss"], "trait_requirements": []}, {"id": "node_first_morning", "npc": "npc_angela", "name": "First Morning", "group": null, "chapter": "chapter_act3", "linked_flag": "first_morning_complete", "is_milestone": false, "journal_entry": "She woke me with her hand already moving beneath the sheets. Before I could speak, she was on top of me. 'This is my new favorite way to wake up,' she breathed.", "linked_canvas": "story_first_morning", "requires_group": null, "requires_nodes": ["node_morning_after"], "trait_requirements": []}, {"id": "node_taking_control", "npc": "npc_angela", "name": "Taking Control", "group": null, "chapter": "chapter_act3", "linked_flag": "taking_control_complete", "is_milestone": false, "journal_entry": "'Tonight, I'm in charge,' she said. I did as commanded. She controlled everything - the pace, the pressure, when I could breathe. 'Good boy,' she whispered after. I've never been more turned on by two words.", "linked_canvas": "story_taking_control", "requires_group": null, "requires_nodes": ["node_first_morning"], "trait_requirements": []}, {"id": "node_all_night_long", "npc": "npc_angela", "name": "All Night Long", "group": null, "chapter": "chapter_act3", "linked_flag": "in_love_with_player", "is_milestone": true, "journal_entry": "No work tomorrow. No responsibilities. Round after round until the sun came up. When we finally stopped, she whispered 'I love you' into my chest. It was the first time. I said it back. I meant it.", "linked_canvas": "story_all_night_long", "requires_group": null, "requires_nodes": ["node_taking_control"], "trait_requirements": []}, {"id": "node_slippery", "npc": "npc_angela", "name": "Slippery When Wet", "group": null, "chapter": "chapter_act3", "linked_flag": "slippery_when_wet_complete", "is_milestone": false, "journal_entry": "She bought massage oil. What started as a back rub became two glistening bodies sliding against each other. 'I can feel every inch of you,' she gasped. So could I.", "linked_canvas": "story_slippery_when_wet", "requires_group": null, "requires_nodes": ["node_first_night"], "trait_requirements": []}, {"id": "node_she_takes_over", "npc": "npc_angela", "name": "She Takes Over", "group": null, "chapter": "chapter_special", "linked_flag": "power_play_unlocked", "is_milestone": true, "journal_entry": "She wanted something that required my complete vulnerability. Her tongue explored territory no one had touched before. The trust it required... the pleasure it gave... was overwhelming.", "linked_canvas": "story_she_takes_over", "requires_group": null, "requires_nodes": ["node_all_night_long"], "trait_requirements": []}, {"id": "node_the_strap", "npc": "npc_angela", "name": "The Strap", "group": null, "chapter": "chapter_special", "linked_flag": "pegging_unlocked", "is_milestone": true, "journal_entry": "The ultimate trust. She wanted to be inside me. 'I've got you,' she whispered as she eased forward. The vulnerability, the pleasure, the connection... deeper than I've ever known.", "linked_canvas": "story_the_strap", "requires_group": null, "requires_nodes": ["node_she_takes_over"], "trait_requirements": []}, {"id": "node_car_wash", "npc": "npc_angela", "name": "The Car Wash", "group": null, "chapter": "chapter_special", "linked_flag": "car_wash_complete", "is_milestone": false, "journal_entry": "Hot summer day. Her in a bikini, washing the car. Water streaming down her curves. She put on a show just for me - or maybe for anyone who might be watching.", "linked_canvas": "story_car_wash", "requires_group": null, "requires_nodes": ["node_first_kiss"], "trait_requirements": []}, {"id": "node_under_open_sky", "npc": "npc_angela", "name": "Under the Open Sky", "group": null, "chapter": "chapter_special", "linked_flag": "outdoor_unlocked", "is_milestone": true, "journal_entry": "'Here. Right here. Outside.' Anyone could see. That was part of it. The thrill of exposure made everything more intense. When we finished, she was laughing, exhilarated, alive.", "linked_canvas": "story_under_open_sky", "requires_group": null, "requires_nodes": ["node_car_wash", "node_first_night"], "trait_requirements": []}], "groups": [{"id": "group_kitchen", "name": "Kitchen Encounters", "description": "Morning moments in the kitchen with Angela", "required_count": 3}, {"id": "group_living_room", "name": "Living Room Passion", "description": "Evening passion on the couch", "required_count": 3}, {"id": "group_spa", "name": "Spa Retreat", "description": "Private moments in the spa", "required_count": 2}, {"id": "group_bedroom", "name": "Bedroom Bliss", "description": "Intimate nights and mornings together", "required_count": 3}, {"id": "group_fantasy", "name": "Fantasy Fulfillment", "description": "Exploring her deepest desires", "required_count": 2}, {"id": "group_outdoor", "name": "Outdoor Encounters", "description": "Exhibitionist thrills under the open sky", "required_count": 2}], "version": "1.0", "chapters": [{"id": "chapter_prologue", "mood": "hopeful", "name": "Moving In", "order": 1, "description": "You've just moved in with a gorgeous new roommate. The tension is already building."}, {"id": "chapter_act1", "mood": "romantic", "name": "Building Tension", "order": 2, "description": "Days 1-6: Every glance, every accidental touch, every moment alone together builds toward something inevitable."}, {"id": "chapter_act2", "mood": "passionate", "name": "First Intimacy", "order": 3, "description": "Days 7-10: The dam has broken. You're lovers now, exploring each other with hungry urgency."}, {"id": "chapter_act3", "mood": "intimate", "name": "Deep Connection", "order": 4, "description": "Days 11-14: Trust deepens. Fantasies are shared. What started as attraction has become something more."}, {"id": "chapter_special", "mood": "taboo", "name": "Hidden Desires", "order": 5, "description": "The paths less traveled - outdoor thrills and power play for those who dare."}], "emotion_mappings": {"trust": {"ranges": [{"max": 19, "min": 0, "label": "cautious", "description": "Angela is friendly but guarded. You just met, after all."}, {"max": 39, "min": 20, "label": "opening", "description": "Angela is starting to open up. She shares little things about herself."}, {"max": 59, "min": 40, "label": "comfortable", "description": "Angela is comfortable with you. She lets her guard down."}, {"max": 79, "min": 60, "label": "vulnerable", "description": "Angela shows you her vulnerable side. She trusts you with her feelings."}, {"max": 99, "min": 80, "label": "complete", "description": "Angela trusts you completely. She shares her fantasies, her fears, her everything."}, {"max": 100, "min": 100, "label": "soul_deep", "description": "Angela's trust is soul-deep. There's nothing she wouldn't share, nothing she wouldn't try."}], "default_npc": "npc_angela", "trait_owner": "npc"}, "desire": {"ranges": [{"max": 19, "min": 0, "label": "noticing", "description": "Angela seems aware of you - her eyes linger a moment longer than they should."}, {"max": 39, "min": 20, "label": "thinking", "description": "Angela catches herself staring. She's thinking about you more than she should."}, {"max": 59, "min": 40, "label": "fighting_it", "description": "Angela's attraction is obvious now. She wants you, but she's still fighting it."}, {"max": 79, "min": 60, "label": "cant_resist", "description": "Angela can't keep her hands off you. She needs to feel you, to touch you."}, {"max": 99, "min": 80, "label": "hungry", "description": "Angela is hungry for you. Every look is an invitation, every touch a promise."}, {"max": 100, "min": 100, "label": "insatiable", "description": "Angela is insatiable. She wants you constantly, completely, endlessly."}], "default_npc": "npc_angela", "trait_owner": "npc"}, "affection": {"ranges": [{"max": 19, "min": 0, "label": "friendly", "description": "Angela is warm and welcoming - a friendly roommate getting to know you."}, {"max": 39, "min": 20, "label": "seeking", "description": "Angela seeks you out. She likes talking to you, being near you."}, {"max": 59, "min": 40, "label": "caring", "description": "Angela cares about you. She asks about your day, remembers the little things."}, {"max": 79, "min": 60, "label": "falling", "description": "Angela is falling for you. This isn't just physical anymore."}, {"max": 99, "min": 80, "label": "devoted", "description": "Angela doesn't want this to end. 'Stay with me tonight,' she asks."}, {"max": 100, "min": 100, "label": "in_love", "description": "Angela loves you. She says it and means it, with her whole heart."}], "default_npc": "npc_angela", "trait_owner": "npc"}}}>><<set $help_data = {"npcs": {"58e831b3-f623-4bf0-bb33-875740bb6f2e": {"name": "Angela", "activities": [{"node_id": "node_intro", "name": "Moving In", "linked_flag": "intro_complete", "canvas_id": "32ea0ec9-0deb-4415-9a10-c2d22988624a", "requires_nodes": [], "requires_group": null, "location": null, "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": null}, {"node_id": "node_first_kiss", "name": "First Kiss", "linked_flag": "kiss_unlocked", "canvas_id": "9d637126-5fa9-43aa-ac66-39bfaedbc61f", "requires_nodes": ["node_intro"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "intro_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_kiss_complete", "operator": "is_false"}, {"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "trait", "value": 20, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_wants_more", "name": "She Wants More", "linked_flag": "groping_unlocked", "canvas_id": "1e49a8a7-d475-46f0-86e9-564a8d1e80d6", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_wants_more_complete", "operator": "is_false"}, {"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_on_her_knees", "name": "On Her Knees", "linked_flag": "oral_unlocked", "canvas_id": "f7cffc4b-2864-4646-b404-bb514f1687d3", "requires_nodes": ["node_she_wants_more"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "on_her_knees_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_tasting_her", "name": "Tasting Her", "linked_flag": "manual_unlocked", "canvas_id": "0f470b7c-4809-445f-a86d-a36500a28f26", "requires_nodes": ["node_on_her_knees"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "tasting_her_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_first_night", "name": "First Night Together", "linked_flag": "sex_unlocked", "canvas_id": "9fb9a4f4-2144-469d-808f-cdb1119214d8", "requires_nodes": ["node_tasting_her"], "requires_group": null, "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 15, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_false"}, {"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_morning_after", "name": "Morning After", "linked_flag": "relationship_together", "canvas_id": "72309d64-5eca-41cd-9b9d-06e6c36415a9", "requires_nodes": ["node_first_night"], "requires_group": null, "location": "The Bedroom", "schedule": "between 6 AM - 10 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_false"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_everything_unlocked", "name": "Everything Unlocked", "linked_flag": "everything_unlocked_complete", "canvas_id": "f16df6e8-6ae8-4bd8-a74e-dba2bb929900", "requires_nodes": ["node_morning_after"], "requires_group": null, "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "relationship_together", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_the_facial", "name": "The Facial", "linked_flag": "the_facial_complete", "canvas_id": "a5492672-7b36-4475-bf4e-a82a3d06533c", "requires_nodes": ["node_everything_unlocked"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_facial_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_catching_her", "name": "Catching Her", "linked_flag": "catching_her_complete", "canvas_id": "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Spa", "schedule": "between 2 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "catching_her_complete", "operator": "is_false"}, {"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_first_morning", "name": "First Morning", "linked_flag": "first_morning_complete", "canvas_id": "7dd74be2-1def-40e3-9b47-6ba08f5c641d", "requires_nodes": ["node_morning_after"], "requires_group": null, "location": "The Bedroom", "schedule": "between 6 AM - 9 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_taking_control", "name": "Taking Control", "linked_flag": "taking_control_complete", "canvas_id": "a1c13307-f16c-4983-9c5b-dc0c0a0febe8", "requires_nodes": ["node_first_morning"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_all_night_long", "name": "All Night Long", "linked_flag": "in_love_with_player", "canvas_id": "f8feeab6-200e-496d-af35-af14df923785", "requires_nodes": ["node_taking_control"], "requires_group": null, "location": "The Bedroom", "schedule": "between 8 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 15, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_slippery", "name": "Slippery When Wet", "linked_flag": "slippery_when_wet_complete", "canvas_id": "a50afd26-980d-4fef-8f68-0c593cec11c3", "requires_nodes": ["node_first_night"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "slippery_when_wet_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_takes_over", "name": "She Takes Over", "linked_flag": "power_play_unlocked", "canvas_id": "12d3264b-006d-4664-afa7-cf66d1715cb5", "requires_nodes": ["node_all_night_long"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_takes_over_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_the_strap", "name": "The Strap", "linked_flag": "pegging_unlocked", "canvas_id": "8c75f386-1a95-4b24-90a9-12ac9d3b3f52", "requires_nodes": ["node_she_takes_over"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 12, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_strap_complete", "operator": "is_false"}, {"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_car_wash", "name": "The Car Wash", "linked_flag": "car_wash_complete", "canvas_id": "4ee60ddf-1cb7-463e-b410-eba6129a6c4d", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_under_open_sky", "name": "Under the Open Sky", "linked_flag": "outdoor_unlocked", "canvas_id": "52cc47cf-43c4-4c35-bbb9-200810e4f301", "requires_nodes": ["node_car_wash", "node_first_night"], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "under_open_sky_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "afb69329-68bb-4c7d-a820-702236f6196c", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "a2825bb2-9517-45d8-8592-9d83e0451882", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 15, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "e3e6d968-0f35-4054-889a-00ba3d02eea2", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "3d3ad3b9-62e4-472b-ace0-340f9c15fed6", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "a44f0735-97f7-4ab7-b857-d575394b5c8a", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 65, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "af0b3a27-2209-4936-ae8e-47b279e11c5a", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 75, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "7bf07e50-d091-474e-8000-7ea5baf18bcb", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "3d9f36d1-fffc-497f-996a-23950976a4e3", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "55f3c04c-0673-4ecd-b8b5-6a5d889e459c", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 12, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "pegging_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "408686ec-8fdb-4ef2-a77f-9ab302e0d271", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "93d145ac-a52d-4e82-8938-ff2a10c2b113", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "59586e40-6e30-4d7b-bea2-a811d40db7ac", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "d60e1f3d-abd9-46be-9b1e-26f7b38b00f3", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "9de6cbcc-7ee4-4605-90cf-12e2d737f080", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 10, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "042268d4-71c9-452c-b462-341515991c08", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "0d0f5574-d806-48be-a888-830d19ce4db0", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "5caa7e6c-88ef-4cc1-9ff1-f00a3098aea1", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "12b69442-f78c-4046-babd-922615b4887a", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "6b100a51-9368-42a7-8912-0b5f00fd6504", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "979fad8d-4232-4bea-929c-65efb9216466", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "d75afe3d-e78e-4029-a7a3-21f07cced03f", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}]}}, "trait_activities": {"affection": [{"node_id": "node_intro", "name": "Moving In", "linked_flag": "intro_complete", "canvas_id": "32ea0ec9-0deb-4415-9a10-c2d22988624a", "requires_nodes": [], "requires_group": null, "location": null, "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": null}, {"node_id": "node_first_kiss", "name": "First Kiss", "linked_flag": "kiss_unlocked", "canvas_id": "9d637126-5fa9-43aa-ac66-39bfaedbc61f", "requires_nodes": ["node_intro"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "intro_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_kiss_complete", "operator": "is_false"}, {"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "trait", "value": 20, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_wants_more", "name": "She Wants More", "linked_flag": "groping_unlocked", "canvas_id": "1e49a8a7-d475-46f0-86e9-564a8d1e80d6", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_wants_more_complete", "operator": "is_false"}, {"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_wants_more", "name": "She Wants More", "linked_flag": "groping_unlocked", "canvas_id": "1e49a8a7-d475-46f0-86e9-564a8d1e80d6", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_wants_more_complete", "operator": "is_false"}, {"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_on_her_knees", "name": "On Her Knees", "linked_flag": "oral_unlocked", "canvas_id": "f7cffc4b-2864-4646-b404-bb514f1687d3", "requires_nodes": ["node_she_wants_more"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "on_her_knees_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_on_her_knees", "name": "On Her Knees", "linked_flag": "oral_unlocked", "canvas_id": "f7cffc4b-2864-4646-b404-bb514f1687d3", "requires_nodes": ["node_she_wants_more"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "on_her_knees_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_tasting_her", "name": "Tasting Her", "linked_flag": "manual_unlocked", "canvas_id": "0f470b7c-4809-445f-a86d-a36500a28f26", "requires_nodes": ["node_on_her_knees"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "tasting_her_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_first_night", "name": "First Night Together", "linked_flag": "sex_unlocked", "canvas_id": "9fb9a4f4-2144-469d-808f-cdb1119214d8", "requires_nodes": ["node_tasting_her"], "requires_group": null, "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 15, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_false"}, {"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_morning_after", "name": "Morning After", "linked_flag": "relationship_together", "canvas_id": "72309d64-5eca-41cd-9b9d-06e6c36415a9", "requires_nodes": ["node_first_night"], "requires_group": null, "location": "The Bedroom", "schedule": "between 6 AM - 10 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_false"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_everything_unlocked", "name": "Everything Unlocked", "linked_flag": "everything_unlocked_complete", "canvas_id": "f16df6e8-6ae8-4bd8-a74e-dba2bb929900", "requires_nodes": ["node_morning_after"], "requires_group": null, "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "relationship_together", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_the_facial", "name": "The Facial", "linked_flag": "the_facial_complete", "canvas_id": "a5492672-7b36-4475-bf4e-a82a3d06533c", "requires_nodes": ["node_everything_unlocked"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_facial_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_first_morning", "name": "First Morning", "linked_flag": "first_morning_complete", "canvas_id": "7dd74be2-1def-40e3-9b47-6ba08f5c641d", "requires_nodes": ["node_morning_after"], "requires_group": null, "location": "The Bedroom", "schedule": "between 6 AM - 9 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_taking_control", "name": "Taking Control", "linked_flag": "taking_control_complete", "canvas_id": "a1c13307-f16c-4983-9c5b-dc0c0a0febe8", "requires_nodes": ["node_first_morning"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_all_night_long", "name": "All Night Long", "linked_flag": "in_love_with_player", "canvas_id": "f8feeab6-200e-496d-af35-af14df923785", "requires_nodes": ["node_taking_control"], "requires_group": null, "location": "The Bedroom", "schedule": "between 8 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 15, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_slippery", "name": "Slippery When Wet", "linked_flag": "slippery_when_wet_complete", "canvas_id": "a50afd26-980d-4fef-8f68-0c593cec11c3", "requires_nodes": ["node_first_night"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "slippery_when_wet_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_takes_over", "name": "She Takes Over", "linked_flag": "power_play_unlocked", "canvas_id": "12d3264b-006d-4664-afa7-cf66d1715cb5", "requires_nodes": ["node_all_night_long"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_takes_over_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_takes_over", "name": "She Takes Over", "linked_flag": "power_play_unlocked", "canvas_id": "12d3264b-006d-4664-afa7-cf66d1715cb5", "requires_nodes": ["node_all_night_long"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_takes_over_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_the_strap", "name": "The Strap", "linked_flag": "pegging_unlocked", "canvas_id": "8c75f386-1a95-4b24-90a9-12ac9d3b3f52", "requires_nodes": ["node_she_takes_over"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 12, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_strap_complete", "operator": "is_false"}, {"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_the_strap", "name": "The Strap", "linked_flag": "pegging_unlocked", "canvas_id": "8c75f386-1a95-4b24-90a9-12ac9d3b3f52", "requires_nodes": ["node_she_takes_over"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 12, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_strap_complete", "operator": "is_false"}, {"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_under_open_sky", "name": "Under the Open Sky", "linked_flag": "outdoor_unlocked", "canvas_id": "52cc47cf-43c4-4c35-bbb9-200810e4f301", "requires_nodes": ["node_car_wash", "node_first_night"], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "under_open_sky_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "afb69329-68bb-4c7d-a820-702236f6196c", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "e3e6d968-0f35-4054-889a-00ba3d02eea2", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "3d3ad3b9-62e4-472b-ace0-340f9c15fed6", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "a44f0735-97f7-4ab7-b857-d575394b5c8a", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 65, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "af0b3a27-2209-4936-ae8e-47b279e11c5a", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 75, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "7bf07e50-d091-474e-8000-7ea5baf18bcb", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "7bf07e50-d091-474e-8000-7ea5baf18bcb", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "3d9f36d1-fffc-497f-996a-23950976a4e3", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "55f3c04c-0673-4ecd-b8b5-6a5d889e459c", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 12, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "pegging_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "408686ec-8fdb-4ef2-a77f-9ab302e0d271", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "93d145ac-a52d-4e82-8938-ff2a10c2b113", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "59586e40-6e30-4d7b-bea2-a811d40db7ac", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "59586e40-6e30-4d7b-bea2-a811d40db7ac", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "d60e1f3d-abd9-46be-9b1e-26f7b38b00f3", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "042268d4-71c9-452c-b462-341515991c08", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "0d0f5574-d806-48be-a888-830d19ce4db0", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "5caa7e6c-88ef-4cc1-9ff1-f00a3098aea1", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "12b69442-f78c-4046-babd-922615b4887a", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "12b69442-f78c-4046-babd-922615b4887a", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "6b100a51-9368-42a7-8912-0b5f00fd6504", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "979fad8d-4232-4bea-929c-65efb9216466", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "d75afe3d-e78e-4029-a7a3-21f07cced03f", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}], "desire": [{"node_id": "node_first_kiss", "name": "First Kiss", "linked_flag": "kiss_unlocked", "canvas_id": "9d637126-5fa9-43aa-ac66-39bfaedbc61f", "requires_nodes": ["node_intro"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "intro_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_kiss_complete", "operator": "is_false"}, {"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "trait", "value": 20, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_first_kiss", "name": "First Kiss", "linked_flag": "kiss_unlocked", "canvas_id": "9d637126-5fa9-43aa-ac66-39bfaedbc61f", "requires_nodes": ["node_intro"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "intro_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_kiss_complete", "operator": "is_false"}, {"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "trait", "value": 20, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_wants_more", "name": "She Wants More", "linked_flag": "groping_unlocked", "canvas_id": "1e49a8a7-d475-46f0-86e9-564a8d1e80d6", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_wants_more_complete", "operator": "is_false"}, {"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_on_her_knees", "name": "On Her Knees", "linked_flag": "oral_unlocked", "canvas_id": "f7cffc4b-2864-4646-b404-bb514f1687d3", "requires_nodes": ["node_she_wants_more"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "on_her_knees_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_tasting_her", "name": "Tasting Her", "linked_flag": "manual_unlocked", "canvas_id": "0f470b7c-4809-445f-a86d-a36500a28f26", "requires_nodes": ["node_on_her_knees"], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "tasting_her_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_first_night", "name": "First Night Together", "linked_flag": "sex_unlocked", "canvas_id": "9fb9a4f4-2144-469d-808f-cdb1119214d8", "requires_nodes": ["node_tasting_her"], "requires_group": null, "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 15, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_false"}, {"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_morning_after", "name": "Morning After", "linked_flag": "relationship_together", "canvas_id": "72309d64-5eca-41cd-9b9d-06e6c36415a9", "requires_nodes": ["node_first_night"], "requires_group": null, "location": "The Bedroom", "schedule": "between 6 AM - 10 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_false"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_everything_unlocked", "name": "Everything Unlocked", "linked_flag": "everything_unlocked_complete", "canvas_id": "f16df6e8-6ae8-4bd8-a74e-dba2bb929900", "requires_nodes": ["node_morning_after"], "requires_group": null, "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "relationship_together", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_the_facial", "name": "The Facial", "linked_flag": "the_facial_complete", "canvas_id": "a5492672-7b36-4475-bf4e-a82a3d06533c", "requires_nodes": ["node_everything_unlocked"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_facial_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_catching_her", "name": "Catching Her", "linked_flag": "catching_her_complete", "canvas_id": "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Spa", "schedule": "between 2 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "catching_her_complete", "operator": "is_false"}, {"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_catching_her", "name": "Catching Her", "linked_flag": "catching_her_complete", "canvas_id": "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Spa", "schedule": "between 2 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "catching_her_complete", "operator": "is_false"}, {"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_first_morning", "name": "First Morning", "linked_flag": "first_morning_complete", "canvas_id": "7dd74be2-1def-40e3-9b47-6ba08f5c641d", "requires_nodes": ["node_morning_after"], "requires_group": null, "location": "The Bedroom", "schedule": "between 6 AM - 9 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_taking_control", "name": "Taking Control", "linked_flag": "taking_control_complete", "canvas_id": "a1c13307-f16c-4983-9c5b-dc0c0a0febe8", "requires_nodes": ["node_first_morning"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_all_night_long", "name": "All Night Long", "linked_flag": "in_love_with_player", "canvas_id": "f8feeab6-200e-496d-af35-af14df923785", "requires_nodes": ["node_taking_control"], "requires_group": null, "location": "The Bedroom", "schedule": "between 8 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 15, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_slippery", "name": "Slippery When Wet", "linked_flag": "slippery_when_wet_complete", "canvas_id": "a50afd26-980d-4fef-8f68-0c593cec11c3", "requires_nodes": ["node_first_night"], "requires_group": null, "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "slippery_when_wet_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_she_takes_over", "name": "She Takes Over", "linked_flag": "power_play_unlocked", "canvas_id": "12d3264b-006d-4664-afa7-cf66d1715cb5", "requires_nodes": ["node_all_night_long"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_takes_over_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_the_strap", "name": "The Strap", "linked_flag": "pegging_unlocked", "canvas_id": "8c75f386-1a95-4b24-90a9-12ac9d3b3f52", "requires_nodes": ["node_she_takes_over"], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 12, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_strap_complete", "operator": "is_false"}, {"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_car_wash", "name": "The Car Wash", "linked_flag": "car_wash_complete", "canvas_id": "4ee60ddf-1cb7-463e-b410-eba6129a6c4d", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_car_wash", "name": "The Car Wash", "linked_flag": "car_wash_complete", "canvas_id": "4ee60ddf-1cb7-463e-b410-eba6129a6c4d", "requires_nodes": ["node_first_kiss"], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_under_open_sky", "name": "Under the Open Sky", "linked_flag": "outdoor_unlocked", "canvas_id": "52cc47cf-43c4-4c35-bbb9-200810e4f301", "requires_nodes": ["node_car_wash", "node_first_night"], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "under_open_sky_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": "node_under_open_sky", "name": "Under the Open Sky", "linked_flag": "outdoor_unlocked", "canvas_id": "52cc47cf-43c4-4c35-bbb9-200810e4f301", "requires_nodes": ["node_car_wash", "node_first_night"], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 12, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "under_open_sky_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "afb69329-68bb-4c7d-a820-702236f6196c", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "a2825bb2-9517-45d8-8592-9d83e0451882", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 15, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "e3e6d968-0f35-4054-889a-00ba3d02eea2", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "3d3ad3b9-62e4-472b-ace0-340f9c15fed6", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "a44f0735-97f7-4ab7-b857-d575394b5c8a", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 65, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "af0b3a27-2209-4936-ae8e-47b279e11c5a", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 75, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Outdoor Encounter", "linked_flag": null, "canvas_id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "requires_nodes": [], "requires_group": null, "location": "The Backyard", "schedule": "between 2 PM - 5 PM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "7bf07e50-d091-474e-8000-7ea5baf18bcb", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "3d9f36d1-fffc-497f-996a-23950976a4e3", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 10, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Fantasy Fulfillment", "linked_flag": null, "canvas_id": "55f3c04c-0673-4ecd-b8b5-6a5d889e459c", "requires_nodes": [], "requires_group": null, "location": "Fantasy Space", "schedule": "between 10 PM - 1 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 12, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "pegging_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "408686ec-8fdb-4ef2-a77f-9ab302e0d271", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "93d145ac-a52d-4e82-8938-ff2a10c2b113", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "59586e40-6e30-4d7b-bea2-a811d40db7ac", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "59586e40-6e30-4d7b-bea2-a811d40db7ac", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Bedroom Bliss", "linked_flag": null, "canvas_id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": "between 10 PM - 1 AM or 6 AM - 8 AM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 5, "npc_id": "npc_angela"}, {"trait": "desire", "value": 10, "npc_id": "npc_angela"}, {"trait": "affection", "value": 8, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "d60e1f3d-abd9-46be-9b1e-26f7b38b00f3", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 1, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "9de6cbcc-7ee4-4605-90cf-12e2d737f080", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 10, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "042268d4-71c9-452c-b462-341515991c08", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Spa Retreat", "linked_flag": null, "canvas_id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": "between 6 AM - 8 AM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 5, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "0d0f5574-d806-48be-a888-830d19ce4db0", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "5caa7e6c-88ef-4cc1-9ff1-f00a3098aea1", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "12b69442-f78c-4046-babd-922615b4887a", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "12b69442-f78c-4046-babd-922615b4887a", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Living Room Passion", "linked_flag": null, "canvas_id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": "between 11 AM - 2 PM or 7 PM - 10 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 6, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "6b100a51-9368-42a7-8912-0b5f00fd6504", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "979fad8d-4232-4bea-929c-65efb9216466", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "affection", "value": 1, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "d75afe3d-e78e-4029-a7a3-21f07cced03f", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "d75afe3d-e78e-4029-a7a3-21f07cced03f", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}, {"node_id": null, "name": "Kitchen Encounter", "linked_flag": null, "canvas_id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "trait_requirements": [], "trait_effects": [{"trait": "desire", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 4, "npc_id": "npc_angela"}, {"trait": "affection", "value": 2, "npc_id": "npc_angela"}, {"trait": "desire", "value": 6, "npc_id": "npc_angela"}, {"trait": "affection", "value": 3, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}, {"trait": "desire", "value": 8, "npc_id": "npc_angela"}, {"trait": "affection", "value": 4, "npc_id": "npc_angela"}], "canvas_conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "is_repeatable": true}], "energy": [{"node_id": null, "name": "Take a Shower", "linked_flag": null, "canvas_id": "462e5d97-d2e8-4b57-9d8c-44106ec79cb5", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "energy", "value": 10}, {"trait": "confidence", "value": 3}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Make Food", "linked_flag": null, "canvas_id": "0839a0f9-0d0d-44a0-aef3-d67a3df42ce9", "requires_nodes": [], "requires_group": null, "location": "The Kitchen", "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "energy", "value": 15}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Watch TV", "linked_flag": null, "canvas_id": "90f794ba-3fec-469a-9dee-a25c7afc5556", "requires_nodes": [], "requires_group": null, "location": "The Living Room", "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "energy", "value": 5}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Get Some Rest", "linked_flag": null, "canvas_id": "24fb6fbb-a0f7-486b-b2c6-75e3d2651f76", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "energy", "value": 20}, {"trait": "energy", "value": 100}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Get Some Rest", "linked_flag": null, "canvas_id": "24fb6fbb-a0f7-486b-b2c6-75e3d2651f76", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "energy", "value": 20}, {"trait": "energy", "value": 100}], "canvas_conditions": null, "is_repeatable": true}], "confidence": [{"node_id": null, "name": "Take a Shower", "linked_flag": null, "canvas_id": "462e5d97-d2e8-4b57-9d8c-44106ec79cb5", "requires_nodes": [], "requires_group": null, "location": "The Spa", "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "energy", "value": 10}, {"trait": "confidence", "value": 3}], "canvas_conditions": null, "is_repeatable": true}, {"node_id": null, "name": "Reflect", "linked_flag": null, "canvas_id": "054063fc-d276-448b-858b-b62534d27b65", "requires_nodes": [], "requires_group": null, "location": "The Bedroom", "schedule": null, "trait_requirements": [], "trait_effects": [{"trait": "confidence", "value": 2}], "canvas_conditions": null, "is_repeatable": true}]}, "flag_unlock_map": {"outdoor_unlocked": {"canvas_name": "Under the Open Sky", "canvas_id": "52cc47cf-43c4-4c35-bbb9-200810e4f301", "location": "The Backyard", "schedule": "between 2 PM - 7 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "under_open_sky_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "under_open_sky_complete": {"canvas_name": "Under the Open Sky", "canvas_id": "52cc47cf-43c4-4c35-bbb9-200810e4f301", "location": "The Backyard", "schedule": "between 2 PM - 7 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "under_open_sky_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "car_wash_complete": {"canvas_name": "The Car Wash", "canvas_id": "4ee60ddf-1cb7-463e-b410-eba6129a6c4d", "location": "The Backyard", "schedule": "between 2 PM - 5 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "outdoor_comfortable": {"canvas_name": "The Car Wash", "canvas_id": "4ee60ddf-1cb7-463e-b410-eba6129a6c4d", "location": "The Backyard", "schedule": "between 2 PM - 5 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "pegging_unlocked": {"canvas_name": "The Strap", "canvas_id": "8c75f386-1a95-4b24-90a9-12ac9d3b3f52", "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_strap_complete", "operator": "is_false"}, {"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "the_strap_complete": {"canvas_name": "The Strap", "canvas_id": "8c75f386-1a95-4b24-90a9-12ac9d3b3f52", "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_strap_complete", "operator": "is_false"}, {"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "power_play_unlocked": {"canvas_name": "She Takes Over", "canvas_id": "12d3264b-006d-4664-afa7-cf66d1715cb5", "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_takes_over_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "she_takes_over_complete": {"canvas_name": "She Takes Over", "canvas_id": "12d3264b-006d-4664-afa7-cf66d1715cb5", "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_takes_over_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "slippery_when_wet_complete": {"canvas_name": "Slippery When Wet", "canvas_id": "a50afd26-980d-4fef-8f68-0c593cec11c3", "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "slippery_when_wet_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "all_night_long_complete": {"canvas_name": "All Night Long", "canvas_id": "f8feeab6-200e-496d-af35-af14df923785", "location": "The Bedroom", "schedule": "between 8 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "in_love_with_player": {"canvas_name": "All Night Long", "canvas_id": "f8feeab6-200e-496d-af35-af14df923785", "location": "The Bedroom", "schedule": "between 8 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "taking_control_complete": {"canvas_name": "Taking Control", "canvas_id": "a1c13307-f16c-4983-9c5b-dc0c0a0febe8", "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "first_morning_complete": {"canvas_name": "First Morning", "canvas_id": "7dd74be2-1def-40e3-9b47-6ba08f5c641d", "location": "The Bedroom", "schedule": "between 6 AM - 9 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, "catching_her_complete": {"canvas_name": "Catching Her", "canvas_id": "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7", "location": "The Spa", "schedule": "between 2 PM - 7 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "catching_her_complete", "operator": "is_false"}, {"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "spa_discovered": {"canvas_name": "Catching Her", "canvas_id": "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7", "location": "The Spa", "schedule": "between 2 PM - 7 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "catching_her_complete", "operator": "is_false"}, {"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "the_facial_complete": {"canvas_name": "The Facial", "canvas_id": "a5492672-7b36-4475-bf4e-a82a3d06533c", "location": "The Bedroom", "schedule": "between 10 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_facial_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "everything_unlocked_complete": {"canvas_name": "Everything Unlocked", "canvas_id": "f16df6e8-6ae8-4bd8-a74e-dba2bb929900", "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "relationship_together", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "morning_after_complete": {"canvas_name": "Morning After", "canvas_id": "72309d64-5eca-41cd-9b9d-06e6c36415a9", "location": "The Bedroom", "schedule": "between 6 AM - 10 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_false"}], "logic": "AND", "version": "1.0"}}, "relationship_together": {"canvas_name": "Morning After", "canvas_id": "72309d64-5eca-41cd-9b9d-06e6c36415a9", "location": "The Bedroom", "schedule": "between 6 AM - 10 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_false"}], "logic": "AND", "version": "1.0"}}, "sex_unlocked": {"canvas_name": "First Night Together", "canvas_id": "9fb9a4f4-2144-469d-808f-cdb1119214d8", "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_false"}, {"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "first_night_complete": {"canvas_name": "First Night Together", "canvas_id": "9fb9a4f4-2144-469d-808f-cdb1119214d8", "location": "The Living Room", "schedule": "between 7 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_false"}, {"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "manual_unlocked": {"canvas_name": "Tasting Her", "canvas_id": "0f470b7c-4809-445f-a86d-a36500a28f26", "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "tasting_her_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "tasting_her_complete": {"canvas_name": "Tasting Her", "canvas_id": "0f470b7c-4809-445f-a86d-a36500a28f26", "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 7 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "tasting_her_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "oral_unlocked": {"canvas_name": "On Her Knees", "canvas_id": "f7cffc4b-2864-4646-b404-bb514f1687d3", "location": "The Kitchen", "schedule": "between 8 AM - 11 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "on_her_knees_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "on_her_knees_complete": {"canvas_name": "On Her Knees", "canvas_id": "f7cffc4b-2864-4646-b404-bb514f1687d3", "location": "The Kitchen", "schedule": "between 8 AM - 11 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "on_her_knees_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "groping_unlocked": {"canvas_name": "She Wants More", "canvas_id": "1e49a8a7-d475-46f0-86e9-564a8d1e80d6", "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_wants_more_complete", "operator": "is_false"}, {"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "she_wants_more_complete": {"canvas_name": "She Wants More", "canvas_id": "1e49a8a7-d475-46f0-86e9-564a8d1e80d6", "location": "The Bedroom", "schedule": "between 7 PM - 1 AM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_wants_more_complete", "operator": "is_false"}, {"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}}, "kiss_unlocked": {"canvas_name": "First Kiss", "canvas_id": "9d637126-5fa9-43aa-ac66-39bfaedbc61f", "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 10 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "intro_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_kiss_complete", "operator": "is_false"}, {"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "trait", "value": 20, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, "first_kiss_complete": {"canvas_name": "First Kiss", "canvas_id": "9d637126-5fa9-43aa-ac66-39bfaedbc61f", "location": "The Kitchen", "schedule": "between 8 AM - 11 AM or 5 PM - 10 PM", "canvas_conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "intro_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_kiss_complete", "operator": "is_false"}, {"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "trait", "value": 20, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}}, "game_started": {"canvas_name": "Moving In", "canvas_id": "32ea0ec9-0deb-4415-9a10-c2d22988624a", "location": null, "schedule": null, "canvas_conditions": null}, "intro_complete": {"canvas_name": "Moving In", "canvas_id": "32ea0ec9-0deb-4415-9a10-c2d22988624a", "location": null, "schedule": null, "canvas_conditions": null}}, "starting_canvas_id": "32ea0ec9-0deb-4415-9a10-c2d22988624a", "locationCanvases": {"3de88b39-6abd-483a-bfab-3e31d3c0304b": [{"id": "0f470b7c-4809-445f-a86d-a36500a28f26", "name": "Tasting Her", "displayName": "Tasting Her", "passageName": "Canvas_story_tasting_her_Node_1", "priority": 87, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "tasting_her_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "f7cffc4b-2864-4646-b404-bb514f1687d3", "name": "On Her Knees", "displayName": "On Her Knees", "passageName": "Canvas_story_on_her_knees_Node_1", "priority": 88, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "on_her_knees_complete", "operator": "is_false"}, {"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "9d637126-5fa9-43aa-ac66-39bfaedbc61f", "name": "First Kiss", "displayName": "First Kiss", "passageName": "Canvas_story_first_kiss_Node_1", "priority": 90, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "22:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "intro_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_kiss_complete", "operator": "is_false"}, {"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "trait", "value": 20, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "0839a0f9-0d0d-44a0-aef3-d67a3df42ce9", "name": "Make Food", "displayName": "Make Food", "passageName": "Canvas_solo_cook_Node_1", "priority": 0, "hasSchedules": false, "scheduleParams": [], "conditions": null, "isRepeatable": true, "maxPerDay": 3}, {"id": "6b100a51-9368-42a7-8912-0b5f00fd6504", "name": "Kitchen Encounter", "displayName": "Kitchen Encounter", "passageName": "Canvas_activity_kitchen_angela_t1_Node_1", "priority": 1, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": null, "isRepeatable": true, "maxPerDay": 1}, {"id": "979fad8d-4232-4bea-929c-65efb9216466", "name": "Kitchen Encounter", "displayName": "Kitchen Encounter", "passageName": "Canvas_activity_kitchen_angela_t3_Node_1", "priority": 3, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "d75afe3d-e78e-4029-a7a3-21f07cced03f", "name": "Kitchen Encounter", "displayName": "Kitchen Encounter", "passageName": "Canvas_activity_kitchen_angela_t4_Node_1", "priority": 4, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "31f245bb-2d4d-4bed-98c5-746e3b3b9bce", "name": "Kitchen Encounter", "displayName": "Kitchen Encounter", "passageName": "Canvas_activity_kitchen_angela_t6_Node_1", "priority": 6, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "90bbf862-b0d7-4c67-a339-8a3c7ba1d745", "name": "Kitchen Encounter", "displayName": "Kitchen Encounter", "passageName": "Canvas_activity_kitchen_angela_t8_Node_1", "priority": 8, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "08:00", "endTime": "11:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}], "7e3b3f43-5dab-4f82-836b-7df2f2175132": [{"id": "f16df6e8-6ae8-4bd8-a74e-dba2bb929900", "name": "Everything Unlocked", "displayName": "Everything Unlocked", "passageName": "Canvas_story_everything_unlocked_Node_1", "priority": 84, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "19:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "relationship_together", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "9fb9a4f4-2144-469d-808f-cdb1119214d8", "name": "First Night Together", "displayName": "First Night Together", "passageName": "Canvas_story_first_night_Node_1", "priority": 86, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "19:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_false"}, {"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "90f794ba-3fec-469a-9dee-a25c7afc5556", "name": "Watch TV", "displayName": "Watch TV", "passageName": "Canvas_solo_watch_tv_Node_1", "priority": 0, "hasSchedules": false, "scheduleParams": [], "conditions": null, "isRepeatable": true, "maxPerDay": 3}, {"id": "0d0f5574-d806-48be-a888-830d19ce4db0", "name": "Living Room Passion", "displayName": "Living Room Passion", "passageName": "Canvas_activity_living_angela_t1_Node_1", "priority": 1, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "11:00", "endTime": "14:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": null, "isRepeatable": true, "maxPerDay": 1}, {"id": "5caa7e6c-88ef-4cc1-9ff1-f00a3098aea1", "name": "Living Room Passion", "displayName": "Living Room Passion", "passageName": "Canvas_activity_living_angela_t3_Node_1", "priority": 3, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "11:00", "endTime": "14:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "12b69442-f78c-4046-babd-922615b4887a", "name": "Living Room Passion", "displayName": "Living Room Passion", "passageName": "Canvas_activity_living_angela_t6_Node_1", "priority": 6, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "11:00", "endTime": "14:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d", "name": "Living Room Passion", "displayName": "Living Room Passion", "passageName": "Canvas_activity_living_angela_t8_Node_1", "priority": 8, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "11:00", "endTime": "14:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}], "0883afa5-53a8-4247-8023-8ff7ed00de16": [{"id": "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7", "name": "Catching Her", "displayName": "Catching Her", "passageName": "Canvas_story_catching_her_Node_1", "priority": 82, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "catching_her_complete", "operator": "is_false"}, {"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "462e5d97-d2e8-4b57-9d8c-44106ec79cb5", "name": "Take a Shower", "displayName": "Take a Shower", "passageName": "Canvas_solo_shower_Node_1", "priority": 0, "hasSchedules": false, "scheduleParams": [], "conditions": null, "isRepeatable": true, "maxPerDay": 2}, {"id": "d60e1f3d-abd9-46be-9b1e-26f7b38b00f3", "name": "Spa Retreat", "displayName": "Spa Retreat", "passageName": "Canvas_activity_spa_angela_t1_Node_1", "priority": 1, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "06:00", "endTime": "08:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": null, "isRepeatable": true, "maxPerDay": 1}, {"id": "9de6cbcc-7ee4-4605-90cf-12e2d737f080", "name": "Spa Retreat", "displayName": "Spa Retreat", "passageName": "Canvas_activity_spa_angela_t2_Node_1", "priority": 2, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "06:00", "endTime": "08:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": {"items": [{"type": "trait", "value": 10, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "042268d4-71c9-452c-b462-341515991c08", "name": "Spa Retreat", "displayName": "Spa Retreat", "passageName": "Canvas_activity_spa_angela_t3_Node_1", "priority": 3, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "06:00", "endTime": "08:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": {"items": [{"type": "trait", "value": 25, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "abeebac0-9703-4872-a7e0-4a81b52d7844", "name": "Spa Retreat", "displayName": "Spa Retreat", "passageName": "Canvas_activity_spa_angela_t5_Node_1", "priority": 5, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "06:00", "endTime": "08:00"}, {"weekdays": [], "startTime": "19:00", "endTime": "22:00"}], "conditions": {"items": [{"type": "trait", "value": 50, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}], "9749655e-1fe7-4d8d-859b-a455c7484bb6": [{"id": "8c75f386-1a95-4b24-90a9-12ac9d3b3f52", "name": "The Strap", "displayName": "The Strap", "passageName": "Canvas_story_the_strap_Node_1", "priority": 76, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_strap_complete", "operator": "is_false"}, {"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "12d3264b-006d-4664-afa7-cf66d1715cb5", "name": "She Takes Over", "displayName": "She Takes Over", "passageName": "Canvas_story_she_takes_over_Node_1", "priority": 77, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_takes_over_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "a50afd26-980d-4fef-8f68-0c593cec11c3", "name": "Slippery When Wet", "displayName": "Slippery When Wet", "passageName": "Canvas_story_slippery_when_wet_Node_1", "priority": 78, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "19:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "slippery_when_wet_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "f8feeab6-200e-496d-af35-af14df923785", "name": "All Night Long", "displayName": "All Night Long", "passageName": "Canvas_story_all_night_long_Node_1", "priority": 79, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "20:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "all_night_long_complete", "operator": "is_false"}, {"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "a1c13307-f16c-4983-9c5b-dc0c0a0febe8", "name": "Taking Control", "displayName": "Taking Control", "passageName": "Canvas_story_taking_control_Node_1", "priority": 80, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "19:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "taking_control_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "7dd74be2-1def-40e3-9b47-6ba08f5c641d", "name": "First Morning", "displayName": "First Morning", "passageName": "Canvas_story_first_morning_Node_1", "priority": 81, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "06:00", "endTime": "09:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "first_morning_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "affection"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "a5492672-7b36-4475-bf4e-a82a3d06533c", "name": "The Facial", "displayName": "The Facial", "passageName": "Canvas_story_the_facial_Node_1", "priority": 83, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "everything_unlocked_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "the_facial_complete", "operator": "is_false"}, {"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "72309d64-5eca-41cd-9b9d-06e6c36415a9", "name": "Morning After", "displayName": "Morning After", "passageName": "Canvas_story_morning_after_Node_1", "priority": 85, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "06:00", "endTime": "10:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "first_night_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "morning_after_complete", "operator": "is_false"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "1e49a8a7-d475-46f0-86e9-564a8d1e80d6", "name": "She Wants More", "displayName": "She Wants More", "passageName": "Canvas_story_she_wants_more_Node_1", "priority": 89, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "19:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "she_wants_more_complete", "operator": "is_false"}, {"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "054063fc-d276-448b-858b-b62534d27b65", "name": "Reflect", "displayName": "Reflect", "passageName": "Canvas_solo_think_Node_1", "priority": 0, "hasSchedules": false, "scheduleParams": [], "conditions": null, "isRepeatable": true, "maxPerDay": 3}, {"id": "24fb6fbb-a0f7-486b-b2c6-75e3d2651f76", "name": "Get Some Rest", "displayName": "Get Some Rest", "passageName": "Canvas_solo_sleep_Node_1", "priority": 0, "hasSchedules": false, "scheduleParams": [], "conditions": null, "isRepeatable": true, "maxPerDay": 2}, {"id": "408686ec-8fdb-4ef2-a77f-9ab302e0d271", "name": "Bedroom Bliss", "displayName": "Bedroom Bliss", "passageName": "Canvas_activity_bedroom_angela_t1_Node_1", "priority": 1, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}, {"weekdays": [], "startTime": "06:00", "endTime": "08:00"}], "conditions": null, "isRepeatable": true, "maxPerDay": 1}, {"id": "93d145ac-a52d-4e82-8938-ff2a10c2b113", "name": "Bedroom Bliss", "displayName": "Bedroom Bliss", "passageName": "Canvas_activity_bedroom_angela_t4_Node_1", "priority": 4, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}, {"weekdays": [], "startTime": "06:00", "endTime": "08:00"}], "conditions": {"items": [{"type": "trait", "value": 40, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "groping_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "59586e40-6e30-4d7b-bea2-a811d40db7ac", "name": "Bedroom Bliss", "displayName": "Bedroom Bliss", "passageName": "Canvas_activity_bedroom_angela_t6_Node_1", "priority": 6, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}, {"weekdays": [], "startTime": "06:00", "endTime": "08:00"}], "conditions": {"items": [{"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7", "name": "Bedroom Bliss", "displayName": "Bedroom Bliss", "passageName": "Canvas_activity_bedroom_angela_t8_Node_1", "priority": 8, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}, {"weekdays": [], "startTime": "06:00", "endTime": "08:00"}], "conditions": {"items": [{"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}], "71700a6a-b26f-4afe-a0c4-4f8b6ca71795": [{"id": "52cc47cf-43c4-4c35-bbb9-200810e4f301", "name": "Under the Open Sky", "displayName": "Under the Open Sky", "passageName": "Canvas_story_under_open_sky_Node_1", "priority": 74, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "under_open_sky_complete", "operator": "is_false"}, {"type": "trait", "value": 80, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "4ee60ddf-1cb7-463e-b410-eba6129a6c4d", "name": "The Car Wash", "displayName": "The Car Wash", "passageName": "Canvas_story_car_wash_Node_1", "priority": 75, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}], "conditions": {"items": [{"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "car_wash_complete", "operator": "is_false"}, {"type": "trait", "value": 60, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "logic": "AND", "version": "1.0"}, "isRepeatable": false, "maxPerDay": null}, {"id": "afb69329-68bb-4c7d-a820-702236f6196c", "name": "Outdoor Encounter", "displayName": "Outdoor Encounter", "passageName": "Canvas_activity_outdoor_angela_t1_Node_1", "priority": 1, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": null, "isRepeatable": true, "maxPerDay": 1}, {"id": "a2825bb2-9517-45d8-8592-9d83e0451882", "name": "Outdoor Encounter", "displayName": "Outdoor Encounter", "passageName": "Canvas_activity_outdoor_angela_t2_Node_1", "priority": 2, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 15, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}], "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "e3e6d968-0f35-4054-889a-00ba3d02eea2", "name": "Outdoor Encounter", "displayName": "Outdoor Encounter", "passageName": "Canvas_activity_outdoor_angela_t3_Node_1", "priority": 3, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 30, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "kiss_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "3d3ad3b9-62e4-472b-ace0-340f9c15fed6", "name": "Outdoor Encounter", "displayName": "Outdoor Encounter", "passageName": "Canvas_activity_outdoor_angela_t5_Node_1", "priority": 5, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 55, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "manual_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "a44f0735-97f7-4ab7-b857-d575394b5c8a", "name": "Outdoor Encounter", "displayName": "Outdoor Encounter", "passageName": "Canvas_activity_outdoor_angela_t6_Node_1", "priority": 6, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 65, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "af0b3a27-2209-4936-ae8e-47b279e11c5a", "name": "Outdoor Encounter", "displayName": "Outdoor Encounter", "passageName": "Canvas_activity_outdoor_angela_t7_Node_1", "priority": 7, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 75, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "d9254675-65bf-4d04-8fdf-67892f03f3bc", "name": "Outdoor Encounter", "displayName": "Outdoor Encounter", "passageName": "Canvas_activity_outdoor_angela_t8_Node_1", "priority": 8, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "14:00", "endTime": "17:00"}, {"weekdays": [], "startTime": "17:00", "endTime": "19:00"}], "conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}, {"type": "flag", "subject": "player", "flag_key": "outdoor_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}], "fa6216c0-d41a-45f7-a07d-af365bd724c8": [{"id": "7bf07e50-d091-474e-8000-7ea5baf18bcb", "name": "Fantasy Fulfillment", "displayName": "Fantasy Fulfillment", "passageName": "Canvas_activity_fantasy_angela_t6_Node_1", "priority": 6, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "trait", "value": 70, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "oral_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2", "name": "Fantasy Fulfillment", "displayName": "Fantasy Fulfillment", "passageName": "Canvas_activity_fantasy_angela_t8_Node_1", "priority": 7, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "trait", "value": 85, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "sex_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "3d9f36d1-fffc-497f-996a-23950976a4e3", "name": "Fantasy Fulfillment", "displayName": "Fantasy Fulfillment", "passageName": "Canvas_activity_fantasy_angela_t8_power_Node_1", "priority": 8, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "trait", "value": 90, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "power_play_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}, {"id": "55f3c04c-0673-4ecd-b8b5-6a5d889e459c", "name": "Fantasy Fulfillment", "displayName": "Fantasy Fulfillment", "passageName": "Canvas_activity_fantasy_angela_t8_pegging_Node_1", "priority": 9, "hasSchedules": true, "scheduleParams": [{"weekdays": [], "startTime": "22:00", "endTime": "01:00"}], "conditions": {"items": [{"type": "trait", "value": 95, "npc_id": "npc_angela", "subject": "npc", "operator": "gte", "trait_key": "desire"}, {"type": "flag", "subject": "player", "flag_key": "pegging_unlocked", "operator": "is_true"}], "logic": "AND", "version": "1.0"}, "isRepeatable": true, "maxPerDay": 1}]}}>><<script>> // Initialize setup object and time management functions if (typeof setup === 'undefined') { window.setup = {}; } // NPC ID resolver: converts slugs to UUIDs for $npcs lookups // Conditions from TOML use NPC slugs (e.g., "elena") but $npcs is keyed by UUID setup.resolveNpcId = function(idOrSlug) { if (!idOrSlug) return null; var slugMap = State.variables.npc_slug_map || {}; var key = String(idOrSlug); // If it's a slug, resolve to UUID; otherwise return as-is (already UUID) return slugMap[key] || key; }; // Time period calculation function setup.getTimePeriod = function(hour) { if (hour >= 6 && hour < 12) return "Morning"; if (hour >= 12 && hour < 18) return "Afternoon"; if (hour >= 18 && hour < 22) return "Evening"; return "Night"; }; // Schedule evaluation function for trigger conditionals // Accepts array of schedule objects, returns true if ANY schedule is active (OR logic) setup.isScheduleActive = function(scheduleArray) { // Empty/null = always active (no schedule restriction) if (!scheduleArray || scheduleArray.length === 0) return true; const timeState = State.variables.game_state.time_state; const dayIndex = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"].indexOf(timeState.current_day); const currentHour = timeState.current_hour; const currentMinute = timeState.current_minute; const currentTotal = (currentHour * 60) + currentMinute; // Check each schedule - return true if ANY matches (OR logic) for (var i = 0; i < scheduleArray.length; i++) { var sched = scheduleArray[i]; var weekdays = sched.weekdays || []; var startTime = sched.startTime; var endTime = sched.endTime; // Check day (empty weekdays = any day) if (weekdays.length > 0 && !weekdays.includes(dayIndex)) continue; // Parse start time var startParts = startTime.split(':'); var startTotal = parseInt(startParts[0]) * 60 + parseInt(startParts[1]); if (endTime) { // Range trigger var endParts = endTime.split(':'); var endTotal = parseInt(endParts[0]) * 60 + parseInt(endParts[1]); // Handle overnight schedules (e.g., 22:00 to 08:00) if (endTotal < startTotal) { if (currentTotal >= startTotal || currentTotal < endTotal) return true; } else { if (currentTotal >= startTotal && currentTotal < endTotal) return true; } } else { // Point trigger - active for 1 hour window if (currentTotal >= startTotal && currentTotal < startTotal + 60) return true; } } return false; }; // ===== NPC Schedule Helper Functions ===== // Get the current location of an NPC based on game time setup.getNpcLocation = function(npcId) { var resolvedId = setup.resolveNpcId(npcId); var npcs = State.variables.npcs || {}; var npc = npcs[resolvedId]; if (!npc || !npc.schedule || npc.schedule.length === 0) return null; var timeState = State.variables.game_state.time_state; var dayIndex = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"].indexOf(timeState.current_day); var currentHour = timeState.current_hour; var currentMinute = timeState.current_minute; var currentTotalMinutes = (currentHour * 60) + currentMinute; for (var i = 0; i < npc.schedule.length; i++) { var sch = npc.schedule[i]; // Check weekdays (empty = all days) if (sch.weekdays && sch.weekdays.length > 0 && !sch.weekdays.includes(dayIndex)) continue; // Parse times var startParts = (sch.start_time || "00:00").split(':'); var startTotal = parseInt(startParts[0]) * 60 + parseInt(startParts[1]); var endTotal; if (sch.end_time) { var endParts = sch.end_time.split(':'); endTotal = parseInt(endParts[0]) * 60 + parseInt(endParts[1]); } else { endTotal = startTotal + 60; // Default 1 hour duration } // Handle overnight schedules (end < start) var isInRange; if (endTotal < startTotal) { isInRange = currentTotalMinutes >= startTotal || currentTotalMinutes < endTotal; } else { isInRange = currentTotalMinutes >= startTotal && currentTotalMinutes < endTotal; } if (isInRange) { return { location: sch.location, activity: sch.activity || "" }; } } return null; }; // Get schedule entries for a specific NPC on a specific day setup.getNpcDaySchedule = function(npcId, dayIndex) { var resolvedId = setup.resolveNpcId(npcId); var npcs = State.variables.npcs || {}; var npc = npcs[resolvedId]; if (!npc || !npc.schedule) return []; var result = []; for (var i = 0; i < npc.schedule.length; i++) { var sch = npc.schedule[i]; // Check if schedule applies to this day (empty weekdays = all days) if (!sch.weekdays || sch.weekdays.length === 0 || sch.weekdays.includes(dayIndex)) { result.push({ location: sch.location, start_time: sch.start_time || "00:00", end_time: sch.end_time || null, activity: sch.activity || "" }); } } return result; }; // Get all NPCs with schedules setup.getNpcsWithSchedules = function() { var npcs = State.variables.npcs || {}; var result = []; for (var npcId in npcs) { if (npcs[npcId].schedule && npcs[npcId].schedule.length > 0) { result.push({ id: npcId, name: npcs[npcId].name }); } } return result; }; // Get today's schedule sorted by start time setup.getTodayScheduleSorted = function(npcId) { var timeState = State.variables.game_state.time_state; var dayIndex = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] .indexOf(timeState.current_day); var schedules = setup.getNpcDaySchedule(npcId, dayIndex); // Sort by start time schedules.sort(function(a, b) { var aParts = a.start_time.split(':'); var bParts = b.start_time.split(':'); var aMinutes = parseInt(aParts[0]) * 60 + parseInt(aParts[1]); var bMinutes = parseInt(bParts[0]) * 60 + parseInt(bParts[1]); return aMinutes - bMinutes; }); return schedules; }; // Check if current game time is within a time slot setup.isCurrentTimeSlot = function(startTime, endTime) { var timeState = State.variables.game_state.time_state; var currentTotal = (timeState.current_hour * 60) + timeState.current_minute; var startParts = startTime.split(':'); var startTotal = parseInt(startParts[0]) * 60 + parseInt(startParts[1]); var endTotal; if (endTime) { var endParts = endTime.split(':'); endTotal = parseInt(endParts[0]) * 60 + parseInt(endParts[1]); } else { endTotal = startTotal + 60; } // Handle overnight (e.g., 22:00-06:00) if (endTotal < startTotal) { return currentTotal >= startTotal || currentTotal < endTotal; } return currentTotal >= startTotal && currentTotal < endTotal; }; // Format hour:minute to readable time (e.g., "10:30 AM") setup.formatTime = function(hour, minute) { var period = hour >= 12 ? 'PM' : 'AM'; var displayHour = hour % 12 || 12; var displayMinute = minute < 10 ? '0' + minute : minute; return displayHour + ':' + displayMinute + ' ' + period; }; // ===== Trigger Conditions Evaluator ===== // Evaluates v1.0 trigger conditions against current game state (flags/traits) setup.triggerConditionsSatisfied = function(conditions) { try { // Treat missing/empty conditions as satisfied if (!conditions || typeof conditions !== 'object') return true; if (!conditions.version || conditions.version !== '1.0') return true; var items = Array.isArray(conditions.items) ? conditions.items : []; if (items.length === 0) return true; var logic = (conditions.logic === 'OR') ? 'OR' : 'AND'; var sv = State.variables || {}; var player = sv.player || {}; var npcs = sv.npcs || {}; function hasKey(obj, key) { if (!obj || typeof obj !== 'object') return false; return Object.prototype.hasOwnProperty.call(obj, String(key)); } function coerceNumber(v) { var n = Number(v); return isNaN(n) ? null : n; } function compare(op, left, right) { if (op === 'eq') return left === right; if (op === 'ne') return left !== right; if (op === 'gt' || op === 'gte' || op === 'lt' || op === 'lte') { var lnum = coerceNumber(left); var rnum = coerceNumber(right); if (lnum === null || rnum === null) return false; if (op === 'gt') return lnum > rnum; if (op === 'gte') return lnum >= rnum; if (op === 'lt') return lnum < rnum; if (op === 'lte') return lnum <= rnum; } if (op === 'in') { if (!Array.isArray(right)) return false; return right.includes(left); } if (op === 'not_in') { if (!Array.isArray(right)) return false; return !right.includes(left); } if (op === 'contains') { if (Array.isArray(left)) return left.includes(right); if (typeof left === 'string') return String(left).includes(String(right)); return false; } if (op === 'not_contains') { if (Array.isArray(left)) return !left.includes(right); if (typeof left === 'string') return !String(left).includes(String(right)); return false; } if (op === 'exists') return (left !== undefined && left !== null); if (op === 'not_exists') return (left === undefined || left === null); return false; } var results = []; for (var i = 0; i < items.length; i++) { var it = items[i]; if (!it || typeof it !== 'object') { results.push(false); continue; } var type = it.type; var subject = it.subject; var satisfied = false; if (type === 'flag') { var key = it.flag_key; var op = it.operator; if (!key || (subject !== 'player' && subject !== 'npc')) { results.push(false); continue; } if (subject === 'player') { // Use global $flags for player flags (sv.flags = State.variables.flags) var flags = (sv.flags || {}); if (op === 'exists') { satisfied = hasKey(flags, key); } else if (op === 'is_true') { satisfied = (flags[String(key)] === true); } else if (op === 'is_false') { // Treat missing or strictly false as false var v = flags[String(key)]; satisfied = (v === false || v === undefined); } else { satisfied = false; } } else if (subject === 'npc') { var rawNpcId = it.npc_id || it.character_id || ''; var npcId = setup.resolveNpcId(rawNpcId); var npc = npcId ? (npcs[npcId] || null) : null; var flagsNpc = npc && npc.flags ? npc.flags : {}; if (op === 'exists') { satisfied = hasKey(flagsNpc, key); } else if (op === 'is_true') { satisfied = (flagsNpc[String(key)] === true); } else if (op === 'is_false') { var v2 = flagsNpc[String(key)]; satisfied = (v2 === false || v2 === undefined); } else { satisfied = false; } } results.push(satisfied); continue; } if (type === 'trait') { var tkey = it.trait_key; var top = it.operator; if (!tkey || (subject !== 'player' && subject !== 'npc')) { results.push(false); continue; } var leftVal = null; if (subject === 'player') { leftVal = (player.core_traits || {})[String(tkey)]; } else if (subject === 'npc') { var rawNpc2Id = it.npc_id || it.character_id || ''; var npc2Id = setup.resolveNpcId(rawNpc2Id); var npc2 = npc2Id ? (npcs[npc2Id] || null) : null; leftVal = npc2 && npc2.core_traits ? npc2.core_traits[String(tkey)] : undefined; } var rightVal = it.value; satisfied = compare(top, leftVal, rightVal); results.push(satisfied); continue; } // Unknown type results.push(false); } if (results.length === 0) return false; if (logic === 'AND') return results.every(function(x) { return !!x; }); return results.some(function(x) { return !!x; }); } catch (e) { // Fail open to avoid breaking gameplay return true; } }; // ===== Trigger Repeatability & Limits ===== // Utility to build a unique day key combining week and day setup.getCurrentDayKey = function() { try { var ts = State.variables.game_state.time_state; return String(ts.current_week) + ':' + String(ts.current_day); } catch (e) { return '0:Monday'; } }; // Check if a canvas can trigger based on repeatability and per-day limit setup.canTriggerCanvas = function(canvasId, isRepeatable, maxPerDay) { try { var sv = State.variables; sv.game_state = sv.game_state || {}; var hist = sv.game_state.trigger_history = sv.game_state.trigger_history || {}; var rec = hist[String(canvasId)] || null; if (!rec) { // Never triggered before; allowed return true; } // Not repeatable and already triggered once if (!isRepeatable && (rec.total || 0) >= 1) { return false; } // Per-day limit check if (maxPerDay !== null && maxPerDay !== undefined) { var currentDayKey = setup.getCurrentDayKey(); var dayKey = rec.dayKey || ''; var dayCount = rec.dayCount || 0; if (dayKey !== currentDayKey) { // New day; reset dayCount logic allows trigger return true; } if (dayCount >= Number(maxPerDay)) { return false; } } return true; } catch (e) { // Fail open return true; } }; // Mark a canvas as triggered: increments total and per-day counters setup.markCanvasTriggered = function(canvasId) { try { var sv = State.variables; sv.game_state = sv.game_state || {}; var hist = sv.game_state.trigger_history = sv.game_state.trigger_history || {}; var key = String(canvasId); var rec = hist[key] || { total: 0, dayKey: '', dayCount: 0 }; var currentDayKey = setup.getCurrentDayKey(); if (rec.dayKey !== currentDayKey) { rec.dayKey = currentDayKey; rec.dayCount = 0; } rec.total = (rec.total || 0) + 1; rec.dayCount = (rec.dayCount || 0) + 1; hist[key] = rec; } catch (e) { // ignore } }; // Check if a canvas has never been completed (for highlighting new content) setup.isCanvasNew = function(canvasId) { try { var sv = State.variables; sv.game_state = sv.game_state || {}; var hist = sv.game_state.trigger_history || {}; var record = hist[String(canvasId)]; return !record || (record.total || 0) === 0; } catch (e) { return true; // Fail open - show as new if error } }; // Check if a location has any unvisited AND available canvases (for navigation indicators) setup.locationHasNewCanvases = function(locationId) { try { var sv = State.variables; var helpData = sv.help_data || {}; var locationCanvases = helpData.locationCanvases || {}; var canvasList = locationCanvases[String(locationId)] || []; for (var i = 0; i < canvasList.length; i++) { var c = canvasList[i]; // Check if canvas is NEW (never visited) if (!setup.isCanvasNew(c.id)) continue; // Check if schedule is active (if canvas has schedules) if (c.hasSchedules && c.scheduleParams) { if (!setup.isScheduleActive(c.scheduleParams)) { continue; } } // Check if conditions are satisfied (if canvas has conditions) if (c.conditions && !setup.triggerConditionsSatisfied(c.conditions)) { continue; } // Check if canvas can still be triggered (repeatability/per-day limits) if (!setup.canTriggerCanvas(c.id, c.isRepeatable, c.maxPerDay)) { continue; } // Found a canvas that is NEW and AVAILABLE return true; } return false; } catch (e) { return false; // Fail closed - don't show indicator if error } }; // ===== Priority-Based Canvas Selection ===== // Check if a canvas is valid (schedule, conditions, repeatability) setup.isCanvasValid = function(c) { try { // Check schedule if present if (c.hasSchedules && c.scheduleParams) { if (!setup.isScheduleActive(c.scheduleParams)) { return false; } } // Check conditions if present if (c.conditions && !setup.triggerConditionsSatisfied(c.conditions)) { return false; } // Check repeatability if (!setup.canTriggerCanvas(c.id, c.isRepeatable, c.maxPerDay)) { return false; } return true; } catch (e) { return false; } }; // Select highest-priority valid canvas per activity name // Returns array of selected canvases (one per unique name) setup.selectCanvasByPriority = function(canvasList) { try { if (!canvasList || canvasList.length === 0) return []; // Check if any canvas has priority > 0 (new system) var hasPriorities = false; for (var i = 0; i < canvasList.length; i++) { if ((canvasList[i].priority || 0) > 0) { hasPriorities = true; break; } } // Backward compatibility: if no priorities set, return all valid canvases if (!hasPriorities) { var allValid = []; for (var j = 0; j < canvasList.length; j++) { if (setup.isCanvasValid(canvasList[j])) { allValid.push(canvasList[j]); } } return allValid; } // New system: group by name and select highest-priority valid per group var groups = {}; for (var k = 0; k < canvasList.length; k++) { var canvas = canvasList[k]; var name = canvas.name || canvas.id; if (!groups[name]) groups[name] = []; groups[name].push(canvas); } var selected = []; var groupNames = Object.keys(groups); for (var g = 0; g < groupNames.length; g++) { var groupName = groupNames[g]; var group = groups[groupName]; // Sort by priority descending (highest first) group.sort(function(a, b) { return (b.priority || 0) - (a.priority || 0); }); // Find first valid canvas in sorted order for (var m = 0; m < group.length; m++) { if (setup.isCanvasValid(group[m])) { selected.push(group[m]); break; } } } return selected; } catch (e) { return []; } }; // Render canvas links for a location with priority-based selection // Returns HTML string with SugarCube-compatible links setup.renderLocationCanvases = function(locationId) { try { var sv = State.variables; var helpData = sv.help_data || {}; var locationCanvases = helpData.locationCanvases || {}; var canvasList = locationCanvases[String(locationId)] || []; if (canvasList.length === 0) return ''; // Use priority selection to get valid canvases var selected = setup.selectCanvasByPriority(canvasList); if (selected.length === 0) return ''; var html = ''; for (var i = 0; i < selected.length; i++) { var c = selected[i]; var displayName = c.displayName || c.name || 'Unnamed'; var passageName = c.passageName || ''; if (!passageName) continue; // Check if this canvas is new (unvisited) var isNew = setup.isCanvasNew(c.id); // Generate SugarCube-compatible link (using data-passage attribute) if (isNew) { html += '<span class="new-canvas">'; } html += '<a class="link-internal" data-passage="' + passageName + '">' + displayName + '</a>'; if (isNew) { html += '</span>'; } html += '<br>'; } return html; } catch (e) { return ''; } }; // Time advancement functions window.advanceTime = function(minutes) { // Add minutes to current time State.variables.game_state.time_state.current_minute += minutes; // Handle minute/hour rollover while (State.variables.game_state.time_state.current_minute >= 60) { State.variables.game_state.time_state.current_minute -= 60; State.variables.game_state.time_state.current_hour += 1; } // Handle day rollover while (State.variables.game_state.time_state.current_hour >= 24) { State.variables.game_state.time_state.current_hour -= 24; advanceDay(); } // Update display updateTimeDisplay(); }; window.advanceDay = function() { const days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]; const currentIndex = days.indexOf(State.variables.game_state.time_state.current_day); const nextIndex = (currentIndex + 1) % 7; State.variables.game_state.time_state.current_day = days[nextIndex]; // New week starts on Monday if (nextIndex === 0) { State.variables.game_state.time_state.current_week += 1; } }; window.updateTimeDisplay = function() { // Format time for 12-hour display const hour = State.variables.game_state.time_state.current_hour; const minute = State.variables.game_state.time_state.current_minute; const displayHour = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour; const ampm = hour < 12 ? 'AM' : 'PM'; const formattedTime = displayHour + ':' + (minute < 10 ? '0' : '') + minute + ' ' + ampm; // Update time display const timeElement = document.getElementById('time-display'); if (timeElement) { timeElement.textContent = formattedTime; } // Update current day const currentDayElement = document.getElementById('current-day'); if (currentDayElement) { currentDayElement.textContent = State.variables.game_state.time_state.current_day; } }; // ===== Trait Helpers ===== window._traitClamp = function(v, min, max) { v = Number(v); if (isNaN(v)) { v = 0; } if (min !== undefined && v < min) v = min; if (max !== undefined && v > max) v = max; return v; }; window.applyTraitEffect = function(targetType, npcId, trait, op, val, clampFlag, cap) { try { var sv = State.variables; if (!sv) return; // Resolve NPC slug to UUID if (targetType === 'npc' && npcId) { npcId = setup.resolveNpcId(npcId); } // Resolve target object var traitsObj = null; if (targetType === 'player') { sv.player = sv.player || {}; sv.player.core_traits = sv.player.core_traits || {}; traitsObj = sv.player.core_traits; } else if (targetType === 'npc') { sv.npcs = sv.npcs || {}; var npc = sv.npcs[String(npcId)] || null; if (!npc) return; // Unknown NPC npc.core_traits = npc.core_traits || {}; traitsObj = npc.core_traits; } else { return; // Unknown target type } // Normalize inputs var key = String(trait); var current = Number(traitsObj[key]); if (isNaN(current)) current = 0; var value = Number(val); if (isNaN(value)) value = 0; // Apply operation var next = current; if (op === 'add') { next = current + value; } else if (op === 'set') { next = value; } else { // Unknown op; do nothing return; } // Clamp 0-100 if requested (default true) if (clampFlag === undefined || clampFlag === null) { clampFlag = true; } if (clampFlag) { next = window._traitClamp(next, 0, 100); } // Apply cap if provided if (cap !== undefined && cap !== null) { var capNum = Number(cap); if (!isNaN(capNum)) { if (next > capNum) next = capNum; } } traitsObj[key] = next; } catch (e) { // Ignore to avoid breaking navigation } }; // ===== Flag Helpers ===== window.applyFlagEffect = function(targetType, npcId, flag) { try { var sv = State.variables; if (!sv) return; // Resolve NPC slug to UUID if (targetType === 'npc' && npcId) { npcId = setup.resolveNpcId(npcId); } var key = String(flag); if (targetType === 'player') { // Store in $flags (sv.flags) to match triggerConditionsSatisfied checks sv.flags = sv.flags || {}; sv.flags[key] = true; return; } if (targetType === 'npc') { sv.npcs = sv.npcs || {}; var npc = sv.npcs[String(npcId)]; if (!npc) return; npc.flags = npc.flags || {}; npc.flags[key] = true; return; } } catch (e) { // ignore } }; // ========== EFFECT NOTIFICATION SYSTEM ========== // Pending effects to show setup.pendingEffects = []; // Get current trait value helper setup.getTraitValue = function(targetType, npcId, trait) { var sv = State.variables; // Resolve NPC slug to UUID if (targetType === 'npc' && npcId) { npcId = setup.resolveNpcId(npcId); } if (targetType === 'player') { return (sv.player && sv.player.core_traits) ? (sv.player.core_traits[trait] || 0) : 0; } else if (targetType === 'npc' && npcId) { var npc = sv.npcs ? sv.npcs[String(npcId)] : null; return (npc && npc.core_traits) ? (npc.core_traits[trait] || 0) : 0; } return 0; }; // Apply trait and queue notification setup.applyAndNotifyTrait = function(targetType, npcId, trait, op, val, clampFlag, cap) { var oldVal = setup.getTraitValue(targetType, npcId, trait); applyTraitEffect(targetType, npcId, trait, op, val, clampFlag, cap); var newVal = setup.getTraitValue(targetType, npcId, trait); var delta = newVal - oldVal; if (delta !== 0) { var npcName = ''; if (targetType === 'npc' && npcId) { npcId = setup.resolveNpcId(npcId); var npc = State.variables.npcs ? State.variables.npcs[String(npcId)] : null; npcName = npc ? (npc.name || npcId) : npcId; } setup.pendingEffects.push({ type: 'trait', name: npcName, trait: trait, delta: delta }); } }; // Apply flag and queue notification setup.applyAndNotifyFlag = function(targetType, npcId, flag) { // Resolve NPC slug to UUID if (targetType === 'npc' && npcId) { npcId = setup.resolveNpcId(npcId); } applyFlagEffect(targetType, npcId, flag); var npcName = ''; if (targetType === 'npc' && npcId) { var npc = State.variables.npcs ? State.variables.npcs[String(npcId)] : null; npcName = npc ? (npc.name || npcId) : npcId; } setup.pendingEffects.push({ type: 'flag', name: npcName, flag: flag }); }; // Show notification and clear setup.showEffectNotification = function() { var effects = setup.pendingEffects; if (!effects || effects.length === 0) return; var lines = []; for (var i = 0; i < effects.length; i++) { var eff = effects[i]; if (eff.type === 'trait') { var sign = eff.delta > 0 ? '+' : ''; var traitDisplay = eff.trait.charAt(0).toUpperCase() + eff.trait.slice(1); var prefix = eff.name ? (eff.name + "'s ") : ''; lines.push(sign + eff.delta + ' ' + prefix + traitDisplay); } else if (eff.type === 'flag') { var flagDisplay = eff.flag.replace(/_/g, ' '); flagDisplay = flagDisplay.charAt(0).toUpperCase() + flagDisplay.slice(1); lines.push('🔓 ' + flagDisplay); } } if (lines.length === 0) { setup.pendingEffects = []; return; } var html = '<div class="effect-toast">' + lines.join(' • ') + '</div>'; jQuery('body').append(html); setTimeout(function() { jQuery('.effect-toast').remove(); }, 2000); setup.pendingEffects = []; }; // ========== STORY JOURNAL SYSTEM ========== // Detect current story position based on story arc and game state setup.detectStoryPosition = function() { var arc = State.variables.story_arc || {}; var result = { current_chapter: null, completed_nodes: [], available_nodes: [], locked_nodes: [], active_groups: [], is_stuck: false, progress_percent: 0 }; if (!arc.nodes || arc.nodes.length === 0) { // Use auto-inference if no story arc defined return setup.autoInferStoryPosition(); } var completedIds = []; var availableIds = []; var lockedIds = []; // Check each node's completion status arc.nodes.forEach(function(node) { var isCompleted = false; // Check linked_canvas completion if (node.linked_canvas) { var canvasId = node.linked_canvas; isCompleted = State.variables.game_state.completed_canvases && State.variables.game_state.completed_canvases.indexOf(canvasId) !== -1; } // Check linked_flag (flags is an object, not an array) if (node.linked_flag && !isCompleted) { isCompleted = State.variables.flags && State.variables.flags[node.linked_flag]; } if (isCompleted) { completedIds.push(node.id); result.completed_nodes.push({ id: node.id, name: node.name, chapter: node.chapter, journal_entry: node.journal_entry, is_milestone: node.is_milestone || false }); } }); // Determine available vs locked nodes arc.nodes.forEach(function(node) { if (completedIds.indexOf(node.id) !== -1) return; // Already completed var canUnlock = true; // Check requires_nodes if (node.requires_nodes && node.requires_nodes.length > 0) { for (var i = 0; i < node.requires_nodes.length; i++) { if (completedIds.indexOf(node.requires_nodes[i]) === -1) { canUnlock = false; break; } } } // Check requires_group if (canUnlock && node.requires_group && arc.groups) { var group = arc.groups.find(function(g) { return g.id === node.requires_group; }); if (group) { var groupNodes = arc.nodes.filter(function(n) { return n.group === group.id; }); var completedCount = groupNodes.filter(function(n) { return completedIds.indexOf(n.id) !== -1; }).length; if (completedCount < group.required_count) { canUnlock = false; } } } if (canUnlock) { availableIds.push(node.id); result.available_nodes.push({ id: node.id, name: node.name, chapter: node.chapter, journal_entry: node.journal_entry, group: node.group || null }); } else { lockedIds.push(node.id); result.locked_nodes.push({ id: node.id, name: node.name, chapter: node.chapter, requires_group: node.requires_group || null, requires_nodes: node.requires_nodes || [] }); } }); // Build active groups status if (arc.groups) { arc.groups.forEach(function(group) { var groupNodes = arc.nodes.filter(function(n) { return n.group === group.id; }); var completedCount = groupNodes.filter(function(n) { return completedIds.indexOf(n.id) !== -1; }).length; result.active_groups.push({ id: group.id, name: group.name, description: group.description || "", completed: completedCount, required: group.required_count, total: groupNodes.length, isComplete: completedCount >= group.required_count }); }); } // Determine current chapter based on most recent milestone or available nodes if (arc.chapters && arc.chapters.length > 0) { var currentChapterId = null; // Find the chapter of the most recent milestone var milestones = result.completed_nodes.filter(function(n) { return n.is_milestone; }); if (milestones.length > 0) { currentChapterId = milestones[milestones.length - 1].chapter; } // Or use chapter of first available node if (!currentChapterId && result.available_nodes.length > 0) { currentChapterId = result.available_nodes[0].chapter; } // Or use first chapter if (!currentChapterId) { currentChapterId = arc.chapters[0].id; } result.current_chapter = arc.chapters.find(function(c) { return c.id === currentChapterId; }); } // Calculate progress var totalNodes = arc.nodes.length; if (totalNodes > 0) { result.progress_percent = Math.round((completedIds.length / totalNodes) * 100); } // Check if stuck (no available nodes and not all completed) result.is_stuck = result.available_nodes.length === 0 && result.completed_nodes.length < totalNodes; return result; }; // Get completed activities as "memories" for the journal setup.getCompletedActivities = function() { var position = setup.detectStoryPosition(); return position.completed_nodes.map(function(node) { return { name: node.name, journal_entry: node.journal_entry || "A moment to remember...", is_milestone: node.is_milestone }; }); }; // Interpret NPC state as emotional description instead of numbers setup.interpretNpcState = function(npcId) { var arc = State.variables.story_arc || {}; var mappings = arc.emotion_mappings || {}; var result = { npc_name: "", primary_emotion: "neutral", description: "Your relationship is developing...", relationship_summary: "", trait_interpretations: [] }; // Get NPC data - $npcs is an object keyed by UUID, not an array var npc = null; var npcs = State.variables.npcs || {}; // Try direct lookup first (npcId might already be a UUID) if (npcs[npcId]) { npc = npcs[npcId]; } else { // Try resolving as slug var resolvedId = setup.resolveNpcId(npcId); if (resolvedId && npcs[resolvedId]) { npc = npcs[resolvedId]; } } // Fallback to npc_states if available if (!npc && State.variables.npc_states) { npc = State.variables.npc_states[npcId]; } if (!npc) return result; result.npc_name = npc.name || npcId; var traits = npc.core_traits || {}; // Process each mapped trait var primaryEmotion = null; var highestPriority = -1; var traitOrder = ["affection", "trust", "arousal", "appreciation"]; traitOrder.forEach(function(traitName, priority) { var traitValue = traits[traitName]; if (typeof traitValue !== "number") return; var mapping = mappings[traitName]; if (!mapping || !mapping.ranges) return; // Find matching range var matchedRange = null; for (var i = 0; i < mapping.ranges.length; i++) { var range = mapping.ranges[i]; if (traitValue >= range.min && traitValue <= range.max) { matchedRange = range; break; } } if (matchedRange) { result.trait_interpretations.push({ trait: traitName, value: traitValue, label: matchedRange.label, description: matchedRange.description }); // Track primary emotion (highest value trait) if (traitValue > highestPriority) { highestPriority = traitValue; primaryEmotion = matchedRange.label; result.description = matchedRange.description; } } }); if (primaryEmotion) { result.primary_emotion = primaryEmotion; } // Generate relationship summary based on trait interpretations if (result.trait_interpretations.length > 0) { var summaryParts = result.trait_interpretations.slice(0, 2).map(function(t) { return t.description; }); result.relationship_summary = summaryParts.join(" "); } return result; }; // Generate subtle narrative hint (not mechanical instructions) setup.generateNarrativeHint = function() { var arc = State.variables.story_arc || {}; var hints = arc.hints || {}; var position = setup.detectStoryPosition(); var result = { hint_type: "none", text: "" }; // Only show hints when stuck or making slow progress if (!position.is_stuck && position.available_nodes.length > 0) { return result; } // Check active groups for progress hints var incompleteGroup = position.active_groups.find(function(g) { return !g.isComplete && g.completed < g.required; }); if (incompleteGroup) { result.hint_type = "observation"; var remaining = incompleteGroup.required - incompleteGroup.completed; if (hints.group_incomplete) { result.text = hints.group_incomplete .replace("{group_name}", incompleteGroup.name) .replace("{remaining}", remaining); } else { result.text = "There might be more to explore..."; } return result; } // Check locked nodes for what might be possible if (position.locked_nodes.length > 0) { result.hint_type = "suggestion"; if (hints.progress_needed) { result.text = hints.progress_needed; } else { result.text = "Perhaps spending more time together would reveal new possibilities..."; } return result; } // All done if (position.progress_percent >= 100) { result.hint_type = "completion"; result.text = hints.story_complete || "Your story together has reached a beautiful conclusion."; } return result; }; // ============== QUEST PAGE HELPER FUNCTIONS ============== // Get the next activity for an NPC (first incomplete in node order) setup.getNextActivity = function(npcId) { var helpData = State.variables.help_data || {}; var npcData = helpData.npcs ? helpData.npcs[npcId] : null; if (!npcData) return null; var activities = npcData.activities || []; var flags = State.variables.flags || {}; var hist = (State.variables.game_state && State.variables.game_state.trigger_history) || {}; // Activities are in node order from story_arc for (var i = 0; i < activities.length; i++) { var activity = activities[i]; // Skip non-story-arc activities (repeatable canvases without node_id) if (!activity.node_id) continue; // Skip completed activities (check linked_flag OR canvas visited in trigger_history) var isCompleted = (activity.linked_flag && flags[activity.linked_flag]) || (activity.canvas_id && hist[activity.canvas_id] && hist[activity.canvas_id].total > 0); if (isCompleted) continue; // Skip activities without a location (intro/automatic activities) if (!activity.location) continue; // Check if canvas trigger conditions are met var canvasConditions = activity.canvas_conditions; if (canvasConditions && canvasConditions.items) { var items = canvasConditions.items; var traitItems = []; var flagItems = []; // Separate trait and flag conditions for (var k = 0; k < items.length; k++) { if (items[k].type === 'trait') traitItems.push(items[k]); else if (items[k].type === 'flag') flagItems.push(items[k]); } // Check trait conditions FIRST (priority) var unmetTraits = []; for (var t = 0; t < traitItems.length; t++) { if (!setup.checkSingleCondition(traitItems[t])) { unmetTraits.push(traitItems[t]); } } if (unmetTraits.length > 0) { // Trait not met - show trait requirement return { activity: activity, isLocked: false, conditionsNotMet: true, traitConditionsNotMet: true, canvasConditions: { items: unmetTraits, logic: canvasConditions.logic, version: '1.0' } }; } // Traits met - check flags var unmetFlags = []; for (var f = 0; f < flagItems.length; f++) { if (!setup.checkSingleCondition(flagItems[f])) { unmetFlags.push(flagItems[f]); } } if (unmetFlags.length > 0) { // Flags not met - show actionable hint var flagHint = setup.getBestFlagHint(unmetFlags); return { activity: activity, isLocked: false, conditionsNotMet: true, flagConditionsNotMet: true, flagHint: flagHint }; } } // Found next visitable activity - check if locked by traits var traitReqs = activity.trait_requirements || []; var missingTraits = []; for (var j = 0; j < traitReqs.length; j++) { if (!setup.checkTraitRequirement(traitReqs[j])) { missingTraits.push(traitReqs[j]); } } return { activity: activity, isLocked: missingTraits.length > 0, missingTraits: missingTraits, conditionsNotMet: false }; } return null; // All completed }; // Check if a trait requirement is met setup.checkTraitRequirement = function(req) { var player = State.variables.player || {}; var traits = player.traits || {}; var currentValue = traits[req.trait] || 0; switch (req.operator) { case ">": return currentValue > req.value; case ">=": return currentValue >= req.value; case "<": return currentValue < req.value; case "<=": return currentValue <= req.value; case "==": return currentValue === req.value; default: return currentValue >= req.value; } }; // Check a single condition item (trait or flag) setup.checkSingleCondition = function(item) { var sv = State.variables || {}; if (item.type === 'flag') { var flags = sv.flags || {}; if (item.subject === 'player') { if (item.operator === 'is_true') return flags[item.flag_key] === true; if (item.operator === 'is_false') return !flags[item.flag_key]; } return false; } if (item.type === 'trait') { var leftVal = null; if (item.subject === 'player') { leftVal = ((sv.player || {}).core_traits || {})[item.trait_key]; } else if (item.subject === 'npc') { var npcId = setup.resolveNpcId(item.npc_id || ''); var npc = npcId ? ((sv.npcs || {})[npcId] || null) : null; leftVal = npc && npc.core_traits ? npc.core_traits[item.trait_key] : undefined; } var rightVal = item.value; var op = item.operator; if (op === 'gte') return Number(leftVal) >= Number(rightVal); if (op === 'gt') return Number(leftVal) > Number(rightVal); if (op === 'lte') return Number(leftVal) <= Number(rightVal); if (op === 'lt') return Number(leftVal) < Number(rightVal); if (op === 'eq') return leftVal === rightVal; return false; } return false; }; // Find actionable hint for unmet flag conditions (with recursive chain resolution) setup.getBestFlagHint = function(unmetFlags) { var helpData = State.variables.help_data || {}; var flagUnlockMap = helpData.flag_unlock_map || {}; var startingCanvasId = helpData.starting_canvas_id; // First pass: find directly visitable unlock canvas for (var i = 0; i < unmetFlags.length; i++) { var flagKey = unmetFlags[i].flag_key; var unlockInfo = flagUnlockMap[flagKey]; if (unlockInfo) { // Skip flags set by starting canvas (it plays automatically via "Start Game") if (startingCanvasId && unlockInfo.canvas_id === startingCanvasId) { continue; } var canvasConditions = unlockInfo.canvas_conditions; var isVisitable = !canvasConditions || setup.triggerConditionsSatisfied(canvasConditions); if (isVisitable) { return { location: unlockInfo.location, schedule: unlockInfo.schedule, canvas_name: unlockInfo.canvas_name }; } } } // Second pass: recursive chain resolution // If unlock canvas has flag conditions, find what unlocks THOSE flags var visited = {}; for (var i = 0; i < unmetFlags.length; i++) { var flagKey = unmetFlags[i].flag_key; var chainHint = setup.resolveUnlockChain(flagKey, flagUnlockMap, visited, 0); if (chainHint) { return chainHint; } } // Final fallback: generic message (no specific hint available) return null; }; // Recursively resolve the unlock chain to find a visitable canvas setup.resolveUnlockChain = function(flagKey, flagUnlockMap, visited, depth) { // Prevent infinite loops and excessive depth if (depth > 10 || visited[flagKey]) return null; visited[flagKey] = true; var unlockInfo = flagUnlockMap[flagKey]; if (!unlockInfo) return null; var canvasConditions = unlockInfo.canvas_conditions; // Check if this canvas is visitable if (!canvasConditions || setup.triggerConditionsSatisfied(canvasConditions)) { return { location: unlockInfo.location, schedule: unlockInfo.schedule, canvas_name: unlockInfo.canvas_name }; } // Canvas has conditions - check what's blocking it var items = canvasConditions.items || []; var helpData = State.variables.help_data || {}; var startingCanvasId = helpData.starting_canvas_id; var hasUnresolvableCondition = false; for (var i = 0; i < items.length; i++) { var item = items[i]; // If it's a flag condition that's not met if (item.type === 'flag' && !setup.checkSingleCondition(item)) { // Check if this flag is set by starting canvas (will be auto-met) var nestedUnlockInfo = flagUnlockMap[item.flag_key]; if (startingCanvasId && nestedUnlockInfo && nestedUnlockInfo.canvas_id === startingCanvasId) { continue; // Auto-met by starting canvas, skip this condition } // Recurse to find hint for this blocking flag var nestedHint = setup.resolveUnlockChain(item.flag_key, flagUnlockMap, visited, depth + 1); if (nestedHint) { return nestedHint; } hasUnresolvableCondition = true; } } // If all blocking conditions were auto-met (skipped), this canvas IS visitable if (!hasUnresolvableCondition) { return { location: unlockInfo.location, schedule: unlockInfo.schedule, canvas_name: unlockInfo.canvas_name }; } return null; }; // Format flag hint as "Visit X between Y" setup.formatFlagHint = function(hint) { if (!hint) return "Complete a prerequisite activity"; if (hint.location && hint.schedule) { return "Visit " + hint.location + " " + hint.schedule; } else if (hint.location) { return "Visit " + hint.location; } return "Complete: " + (hint.canvas_name || "a prerequisite activity"); }; // Format trait requirements as "Love > 30 and Trust > 20 required" setup.formatTraitRequirements = function(missingTraits) { if (!missingTraits || missingTraits.length === 0) return ""; var parts = missingTraits.map(function(req) { var traitName = req.trait.charAt(0).toUpperCase() + req.trait.slice(1); return traitName + " " + (req.operator || ">") + " " + req.value; }); return parts.join(" and ") + " required"; }; // Format canvas trigger conditions as clickable links "Required: Elena Affection ≥ 50" setup.formatCanvasConditions = function(conditions) { if (!conditions || !conditions.items) return "Conditions not met"; var parts = []; var items = conditions.items; for (var i = 0; i < items.length; i++) { var item = items[i]; if (item.type === "trait") { // Format as clickable link: "Elena Affection ≥ 50" or "Your Boldness ≥ 40" var npcId = item.npc_id || ""; var isPlayerTrait = item.subject === "player" || !npcId; var trait = item.trait_key; var value = item.value; var op = item.operator === "gte" ? "≥" : item.operator === "gt" ? ">" : item.operator === "lte" ? "≤" : item.operator === "lt" ? "<" : item.operator === "eq" ? "=" : "≥"; // Capitalize for display - use "Your" for player traits var displayNpc = isPlayerTrait ? "Your" : (npcId.charAt(0).toUpperCase() + npcId.slice(1)); var displayTrait = trait.charAt(0).toUpperCase() + trait.slice(1); // Wrap in clickable span with data attributes var link = '<span class="trait-requirement-link" ' + 'data-npc="' + npcId + '" ' + 'data-trait="' + trait + '" ' + 'data-value="' + value + '">' + displayNpc + ' ' + displayTrait + ' ' + op + ' ' + value + '</span>'; parts.push(link); } // Skip flag conditions - they're internal game mechanics, not player-actionable } if (parts.length === 0) return "Conditions not met"; var logic = conditions.logic === "OR" ? " or " : " and "; return "Required: " + parts.join(logic); }; // Format activity hint as "Visit X between Y" setup.formatActivityHint = function(activity) { if (activity.location && activity.schedule) { return "Visit " + activity.location + " " + activity.schedule; } else if (activity.location) { return "Visit " + activity.location; } return activity.name; }; // Show modal with activities that increase a specific trait for an NPC or player setup.showTraitActivitiesModal = function(npcId, traitKey, requiredValue) { var helpData = State.variables.help_data || {}; var npcs = State.variables.npcs || {}; // Detect if this is a player trait (empty/undefined npcId) var isPlayerTrait = !npcId || npcId === ""; var displayName, currentValue, activities; if (isPlayerTrait) { // Player trait - use player data and trait_activities index displayName = "Your"; var playerData = State.variables.player || {}; currentValue = (playerData.core_traits || {})[traitKey] || 0; // Get activities from trait_activities index that boost this trait for player var allTraitActivities = helpData.trait_activities ? helpData.trait_activities[traitKey] : []; activities = allTraitActivities.filter(function(act) { // Check if any effect targets player (no npc_id) with this trait var effects = act.trait_effects || []; for (var e = 0; e < effects.length; e++) { if (effects[e].trait === traitKey && !effects[e].npc_id && effects[e].value > 0) { return true; } } return false; }); } else { // NPC trait - use NPC data and NPC activities var resolvedId = setup.resolveNpcId(npcId); var npcData = npcs[resolvedId] || {}; displayName = npcData.name || npcId.charAt(0).toUpperCase() + npcId.slice(1); currentValue = (npcData.core_traits || {})[traitKey] || 0; var npcHelpData = helpData.npcs ? helpData.npcs[resolvedId] : null; activities = npcHelpData ? npcHelpData.activities : []; } // Filter to activities that: // 1. Have a location (skip intro activities) // 2. Canvas conditions met (NPC trait requirements) // 3. Activity trait requirements met (player traits) // 4. Increase the requested trait var relevantActivities = []; for (var i = 0; i < activities.length; i++) { var act = activities[i]; if (!act.location) continue; // Skip intro activities // Skip completed non-repeatable activities (story arc OR regular non-repeatable) if (act.is_repeatable === false || act.linked_flag) { var flags = State.variables.flags || {}; var hist = (State.variables.game_state && State.variables.game_state.trigger_history) || {}; var isCompleted = (act.linked_flag && flags[act.linked_flag]) || (act.canvas_id && hist[act.canvas_id] && hist[act.canvas_id].total > 0); if (isCompleted) continue; } // Check canvas conditions (NPC trait requirements like "Elena Affection >= 30") var canvasConditions = act.canvas_conditions; if (canvasConditions && !setup.triggerConditionsSatisfied(canvasConditions)) { continue; // Skip - canvas conditions not met } // Check activity trait requirements (player traits) var traitReqs = act.trait_requirements || []; var isLocked = false; for (var r = 0; r < traitReqs.length; r++) { if (!setup.checkTraitRequirement(traitReqs[r])) { isLocked = true; break; } } if (isLocked) continue; // Skip locked activities // Check if this activity boosts the requested trait // For player traits: match effects without npc_id // For NPC traits: match effects with any npc_id (already filtered to NPC's activities) var effects = act.trait_effects || []; for (var j = 0; j < effects.length; j++) { var eff = effects[j]; var traitMatches = eff.trait === traitKey && eff.value > 0; var targetMatches = isPlayerTrait ? !eff.npc_id : true; if (traitMatches && targetMatches) { relevantActivities.push({ name: act.name, location: act.location, schedule: act.schedule, bonus: eff.value }); break; } } } // Deduplicate by name: keep only highest bonus per activity name var byName = {}; for (var d = 0; d < relevantActivities.length; d++) { var ra = relevantActivities[d]; if (!byName[ra.name] || byName[ra.name].bonus < ra.bonus) { byName[ra.name] = ra; } } relevantActivities = Object.values(byName); // Build modal HTML (no inline onclick - use jQuery event delegation) var traitDisplay = traitKey.charAt(0).toUpperCase() + traitKey.slice(1); var html = '<div class="trait-modal-overlay">'; html += '<div class="trait-modal">'; html += '<div class="trait-modal-header">'; var titlePossessive = isPlayerTrait ? (displayName + ' ') : (displayName + "'s "); html += '<h3>How to increase ' + titlePossessive + traitDisplay + '</h3>'; html += '<span class="trait-modal-close">×</span>'; html += '</div>'; html += '<div class="trait-modal-progress">'; html += 'Current: ' + currentValue + ' / Required: ' + requiredValue; html += '</div>'; html += '<div class="trait-modal-body">'; if (relevantActivities.length === 0) { html += '<p>No activities found that increase this trait.</p>'; } else { html += '<ul class="trait-activity-list">'; for (var k = 0; k < relevantActivities.length; k++) { var ra = relevantActivities[k]; html += '<li>'; html += '<span class="activity-name">' + ra.name + '</span>'; html += '<span class="activity-bonus">+' + ra.bonus + ' ' + traitDisplay + '</span>'; html += '<div class="activity-hint">→ Visit ' + ra.location; if (ra.schedule) html += ' ' + ra.schedule; html += '</div>'; html += '</li>'; } html += '</ul>'; } html += '</div></div></div>'; jQuery(html).appendTo('#story'); }; // Close trait activities modal setup.closeTraitModal = function() { jQuery('.trait-modal-overlay').remove(); }; // ============== END QUEST PAGE HELPERS ============== // Auto-inference for games without author-defined story arc setup.autoInferStoryPosition = function() { var result = { current_chapter: { id: "auto_chapter", name: "Your Story", mood: "developing", description: "Your adventure continues..." }, completed_nodes: [], available_nodes: [], locked_nodes: [], active_groups: [], is_stuck: false, progress_percent: 0, is_auto_inferred: true }; // Check completed canvases from game state if (State.variables.game_state && State.variables.game_state.completed_canvases) { State.variables.game_state.completed_canvases.forEach(function(canvasId) { // Avoid duplicates var existing = result.completed_nodes.find(function(n) { return n.id === canvasId; }); if (!existing) { result.completed_nodes.push({ id: canvasId, name: canvasId.replace(/_/g, " "), chapter: "auto_chapter", journal_entry: "A chapter of your story...", is_milestone: true }); } }); } // Calculate progress estimate var total = result.completed_nodes.length + result.available_nodes.length + result.locked_nodes.length; if (total > 0) { result.progress_percent = Math.round((result.completed_nodes.length / total) * 100); } result.is_stuck = result.available_nodes.length === 0 && result.locked_nodes.length > 0; return result; }; // Initialize trait requirement click handlers (event delegation) jQuery(document).on('click', '.trait-requirement-link', function(e) { e.preventDefault(); var npcId = jQuery(this).data('npc'); var trait = jQuery(this).data('trait'); var value = jQuery(this).data('value'); setup.showTraitActivitiesModal(npcId, trait, value); }); // Modal close handlers (event delegation) jQuery(document).on('click', '.trait-modal-overlay', function(e) { // Close when clicking overlay (but not modal content) if (jQuery(e.target).hasClass('trait-modal-overlay')) { setup.closeTraitModal(); } }); jQuery(document).on('click', '.trait-modal-close', function(e) { e.preventDefault(); setup.closeTraitModal(); }); <</script>><<nobr>> <div class="game-intro"> <h1>Angela's Desire</h1> <p class="game-description">What if your gorgeous new roommate was secretly attracted to you, and every shared moment became charged with unspoken desire - until neither of you could hold back anymore? An adult interactive fiction experience following the journey from strangers to lovers with Angela - a warm, approachable woman with hidden depths of passion waiting to be discovered. </p> <div class="developer-intro"> <p class="developer-about">We're a small indie studio crafting intimate, story-driven experiences. Every game is made with care, and your support helps us keep creating. If you enjoy our work, consider supporting us!</p> <p class="support-link">👉 <a href="https://www.patreon.com/cw/nutgames844" target="_blank" rel="noopener">Support us on Patreon</a></p> </div> <div class="age-gate"> <p class="age-warning">⚠️ This game contains adult content intended for players 18 years of age or older.</p> <div class="age-buttons"> [[✓ I am 18 or older - Enter Game->StartingCanvas_story_intro_Node_1]] [[✗ I am NOT 18 or older->AgeBlocked]] </div> </div> <div class="developer-footer"> <p class="developer-credit">Developed by <strong>NutGames</strong></p> <p class="support-link">👉 <a href="https://www.patreon.com/cw/nutgames844" target="_blank" rel="noopener">Support us on Patreon</a></p> </div> </div> <</nobr>>
<div class="blocked-page"> <h2>Access Denied</h2> <p>This content is not available for you.</p> <p>Please close this page.</p> </div>
<!-- Time Display Widgets --> <<widget "timeFormatted">> <<set _hour to $game_state.time_state.current_hour>> <<set _minute to $game_state.time_state.current_minute>> <<set _displayHour to (_hour is 0 ? 12 : (_hour > 12 ? _hour - 12 : _hour))>> <<set _ampm to (_hour < 12 ? "AM" : "PM")>> <<set _minuteStr to (_minute < 10 ? "0" + _minute : _minute)>> <<print _displayHour + ":" + _minuteStr + " " + _ampm>> <</widget>> <<widget "timeDisplay">> <div id="time-widget" class="time-display"> <div class="time-line"> <span id="time-display"><<timeFormatted>></span> | <span id="current-day"><<print $game_state.time_state.current_day>></span> </div> <div class="control-line"> <button class="time-btn" onclick="advanceTime(10)" title="Advance 10 minutes">></button> | <button class="time-btn" onclick="advanceTime(60)" title="Advance 1 hour">>></button> | <button class="time-btn" onclick="advanceTime(1440)" title="Advance 1 day">>>>>></button> </div> </div> <</widget>> <<widget "playerTraits">> <div id="traits-widget" class="traits-display"> <div class="traits-header">Traits</div> <<if $player and $player.core_traits and Object.keys($player.core_traits).length > 0>> <<set _keys to Object.keys($player.core_traits).sort()>> <ul class="traits-list"> <<for _i to 0; _i lt _keys.length; _i++>> <<set _k to _keys[_i]>> <li class="trait-item"> <span class="trait-name"><<print _k>></span> <span class="trait-value"><<print $player.core_traits[_k]>></span> </li> <</for>> </ul> <<else>> <div class="no-traits">No traits</div> <</if>> <div class="traits-hint">Updates after each choice.</div> </div> <</widget>> <<widget "playerFlags">> <div id="flags-widget" class="traits-display"> <div class="traits-header">Flags</div> <<if $player and $player.flags and Object.keys($player.flags).length > 0>> <<set _fkeys to Object.keys($player.flags).sort()>> <ul class="traits-list"> <<for _j to 0; _j lt _fkeys.length; _j++>> <<set _fk to _fkeys[_j]>> <li class="trait-item"> <span class="trait-name"><<print _fk>></span> <span class="trait-value"><<print $player.flags[_fk] ? '✔' : '✖'>></span> </li> <</for>> </ul> <<else>> <div class="no-traits">No flags</div> <</if>> <div class="traits-hint">Set by choices and story logic.</div> </div> <</widget>> <<widget "questsButton">> <!-- Debug/legacy quest view - shows raw mechanics --> <div id="quests-btn-widget"> <<link "📋 Quests" "QuestsPage">><</link>> </div> <</widget>> <<widget "missingMediaButton">> <<if $flags.debug_mode>> <div id="missing-media-btn-widget" style="margin-bottom:8px;"> <<link "⚠️ Missing Media" "MissingMediaPage">><</link>> </div> <</if>> <</widget>> <<widget "journalButton">> <!-- Guide - simplified what's next help --> <div id="journal-btn-widget"> <<link "📖 Guide" "QuestsPage">><</link>> </div> <</widget>> <<widget "statsButton">> <div id="stats-btn-widget"> <<link "📊 Stats" "StatsPage">><</link>> </div> <</widget>> <<widget "scheduleButton">> <<set _npcsWithSchedules to setup.getNpcsWithSchedules()>> <<if _npcsWithSchedules.length > 0>> <div id="schedule-btn-widget"> <<link "📅 Schedules" "SchedulePage">><</link>> </div> <</if>> <</widget>> <<widget "patreonButton">> <div id="patreon-btn-widget"> <a href="https://www.patreon.com/cw/nutgames844" target="_blank" rel="noopener" class="patreon-link"> <svg class="patreon-icon" viewBox="0 0 24 24" width="16" height="16"> <path fill="currentColor" d="M15.386.524c-4.764 0-8.64 3.876-8.64 8.64 0 4.75 3.876 8.613 8.64 8.613 4.75 0 8.614-3.864 8.614-8.613C24 4.4 20.136.524 15.386.524M.003 23.537h4.22V.524H.003"/> </svg> Support Us </a> </div> <</widget>>
<<missingMediaButton>> <<timeDisplay>> <<journalButton>> <<statsButton>> <<scheduleButton>> <<playerTraits>> <<patreonButton>> <style> #time-widget { background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 8px; margin-bottom: 10px; font-family: 'Courier New', monospace; font-size: 14px; line-height: 1.2; color: #212529; } .time-line { text-align: center; margin-bottom: 4px; font-weight: bold; color: #000000; } .control-line { text-align: center; font-size: 12px; } .time-btn { background: #e9ecef; border: 1px solid #ced4da; border-radius: 3px; color: #495057; cursor: pointer; padding: 3px 6px; font-size: 12px; font-family: 'Courier New', monospace; font-weight: bold; } .time-btn:hover { background: #dee2e6; color: #000000; border-color: #adb5bd; } #traits-widget { background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 8px; margin-top: 8px; font-family: 'Courier New', monospace; font-size: 13px; color: #212529; } #flags-widget { background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 4px; padding: 8px; margin-top: 8px; font-family: 'Courier New', monospace; font-size: 13px; color: #212529; } .traits-header { font-weight: bold; margin-bottom: 6px; } .traits-list { list-style: none; padding-left: 0; margin: 0; } .trait-item { display: flex; justify-content: space-between; border-bottom: 1px dashed #e2e3e5; padding: 2px 0; } .trait-name { color: #495057; } .trait-value { color: #0d6efd; font-weight: bold; } .no-traits { font-style: italic; color: #6c757d; } .traits-hint { margin-top: 6px; font-size: 11px; color: #6c757d; } #time-display, #current-day { font-family: 'Courier New', monospace; color: #000000; } #quests-btn-widget { background: #e7f3ff; border: 1px solid #007bff; border-radius: 4px; padding: 6px 8px; margin-bottom: 8px; text-align: center; } #quests-btn-widget a { color: #007bff; text-decoration: none; font-weight: bold; } #quests-btn-widget a:hover { color: #0056b3; text-decoration: underline; } #journal-btn-widget { background: linear-gradient(180deg, #fdf6e3 0%, #f5e6d3 100%); border: 1px solid #c9b896; border-radius: 4px; padding: 6px 8px; margin-bottom: 8px; text-align: center; } #journal-btn-widget a { color: #6d5a40; text-decoration: none; font-weight: bold; font-family: 'Georgia', serif; } #journal-btn-widget a:hover { color: #4a3f30; text-decoration: underline; } #stats-btn-widget { background: #f0f7e6; border: 1px solid #28a745; border-radius: 4px; padding: 6px 8px; margin-bottom: 8px; text-align: center; } #stats-btn-widget a { color: #28a745; text-decoration: none; font-weight: bold; } #stats-btn-widget a:hover { color: #1e7e34; text-decoration: underline; } #schedule-btn-widget { background: #e8f4fc; border: 1px solid #3b82f6; border-radius: 4px; padding: 6px 8px; margin-bottom: 8px; text-align: center; } #schedule-btn-widget a { color: #3b82f6; text-decoration: none; font-weight: bold; } #schedule-btn-widget a:hover { color: #2563eb; text-decoration: underline; } /* Patreon Button in Sidebar */ #patreon-btn-widget { margin: 15px 0 0 0; padding: 15px 0 0 0; border-top: 1px solid #444; text-align: center; } /* Reduce gap between StoryCaption and Save/Restart menu */ #story-caption { margin-bottom: 0 !important; padding-bottom: 0 !important; } #menu-story { margin-top: 8px !important; } .patreon-link { display: inline-flex; align-items: center; gap: 6px; padding: 8px 12px; background: #f96854; color: #fff !important; border-radius: 4px; text-decoration: none; font-size: 0.9em; font-weight: bold; } .patreon-link:hover { background: #e85a47; text-decoration: none !important; } .patreon-icon { flex-shrink: 0; } .stats-card { background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 6px; padding: 12px; margin-bottom: 12px; } .stats-name { font-weight: bold; font-size: 1.2em; color: #212529; margin-bottom: 8px; border-bottom: 1px solid #dee2e6; padding-bottom: 6px; } .stats-traits { margin-top: 8px; } .stats-trait-item { display: flex; justify-content: space-between; padding: 4px 8px; border-bottom: 1px dashed #e2e3e5; color: #343a40; } .stats-trait-value { font-weight: bold; color: #0d6efd; } /* Story Arc Help Page Styles */ .chapter-context { background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); padding: 12px 16px; border-radius: 8px; margin-bottom: 16px; display: flex; justify-content: space-between; align-items: center; } .chapter-name { font-size: 1.1em; color: #e0e0e0; font-weight: bold; } .chapter-mood { font-size: 0.9em; color: #a0a0a0; font-style: italic; } .available-section h3 { font-size: 1em; color: #495057; margin: 0 0 10px 0; border-bottom: 1px solid #dee2e6; padding-bottom: 6px; } .help-card { background: #f8f9fa; border: 1px solid #dee2e6; border-radius: 6px; padding: 12px 16px; margin-bottom: 10px; } .node-name { font-weight: bold; color: #212529; } .node-hint { color: #6c757d; font-size: 0.9em; margin-top: 4px; } .narrative-hint { background: #fff3cd; border: 1px solid #ffc107; border-radius: 6px; padding: 12px; margin: 16px 0; } .narrative-hint p { margin: 0; color: #856404; } .progress-summary { text-align: center; color: #6c757d; font-size: 0.9em; margin-top: 16px; padding-top: 12px; border-top: 1px solid #dee2e6; } .no-quests-msg { font-style: italic; color: #6c757d; padding: 10px; } /* Quest Page - Simplified One Activity Per NPC */ .npc-section { margin-bottom: 20px; padding: 16px; background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%); border-radius: 10px; border: 1px solid #dee2e6; } .npc-name { font-size: 1.2em; color: #2c3e50; margin: 0 0 12px 0; border-bottom: 2px solid #3498db; padding-bottom: 8px; font-weight: 600; } .quest-available { color: #155724; font-weight: 500; padding: 10px 14px; background: rgba(40, 167, 69, 0.1); border-radius: 6px; border-left: 4px solid #28a745; } .quest-locked { color: #856404; font-weight: 500; padding: 10px 14px; background: rgba(255, 193, 7, 0.15); border-radius: 6px; border-left: 4px solid #ffc107; } .quest-conditions { color: #721c24; font-weight: 500; padding: 10px 14px; background: rgba(220, 53, 69, 0.1); border-radius: 6px; border-left: 4px solid #dc3545; } .quest-complete { color: #28a745; font-style: italic; padding: 10px 14px; text-align: center; } .no-quests { color: #6c757d; font-style: italic; padding: 12px; text-align: center; } /* Trait Requirement Link */ .trait-requirement-link { color: #721c24; text-decoration: underline; cursor: pointer; } .trait-requirement-link:hover { color: #a71d2a; } /* Trait Activities Modal Overlay */ .trait-modal-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.6); display: flex; align-items: center; justify-content: center; z-index: 10000; } /* Modal Container */ .trait-modal { background: #fff; border-radius: 12px; max-width: 400px; width: 90%; max-height: 80vh; overflow: hidden; box-shadow: 0 10px 40px rgba(0,0,0,0.3); } .trait-modal-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px; background: #f8f9fa; border-bottom: 1px solid #dee2e6; } .trait-modal-header h3 { margin: 0; font-size: 1.1em; color: #333; } .trait-modal-close { font-size: 24px; cursor: pointer; color: #666; line-height: 1; } .trait-modal-close:hover { color: #333; } .trait-modal-progress { padding: 12px 20px; background: rgba(220, 53, 69, 0.1); color: #721c24; font-weight: 500; text-align: center; } .trait-modal-body { padding: 16px 20px; max-height: 50vh; overflow-y: auto; } /* Activity List */ .trait-activity-list { list-style: none; padding: 0; margin: 0; } .trait-activity-list li { padding: 12px; border-bottom: 1px solid #eee; } .trait-activity-list li:last-child { border-bottom: none; } .activity-name { font-weight: 600; color: #333; } .activity-bonus { float: right; color: #28a745; font-weight: 500; } .activity-hint { margin-top: 4px; color: #666; font-size: 0.9em; clear: both; } /* Effect Toast Notification */ .effect-toast { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background: rgba(0, 0, 0, 0.85); color: #4ade80; padding: 10px 20px; border-radius: 6px; font-size: 14px; z-index: 9999; white-space: nowrap; } /* Game Intro - Top Left Aligned */ .game-intro { text-align: left; } /* Age Gate Section */ .age-gate { background: #fff3cd; border: 1px solid #ffc107; border-radius: 8px; padding: 20px; margin: 20px 0; text-align: center; } .age-warning { font-weight: bold; color: #856404; margin-bottom: 15px; } .age-buttons { display: flex; flex-direction: column; gap: 10px; align-items: center; } /* Developer Intro Section (above age gate) */ .developer-intro { text-align: left; color: #555; margin: 20px 0; } /* Developer Footer Section (below age gate) */ .developer-footer { margin-top: 30px; padding-top: 20px; border-top: 1px solid #dee2e6; text-align: center; color: #6c757d; font-size: 0.9em; } .developer-intro a, .developer-footer a { color: #f96854; text-decoration: none; } .developer-intro a:hover, .developer-footer a:hover { text-decoration: underline; } .developer-about { line-height: 1.5; margin: 10px 0; } .support-link { margin-top: 8px; } .developer-footer .support-link { font-weight: bold; } /* Age Blocked Page */ .blocked-page { text-align: center; padding: 50px; color: #721c24; background: #f8d7da; border-radius: 8px; margin: 50px auto; max-width: 400px; } /* Override SugarCube default vertical centering */ #story { align-items: flex-start !important; justify-content: flex-start !important; padding-top: 1em !important; } .passage { margin-top: 0 !important; padding-top: 0 !important; } /* New/Unvisited Canvas Highlight */ .new-canvas a { color: #28a745 !important; font-weight: 600; } .new-canvas a::before { content: "✨ "; } /* Navigation New Content Indicator */ .nav-new { color: #ffc107; font-weight: bold; font-size: 1.1em; } /* Dev Mode Controls */ .dev-adj-btn { background: #6c757d; color: white; border: none; border-radius: 3px; width: 20px; height: 20px; font-size: 14px; font-weight: bold; cursor: pointer; padding: 0; line-height: 1; vertical-align: middle; } .dev-adj-btn:hover { background: #5a6268; } .trait-controls { display: flex; align-items: center; gap: 4px; } .trait-controls .trait-value { min-width: 24px; text-align: center; } </style>
<<nobr>> <h2>What's Next</h2> <<set _helpData = State.variables.help_data || {}>> <<set _hasNpcs = _helpData.npcs && Object.keys(_helpData.npcs).length > 0>> <<if _hasNpcs>> <<for _npcId, _npcData range _helpData.npcs>> <div class="npc-section"> <h3 class="npc-name"><<print _npcData.name>></h3> <<set _next = setup.getNextActivity(_npcId)>> <<if _next === null>> <div class="quest-complete">✓ All activities completed!</div> <<elseif _next.traitConditionsNotMet>> <div class="quest-conditions"> 🔒 <<print setup.formatCanvasConditions(_next.canvasConditions)>> </div> <<elseif _next.flagConditionsNotMet>> <div class="quest-available"> → <<print setup.formatFlagHint(_next.flagHint)>> </div> <<elseif _next.conditionsNotMet>> <div class="quest-conditions"> 🔒 <<print setup.formatCanvasConditions(_next.canvasConditions)>> </div> <<elseif _next.isLocked>> <div class="quest-locked"> 🔒 <<print setup.formatTraitRequirements(_next.missingTraits)>> </div> <<else>> <div class="quest-available"> → <<print setup.formatActivityHint(_next.activity)>> </div> <</if>> </div> <</for>> <<else>> <div class="no-quests">No activities available.</div> <</if>> <</nobr>> <<link "← Back">><<run Engine.backward()>><</link>>
<<set _position = setup.detectStoryPosition()>> <<set _hint = setup.generateNarrativeHint()>> <div class="journal-container"> <div class="journal-header"> <<if _position.current_chapter>> <h2 class="journal-chapter-title"><<print _position.current_chapter.name>></h2> <<if _position.current_chapter.mood>> <div class="journal-chapter-mood <<print _position.current_chapter.mood>>"> <<print _position.current_chapter.description || "">> </div> <</if>> <<else>> <h2 class="journal-chapter-title">Your Story</h2> <</if>> <<if _position.progress_percent > 0>> <div class="journal-progress"> <div class="journal-progress-bar"> <div class="journal-progress-fill" style="width: <<print _position.progress_percent>>%;"></div> </div> </div> <</if>> </div> <!-- Memories (completed story moments) --> <<if _position.completed_nodes.length > 0>> <div class="journal-section"> <div class="journal-section-title">Memories</div> <<for _i, _node range _position.completed_nodes>> <div class="journal-memory <<if _node.is_milestone>>milestone<</if>>"> <div class="journal-memory-title"><<print _node.name>></div> <<if _node.journal_entry>> <<print _node.journal_entry>> <</if>> </div> <</for>> </div> <</if>> <!-- Active story threads (groups in progress) --> <<if _position.active_groups.length > 0>> <<set _incompleteGroups = _position.active_groups.filter(function(g) { return !g.isComplete && g.completed > 0; })>> <<if _incompleteGroups.length > 0>> <div class="journal-section"> <div class="journal-section-title">Unfolding</div> <<for _i, _group range _incompleteGroups>> <div class="journal-group"> <div class="journal-group-name"><<print _group.name>></div> <div class="journal-group-progress"> <<print _group.description>> </div> </div> <</for>> </div> <</if>> <</if>> <!-- Relationship states (NPC emotions) --> <<if Object.keys($npcs).length > 0>> <div class="journal-section"> <div class="journal-section-title">Connections</div> <<for _npcId range Object.keys($npcs)>> <<set _state = setup.interpretNpcState(_npcId)>> <<if _state.npc_name>> <div class="journal-npc"> <div class="journal-npc-name"><<print _state.npc_name>></div> <div class="journal-npc-emotion"><<print _state.description>></div> <<if _state.relationship_summary && _state.relationship_summary !== _state.description>> <div class="journal-npc-summary"><<print _state.relationship_summary>></div> <</if>> </div> <</if>> <</for>> </div> <</if>> <!-- Subtle narrative hint (only when needed) --> <<if _hint.hint_type !== "none" && _hint.text>> <div class="journal-hint <<print _hint.hint_type>>"> <<print _hint.text>> </div> <</if>> <!-- Empty state --> <<if _position.completed_nodes.length === 0 && Object.keys($npcs).length === 0>> <div class="journal-empty"> Your story is just beginning... </div> <</if>> <div class="journal-back-link"> [[Return to your story->Navigation]] </div> </div>
<<nobr>> <h2>All Stats</h2> <!-- Player Stats --> <div class="stats-card"> <div class="stats-name">You (<<print $player.name>>)</div> <div class="stats-traits"> <<if $player && $player.core_traits && Object.keys($player.core_traits).length > 0>> <<for _tk, _tv range $player.core_traits>> <div class="stats-trait-item"> <span><<print _tk>></span> <span class="stats-trait-value"><<print _tv>></span> </div> <</for>> <<else>> <em>No traits</em> <</if>> </div> </div> <!-- NPC Stats --> <<if Object.keys($npcs).length > 0>> <<for _npcId, _npc range $npcs>> <div class="stats-card"> <div class="stats-name"><<print _npc.name>></div> <div class="stats-traits"> <<if _npc.core_traits && Object.keys(_npc.core_traits).length > 0>> <<for _tk, _tv range _npc.core_traits>> <div class="stats-trait-item"> <span><<print _tk>></span> <span class="stats-trait-value"><<print _tv>></span> </div> <</for>> <<else>> <em>No traits</em> <</if>> </div> </div> <</for>> <<else>> <p><em>No NPCs found.</em></p> <</if>> <</nobr>> <<link "← Back">><<run Engine.backward()>><</link>>
<<nobr>> <<set _currentDay to $game_state.time_state.current_day>> <h2>📅 <<print _currentDay>>'s Schedules</h2> <p class="current-time">Current Time: <<print setup.formatTime($game_state.time_state.current_hour, $game_state.time_state.current_minute)>></p> <<set _npcsWithSchedules to setup.getNpcsWithSchedules()>> <<if _npcsWithSchedules.length === 0>> <p><em>No NPCs have schedules defined.</em></p> <<else>> <<for _npcInfo range _npcsWithSchedules>> <<set _npcId to _npcInfo.id>> <<set _npcName to _npcInfo.name>> <<set _currentLoc to setup.getNpcLocation(_npcId)>> <<set _todaySchedule to setup.getTodayScheduleSorted(_npcId)>> <<set _dayIndex to ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"].indexOf(_currentDay)>> <div class="schedule-card"> <div class="schedule-header"> <span class="npc-name"><<print _npcName>></span> <<if _currentLoc>> <<set _locName to ($locations[_currentLoc.location] && $locations[_currentLoc.location].name) || _currentLoc.location>> <span class="now-badge">NOW: <<print _locName>></span> <</if>> </div> <<if _currentLoc && _currentLoc.activity>> <div class="current-activity">"<<print _currentLoc.activity>>"</div> <</if>> <<if _todaySchedule.length === 0>> <p><em>No schedule entries for <<print _currentDay>>.</em></p> <<else>> <p class="schedule-day-info"><<print _todaySchedule.length>> schedule entries for <<print _currentDay>></p> <table class="schedule-table"> <thead><tr><th>Time</th><th>Location</th><th>Activity</th></tr></thead> <tbody> <<for _sch range _todaySchedule>> <<set _isCurrent to setup.isCurrentTimeSlot(_sch.start_time, _sch.end_time)>> <<set _rowClass to _isCurrent ? "current-slot" : "">> <<set _schLocName to ($locations[_sch.location] && $locations[_sch.location].name) || _sch.location>> <tr class="<<print _rowClass>>"> <td><<if _isCurrent>>▶ <</if>><<print _sch.start_time>>-<<print _sch.end_time || "?">></td> <td><<print _schLocName>></td> <td><<print _sch.activity>></td> </tr> <</for>> </tbody> </table> <</if>> </div> <</for>> <</if>> <<return "← Back">> <</nobr>> <style> .current-time { color: #334155; font-size: 0.9em; margin: 0 0 10px 0; } .schedule-card { background: #ffffff; border: 1px solid #e2e8f0; border-radius: 8px; padding: 12px; margin-bottom: 12px; } .schedule-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px; } .npc-name { font-size: 1.1em; font-weight: bold; color: #1e293b; } .now-badge { background: #22c55e; color: white; padding: 3px 8px; border-radius: 10px; font-size: 0.8em; font-weight: bold; } .current-activity { color: #475569; font-style: italic; margin-bottom: 6px; font-size: 0.85em; } .schedule-day-info { color: #64748b; font-size: 0.8em; margin: 0 0 6px 0; padding: 2px 6px; background: #f1f5f9; border-radius: 3px; display: inline-block; } .schedule-table { width: 100%; border-collapse: collapse; font-size: 0.85em; color: #1e293b; } .schedule-table th { text-align: left; padding: 4px 8px; background: #f1f5f9; border-bottom: 2px solid #e2e8f0; color: #334155; font-weight: 600; } .schedule-table td { padding: 4px 8px; border-bottom: 1px solid #e2e8f0; color: #334155; } .schedule-table tr.current-slot { background: #fef3c7; font-weight: 500; } .schedule-table tr.current-slot td:first-child { color: #d97706; } </style>
<p>You stand in the hallway of your new home, boxes stacked around you. The ad said 'roommate wanted' - it didn't mention that the roommate would be her.</p><p>Angela emerges from the kitchen, coffee in hand. She's wearing yoga pants and a tank top that hugs her curves. Her smile is warm and welcoming.</p><p>"You must be my new roommate! I'm Angela." She extends her hand. Her grip is firm, her skin soft. "Welcome home."</p><p>Home. The word feels different now, knowing you'll be sharing it with her.</p> <<set $game_state.current_canvas = "32ea0ec9-0deb-4415-9a10-c2d22988624a">> <<set $game_state.current_node = "9f8ddafc-19e9-41c7-b627-a9a3abf5dbf0">> <<script>>setup.markCanvasTriggered("32ea0ec9-0deb-4415-9a10-c2d22988624a");<</script>> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "game_started");setup.applyAndNotifyFlag("player", null, "intro_complete");<</script>> [[Begin your new life->Location_The_Hallway]]
<h2>Navigation</h2> <p>Where would you like to go?</p> <div class="location-list"> [[The Hallway->Location_The_Hallway]]<br> [[The Kitchen->Location_The_Kitchen]]<br> [[The Living Room->Location_The_Living_Room]]<br> [[The Spa->Location_The_Spa]]<br> [[The Bedroom->Location_The_Bedroom]]<br> [[The Backyard->Location_The_Backyard]]<br> [[Fantasy Space->Location_Fantasy_Space]]<br> </div> <!-- LOCATION PASSAGES -->
<h2>The Hallway</h2> <p>The central hub of the shared home. A warm, modern space that connects all the rooms. You pass through here constantly, and so does she. </p> <<set $player.current_location = "85d2d9fb-d403-4484-9676-7ef4d5083069">> <<if not $game_state.visited_locations.includes("85d2d9fb-d403-4484-9676-7ef4d5083069")>> <<set $game_state.visited_locations.push("85d2d9fb-d403-4484-9676-7ef4d5083069")>> <</if>> <<= setup.renderLocationCanvases("85d2d9fb-d403-4484-9676-7ef4d5083069")>> <!-- Hierarchical Navigation --> <div class="location-navigation"> <strong>Available destinations:</strong><br> [[The Kitchen->Location_The_Kitchen]]<<if setup.locationHasNewCanvases("3de88b39-6abd-483a-bfab-3e31d3c0304b")>> <span class="nav-new">!</span><</if>><br> [[The Living Room->Location_The_Living_Room]]<<if setup.locationHasNewCanvases("7e3b3f43-5dab-4f82-836b-7df2f2175132")>> <span class="nav-new">!</span><</if>><br> [[The Spa->Location_The_Spa]]<<if setup.locationHasNewCanvases("0883afa5-53a8-4247-8023-8ff7ed00de16")>> <span class="nav-new">!</span><</if>><br> [[The Bedroom->Location_The_Bedroom]]<<if setup.locationHasNewCanvases("9749655e-1fe7-4d8d-859b-a455c7484bb6")>> <span class="nav-new">!</span><</if>><br> [[The Backyard->Location_The_Backyard]]<<if setup.locationHasNewCanvases("71700a6a-b26f-4afe-a0c4-4f8b6ca71795")>> <span class="nav-new">!</span><</if>><br> </div>
<h2>The Kitchen</h2> <p>Open-plan kitchen with counter seating and modern appliances. The coffee maker runs every morning. This is where you'll find Angela most mornings, and where some of your most charged moments will happen. </p> <<set $player.current_location = "3de88b39-6abd-483a-bfab-3e31d3c0304b">> <<if not $game_state.visited_locations.includes("3de88b39-6abd-483a-bfab-3e31d3c0304b")>> <<set $game_state.visited_locations.push("3de88b39-6abd-483a-bfab-3e31d3c0304b")>> <</if>> <<= setup.renderLocationCanvases("3de88b39-6abd-483a-bfab-3e31d3c0304b")>> <!-- Hierarchical Navigation --> <div class="location-navigation"> [[Leave The Kitchen->Location_The_Hallway]]<br> </div>
<h2>The Living Room</h2> <p>A spacious room dominated by a large white couch, soft rugs, and ambient lighting. The TV is often on in the evenings. This is where you'll spend most of your nights together - and where things will eventually escalate. </p> <<set $player.current_location = "7e3b3f43-5dab-4f82-836b-7df2f2175132">> <<if not $game_state.visited_locations.includes("7e3b3f43-5dab-4f82-836b-7df2f2175132")>> <<set $game_state.visited_locations.push("7e3b3f43-5dab-4f82-836b-7df2f2175132")>> <</if>> <<= setup.renderLocationCanvases("7e3b3f43-5dab-4f82-836b-7df2f2175132")>> <!-- Hierarchical Navigation --> <div class="location-navigation"> [[Leave The Living Room->Location_The_Hallway]]<br> </div>
<h2>The Spa</h2> <p>A luxury bathroom area with a hot tub. Angela uses this for self-care and relaxation. A private space where she lets her guard down - sometimes without realizing you might walk in. </p> <<set $player.current_location = "0883afa5-53a8-4247-8023-8ff7ed00de16">> <<if not $game_state.visited_locations.includes("0883afa5-53a8-4247-8023-8ff7ed00de16")>> <<set $game_state.visited_locations.push("0883afa5-53a8-4247-8023-8ff7ed00de16")>> <</if>> <<= setup.renderLocationCanvases("0883afa5-53a8-4247-8023-8ff7ed00de16")>> <!-- Hierarchical Navigation --> <div class="location-navigation"> [[Leave The Spa->Location_The_Hallway]]<br> </div>
<h2>The Bedroom</h2> <p>The master bedroom with a comfortable bed and soft lighting. The most intimate space in the home. Morning-after moments happen here, and this is where the deepest connections form. </p> <<set $player.current_location = "9749655e-1fe7-4d8d-859b-a455c7484bb6">> <<if not $game_state.visited_locations.includes("9749655e-1fe7-4d8d-859b-a455c7484bb6")>> <<set $game_state.visited_locations.push("9749655e-1fe7-4d8d-859b-a455c7484bb6")>> <</if>> <<= setup.renderLocationCanvases("9749655e-1fe7-4d8d-859b-a455c7484bb6")>> <!-- Hierarchical Navigation --> <div class="location-navigation"> <strong>Available destinations:</strong><br> [[Fantasy Space->Location_Fantasy_Space]]<<if setup.locationHasNewCanvases("fa6216c0-d41a-45f7-a07d-af365bd724c8")>> <span class="nav-new">!</span><</if>><br> [[Leave The Bedroom->Location_The_Hallway]]<br> </div>
<h2>The Backyard</h2> <p>A suburban backyard with a driveway. On hot days, this becomes a stage for exhibitionist fantasies. The car wash scene happens here, and eventually, much more. </p> <<set $player.current_location = "71700a6a-b26f-4afe-a0c4-4f8b6ca71795">> <<if not $game_state.visited_locations.includes("71700a6a-b26f-4afe-a0c4-4f8b6ca71795")>> <<set $game_state.visited_locations.push("71700a6a-b26f-4afe-a0c4-4f8b6ca71795")>> <</if>> <<= setup.renderLocationCanvases("71700a6a-b26f-4afe-a0c4-4f8b6ca71795")>> <!-- Hierarchical Navigation --> <div class="location-navigation"> [[Leave The Backyard->Location_The_Hallway]]<br> </div>
<h2>Fantasy Space</h2> <p>A memory/imagination overlay space. Used for flashbacks, fantasy reveals, and exploring Angela's secret desires. Not a physical location - accessed through intimate moments and deep trust. </p> <<set $player.current_location = "fa6216c0-d41a-45f7-a07d-af365bd724c8">> <<if not $game_state.visited_locations.includes("fa6216c0-d41a-45f7-a07d-af365bd724c8")>> <<set $game_state.visited_locations.push("fa6216c0-d41a-45f7-a07d-af365bd724c8")>> <</if>> <<= setup.renderLocationCanvases("fa6216c0-d41a-45f7-a07d-af365bd724c8")>> <!-- Hierarchical Navigation --> <div class="location-navigation"> [[Leave Fantasy Space->Location_The_Bedroom]]<br> </div> <!-- STORY CANVAS PASSAGES -->
<p>The backyard is private, but not that private. Trees provide some cover, but anyone looking from the right angle could see.</p><p>Angela doesn't seem to care. She's pressed against you, her hands pulling at your clothes, her mouth hungry on yours.</p><p>"Inside?" you suggest, breathless.</p><p>"No." She shakes her head, already unbuttoning your pants. "Here. Right here. Outside."</p><p>"Someone might see."</p><p>Her eyes flash with excitement. "I know. That's part of it."</p> <<set $game_state.current_canvas = "52cc47cf-43c4-4c35-bbb9-200810e4f301">> <<set $game_state.current_node = "87c077e0-3c78-416f-a853-6c178895806f">> <<script>>setup.markCanvasTriggered("52cc47cf-43c4-4c35-bbb9-200810e4f301");<</script>> <<link "Give her what she wants" "Canvas_story_under_open_sky_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Take her inside first" "Location_The_Backyard">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 2.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(10);<</script>><</link>><br>
<p>You spin her around, bending her over the back of a patio chair. She gasps as you enter her, exposed to the open air.</p><p>"Yes," she moans, not bothering to be quiet. "Just like that. Don't stop."</p><video src="media/assets/clips/clip_010_MAp6xBo.mp4" controls preload="metadata" poster="media/assets/posters/clip_010_jvRNXfY.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The thrill of exposure, the risk of being seen, makes everything more intense. Every sound could be a neighbor. Every moment feels forbidden.</p><p>When you both finish, she's laughing, exhilarated, alive in a way you've never seen.</p><p>"That was incredible," she gasps. "We're definitely doing that again."</p> <<set $game_state.current_canvas = "52cc47cf-43c4-4c35-bbb9-200810e4f301">> <<set $game_state.current_node = "196ec82d-9097-4855-90e8-aa4766c1ca2b">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 12.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 6.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "outdoor_unlocked");setup.applyAndNotifyFlag("player", null, "under_open_sky_complete");<</script>> [[Finally go inside->Location_The_Backyard]]
<p>You find Angela in the driveway, washing the car in a bikini that leaves very little to the imagination. Water streams down her curves as she bends over the hood.</p><p>She sees you watching and makes no effort to cover up. Instead, she runs the sponge slowly across the windshield, arching her back in a way that can only be deliberate.</p><p>"Hot day," she calls out, wringing water from the sponge so it runs down between her breasts. "Want to help me cool off?"</p> <<set $game_state.current_canvas = "4ee60ddf-1cb7-463e-b410-eba6129a6c4d">> <<set $game_state.current_node = "7a9f345f-5430-4f61-aa1b-667be74e2b5c">> <<script>>setup.markCanvasTriggered("4ee60ddf-1cb7-463e-b410-eba6129a6c4d");<</script>> <<link "Join her" "Canvas_story_car_wash_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Watch the show" "Canvas_story_car_wash_Node_3">><<script>>advanceTime(3);<</script>><</link>><br>
<p>You grab the hose and approach. She squeals as you spray her, the cold water making her gasp, her nipples hardening visibly through the thin bikini top.</p><video src="media/assets/clips/clip_000_HG5zVGa.mp4" controls preload="metadata" poster="media/assets/posters/clip_000_QujtSib.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Soon you're both soaked, pressed against the wet car, her body slippery against yours. Anyone could drive by. Anyone could see.</p><p>"We should take this inside," she gasps against your mouth. "Before the neighbors get a real show."</p><p>But her eyes say she wouldn't mind giving them one.</p> <<set $game_state.current_canvas = "4ee60ddf-1cb7-463e-b410-eba6129a6c4d">> <<set $game_state.current_node = "745aa713-6d4e-4a37-865f-81ad2aa49331">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "car_wash_complete");setup.applyAndNotifyFlag("player", null, "outdoor_comfortable");<</script>> [[Go inside (for now)->Location_The_Backyard]]
<p>You lean against the fence, making no secret of your appreciation. She puts on a show just for you - bending, stretching, letting the water run down her body.</p><video src="media/assets/clips/clip_000_HG5zVGa.mp4" controls preload="metadata" poster="media/assets/posters/clip_000_QujtSib.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Like what you see?" she calls, running her hands up her own body.</p><p>"You know I do."</p><p>She grins wickedly. "Maybe next time we don't stop at looking."</p> <<set $game_state.current_canvas = "4ee60ddf-1cb7-463e-b410-eba6129a6c4d">> <<set $game_state.current_node = "fe92f92b-5796-46e0-9093-794a2f7c646c">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "car_wash_complete");setup.applyAndNotifyFlag("player", null, "outdoor_comfortable");<</script>> [[Go inside together->Location_The_Backyard]]
<p>Angela emerges from the closet holding something you've never seen before - a harness with an attachment.</p><p>"I've been fantasizing about this," she says, her voice barely above a whisper. "About being inside you."</p><p>She sets it down and takes your hands. "Will you let me? I promise I'll be gentle. I'll stop the moment you say."</p><p>Her eyes search yours for permission, for trust, for the ultimate surrender.</p> <<set $game_state.current_canvas = "8c75f386-1a95-4b24-90a9-12ac9d3b3f52">> <<set $game_state.current_node = "f05b7ff6-220f-47ee-a189-84eebe7255b6">> <<script>>setup.markCanvasTriggered("8c75f386-1a95-4b24-90a9-12ac9d3b3f52");<</script>> <<link "I trust you. Completely." "Canvas_story_the_strap_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Not tonight" "Location_The_Bedroom">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(15);<</script>><</link>><br>
<p>She takes her time preparing, making sure you're ready, comfortable. Her touch is tender, patient.</p><p>"You're taking me so well," she breathes as she eases forward. "Just relax. Let go. I've got you."</p><video src="media/assets/clips/clip_076_nsPYm3n.mp4" controls preload="metadata" poster="media/assets/posters/clip_076_LXayFcA.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The sensation is overwhelming - vulnerability, pleasure, connection deeper than you've ever known. She moves with care, watching your face, responding to every sound you make.</p><p>When you both finish, she holds you like something precious.</p><p>"Thank you," she whispers against your hair. "For giving me that. For trusting me with all of you."</p> <<set $game_state.current_canvas = "8c75f386-1a95-4b24-90a9-12ac9d3b3f52">> <<set $game_state.current_node = "74cd9311-3359-4a77-bb9e-4de94d3091f3">> <<script>>advanceTime(90);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 12.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "pegging_unlocked");setup.applyAndNotifyFlag("player", null, "the_strap_complete");<</script>> [[Fall asleep in her arms->Location_The_Bedroom]]
<p>Angela sits you on the edge of the bed, a nervous energy in her movements you haven't seen before.</p><p>"I want to try something," she says softly. "Something I've fantasized about. But it requires you to trust me completely."</p><p>"What is it?"</p><p>She takes a breath. "I want to use my mouth on you. But not... there." Her eyes hold yours. "Would you be okay with that?"</p> <<set $game_state.current_canvas = "12d3264b-006d-4664-afa7-cf66d1715cb5">> <<set $game_state.current_node = "b6d8c272-1ce8-4884-b9f4-ce937338e94c">> <<script>>setup.markCanvasTriggered("12d3264b-006d-4664-afa7-cf66d1715cb5");<</script>> <<link "I trust you completely" "Canvas_story_she_takes_over_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "I'm not ready for that" "Location_The_Bedroom">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(15);<</script>><</link>><br>
<p>You lie back, giving yourself over to her completely. She positions you gently, reverently.</p><p>"Relax," she whispers. "I'll go slow. Just feel."</p><video src="media/assets/clips/clip_084_8OGyOWe.mp4" controls preload="metadata" poster="media/assets/posters/clip_084_kNPa4dW.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The sensation is unlike anything you've experienced. Her tongue explores territory no one has touched before. You gasp, grip the sheets, surrender completely.</p><p>When it's over, she crawls up beside you, a satisfied smile on her face.</p><p>"Thank you for trusting me," she says softly. "That was beautiful."</p> <<set $game_state.current_canvas = "12d3264b-006d-4664-afa7-cf66d1715cb5">> <<set $game_state.current_node = "3197c653-c262-4734-be9a-496ee162f8a1">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 10.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "power_play_unlocked");setup.applyAndNotifyFlag("player", null, "she_takes_over_complete");<</script>> [[Hold her close->Location_The_Bedroom]]
<p>Angela shows you a bottle. "I bought massage oil," she says with a mischievous smile. "Want to help me try it out?"</p><p>She's already stripping off her clothes. The oil catches the candlelight as she pours it over herself.</p> <<set $game_state.current_canvas = "a50afd26-980d-4fef-8f68-0c593cec11c3">> <<set $game_state.current_node = "a1f234af-ecce-416a-ab18-5ed91097f65f">> <<script>>setup.markCanvasTriggered("a50afd26-980d-4fef-8f68-0c593cec11c3");<</script>> <<link "Help her apply it" "Canvas_story_slippery_when_wet_Node_2">><<script>>advanceTime(3);<</script>><</link>><br>
<p>Your hands glide over her oiled body, slipping and sliding over every curve. She pours some on you, and suddenly you're both glistening.</p><video src="media/assets/clips/clip_081_Mimlxyv.mp4" controls preload="metadata" poster="media/assets/posters/clip_081_bHztjh1.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>What starts as a massage becomes something else entirely. Your bodies slide against each other, slick and warm.</p><p>"I can feel every inch of you," she gasps as you grind together. "This is incredible."</p><p>By the end, you're both covered in oil and satisfaction.</p> <<set $game_state.current_canvas = "a50afd26-980d-4fef-8f68-0c593cec11c3">> <<set $game_state.current_node = "46b468b9-a878-4719-bb9f-5fc08ceb8638">> <<script>>advanceTime(75);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "slippery_when_wet_complete");<</script>> [[Shower together after->Location_The_Bedroom]]
<p>Angela pulls you into bed with a grin. "No work tomorrow. No responsibilities. No reason to stop."</p><p>She kisses you deeply. "I want to see how many times we can make each other come before the sun rises."</p> <<set $game_state.current_canvas = "f8feeab6-200e-496d-af35-af14df923785">> <<set $game_state.current_node = "2279df12-159d-4671-8498-a98d17fb9a00">> <<script>>setup.markCanvasTriggered("f8feeab6-200e-496d-af35-af14df923785");<</script>> <<link "Challenge accepted" "Canvas_story_all_night_long_Node_2">><<script>>advanceTime(3);<</script>><</link>><br>
<p>What follows is the most intense night of your life. Round after round, position after position.</p><video src="media/assets/clips/clip_042_RCVAtAA.mp4" controls preload="metadata" poster="media/assets/posters/clip_042_AZrot7U.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>You lose count after the fourth time. The fifth? The sixth? It all blurs together into one continuous wave of pleasure.</p><p>When the sun finally comes up, you're both exhausted, satisfied, completely spent.</p><p>"I love you," she whispers into your chest. It's the first time she's said it.</p><p>"I love you too," you reply. And you mean it.</p> <<set $game_state.current_canvas = "f8feeab6-200e-496d-af35-af14df923785">> <<set $game_state.current_node = "271c42de-316c-4f2e-8dda-211a4e924372">> <<script>>advanceTime(480);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 12.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 15.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "all_night_long_complete");setup.applyAndNotifyFlag("player", null, "in_love_with_player");<</script>> [[Sleep until noon->Location_The_Bedroom]]
<p>Angela meets you at the bedroom door with a commanding look you've never seen before.</p><p>"Tonight, I'm in charge," she says. "You do what I say. Understand?"</p><p>Something about her tone sends a thrill through you.</p> <<set $game_state.current_canvas = "a1c13307-f16c-4983-9c5b-dc0c0a0febe8">> <<set $game_state.current_node = "b19cf67b-ff10-4e6d-9525-1134edf84d72">> <<script>>setup.markCanvasTriggered("a1c13307-f16c-4983-9c5b-dc0c0a0febe8");<</script>> <<link "Yes, Angela" "Canvas_story_taking_control_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Not tonight" "Location_The_Bedroom">><<script>>advanceTime(15);<</script>><</link>><br>
<p>She pushes you onto the bed and straddles your face. "Make me come first," she orders. "Then maybe I'll let you have what you want."</p><video src="media/assets/clips/clip_041_BQ2at7u.mp4" controls preload="metadata" poster="media/assets/posters/clip_041_NJNH8Oo.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>You worship her as commanded. She controls everything - the pace, the pressure, when she lets you breathe.</p><p>After she finishes on your tongue, she rewards you - riding you with the same commanding energy until you both collapse.</p><p>"Good boy," she murmurs into your ear. You've never been more turned on by two words.</p> <<set $game_state.current_canvas = "a1c13307-f16c-4983-9c5b-dc0c0a0febe8">> <<set $game_state.current_node = "0ea0519d-f2e5-41da-87ae-ffaf171152c7">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "taking_control_complete");<</script>> [[Catch your breath->Location_The_Bedroom]]
<p>You wake to Angela's hand already moving beneath the sheets, stroking you gently awake.</p><p>"Good morning," she whispers. "I had an idea for how we could start every day."</p><p>Before you can respond, she's climbing on top of you.</p> <<set $game_state.current_canvas = "7dd74be2-1def-40e3-9b47-6ba08f5c641d">> <<set $game_state.current_node = "7367d846-3325-40cc-8402-04414a0e1a91">> <<script>>setup.markCanvasTriggered("7dd74be2-1def-40e3-9b47-6ba08f5c641d");<</script>> <<link "Let her take control" "Canvas_story_first_morning_Node_2">><<script>>advanceTime(3);<</script>><</link>><br>
<p>She sinks down onto you, both of you gasping at the sensation. Her hips begin to move in a slow, sensual rhythm.</p><video src="media/assets/clips/clip_021_RgqBkEH.mp4" controls preload="metadata" poster="media/assets/posters/clip_021_B75Qc7k.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"This is my new favorite way to wake up," she says breathlessly.</p><p>You couldn't agree more. The morning light catches her body as she rides you, and you think you could do this every day forever.</p> <<set $game_state.current_canvas = "7dd74be2-1def-40e3-9b47-6ba08f5c641d">> <<set $game_state.current_node = "0efa8ddd-0cbf-49cd-bff7-5b7c01bf30c0">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 8.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "first_morning_complete");<</script>> [[Start the day right->Location_The_Bedroom]]
<p>You come home earlier than expected. The house seems quiet, but you hear soft sounds coming from the spa area.</p><p>The door is slightly ajar. Through it, you see Angela in the hot tub, her head thrown back, her hand moving beneath the water. A toy glints in the light.</p><p>She moans softly. You hear your name on her lips.</p><p>Her eyes open and lock with yours. Instead of embarrassment, a slow smile spreads across her face.</p> <<set $game_state.current_canvas = "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7">> <<set $game_state.current_node = "d4a5bdda-ddd4-42e6-93b5-73c37943d59a">> <<script>>setup.markCanvasTriggered("4b7299e1-fb92-4fbd-980b-3e8fcdce13d7");<</script>> <<link "Watch" "Canvas_story_catching_her_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Give her privacy" "Location_The_Spa">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(15);<</script>><</link>><br>
<p>"Don't stop on my account," you say from the doorway.</p><p>Her smile turns wicked. "Then watch."</p><video src="media/assets/clips/clip_009_LdTsrdB.mp4" controls preload="metadata" poster="media/assets/posters/clip_009_uvu2tYo.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>She puts on a show just for you, using the toy while holding your gaze. When she finishes, crying out your name, it's the most erotic thing you've ever witnessed.</p><p>"Next time," she says breathlessly, "maybe you can replace the toy."</p> <<set $game_state.current_canvas = "4b7299e1-fb92-4fbd-980b-3e8fcdce13d7">> <<set $game_state.current_node = "bd247175-276c-4eca-a2d6-c2ceb142e183">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "catching_her_complete");setup.applyAndNotifyFlag("player", null, "spa_discovered");<</script>> [[Promise her you will->Location_The_Spa]]
<p>Angela looks up at you from the bed, something vulnerable in her expression. "Can I ask you something?"</p><p>"Anything."</p><p>"I've never... I mean, I've always been curious about..." She takes a breath. "I want you to finish on my face."</p><p>The request surprises you. She continues quickly. "I trust you. And I want to try it. With you."</p> <<set $game_state.current_canvas = "a5492672-7b36-4475-bf4e-a82a3d06533c">> <<set $game_state.current_node = "4d483243-2e44-4877-9b8a-35ae4553da43">> <<script>>setup.markCanvasTriggered("a5492672-7b36-4475-bf4e-a82a3d06533c");<</script>> <<link "If you're sure" "Canvas_story_the_facial_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Another time" "Location_The_Bedroom">><<script>>advanceTime(15);<</script>><</link>><br>
<p>She kneels before you, looking up with complete trust. Her mouth works you toward the edge.</p><video src="media/assets/clips/clip_064_2fbZUkO.mp4" controls preload="metadata" poster="media/assets/posters/clip_064_hIuzTtv.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>When you finish, she closes her eyes and takes it. After, she looks up at you with a satisfied smile.</p><p>"That was..." she laughs softly. "I liked it. I liked giving you that."</p><p>You help clean her up, the intimacy of the act somehow more profound than the act itself.</p> <<set $game_state.current_canvas = "a5492672-7b36-4475-bf4e-a82a3d06533c">> <<set $game_state.current_node = "4574e097-ad5b-44f0-8878-df90911009e6">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "the_facial_complete");<</script>> [[Hold her close->Location_The_Bedroom]]
<p>Angela pulls you onto the couch with a wicked grin. "Now that we're official," she says, "I want to try everything."</p><p>"Everything?"</p><p>"Every position. Every way you can have me." Her eyes gleam. "Think you're up for the challenge?"</p> <<set $game_state.current_canvas = "f16df6e8-6ae8-4bd8-a74e-dba2bb929900">> <<set $game_state.current_node = "0f070db2-1bef-43ff-9074-10ac4993060e">> <<script>>setup.markCanvasTriggered("f16df6e8-6ae8-4bd8-a74e-dba2bb929900");<</script>> <<link "Accept the challenge" "Canvas_story_everything_unlocked_Node_2">><<script>>advanceTime(3);<</script>><</link>><br>
<p>What follows is a marathon exploration of each other's bodies. She wasn't kidding about trying everything.</p><video src="media/assets/clips/clip_028_rjIa1NC.mp4" controls preload="metadata" poster="media/assets/posters/clip_028_ZBe7wjX.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Missionary. Doggy. Cowgirl. Reverse. Every position you can think of, and some you couldn't have imagined.</p><p>By the time you're both spent, the sun is coming up. You've lost count of how many times you've both finished.</p><p>"Challenge complete," she gasps, collapsing against you. "You passed."</p> <<set $game_state.current_canvas = "f16df6e8-6ae8-4bd8-a74e-dba2bb929900">> <<set $game_state.current_node = "4a24b8a3-3e80-4059-9f0b-8b16affdd8c1">> <<script>>advanceTime(240);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 6.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "everything_unlocked_complete");<</script>> [[Pass out together->Location_The_Living_Room]]
<p>You wake to find Angela watching you, her head propped on her hand. Morning light filters through the curtains.</p><p>"Hi," she says softly.</p><p>"Hi yourself."</p><p>"I was worried it would be awkward," she admits. "But it's not. It feels... right."</p><p>She moves closer, her body warm against yours. "So what are we now? Officially?"</p> <<set $game_state.current_canvas = "72309d64-5eca-41cd-9b9d-06e6c36415a9">> <<set $game_state.current_node = "9cdaf765-602b-4dfd-a601-cc019f51cabc">> <<script>>setup.markCanvasTriggered("72309d64-5eca-41cd-9b9d-06e6c36415a9");<</script>> <<link "\"I want to be yours.\"" "Canvas_story_morning_after_Node_2">><<script>>advanceTime(3);<</script>><</link>><br>
<p>"I want to be yours," she says before you can answer. "And I want you to be mine."</p><p>You kiss her in response. One thing leads to another...</p><video src="media/assets/clips/clip_048_sLejqgN.mp4" controls preload="metadata" poster="media/assets/posters/clip_048_ZYAgju2.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>You make love again in the morning light, slower this time, more certain. When you finish, she curls against you.</p><p>"I could get used to this," she murmurs. "Waking up with you."</p> <<set $game_state.current_canvas = "72309d64-5eca-41cd-9b9d-06e6c36415a9">> <<set $game_state.current_node = "97666ec1-443e-4a9c-bc6c-626f4c081259">> <<script>>advanceTime(90);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 8.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "morning_after_complete");setup.applyAndNotifyFlag("player", null, "relationship_together");<</script>> [[Eventually get up for coffee->Location_The_Bedroom]]
<p>Angela is waiting for you in the living room. The lights are low. She's wearing a silk robe and nothing else.</p><p>"No more waiting," she says. "No more teasing. I want you. All of you."</p><p>She takes your hand and places it over her heart. You can feel it racing.</p><p>"Feel that? I've never been more sure of anything."</p> <<set $game_state.current_canvas = "9fb9a4f4-2144-469d-808f-cdb1119214d8">> <<set $game_state.current_node = "9653fe58-f1cc-417b-b5de-e2af985ec5eb">> <<script>>setup.markCanvasTriggered("9fb9a4f4-2144-469d-808f-cdb1119214d8");<</script>> <<link "Take her to bed" "Canvas_story_first_night_Node_2">><<script>>advanceTime(3);<</script>><</link>><br>
<p>You lead her to the bedroom. The robe falls away. You've seen her body before, but never like this - offered completely, without reservation.</p><p>"I want to remember this forever," she whispers as you lower her onto the bed.</p><video src="media/assets/clips/clip_027_K9TTaaJ.mp4" controls preload="metadata" poster="media/assets/posters/clip_027_2N0SOmH.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>When you finally join together, she gasps. "Yes. Just like that."</p><p>She wraps her legs around you, pulling you deeper. "Move. Please. I need to feel you."</p><p>You make love for the first time - tender, meaningful, the culmination of weeks of tension. When you both finish, she clings to you like she never wants to let go.</p> <<set $game_state.current_canvas = "9fb9a4f4-2144-469d-808f-cdb1119214d8">> <<set $game_state.current_node = "3b3c93ff-ef1d-43db-b7f1-f4f88437f34e">> <<script>>advanceTime(120);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 15.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 10.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "sex_unlocked");setup.applyAndNotifyFlag("player", null, "first_night_complete");<</script>> [[Hold her through the night->Location_The_Living_Room]]
<p>You find Angela in the kitchen again. She smiles when she sees you, but there's a question in her eyes - anticipation.</p><p>"My turn," you say simply.</p><p>Her breath catches. "What do you mean?"</p><p>Instead of answering, you lift her onto the counter. She gasps as you kneel between her thighs.</p> <<set $game_state.current_canvas = "0f470b7c-4809-445f-a86d-a36500a28f26">> <<set $game_state.current_node = "93be0805-84b5-4786-8527-544c4d72b08b">> <<script>>setup.markCanvasTriggered("0f470b7c-4809-445f-a86d-a36500a28f26");<</script>> <<link "Worship her" "Canvas_story_tasting_her_Node_2">><<script>>advanceTime(3);<</script>><</link>><br>
<p>You push her skirt up, revealing she's not wearing anything underneath. She planned this.</p><video src="media/assets/clips/clip_011_EqkzLJV.mp4" controls preload="metadata" poster="media/assets/posters/clip_011_cUOqDIl.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Oh god," she gasps as your mouth finds her. "Yes. Please. Right there."</p><p>Her fingers tangle in your hair, holding you in place. Her thighs tremble around your ears as you bring her higher and higher.</p><p>When she comes, she cries out your name. The sound is the most beautiful thing you've ever heard.</p> <<set $game_state.current_canvas = "0f470b7c-4809-445f-a86d-a36500a28f26">> <<set $game_state.current_node = "3c4bad29-b529-41c3-9727-04f5326ea319">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 12.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 6.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "manual_unlocked");setup.applyAndNotifyFlag("player", null, "tasting_her_complete");<</script>> [[Help her down->Location_The_Kitchen]]
<p>Angela is leaning against the counter when you enter, coffee untouched. She looks like she didn't sleep well - in a good way.</p><p>"I had a dream about you last night," she says without preamble.</p><p>"What kind of dream?"</p><p>"I was on my knees. Right here. In this kitchen." Her voice drops. "I've been thinking about it for days. About how you'd taste."</p><p>She sets down her mug and takes a step toward you. "Can I? Please?"</p> <<set $game_state.current_canvas = "f7cffc4b-2864-4646-b404-bb514f1687d3">> <<set $game_state.current_node = "9080cb65-0637-4f76-9ca6-0ac1ef01644e">> <<script>>setup.markCanvasTriggered("f7cffc4b-2864-4646-b404-bb514f1687d3");<</script>> <<link "Yes" "Canvas_story_on_her_knees_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Not here" "Canvas_story_on_her_knees_Node_3">><<script>>advanceTime(3);<</script>><</link>><br>
<p>She sinks to her knees right there on the kitchen floor, looking up at you with desire-darkened eyes.</p><p>"I've been wanting this," she breathes, fingers working at your waistband.</p><video src="media/assets/clips/clip_013_ZPN21Zh.mp4" controls preload="metadata" poster="media/assets/posters/clip_013_RshcazO.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The coffee maker beeps, forgotten. Her mouth is hot and eager, her eyes locked on yours the entire time.</p><p>When she finally pulls back, she's smiling. "Even better than the dream."</p> <<set $game_state.current_canvas = "f7cffc4b-2864-4646-b404-bb514f1687d3">> <<set $game_state.current_node = "0c229098-273f-4e0f-9d5c-66b228ff6f8e">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 12.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "oral_unlocked");setup.applyAndNotifyFlag("player", null, "on_her_knees_complete");<</script>> [[Pull her up for a kiss->Location_The_Kitchen]]
<p>"Not here," you say. "Someone could walk in."</p><p>She laughs softly. "We're the only ones who live here."</p><p>"Still. When it happens, I want to take my time with you."</p><p>Her eyes flash with heat. "Promise?"</p><p>"Promise."</p> <<set $game_state.current_canvas = "f7cffc4b-2864-4646-b404-bb514f1687d3">> <<set $game_state.current_node = "c87bc2fb-09db-41be-986a-c1787e52ab66">> <<script>>advanceTime(15);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Kiss her forehead->Location_The_Kitchen]]
<p>Angela invited you to her room "to talk." The door closes behind you with a soft click.</p><p>She sits on the bed, patting the space beside her. When you sit, she immediately turns toward you, her knee touching yours.</p><p>"About what happened in the kitchen," she begins. Her hand finds your thigh. "I can't stop thinking about it."</p><p>Her hand slides higher. "I don't want to be safe with you."</p> <<set $game_state.current_canvas = "1e49a8a7-d475-46f0-86e9-564a8d1e80d6">> <<set $game_state.current_node = "b73010a1-ec38-4b4f-ac31-fe1fd75e987e">> <<script>>setup.markCanvasTriggered("1e49a8a7-d475-46f0-86e9-564a8d1e80d6");<</script>> <<link "Let her explore" "Canvas_story_she_wants_more_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Slow down" "Canvas_story_she_wants_more_Node_3">><<script>>advanceTime(3);<</script>><</link>><br>
<p>Her hand finds you through your pants. You're already hard. She smiles.</p><video src="media/assets/clips/clip_018_VpSvbQk.mp4" controls preload="metadata" poster="media/assets/posters/clip_018_MH6Pm3y.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"You want this too," she breathes, stroking slowly. "I can feel it."</p><p>She doesn't go further - not tonight. But the line has been crossed. There's no going back to pretending.</p><p>"To be continued," she promises, pulling away with obvious reluctance.</p> <<set $game_state.current_canvas = "1e49a8a7-d475-46f0-86e9-564a8d1e80d6">> <<set $game_state.current_node = "f9387797-e0d2-43de-acd1-e234ad2af825">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "groping_unlocked");setup.applyAndNotifyFlag("player", null, "she_wants_more_complete");<</script>> [[Leave her wanting more->Location_The_Bedroom]]
<p>You catch her wrist gently. "Not yet," you say. "I want this to be right."</p><p>She looks at you with something like respect. "You're not like other guys," she says softly.</p><p>"When we do this - and we will - I want it to mean something."</p><p>She nods, squeezing your hand. "Okay. But don't make me wait too long."</p> <<set $game_state.current_canvas = "1e49a8a7-d475-46f0-86e9-564a8d1e80d6">> <<set $game_state.current_node = "24cbcf19-d6e4-44d5-9b09-882792c572d8">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Give her a goodnight kiss->Location_The_Bedroom]]
<p>She's reaching for something on the top shelf, stretching on her toes. You move to help without thinking, stepping close behind her.</p><p>Your bodies are inches apart. She turns, and suddenly you're face to face, breathing the same air. Neither of you moves away.</p><p>"We've been doing this dance for days," she says softly.</p><p>"What dance?"</p><p>"This. Pretending we're not... that I don't notice you looking."</p><p>A beat of silence. Her eyes drop to your lips.</p><p>"The good kind of weird," she whispers.</p> <<set $game_state.current_canvas = "9d637126-5fa9-43aa-ac66-39bfaedbc61f">> <<set $game_state.current_node = "8c36b904-1bf2-4daa-bc15-abb946b57473">> <<script>>setup.markCanvasTriggered("9d637126-5fa9-43aa-ac66-39bfaedbc61f");<</script>> <<link "Kiss her" "Canvas_story_first_kiss_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Step back" "Canvas_story_first_kiss_Node_3">><<script>>advanceTime(3);<</script>><</link>><br>
<p>You close the distance. Your lips meet hers.</p><video src="media/assets/clips/clip_007_jpPZEwP.mp4" controls preload="metadata" poster="media/assets/posters/clip_007_sUYQEju.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>She melts into you, her hands finding your chest. The kiss deepens, weeks of tension pouring out in this single moment.</p><p>When you finally break apart, she's breathless.</p><p>"God," she gasps. "I've been wanting that."</p> <<set $game_state.current_canvas = "9d637126-5fa9-43aa-ac66-39bfaedbc61f">> <<set $game_state.current_node = "f613e348-83f7-4992-8864-01fa9025a91a">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> <<script>>setup.applyAndNotifyFlag("player", null, "kiss_unlocked");setup.applyAndNotifyFlag("player", null, "first_kiss_complete");<</script>> [[Let the moment settle->Location_The_Kitchen]]
<p>You step back, breaking the spell. Disappointment flickers across her face before she masks it with a smile.</p><p>"Right," she says, voice slightly strained. "The... shelf. Thanks for the help."</p><p>The moment passes, but the tension remains. If anything, it's stronger now. You both know what almost happened.</p> <<set $game_state.current_canvas = "9d637126-5fa9-43aa-ac66-39bfaedbc61f">> <<set $game_state.current_node = "3629dda4-9173-4cf3-9e85-99f5e86fc7fc">> <<script>>advanceTime(15);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Give her space->Location_The_Kitchen]]
<p>The hot water feels good against your skin. You let your mind wander as steam fills the bathroom.</p><p>You try not to think about Angela in here... and fail.</p> <<set $game_state.current_canvas = "462e5d97-d2e8-4b57-9d8c-44106ec79cb5">> <<set $game_state.current_node = "9cf0f5d0-6adf-4277-bf45-df6505fc89d3">> <<script>>setup.markCanvasTriggered("462e5d97-d2e8-4b57-9d8c-44106ec79cb5");<</script>> <<script>>advanceTime(20);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("player", null, "energy", "add", 10.0, true, null);setup.applyAndNotifyTrait("player", null, "confidence", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Dry off->Location_The_Spa]]
<p>You find some ingredients and start putting together a meal. Nothing fancy, but it'll do.</p><p>You find yourself wondering what Angela is up to.</p> <<set $game_state.current_canvas = "0839a0f9-0d0d-44a0-aef3-d67a3df42ce9">> <<set $game_state.current_node = "baaa8388-0b00-489b-a31c-b0c626434437">> <<script>>setup.markCanvasTriggered("0839a0f9-0d0d-44a0-aef3-d67a3df42ce9");<</script>> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("player", null, "energy", "add", 15.0, true, null);setup.showEffectNotification();<</script>> [[Finish eating->Location_The_Kitchen]]
<p>You settle onto the couch and flip through channels. Nothing great on, but it's relaxing.</p><p>The house feels a little empty without Angela around.</p> <<set $game_state.current_canvas = "90f794ba-3fec-469a-9dee-a25c7afc5556">> <<set $game_state.current_node = "3512196f-0cfd-4d52-8eca-b3204cb9947d">> <<script>>setup.markCanvasTriggered("90f794ba-3fec-469a-9dee-a25c7afc5556");<</script>> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("player", null, "energy", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Turn off TV->Location_The_Living_Room]]
<p>You sit on your bed, thinking about Angela. About the way she looks at you. About what might happen if you...</p><p>Your mind wanders to possibilities.</p> <<set $game_state.current_canvas = "054063fc-d276-448b-858b-b62534d27b65">> <<set $game_state.current_node = "1285ef0e-41ad-4e14-b45a-39e10cc6ddd6">> <<script>>setup.markCanvasTriggered("054063fc-d276-448b-858b-b62534d27b65");<</script>> <<script>>advanceTime(15);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("player", null, "confidence", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Get up->Location_The_Bedroom]]
<p>You lie down on your bed, letting the day's tension drain away. The house is quiet.</p> <<set $game_state.current_canvas = "24fb6fbb-a0f7-486b-b2c6-75e3d2651f76">> <<set $game_state.current_node = "e4e1941d-6552-4f83-bb6a-71f850bbcd5b">> <<script>>setup.markCanvasTriggered("24fb6fbb-a0f7-486b-b2c6-75e3d2651f76");<</script>> <<link "Short nap (1 hour)" "Location_The_Bedroom">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("player", null, "energy", "add", 20.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(60);<</script>><</link>><br> <<link "Sleep until morning" "Location_The_Bedroom">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("player", null, "energy", "set", 100.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(480);<</script>><</link>><br>
<p>Angela is in the driveway checking the mail when you come outside. She waves cheerfully.</p><p>"Beautiful day, isn't it?" she says, tilting her face to the sun. "I love this time of year."</p><p>You chat for a few minutes about nothing important - the weather, the neighborhood. It's pleasant and easy.</p> <<set $game_state.current_canvas = "afb69329-68bb-4c7d-a820-702236f6196c">> <<set $game_state.current_node = "0b8daac7-a080-46a1-a535-a05dcfcc5152">> <<script>>setup.markCanvasTriggered("afb69329-68bb-4c7d-a820-702236f6196c");<</script>> <<script>>advanceTime(15);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 1.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Head back inside->Location_The_Backyard]]
<p>You come outside to find Angela washing the car in a tiny bikini. Water drips down her curves as she bends over the hood.</p><video src="media/assets/clips/clip_000_HG5zVGa.mp4" controls preload="metadata" poster="media/assets/posters/clip_000_QujtSib.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>She sees you watching and makes a show of squeezing the sponge, suds running down her chest.</p><p>"Hot day," she says innocently. "The car needed washing. You could help... if you want."</p> <<set $game_state.current_canvas = "a2825bb2-9517-45d8-8592-9d83e0451882">> <<set $game_state.current_node = "aa511639-3df6-402b-ba79-182d4640abfa">> <<script>>setup.markCanvasTriggered("a2825bb2-9517-45d8-8592-9d83e0451882");<</script>> <<script>>advanceTime(15);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Head back inside->Location_The_Backyard]]
<p>Angela is in the backyard, setting up a lounger. She notices you and smiles mischievously.</p><p>"I need to work on my tan," she says. "Hope you don't mind the view."</p><p>She peels off her top, revealing her bikini beneath. Then, holding your gaze, she reaches for the bikini ties...</p> <<set $game_state.current_canvas = "e3e6d968-0f35-4054-889a-00ba3d02eea2">> <<set $game_state.current_node = "f45c35f7-76d7-4cc0-832c-589060aec834">> <<script>>setup.markCanvasTriggered("e3e6d968-0f35-4054-889a-00ba3d02eea2");<</script>> <<link "Enjoy the show" "Canvas_activity_outdoor_angela_t3_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Give her privacy" "Location_The_Backyard">><<script>>advanceTime(10);<</script>><</link>><br>
<p>She lets the bikini top fall away, revealing her breasts to the sun - and to you. She lies back on the lounger, making no effort to cover herself.</p><p>"The fence is high enough," she says casually. "Unless someone's really trying to look."</p><p>Her eyes meet yours. "Someone like you, maybe?"</p> <<set $game_state.current_canvas = "e3e6d968-0f35-4054-889a-00ba3d02eea2">> <<set $game_state.current_node = "0d045b7c-42ac-4bd4-a997-f7f8220f1052">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Leave her to tan->Location_The_Backyard]]
<p>You come outside to find Angela sunbathing on a lounger, bikini top already discarded. Her hand rests suspiciously low on her stomach.</p><p>She opens her eyes, sees you, and doesn't stop. "Watch me," she breathes.</p> <<set $game_state.current_canvas = "3d3ad3b9-62e4-472b-ace0-340f9c15fed6">> <<set $game_state.current_node = "b5470280-e76d-464b-9533-866ac13fd61e">> <<script>>setup.markCanvasTriggered("3d3ad3b9-62e4-472b-ace0-340f9c15fed6");<</script>> <<link "Watch her" "Canvas_activity_outdoor_angela_t5_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Give her privacy" "Location_The_Backyard">><<script>>advanceTime(10);<</script>><</link>><br>
<p>Her hand slides beneath her bikini bottom. She arches slightly, her breath quickening.</p><video src="media/assets/clips/clip_003_usHhkPI.mp4" controls preload="metadata" poster="media/assets/posters/clip_003_nGHRVc1.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Anyone could see," she moans. "You watching me... oh god... it's so hot."</p><p>She finishes under the open sky, crying out your name.</p> <<set $game_state.current_canvas = "3d3ad3b9-62e4-472b-ace0-340f9c15fed6">> <<set $game_state.current_node = "9e9c3b4e-15be-4e99-acd2-90a3e7d5356a">> <<script>>advanceTime(20);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 5.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Give her a moment->Location_The_Backyard]]
<p>Angela pulls you behind the car, out of direct view of the neighbors. Her hands are already at your waistband.</p><p>"I want to taste you," she says. "Right here. Right now."</p> <<set $game_state.current_canvas = "a44f0735-97f7-4ab7-b857-d575394b5c8a">> <<set $game_state.current_node = "ea6a1d02-1846-4148-96bc-39b78885b294">> <<script>>setup.markCanvasTriggered("a44f0735-97f7-4ab7-b857-d575394b5c8a");<</script>> <<link "Let her" "Canvas_activity_outdoor_angela_t6_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Too risky" "Location_The_Backyard">><<script>>advanceTime(10);<</script>><</link>><br>
<p>She kneels on the warm concrete, looking up at you with hungry eyes. The fence barely conceals you from view.</p><p>Her mouth is hot around you. The danger of discovery makes every sensation sharper.</p><p>"Don't make a sound," she teases between strokes. "Or everyone will know."</p> <<set $game_state.current_canvas = "a44f0735-97f7-4ab7-b857-d575394b5c8a">> <<set $game_state.current_node = "41d627d8-8a77-4193-9f03-927747323018">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Head inside breathless->Location_The_Backyard]]
<p>Angela pulls you close in the backyard, her hands already working at your clothes. "I can't wait," she breathes. "I need you right now."</p><p>"Out here?" you ask. "Someone could see."</p><p>"I know," she says, her eyes gleaming. "That's the point."</p> <<set $game_state.current_canvas = "af0b3a27-2209-4936-ae8e-47b279e11c5a">> <<set $game_state.current_node = "2ccaf164-4716-4bc3-a07d-e017b906671f">> <<script>>setup.markCanvasTriggered("af0b3a27-2209-4936-ae8e-47b279e11c5a");<</script>> <<link "Take the risk" "Canvas_activity_outdoor_angela_t7_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Go inside first" "Location_The_Backyard">><<script>>advanceTime(5);<</script>><</link>><br>
<p>You give in to her urgency. Right there in the backyard, clothes half off, you take her against the warm car hood.</p><video src="media/assets/clips/clip_010_MAp6xBo.mp4" controls preload="metadata" poster="media/assets/posters/clip_010_jvRNXfY.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The risk of discovery heightens everything. Every sound could be a neighbor. Every moment is stolen.</p><p>When you finish, you're both breathless and laughing with the thrill of it.</p> <<set $game_state.current_canvas = "af0b3a27-2209-4936-ae8e-47b279e11c5a">> <<set $game_state.current_node = "23ec6e14-1fda-4365-8478-a5ccf4ee1d8d">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Hurry inside->Location_The_Backyard]]
<p>Angela finds you in the backyard, her eyes hungry. She glances around - the fence provides some privacy, but not much.</p><p>"Anyone could see," she whispers. "That's what makes it exciting."</p> <<set $game_state.current_canvas = "d9254675-65bf-4d04-8fdf-67892f03f3bc">> <<set $game_state.current_node = "fbf42a6a-7349-4c4f-baa4-69afa861c64f">> <<script>>setup.markCanvasTriggered("d9254675-65bf-4d04-8fdf-67892f03f3bc");<</script>> <<link "Against the car" "Canvas_activity_outdoor_angela_t8_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Standing by the fence" "Canvas_activity_outdoor_angela_t8_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "On the lawn" "Canvas_activity_outdoor_angela_t8_Node_4">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Too risky" "Location_The_Backyard">><<script>>advanceTime(15);<</script>><</link>><br>
<p>You bend her over the hood of the car, still warm from the sun. She grips the edge as you take her from behind.</p><video src="media/assets/clips/clip_010_MAp6xBo.mp4" controls preload="metadata" poster="media/assets/posters/clip_010_jvRNXfY.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Yes," she moans. "Right here. I don't care who sees."</p> <<set $game_state.current_canvas = "d9254675-65bf-4d04-8fdf-67892f03f3bc">> <<set $game_state.current_node = "0093523d-13b0-4b10-9495-dba3e6034b34">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Hurry inside after->Location_The_Backyard]]
<p>You press her against the wooden fence, lifting her slightly. She wraps her legs around you.</p><p>"If the neighbors look..." she gasps. "Oh god, I don't care. Don't stop."</p><p>The thrill of potential exposure makes everything more intense.</p> <<set $game_state.current_canvas = "d9254675-65bf-4d04-8fdf-67892f03f3bc">> <<set $game_state.current_node = "d2b69ec4-2b46-484a-b213-2b0fea1546b3">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Retreat inside->Location_The_Backyard]]
<p>You lay her down on the grass, the sun warm on your skin. She pulls you down on top of her.</p><p>"This is crazy," she laughs breathlessly. "Anyone could walk by. I love it."</p><p>You make love under the open sky, the thrill making every sensation electric.</p> <<set $game_state.current_canvas = "d9254675-65bf-4d04-8fdf-67892f03f3bc">> <<set $game_state.current_node = "3f09513f-4f02-4113-9f07-c69a5423ff43">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Head inside->Location_The_Backyard]]
<p>It's late. Angela is relaxed, vulnerable. She starts talking about her past, her experiences.</p><p>"There's something I've never told anyone," she says quietly. "About who I am. What I've done."</p> <<set $game_state.current_canvas = "7bf07e50-d091-474e-8000-7ea5baf18bcb">> <<set $game_state.current_node = "18c03c4e-2327-4af3-a6c8-a28eae3c0fa6">> <<script>>setup.markCanvasTriggered("7bf07e50-d091-474e-8000-7ea5baf18bcb");<</script>> <<link "I want to know everything about you" "Canvas_activity_fantasy_angela_t6_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Only share what you're comfortable with" "Location_Fantasy_Space">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(30);<</script>><</link>><br>
<p>She tells you about the women she's been with. Not in explicit detail - just the emotional truth of it. The discovery. The pleasure. The part of herself she'd kept hidden.</p><p>"I'm telling you because I trust you," she says. "Because I want you to know all of me."</p><p>The intimacy of the confession is almost more powerful than anything physical could be.</p> <<set $game_state.current_canvas = "7bf07e50-d091-474e-8000-7ea5baf18bcb">> <<set $game_state.current_node = "0d2e3d4a-d73f-4db6-bb61-f2032a5c42b3">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 5.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 8.0, true, null);setup.showEffectNotification();<</script>> [[Hold her close->Location_Fantasy_Space]]
<p>Angela curls against you in bed, her voice soft in the darkness. "Can I tell you a fantasy?" she asks.</p><p>"I've been with women before," she continues. "And sometimes I think about... about having both. You and another woman."</p> <<set $game_state.current_canvas = "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2">> <<set $game_state.current_node = "da0fd38a-805e-4dee-8724-60f1a91e9307">> <<script>>setup.markCanvasTriggered("f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2");<</script>> <<link "Tell me about your experiences" "Canvas_activity_fantasy_angela_t8_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "The thought of that is incredibly hot" "Canvas_activity_fantasy_angela_t8_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just hold her" "Location_Fantasy_Space">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(30);<</script>><</link>><br>
<p>She tells you about her experiences with women - the softness, the knowing touches, the way another woman understands her body.</p><video src="media/assets/clips/clip_079_8ppZ4Pj.mp4" controls preload="metadata" poster="media/assets/posters/clip_079_lt5lNGN.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>As she describes it, her hand finds yours, guiding it to where she wants to be touched. The fantasy and the present blur together.</p> <<set $game_state.current_canvas = "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2">> <<set $game_state.current_node = "b9514afe-5891-46bf-bd32-381daee8a6bd">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Help her finish->Location_Fantasy_Space]]
<p>You describe what you'd want to see, to participate in. Angela's breathing quickens as you paint the picture together.</p><p>The fantasy becomes fuel. What you do to each other that night is colored by the imagined third, the possibilities.</p><p>"Maybe someday," she whispers after. "Maybe we'll make it real."</p> <<set $game_state.current_canvas = "f5bb5184-dea2-4cff-a4d5-2a7a3f4df7a2">> <<set $game_state.current_node = "9331fcf8-0ce8-410c-9c34-1ed1d4a575ac">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Dream together->Location_Fantasy_Space]]
<p>Angela's eyes have a different quality tonight - darker, more commanding. She pushes you onto the bed with surprising force.</p><p>"Tonight, I'm in charge," she says. "You're going to do exactly what I tell you. Understand?"</p> <<set $game_state.current_canvas = "3d9f36d1-fffc-497f-996a-23950976a4e3">> <<set $game_state.current_node = "c3f3df26-5f5b-4a88-b41f-e281ec5efd99">> <<script>>setup.markCanvasTriggered("3d9f36d1-fffc-497f-996a-23950976a4e3");<</script>> <<link "Submit to her" "Canvas_activity_fantasy_angela_t8_power_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Not in the mood" "Location_Fantasy_Space">><<script>>advanceTime(15);<</script>><</link>><br>
<p>She positions you how she wants you, completely exposed and vulnerable. Then her tongue finds you in a place you've never been touched before.</p><video src="media/assets/clips/clip_084_8OGyOWe.mp4" controls preload="metadata" poster="media/assets/posters/clip_084_kNPa4dW.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The sensation is electric, taboo, incredible. She takes her time, exploring, owning you completely.</p><p>"That's it," she murmurs. "Give yourself to me."</p> <<set $game_state.current_canvas = "3d9f36d1-fffc-497f-996a-23950976a4e3">> <<set $game_state.current_node = "c9e8d6e7-2ed1-46b7-acc8-0f5cb2572df4">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 10.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_Fantasy_Space]]
<p>Angela shows you a box she's been keeping hidden. Inside is a strap-on harness. She looks at you with a mix of nervousness and desire.</p><p>"I've been fantasizing about this," she admits. "About being inside you. Will you let me?"</p> <<set $game_state.current_canvas = "55f3c04c-0673-4ecd-b8b5-6a5d889e459c">> <<set $game_state.current_node = "28950a97-62e5-44bf-8e66-ec8508fce1c1">> <<script>>setup.markCanvasTriggered("55f3c04c-0673-4ecd-b8b5-6a5d889e459c");<</script>> <<link "Surrender to her" "Canvas_activity_fantasy_angela_t8_pegging_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Not tonight" "Location_Fantasy_Space">><<script>>advanceTime(15);<</script>><</link>><br>
<p>You trust her completely. You lie back as she prepares you gently, carefully. When she finally enters you, the sensation is unlike anything you've experienced.</p><video src="media/assets/clips/clip_076_nsPYm3n.mp4" controls preload="metadata" poster="media/assets/posters/clip_076_LXayFcA.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"You're taking me so well," she whispers. "Let go. I've got you."</p><p>The vulnerability is overwhelming, but so is the intimacy. You've given her everything, and she handles it with care.</p> <<set $game_state.current_canvas = "55f3c04c-0673-4ecd-b8b5-6a5d889e459c">> <<set $game_state.current_node = "dddc5633-5d8e-4b71-9b7c-3887eb560b7e">> <<script>>advanceTime(90);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 12.0, true, null);setup.showEffectNotification();<</script>> [[Hold each other->Location_Fantasy_Space]]
<p>Angela's bedroom door is slightly ajar. You hear her humming softly inside - some song you don't recognize.</p><p>She notices you passing and waves. "Just doing some reading before bed. Sleep well!"</p><p>It's a small moment, but domestic in a way that makes you realize how comfortable this living situation has become.</p> <<set $game_state.current_canvas = "408686ec-8fdb-4ef2-a77f-9ab302e0d271">> <<set $game_state.current_node = "603e6e4c-083d-4a7d-90f8-d258de28c063">> <<script>>setup.markCanvasTriggered("408686ec-8fdb-4ef2-a77f-9ab302e0d271");<</script>> <<script>>advanceTime(5);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 1.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Continue on->Location_The_Bedroom]]
<p>You pass her bedroom and see the door is open. Angela is just waking up, stretching in bed. She sees you and smiles sleepily.</p><p>"Come here," she murmurs, patting the bed beside her. "Just for a minute."</p> <<set $game_state.current_canvas = "93d145ac-a52d-4e82-8938-ff2a10c2b113">> <<set $game_state.current_node = "3476bb5b-cf08-4e64-b06c-6a3cb855174a">> <<script>>setup.markCanvasTriggered("93d145ac-a52d-4e82-8938-ff2a10c2b113");<</script>> <<link "Join her" "Canvas_activity_bedroom_angela_t4_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Let her rest" "Location_The_Bedroom">><<script>>advanceTime(5);<</script>><</link>><br>
<p>You slide into bed beside her. She immediately curls against you, her body warm and soft from sleep.</p><video src="media/assets/clips/clip_021_RgqBkEH.mp4" controls preload="metadata" poster="media/assets/posters/clip_021_B75Qc7k.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Your hands find each other beneath the sheets. What starts as innocent touching quickly becomes something more charged.</p><p>"We should stop," she whispers, even as her hand slides higher. "We should probably..."</p><p>Neither of you stops.</p> <<set $game_state.current_canvas = "93d145ac-a52d-4e82-8938-ff2a10c2b113">> <<set $game_state.current_node = "47c820df-e287-4bb0-9200-b11cb67b5e3f">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 4.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Eventually get up->Location_The_Bedroom]]
<p>Angela pulls you into her bedroom, closing the door behind you. Her eyes are dark with want.</p><p>"I need to taste you," she says simply. "Will you let me?"</p> <<set $game_state.current_canvas = "59586e40-6e30-4d7b-bea2-a811d40db7ac">> <<set $game_state.current_node = "4ec768ba-4db4-46ff-ae88-712500f57bc1">> <<script>>setup.markCanvasTriggered("59586e40-6e30-4d7b-bea2-a811d40db7ac");<</script>> <<link "Let her" "Canvas_activity_bedroom_angela_t6_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Taste her first" "Canvas_activity_bedroom_angela_t6_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just sleep tonight" "Location_The_Bedroom">><<script>>advanceTime(30);<</script>><</link>><br>
<p>She pushes you onto the bed and kneels between your legs, looking up at you as she takes you in her mouth.</p><video src="media/assets/clips/clip_023_DG60AWW.mp4" controls preload="metadata" poster="media/assets/posters/clip_023_dNdm6RW.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Her eyes never leave yours as she works, drawing sounds from you that you didn't know you could make.</p> <<set $game_state.current_canvas = "59586e40-6e30-4d7b-bea2-a811d40db7ac">> <<set $game_state.current_node = "eebe04be-2c0a-4993-806e-b08f82cd1e90">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Catch your breath->Location_The_Bedroom]]
<p>You lay her back on the bed and settle between her thighs. She spreads for you, trembling with anticipation.</p><video src="media/assets/clips/clip_024_ZoYEmo6.mp4" controls preload="metadata" poster="media/assets/posters/clip_024_NepHZYs.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Yes," she moans as your tongue finds her. "Right there. Don't stop." Her fingers tangle in your hair, holding you in place.</p> <<set $game_state.current_canvas = "59586e40-6e30-4d7b-bea2-a811d40db7ac">> <<set $game_state.current_node = "560ba4c7-38a2-40f5-8c8d-34775dbfee56">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Hold her as she recovers->Location_The_Bedroom]]
<p>Angela is lying in bed, the sheets barely covering her. When she sees you, she lifts them invitingly.</p><p>"I was hoping you'd come," she says. "I can't sleep without you anymore."</p> <<set $game_state.current_canvas = "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7">> <<set $game_state.current_node = "70e47c55-55de-4480-8f7c-7f88afb7fc4c">> <<script>>setup.markCanvasTriggered("c2aea6f7-c494-4eb9-8ded-f436e1ea46b7");<</script>> <<link "Tender missionary" "Canvas_activity_bedroom_angela_t8_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Intense doggy" "Canvas_activity_bedroom_angela_t8_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Let her ride (cowgirl)" "Canvas_activity_bedroom_angela_t8_Node_4">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Reverse cowgirl" "Canvas_activity_bedroom_angela_t8_Node_5">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Facesitting first" "Canvas_activity_bedroom_angela_t8_Node_6">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Anal (trust)" "Canvas_activity_bedroom_angela_t8_Node_7">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just hold her tonight" "Location_The_Bedroom">><<script>>setup.pendingEffects = [];<</script>><<script>>setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, false, null);<</script>><<script>>setup.showEffectNotification();<</script>><<script>>advanceTime(60);<</script>><</link>><br>
<p>You slide into bed and cover her body with yours. She wraps her arms and legs around you as you enter her slowly.</p><video src="media/assets/clips/clip_035_QlGc0Rz.mp4" controls preload="metadata" poster="media/assets/posters/clip_035_ScyoxLM.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"I love this," she whispers against your lips. "I love being yours."</p> <<set $game_state.current_canvas = "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7">> <<set $game_state.current_node = "4ae1e07e-8b7a-4cd3-8cc4-f9b68efa52b5">> <<script>>advanceTime(90);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Fall asleep together->Location_The_Bedroom]]
<p>She rolls onto her hands and knees, looking back at you with hungry eyes. "Don't be gentle," she demands.</p><video src="media/assets/clips/clip_029_5CTH6IO.mp4" controls preload="metadata" poster="media/assets/posters/clip_029_hRwjvs3.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The headboard bangs against the wall as you give her exactly what she asked for.</p> <<set $game_state.current_canvas = "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7">> <<set $game_state.current_node = "147d796b-3849-4dbc-8824-ff90a45630be">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse exhausted->Location_The_Bedroom]]
<p>She pushes you onto your back and straddles you, sinking down slowly. Her hands press against your chest as she begins to move.</p><video src="media/assets/clips/clip_042_RCVAtAA.mp4" controls preload="metadata" poster="media/assets/posters/clip_042_AZrot7U.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"This is mine," she says, rolling her hips. "You're mine."</p> <<set $game_state.current_canvas = "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7">> <<set $game_state.current_node = "f66ec5af-fdf3-4ab4-a5de-1a5623587d66">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Let her finish->Location_The_Bedroom]]
<p>She turns around, giving you a view of her back as she rides you. Her moans fill the dark bedroom.</p><video src="media/assets/clips/clip_047_opzz6jq.mp4" controls preload="metadata" poster="media/assets/posters/clip_047_hyNScl3.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Grab my hips," she commands. "Help me."</p> <<set $game_state.current_canvas = "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7">> <<set $game_state.current_node = "316563be-ac3f-44d3-8aff-6b31c6bf5be1">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Finish together->Location_The_Bedroom]]
<p>She climbs over you and settles onto your face. "Make me come first," she orders. "Then I'll take care of you."</p><video src="media/assets/clips/clip_046_2Vak8th.mp4" controls preload="metadata" poster="media/assets/posters/clip_046_yt1bAoY.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>True to her word, after she finishes on your tongue, she slides down to return the favor in full.</p> <<set $game_state.current_canvas = "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7">> <<set $game_state.current_node = "edea899d-06b7-4856-8bec-a9448fb11c05">> <<script>>advanceTime(90);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 5.0, true, null);setup.showEffectNotification();<</script>> [[Drift off satisfied->Location_The_Bedroom]]
<p>She looks into your eyes with complete trust. "I want to give you everything," she whispers. "Every part of me."</p><video src="media/assets/clips/clip_032_LBoJaCl.mp4" controls preload="metadata" poster="media/assets/posters/clip_032_gvTuS0a.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>You go slowly, carefully. Her gasps turn to moans as she adjusts to the sensation. "Yes," she breathes. "God, yes."</p> <<set $game_state.current_canvas = "c2aea6f7-c494-4eb9-8ded-f436e1ea46b7">> <<set $game_state.current_node = "f239c87a-0e2b-4654-af72-787a77cb8a75">> <<script>>advanceTime(90);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 10.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 8.0, true, null);setup.showEffectNotification();<</script>> [[Hold her after->Location_The_Bedroom]]
<p>The sound of bubbling water draws you to the spa area. Angela is soaking in the hot tub, eyes closed, looking utterly peaceful.</p><video src="media/assets/clips/clip_000_C6yv4rI.mp4" controls preload="metadata" poster="media/assets/posters/clip_000_kNwRFry.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>She opens one eye and smiles. "This is my happy place. Best decision I ever made, getting this tub."</p><p>Steam rises around her. It's intimate without being suggestive - just two roommates sharing a peaceful moment.</p> <<set $game_state.current_canvas = "d60e1f3d-abd9-46be-9b1e-26f7b38b00f3">> <<set $game_state.current_node = "8b8461e2-d6d2-4b02-8a88-5b99f7596f8d">> <<script>>setup.markCanvasTriggered("d60e1f3d-abd9-46be-9b1e-26f7b38b00f3");<</script>> <<script>>advanceTime(15);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 1.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Leave her to relax->Location_The_Spa]]
<p>You pass the spa just as Angela is stepping out, wrapped in a towel that barely covers her. She startles when she sees you.</p><video src="media/assets/clips/clip_013_rWYbaBX.mp4" controls preload="metadata" poster="media/assets/posters/clip_013_oDziRHW.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Oh! Sorry, I didn't know you were... well." She adjusts the towel, which slips just a bit. "I'll be more careful."</p><p>But the smile on her face suggests she doesn't mind the encounter at all.</p> <<set $game_state.current_canvas = "9de6cbcc-7ee4-4605-90cf-12e2d737f080">> <<set $game_state.current_node = "d6aab639-e314-4882-a05d-0cc28fe58cb1">> <<script>>setup.markCanvasTriggered("9de6cbcc-7ee4-4605-90cf-12e2d737f080");<</script>> <<script>>advanceTime(5);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Continue on->Location_The_Spa]]
<p>Angela is soaking in the hot tub when you enter. The water comes just to her chest, but as she shifts, you catch glimpses of what lies beneath.</p><video src="media/assets/clips/clip_002_z8JIGug.mp4" controls preload="metadata" poster="media/assets/posters/clip_002_5f5VXrK.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Her hands cup her breasts beneath the surface, lifting them slightly. "The water feels amazing," she sighs. "You should join me sometime."</p> <<set $game_state.current_canvas = "042268d4-71c9-452c-b462-341515991c08">> <<set $game_state.current_node = "663600b5-ad6f-4f4a-a997-342cccaf0115">> <<script>>setup.markCanvasTriggered("042268d4-71c9-452c-b462-341515991c08");<</script>> <<link "Admire the view" "Canvas_activity_spa_angela_t3_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Give her privacy" "Location_The_Spa">><<script>>advanceTime(15);<</script>><</link>><br>
<p>You linger in the doorway, making no effort to hide your appreciation. She notices and preens under the attention.</p><p>"I don't mind you looking," she says softly. "I kind of like it."</p> <<set $game_state.current_canvas = "042268d4-71c9-452c-b462-341515991c08">> <<set $game_state.current_node = "18c49cba-8371-46d7-9a9a-1105b246248c">> <<script>>advanceTime(20);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Leave her to relax->Location_The_Spa]]
<p>You find Angela in the spa, already deep in pleasure. She sees you in the doorway and instead of stopping, she holds your gaze.</p><p>"Stay," she breathes. "Watch me."</p> <<set $game_state.current_canvas = "abeebac0-9703-4872-a7e0-4a81b52d7844">> <<set $game_state.current_node = "73fde49b-c889-4117-9414-d2abdd022b41">> <<script>>setup.markCanvasTriggered("abeebac0-9703-4872-a7e0-4a81b52d7844");<</script>> <<link "Watch her fingers" "Canvas_activity_spa_angela_t5_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Watch her with toy" "Canvas_activity_spa_angela_t5_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Watch her climax" "Canvas_activity_spa_angela_t5_Node_4">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Give her privacy" "Location_The_Spa">><<script>>advanceTime(15);<</script>><</link>><br>
<p>She leans back in the warm water, her hand sliding between her legs. Her eyes never leave yours as her fingers begin to move.</p><video src="media/assets/clips/clip_003_PhCifHX.mp4" controls preload="metadata" poster="media/assets/posters/clip_003_tPBRoqj.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"I think about you when I do this," she confesses breathlessly. "Every time."</p> <<set $game_state.current_canvas = "abeebac0-9703-4872-a7e0-4a81b52d7844">> <<set $game_state.current_node = "587ddfe6-8493-4dd0-8933-c9d3b7618435">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 5.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Leave her to finish->Location_The_Spa]]
<p>She reaches for something at the edge of the tub - a sleek toy. She brings it between her legs, watching your reaction.</p><video src="media/assets/clips/clip_005_Ri5Zyjr.mp4" controls preload="metadata" poster="media/assets/posters/clip_005_WEmSZs1.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"I imagine it's you," she moans. "I always imagine it's you."</p> <<set $game_state.current_canvas = "abeebac0-9703-4872-a7e0-4a81b52d7844">> <<set $game_state.current_node = "fbbd23ad-fb25-4b33-840b-e133eb92e513">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 5.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Leave her to finish->Location_The_Spa]]
<p>You watch as she builds toward her peak, her body arching in the water, her moans echoing off the tiles.</p><video src="media/assets/clips/clip_004_eDisQ5i.mp4" controls preload="metadata" poster="media/assets/posters/clip_004_HfqEv75.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>She cries out your name as she comes, looking directly at you. The intimacy is almost overwhelming.</p> <<set $game_state.current_canvas = "abeebac0-9703-4872-a7e0-4a81b52d7844">> <<set $game_state.current_node = "d81202fd-8f3c-40e1-b47a-4d4e3599ae34">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Let her recover->Location_The_Spa]]
<p>Angela is on the couch watching TV when you come in. She looks up with a friendly smile and shifts to make room.</p><p>"Want to watch something? I can't decide between a thriller and a rom-com."</p><p>You settle onto the couch beside her. It's comfortable. Easy. Though you're acutely aware of how close she is.</p> <<set $game_state.current_canvas = "0d0f5574-d806-48be-a888-830d19ce4db0">> <<set $game_state.current_node = "8633c26d-2e71-446d-9bf9-d24e3757c4bb">> <<script>>setup.markCanvasTriggered("0d0f5574-d806-48be-a888-830d19ce4db0");<</script>> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Watch TV together->Location_The_Living_Room]]
<p>Angela stretches out on the couch like a cat, her thin clothes leaving little to imagination. She catches you looking and doesn't look away.</p><video src="media/assets/clips/clip_004_6xDdcPZ.mp4" controls preload="metadata" poster="media/assets/posters/clip_004_8ah6ujh.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Come sit with me," she says, patting the cushion beside her. "I promise I don't bite." She pauses. "Unless you want me to."</p> <<set $game_state.current_canvas = "5caa7e6c-88ef-4cc1-9ff1-f00a3098aea1">> <<set $game_state.current_node = "e46a9aad-3da2-4cab-a4e3-403b8846ce4f">> <<script>>setup.markCanvasTriggered("5caa7e6c-88ef-4cc1-9ff1-f00a3098aea1");<</script>> <<link "Sit close to her" "Canvas_activity_living_angela_t3_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Keep a safe distance" "Location_The_Living_Room">><<script>>advanceTime(45);<</script>><</link>><br>
<p>You settle beside her, and she immediately shifts closer, her thigh pressing against yours. The contact sends electricity through you both.</p><p>"This is nice," she murmurs. "Having someone to share evenings with."</p><p>Her hand finds yours, fingers intertwining. It's innocent enough. But the look in her eyes promises more.</p> <<set $game_state.current_canvas = "5caa7e6c-88ef-4cc1-9ff1-f00a3098aea1">> <<set $game_state.current_node = "a79cadb7-a37a-47c4-8bc1-9a69007c3ecf">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Enjoy the evening->Location_The_Living_Room]]
<p>Angela pulls you down onto the couch beside her, her hand immediately finding your thigh. The movie plays unwatched.</p><p>"I can't focus on anything when you're this close," she admits, her hand sliding higher.</p> <<set $game_state.current_canvas = "12b69442-f78c-4046-babd-922615b4887a">> <<set $game_state.current_node = "37aa53a7-5d9d-42ab-a705-3d55229e7748">> <<script>>setup.markCanvasTriggered("12b69442-f78c-4046-babd-922615b4887a");<</script>> <<link "Let her continue" "Canvas_activity_living_angela_t6_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Return the attention" "Canvas_activity_living_angela_t6_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just enjoy the movie" "Location_The_Living_Room">><<script>>advanceTime(60);<</script>><</link>><br>
<p>Her hand finds you through your pants, stroking slowly. Then she slides off the couch to kneel between your legs.</p><video src="media/assets/clips/clip_063_QpkKjYv.mp4" controls preload="metadata" poster="media/assets/posters/clip_063_7JA3Sj5.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"I've been thinking about this all day," she murmurs before taking you in her mouth.</p> <<set $game_state.current_canvas = "12b69442-f78c-4046-babd-922615b4887a">> <<set $game_state.current_node = "152d1d0d-2603-4fdd-8f9e-374cdb4162a0">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Catch your breath->Location_The_Living_Room]]
<p>You push her back against the cushions and slide down between her legs. She spreads for you willingly.</p><video src="media/assets/clips/clip_029_fgXl81g.mp4" controls preload="metadata" poster="media/assets/posters/clip_029_chfLLvY.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Yes," she gasps as your tongue finds her. "God, yes. Right there."</p> <<set $game_state.current_canvas = "12b69442-f78c-4046-babd-922615b4887a">> <<set $game_state.current_node = "5d2a7b42-a6d0-4610-a78e-94d32daabc2e">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Hold her as she recovers->Location_The_Living_Room]]
<p>Angela is curled up on the white couch, wine glass in hand. The TV plays softly in the background, but her attention is entirely on you as you enter.</p><p>She sets down her glass and pats the cushion beside her. "Come here. I've been waiting for you."</p><p>There's no pretense anymore. You both know exactly where this evening is going.</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "eddc2da4-d8fa-413e-bc24-4abb4182f477">> <<script>>setup.markCanvasTriggered("adae663c-4a9d-4e4c-93a6-a42c1d80bf3d");<</script>> <<link "Missionary" "Canvas_activity_living_angela_t8_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Doggy Style" "Canvas_activity_living_angela_t8_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Cowgirl" "Canvas_activity_living_angela_t8_Node_4">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Reverse Cowgirl" "Canvas_activity_living_angela_t8_Node_5">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Prone Bone" "Canvas_activity_living_angela_t8_Node_6">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Facesitting" "Canvas_activity_living_angela_t8_Node_7">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Spooning" "Canvas_activity_living_angela_t8_Node_8">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just cuddle tonight" "Location_The_Living_Room">><<script>>advanceTime(60);<</script>><</link>><br>
<p>You lower her onto the soft cushions, settling between her thighs. She pulls you down into a deep kiss as you enter her slowly.</p><video src="media/assets/clips/clip_026_LHarsqi.mp4" controls preload="metadata" poster="media/assets/posters/clip_026_TXOmSIw.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"I love seeing your face," she whispers. "I love watching you want me."</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "9a699c63-7435-4bb9-b442-d310a3e7189b">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Living_Room]]
<p>She turns and braces herself against the arm of the couch, looking back at you with hungry eyes. "Take me," she demands.</p><video src="media/assets/clips/clip_050_hZy0y9o.mp4" controls preload="metadata" poster="media/assets/posters/clip_050_9zXixNC.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Her moans fill the room as you give her exactly what she asked for.</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "e183e3d0-c4dc-4d66-9276-5271eaf110c6">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Living_Room]]
<p>She pushes you back against the cushions and climbs on top, taking control. Her hips begin to move in a rhythm that makes your head spin.</p><video src="media/assets/clips/clip_041_Gw7DjAy.mp4" controls preload="metadata" poster="media/assets/posters/clip_041_9cz1ZqQ.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Watch me," she breathes. "Watch me take what I want."</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "79365dea-10f1-4df1-87d2-be10c39a005e">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Living_Room]]
<p>She turns around on your lap, giving you a view that takes your breath away. Her back arches as she rides you.</p><video src="media/assets/clips/clip_034_MUcyxhR.mp4" controls preload="metadata" poster="media/assets/posters/clip_034_FkXuCKR.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Your hands find her hips, guiding her movements as pleasure builds.</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "d91cd744-cc4c-448f-9790-411c7d0d484d">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Living_Room]]
<p>She lies flat on her stomach across the couch, and you cover her body with yours. The position is intimate, intense, impossibly deep.</p><video src="media/assets/clips/clip_059_2tJFXcG.mp4" controls preload="metadata" poster="media/assets/posters/clip_059_2GRuFQb.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"God, yes," she moans into the cushion. "Just like that. Don't stop."</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "d1f0e95e-73ac-42d7-89f8-d68d44e4eec6">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Living_Room]]
<p>She pushes you down and straddles your face, looking down at you with a wicked smile. "Make me come first," she orders.</p><video src="media/assets/clips/clip_032_mDn1Zng.mp4" controls preload="metadata" poster="media/assets/posters/clip_032_V2I9G37.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Her thighs tremble around your ears as you worship her.</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "50aa7027-d08f-4d68-b99b-8978988053b0">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Continue to more->Location_The_Living_Room]]
<p>You curl up behind her on the couch, entering her slowly from behind. It's intimate, unhurried, deeply connected.</p><video src="media/assets/clips/clip_028_rjIa1NC.mp4" controls preload="metadata" poster="media/assets/posters/clip_028_ZBe7wjX.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"I love this," she whispers. "I love being this close to you."</p> <<set $game_state.current_canvas = "adae663c-4a9d-4e4c-93a6-a42c1d80bf3d">> <<set $game_state.current_node = "81d3f960-b92e-4b37-b065-6b8ba62dfa8e">> <<script>>advanceTime(90);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 6.0, true, null);setup.showEffectNotification();<</script>> [[Drift off together->Location_The_Living_Room]]
<p>Angela is in the kitchen making coffee when you walk in. She looks up with a warm smile.</p><video src="media/assets/clips/clip_001_acK805G.mp4" controls preload="metadata" poster="media/assets/posters/clip_001_zYkvSde.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Morning! Coffee's fresh. I made extra because, honestly, I can't function on just one cup."</p><p>She hands you a mug, her fingers brushing yours briefly. Is it your imagination, or did that touch linger?</p> <<set $game_state.current_canvas = "6b100a51-9368-42a7-8912-0b5f00fd6504">> <<set $game_state.current_node = "e37c4e4f-ca7f-4b3b-a176-d36e6e8a7043">> <<script>>setup.markCanvasTriggered("6b100a51-9368-42a7-8912-0b5f00fd6504");<</script>> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Finish coffee->Location_The_Kitchen]]
<p>Angela is eating a strawberry when you walk in, her lips closing around the red fruit in a way that's impossible not to notice. She catches your eye and smiles knowingly.</p><video src="media/assets/clips/clip_003_BDZheSh.mp4" controls preload="metadata" poster="media/assets/posters/clip_003_5wprDRh.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>"Want one?" she offers, holding out the fruit bowl. Her robe has slipped off one shoulder.</p> <<set $game_state.current_canvas = "979fad8d-4232-4bea-929c-65efb9216466">> <<set $game_state.current_node = "0e9e9f02-3a68-4293-aa5b-4fb2fbe12d0d">> <<script>>setup.markCanvasTriggered("979fad8d-4232-4bea-929c-65efb9216466");<</script>> <<link "Flirt back" "Canvas_activity_kitchen_angela_t3_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just enjoy coffee" "Location_The_Kitchen">><<script>>advanceTime(30);<</script>><</link>><br>
<p>You take a strawberry from her fingers, letting your touch linger. "You're doing that on purpose," you say.</p><p>"Doing what?" she asks innocently, licking juice from her lip.</p><p>"You know exactly what."</p><p>Her smile widens. "Maybe I do."</p> <<set $game_state.current_canvas = "979fad8d-4232-4bea-929c-65efb9216466">> <<set $game_state.current_node = "363b373a-a90a-4fb5-8eb9-6d49a261b416">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 1.0, true, null);setup.showEffectNotification();<</script>> [[Finish breakfast->Location_The_Kitchen]]
<p>Angela is reaching for the top shelf when you enter. Her thin tank top rides up, revealing a strip of bare skin. She catches you looking and doesn't pull it down.</p><p>"Good morning," she says, her voice dropping an octave. "Need help with anything?"</p> <<set $game_state.current_canvas = "d75afe3d-e78e-4029-a7a3-21f07cced03f">> <<set $game_state.current_node = "89b0e898-16ba-488f-88e8-c9840ecb4e59">> <<script>>setup.markCanvasTriggered("d75afe3d-e78e-4029-a7a3-21f07cced03f");<</script>> <<link "Tease her" "Canvas_activity_kitchen_angela_t4_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Help her reach (get close)" "Canvas_activity_kitchen_angela_t4_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just enjoy coffee" "Location_The_Kitchen">><<script>>advanceTime(30);<</script>><</link>><br>
<p>"The view from here is pretty good," you say, making no effort to hide where you're looking.</p><p>She turns slowly, a smile playing at her lips. "Is it now?"</p> <<set $game_state.current_canvas = "d75afe3d-e78e-4029-a7a3-21f07cced03f">> <<set $game_state.current_node = "8bbe4817-a99e-4553-878a-adf5349127c6">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Finish coffee->Location_The_Kitchen]]
<p>You step behind her, reaching up to help. Your body presses against hers, and neither of you moves away.</p><p>Her breath catches as your hand lingers at her waist. "We keep ending up like this," she whispers.</p><p>"Do you want me to stop?" you ask against her ear.</p><p>"No," she breathes. "I really don't."</p> <<set $game_state.current_canvas = "d75afe3d-e78e-4029-a7a3-21f07cced03f">> <<set $game_state.current_node = "c0a9fa40-5cd9-4aaf-bff0-672f034a4a42">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 4.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Pull away reluctantly->Location_The_Kitchen]]
<p>Angela looks up from her coffee as you enter, her eyes immediately dropping to your lips. There's a heat in her gaze that wasn't there before.</p><p>"I had a dream about you last night," she says softly. "About what I want to do to you."</p> <<set $game_state.current_canvas = "31f245bb-2d4d-4bed-98c5-746e3b3b9bce">> <<set $game_state.current_node = "4f543f72-8b20-4c6b-acca-ec96b967622a">> <<script>>setup.markCanvasTriggered("31f245bb-2d4d-4bed-98c5-746e3b3b9bce");<</script>> <<link "Tease her" "Canvas_activity_kitchen_angela_t6_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Pull her close" "Canvas_activity_kitchen_angela_t6_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Let her show you" "Canvas_activity_kitchen_angela_t6_Node_4">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Return the favor" "Canvas_activity_kitchen_angela_t6_Node_5">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just enjoy coffee" "Location_The_Kitchen">><<script>>advanceTime(30);<</script>><</link>><br>
<p>"Tell me about this dream," you say, leaning against the counter with a knowing smile.</p><p>She blushes deeply but holds your gaze. "Maybe I'd rather show you."</p> <<set $game_state.current_canvas = "31f245bb-2d4d-4bed-98c5-746e3b3b9bce">> <<set $game_state.current_node = "dbd25f4d-9fc6-4748-ab77-4d8cf2e406f5">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Finish coffee->Location_The_Kitchen]]
<p>You set down your mug and pull her into your arms. She fits perfectly against you, her breath catching as your hands explore.</p><p>"I can't stop thinking about your hands on me," she whispers.</p> <<set $game_state.current_canvas = "31f245bb-2d4d-4bed-98c5-746e3b3b9bce">> <<set $game_state.current_node = "f76dce5d-1d90-4727-a369-7067ad53a4be">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 4.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Finish coffee->Location_The_Kitchen]]
<p>Angela sets down her coffee and sinks gracefully to her knees, looking up at you with desire-darkened eyes.</p><p>"I've been thinking about this all morning," she breathes.</p><video src="media/assets/clips/clip_014_KX4hWAC.mp4" controls preload="metadata" poster="media/assets/posters/clip_014_4aUScJV.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The coffee maker beeps forgotten in the background.</p> <<set $game_state.current_canvas = "31f245bb-2d4d-4bed-98c5-746e3b3b9bce">> <<set $game_state.current_node = "4b3e77fc-466f-4a80-954e-b3fe63f2f008">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Catch your breath->Location_The_Kitchen]]
<p>You lift her onto the counter, stepping between her legs. She gasps as you kneel before her, pushing her robe aside.</p><p>"Oh god," she moans as your mouth finds her. "Yes... right there..."</p><video src="media/assets/clips/clip_010_ZLHFGIs.mp4" controls preload="metadata" poster="media/assets/posters/clip_010_ppxAQhn.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Her fingers tangle in your hair as she comes undone.</p> <<set $game_state.current_canvas = "31f245bb-2d4d-4bed-98c5-746e3b3b9bce">> <<set $game_state.current_node = "a7ca2bc0-cca4-406d-8b56-92bf99e5d2e8">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Help her down->Location_The_Kitchen]]
<p>Angela is in the kitchen, the coffee maker gurgling behind her. She's wearing a thin robe that leaves little to the imagination. When she sees you, her eyes light up with unmistakable hunger.</p><p>"Morning, handsome," she purrs, setting down her mug. "I was just thinking about you."</p> <<set $game_state.current_canvas = "90bbf862-b0d7-4c67-a339-8a3c7ba1d745">> <<set $game_state.current_node = "89fe00a4-e851-4b49-bf2e-84c48b04e843">> <<script>>setup.markCanvasTriggered("90bbf862-b0d7-4c67-a339-8a3c7ba1d745");<</script>> <<link "Tease her" "Canvas_activity_kitchen_angela_t8_Node_2">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Pull her close" "Canvas_activity_kitchen_angela_t8_Node_3">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Kiss her deeply" "Canvas_activity_kitchen_angela_t8_Node_4">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Bend her over the counter" "Canvas_activity_kitchen_angela_t8_Node_5">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Lift her onto the table" "Canvas_activity_kitchen_angela_t8_Node_6">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Take her standing" "Canvas_activity_kitchen_angela_t8_Node_7">><<script>>advanceTime(3);<</script>><</link>><br> <<link "Just enjoy coffee" "Location_The_Kitchen">><<script>>advanceTime(30);<</script>><</link>><br>
<p>You let your gaze travel slowly down her body, making no effort to hide your appreciation. She squirms under the attention, biting her lip.</p><p>"You're staring," she breathes.</p><p>"I know," you reply. "I like what I see."</p> <<set $game_state.current_canvas = "90bbf862-b0d7-4c67-a339-8a3c7ba1d745">> <<set $game_state.current_node = "eaadf48b-29c0-401b-aded-a2ac8b456f5d">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Finish coffee->Location_The_Kitchen]]
<p>You step forward and pull her against you, your hands finding her waist beneath the thin robe. She gasps, melting into your touch.</p><p>"God, I love when you do that," she whispers against your neck.</p> <<set $game_state.current_canvas = "90bbf862-b0d7-4c67-a339-8a3c7ba1d745">> <<set $game_state.current_node = "32d706cc-ea3f-4725-b2e2-2f3f91807127">> <<script>>advanceTime(30);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 4.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 2.0, true, null);setup.showEffectNotification();<</script>> [[Finish coffee->Location_The_Kitchen]]
<p>Your kiss deepens, hungry and demanding. Without breaking contact, she sinks to her knees on the kitchen floor, looking up at you with desire-darkened eyes.</p><video src="media/assets/clips/clip_014_KX4hWAC.mp4" controls preload="metadata" poster="media/assets/posters/clip_014_4aUScJV.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The coffee goes cold as she shows you exactly how much she's been thinking about you.</p> <<set $game_state.current_canvas = "90bbf862-b0d7-4c67-a339-8a3c7ba1d745">> <<set $game_state.current_node = "fe5d2e71-a69e-464f-a799-69616e90000a">> <<script>>advanceTime(45);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 6.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 3.0, true, null);setup.showEffectNotification();<</script>> [[Catch your breath->Location_The_Kitchen]]
<p>You spin her around and bend her over the kitchen counter. Her robe falls open as she braces herself, looking back at you with pure need.</p><p>"Yes," she moans. "Right here. Don't make me wait."</p><video src="media/assets/clips/clip_009_xSHCvKz.mp4" controls preload="metadata" poster="media/assets/posters/clip_009_sohrZP0.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The morning sun streams through the window as you take her right there in the kitchen.</p> <<set $game_state.current_canvas = "90bbf862-b0d7-4c67-a339-8a3c7ba1d745">> <<set $game_state.current_node = "13cea13c-f2d8-4ab9-b829-e6231b6c9859">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Kitchen]]
<p>You lift her onto the kitchen table, sweeping aside the morning paper. She wraps her legs around you, pulling you closer.</p><p>"I need you inside me," she demands breathlessly.</p><video src="media/assets/clips/clip_009_xSHCvKz.mp4" controls preload="metadata" poster="media/assets/posters/clip_009_sohrZP0.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>Breakfast can wait. This can't.</p> <<set $game_state.current_canvas = "90bbf862-b0d7-4c67-a339-8a3c7ba1d745">> <<set $game_state.current_node = "74a56209-bf6c-440b-982d-9a34e9fb2ca8">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Kitchen]]
<p>You press her against the refrigerator, lifting her effortlessly. Magnets scatter to the floor as she wraps herself around you.</p><p>"Oh god," she gasps as you enter her. "Don't stop. Don't ever stop."</p><video src="media/assets/clips/clip_009_xSHCvKz.mp4" controls preload="metadata" poster="media/assets/posters/clip_009_sohrZP0.jpg" style="max-width:100%;height:auto;border-radius:8px;"></video><p>The fridge hums against her back as you lose yourselves in each other.</p> <<set $game_state.current_canvas = "90bbf862-b0d7-4c67-a339-8a3c7ba1d745">> <<set $game_state.current_node = "ef278ce9-5168-4fbd-b30f-2906e00020eb">> <<script>>advanceTime(60);<</script>> <<script>>setup.pendingEffects = [];setup.applyAndNotifyTrait("npc", "npc_angela", "desire", "add", 8.0, true, null);setup.applyAndNotifyTrait("npc", "npc_angela", "affection", "add", 4.0, true, null);setup.showEffectNotification();<</script>> [[Collapse together->Location_The_Kitchen]]
<h2>Missing Media Files</h2> <p>No missing media files found.</p> <<link "← Back" "previous()">><</link>>