From 13f71baa82764928e6fbb11cabdd7b7fb970bcf1 Mon Sep 17 00:00:00 2001 From: "Z. Cliffe Schreuders" Date: Thu, 6 Nov 2025 00:54:08 +0000 Subject: [PATCH] feat(ui): Update font sizes for dialogue and speaker name for improved readability --- css/person-chat-minigame.css | 8 +- .../person-chat/person-chat-ui-old.js | 338 ------------------ scenarios/ink/generic-npc.ink.json | 1 - scenarios/ink/helper-npc.ink.json | 1 - 4 files changed, 4 insertions(+), 344 deletions(-) delete mode 100644 js/minigames/person-chat/person-chat-ui-old.js delete mode 100644 scenarios/ink/generic-npc.ink.json delete mode 100644 scenarios/ink/helper-npc.ink.json diff --git a/css/person-chat-minigame.css b/css/person-chat-minigame.css index 2f59616..093f7f3 100644 --- a/css/person-chat-minigame.css +++ b/css/person-chat-minigame.css @@ -103,7 +103,7 @@ /* Speaker name */ .person-chat-speaker-name { - font-size: 14px; + font-size: 20px; font-weight: bold; padding-bottom: 8px; border-bottom: 2px solid #333; @@ -132,7 +132,7 @@ } .person-chat-dialogue-text { - font-size: 16px; + font-size: 20px; line-height: 1.5; color: #fff; margin: 0; @@ -164,7 +164,7 @@ color: #fff; border: 2px solid #555; padding: 10px 15px; - font-size: 13px; + font-size: 18px; cursor: pointer; text-align: left; transition: all 0.1s ease; @@ -194,7 +194,7 @@ color: #4eff4a; border: 2px solid #555; padding: 12px 15px; - font-size: 13px; + font-size: 18px; font-weight: bold; cursor: pointer; text-align: center; diff --git a/js/minigames/person-chat/person-chat-ui-old.js b/js/minigames/person-chat/person-chat-ui-old.js deleted file mode 100644 index f285ea3..0000000 --- a/js/minigames/person-chat/person-chat-ui-old.js +++ /dev/null @@ -1,338 +0,0 @@ -/** - * PersonChatUI - UI Component for Person-Chat Minigame - * - * Handles rendering of conversation interface with: - * - Zoomed portrait displays (NPC left, player right) - * - Dialogue text box - * - Choice buttons - * - Pixel-art styling - * - * @module person-chat-ui - */ - -import PersonChatPortraits from './person-chat-portraits.js'; - -export default class PersonChatUI { - /** - * Create UI component - * @param {HTMLElement} container - Container for UI - * @param {Object} params - Configuration (game, npc, playerSprite) - * @param {NPCManager} npcManager - NPC manager for sprite access - */ - constructor(container, params, npcManager) { - this.container = container; - this.params = params; - this.npcManager = npcManager; - this.game = params.game; - this.npc = params.npc; - this.playerSprite = params.playerSprite; - - // UI elements - this.elements = { - root: null, - portraitsContainer: null, - npcPortraitContainer: null, - playerPortraitContainer: null, - dialogueBox: null, - dialogueText: null, - choicesContainer: null, - speakerName: null - }; - - // Portrait renderers - this.npcPortrait = null; - this.playerPortrait = null; - - // State - this.currentSpeaker = null; // 'npc' or 'player' - - console.log('πŸ“± PersonChatUI created'); - } - - /** - * Render the complete UI structure - */ - render() { - try { - this.container.innerHTML = ''; - - // Create root container - this.elements.root = document.createElement('div'); - this.elements.root.className = 'person-chat-root'; - - // Create portraits and dialogue sections (integrated) - this.createConversationLayout(); - - // Create choices section (right side) - this.createChoicesSection(); - - // Add to container - this.container.appendChild(this.elements.root); - - // Initialize portrait renderers - this.initializePortraits(); - - console.log('βœ… PersonChatUI rendered'); - } catch (error) { - console.error('❌ Error rendering UI:', error); - } - } - - /** - * Create conversation layout with portraits and dialogue areas - */ - createConversationLayout() { - const portraitsContainer = document.createElement('div'); - portraitsContainer.className = 'person-chat-portraits-container'; - - // NPC section (left) - portrait + dialogue - const npcSection = this.createCharacterSection('npc', this.npc?.displayName || 'NPC'); - this.elements.npcPortraitSection = npcSection.section; - this.elements.npcPortraitContainer = npcSection.portraitContainer; - this.elements.npcDialogueSection = npcSection.dialogueSection; - - // Player section (right) - portrait + dialogue - const playerSection = this.createCharacterSection('player', 'You'); - this.elements.playerPortraitSection = playerSection.section; - this.elements.playerPortraitContainer = playerSection.portraitContainer; - this.elements.playerDialogueSection = playerSection.dialogueSection; - - // Add both sections - portraitsContainer.appendChild(npcSection.section); - portraitsContainer.appendChild(playerSection.section); - - this.elements.root.appendChild(portraitsContainer); - this.elements.portraitsContainer = portraitsContainer; - } - - /** - * Create a character section (portrait + dialogue) - * @param {string} type - 'npc' or 'player' - * @param {string} displayName - Character's display name - * @returns {Object} Elements created - */ - createCharacterSection(type, displayName) { - const section = document.createElement('div'); - section.className = `person-chat-portrait-section ${type}-portrait-section`; - - // Label - const label = document.createElement('div'); - label.className = `person-chat-portrait-label ${type}-label`; - label.textContent = displayName; - - // Portrait container - const portraitContainer = document.createElement('div'); - portraitContainer.className = 'person-chat-portrait-canvas-container'; - portraitContainer.id = `${type}-portrait-container`; - - // Dialogue section (below portrait) - const dialogueSection = document.createElement('div'); - dialogueSection.className = 'person-chat-dialogue-section'; - dialogueSection.style.display = 'none'; // Hidden by default - - const speakerName = document.createElement('div'); - speakerName.className = 'person-chat-speaker-name'; - speakerName.textContent = displayName; - - const dialogueBox = document.createElement('div'); - dialogueBox.className = 'person-chat-dialogue-box'; - - const dialogueText = document.createElement('p'); - dialogueText.className = 'person-chat-dialogue-text'; - dialogueText.id = `${type}-dialogue-text`; - - dialogueBox.appendChild(dialogueText); - dialogueSection.appendChild(speakerName); - dialogueSection.appendChild(dialogueBox); - - // Assemble section - section.appendChild(label); - section.appendChild(portraitContainer); - section.appendChild(dialogueSection); - - return { - section, - portraitContainer, - dialogueSection, - dialogueText - }; - } - - /** - * Create choices section (right side) - */ - createChoicesSection() { - const choicesContainer = document.createElement('div'); - choicesContainer.className = 'person-chat-choices-container'; - choicesContainer.id = 'choices-container'; - choicesContainer.style.display = 'none'; // Hidden until choices available - - this.elements.root.appendChild(choicesContainer); - this.elements.choicesContainer = choicesContainer; - } - - /** - * Initialize portrait renderers - */ - initializePortraits() { - try { - if (!this.game || !this.npc) { - console.warn('⚠️ Missing game or NPC, skipping portrait initialization'); - return; - } - - // Initialize NPC portrait - if (this.npc._sprite) { - this.npcPortrait = new PersonChatPortraits( - this.game, - this.npc, - this.elements.npcPortraitContainer - ); - this.npcPortrait.init(); - } else { - console.warn(`⚠️ NPC ${this.npc.id} has no sprite reference`); - } - - // Initialize player portrait (if player sprite exists) - if (this.playerSprite) { - // Create a pseudo-NPC object for player portrait - const playerNPC = { - id: 'player', - displayName: 'You', - _sprite: this.playerSprite - }; - - this.playerPortrait = new PersonChatPortraits( - this.game, - playerNPC, - this.elements.playerPortraitContainer - ); - this.playerPortrait.init(); - } - - console.log('βœ… Portraits initialized'); - } catch (error) { - console.error('❌ Error initializing portraits:', error); - } - } - - /** - * Display dialogue text - * @param {string} text - Dialogue text - * @param {string} speaker - Speaker name ('npc' or 'player') - */ - showDialogue(text, speaker = 'npc') { - this.currentSpeaker = speaker; - - // Hide both dialogue sections first - if (this.elements.npcDialogueSection) { - this.elements.npcDialogueSection.style.display = 'none'; - } - if (this.elements.playerDialogueSection) { - this.elements.playerDialogueSection.style.display = 'none'; - } - - // Remove active speaker class from both - if (this.elements.npcPortraitSection) { - this.elements.npcPortraitSection.classList.remove('active-speaker'); - } - if (this.elements.playerPortraitSection) { - this.elements.playerPortraitSection.classList.remove('active-speaker'); - } - - // Show dialogue in the correct section - if (speaker === 'npc' && this.elements.npcDialogueSection) { - const dialogueText = this.elements.npcDialogueSection.querySelector('.person-chat-dialogue-text'); - if (dialogueText) { - dialogueText.textContent = text; - } - this.elements.npcDialogueSection.style.display = 'flex'; - this.elements.npcPortraitSection.classList.add('active-speaker'); - } else if (speaker === 'player' && this.elements.playerDialogueSection) { - const dialogueText = this.elements.playerDialogueSection.querySelector('.person-chat-dialogue-text'); - if (dialogueText) { - dialogueText.textContent = text; - } - this.elements.playerDialogueSection.style.display = 'flex'; - this.elements.playerPortraitSection.classList.add('active-speaker'); - } - } - - /** - * Display choice buttons - * @param {Array} choices - Array of choice objects {text, index} - */ - showChoices(choices) { - if (!this.elements.choicesContainer) { - return; - } - - // Clear existing choices - this.elements.choicesContainer.innerHTML = ''; - - if (!choices || choices.length === 0) { - this.elements.choicesContainer.style.display = 'none'; - return; - } - - // Show choices container - this.elements.choicesContainer.style.display = 'flex'; - - // Create button for each choice - choices.forEach((choice, idx) => { - const choiceButton = document.createElement('button'); - choiceButton.className = 'person-chat-choice-button'; - choiceButton.dataset.index = idx; - choiceButton.textContent = choice.text; - - this.elements.choicesContainer.appendChild(choiceButton); - }); - - console.log(`βœ… Displayed ${choices.length} choices`); - } - - /** - * Hide choices - */ - hideChoices() { - if (this.elements.choicesContainer) { - this.elements.choicesContainer.innerHTML = ''; - } - } - - /** - * Clear dialogue - */ - clearDialogue() { - if (this.elements.dialogueText) { - this.elements.dialogueText.textContent = ''; - } - if (this.elements.speakerName) { - this.elements.speakerName.textContent = ''; - } - } - - /** - * Cleanup UI and resources - */ - destroy() { - try { - // Stop portrait updates - if (this.npcPortrait) { - this.npcPortrait.destroy(); - } - if (this.playerPortrait) { - this.playerPortrait.destroy(); - } - - // Clear container - if (this.container) { - this.container.innerHTML = ''; - } - - console.log('βœ… PersonChatUI destroyed'); - } catch (error) { - console.error('❌ Error destroying UI:', error); - } - } -} diff --git a/scenarios/ink/generic-npc.ink.json b/scenarios/ink/generic-npc.ink.json deleted file mode 100644 index 96cbb2e..0000000 --- a/scenarios/ink/generic-npc.ink.json +++ /dev/null @@ -1 +0,0 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["ev",{"VAR?":"conversation_count"},1,"+",{"VAR=":"conversation_count","re":true},"/ev","ev",{"VAR?":"npc_name"},"out","/ev","^: Hey there! This is conversation ","#","ev",{"VAR?":"conversation_count"},"out","/ev","^.","/#","\n","ev",{"VAR?":"npc_name"},"out","/ev","^: What can I help you with?","\n",{"->":"hub"},null],"hub":[["ev",{"VAR?":"asked_question"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n",["ev",{"^->":"hub.0.4.b.1.$r1"},{"temp=":"$r"},"str",{"->":".^.s"},[{"#n":"$r1"}],"/str","str","^Introduce yourself","/str","/ev",{"*":".^.^.c-0","flg":22},{"s":["^once ",{"->":"$r","var":true},null]}],{"->":"hub.0.5"},{"c-0":["ev",{"^->":"hub.0.4.b.c-0.$r2"},"/ev",{"temp=":"$r"},{"->":".^.^.1.s"},[{"#n":"$r2"}],"\n","ev","str","^Nice to meet you!","/str","/ev",{"VAR=":"npc_name","re":true},{"->":"introduction"},{"#f":5}]}]}],"nop","\n","ev",{"VAR?":"asked_question"},"/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Remind me about that question","/str","/ev",{"*":".^.c-0","flg":4},{"->":"hub.0.12"},{"c-0":["\n",{"->":"question_reminder"},null]}]}],[{"->":".^.b"},{"b":["\n","ev","str","^Ask a question","/str","/ev",{"*":".^.c-0","flg":4},{"->":"hub.0.12"},{"c-0":["\n",{"->":"question"},null]}]}],"nop","\n","ev",{"VAR?":"asked_about_passwords"},"/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Tell me more about passwords","/str","/ev",{"*":".^.c-0","flg":4},{"->":"hub.0.19"},{"c-0":["\n",{"->":"passwords_advanced"},null]}]}],[{"->":".^.b"},{"b":["\n","ev","str","^Ask about password security","/str","/ev",{"*":".^.c-0","flg":4},{"->":"hub.0.19"},{"c-0":["\n",{"->":"ask_passwords"},null]}]}],"nop","\n","ev","str","^Say hello","/str","/ev",{"*":".^.c-0","flg":4},"ev","str","^Leave","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n",{"->":"greeting"},null],"c-1":["^ ","#","^exit_conversation","/#","\n","ev",{"VAR?":"npc_name"},"out","/ev","^: See you later!","\n",{"->":"hub"},null]}],null],"introduction":["ev",{"VAR?":"npc_name"},"out","/ev","^: Nice to meet you too! I'm ","ev",{"VAR?":"npc_name"},"out","/ev","^.","\n","ev",{"VAR?":"npc_name"},"out","/ev","^: Feel free to ask me anything.","\n",{"->":"hub"},null],"ask_passwords":["ev",true,"/ev",{"VAR=":"asked_about_passwords","re":true},"ev",{"VAR?":"npc_name"},"out","/ev","^: Passwords should be long and complex...","\n","ev",{"VAR?":"npc_name"},"out","/ev","^: Use at least 12 characters with mixed case and numbers.","\n",{"->":"hub"},null],"question_reminder":["ev",{"VAR?":"npc_name"},"out","/ev","^: As I said before, passwords should be strong and unique.","\n","ev",{"VAR?":"npc_name"},"out","/ev","^: Anything else?","\n",{"->":"hub"},null],"passwords_advanced":["ev",{"VAR?":"npc_name"},"out","/ev","^: For advanced security, use a password manager to generate unique passwords for each site.","\n","ev",{"VAR?":"npc_name"},"out","/ev","^: Never reuse passwords across different services.","\n",{"->":"hub"},null],"question":["ev",{"VAR?":"npc_name"},"out","/ev","^: That's a good question. Let me think about it...","\n","ev",{"VAR?":"npc_name"},"out","/ev","^: I'm not sure I have all the answers right now.","\n",{"->":"hub"},null],"greeting":["ev",{"VAR?":"npc_name"},"out","/ev","^: Hello to you too! Nice to chat with you.","\n",{"->":"hub"},null],"global decl":["ev","str","^NPC","/str",{"VAR=":"npc_name"},0,{"VAR=":"conversation_count"},false,{"VAR=":"asked_question"},false,{"VAR=":"asked_about_passwords"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/scenarios/ink/helper-npc.ink.json b/scenarios/ink/helper-npc.ink.json deleted file mode 100644 index 7b7c828..0000000 --- a/scenarios/ink/helper-npc.ink.json +++ /dev/null @@ -1 +0,0 @@ -{"inkVersion":21,"root":[[["done",{"#n":"g-0"}],null],"done",{"start":["^Hey there! I'm here to help you out if you need it. πŸ‘‹","\n","^What can I do for you?","\n","ev",true,"/ev",{"VAR=":"has_greeted","re":true},{"->":"hub"},null],"hub":[["ev","str","^Who are you?","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Thanks, I'm good for now.","/str","/ev",{"*":".^.c-1","flg":4},{"c-0":["\n","ev",true,"/ev",{"VAR=":"asked_about_self","re":true},{"->":"who_are_you"},"ev",{"CNT?":".^"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Remind me, who are you?","/str","/ev",{"*":".^.c-0","flg":4},{"->":".^.^.^.11"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"asked_about_self","re":true},{"->":"who_are_you"},null]}]}],"nop","\n","ev",{"VAR?":"has_unlocked_ceo"},"/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Any other doors you need help with?","/str","/ev",{"*":".^.c-0","flg":4},{"->":".^.^.^.17"},{"c-0":["\n",{"->":"other_doors"},null]}]}],"nop","\n","ev",{"VAR?":"has_unlocked_ceo"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Can you help me get into the CEO's office?","/str","/ev",{"*":".^.c-0","flg":4},{"->":".^.^.^.24"},{"c-0":["\n",{"->":"help_ceo_office"},null]}]}],"nop","\n","ev",{"VAR?":"has_given_lockpick"},"/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Got any other items for me?","/str","/ev",{"*":".^.c-0","flg":4},{"->":".^.^.^.30"},{"c-0":["\n",{"->":"other_items"},null]}]}],"nop","\n","ev",{"VAR?":"has_given_lockpick"},"!","/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Do you have any items for me?","/str","/ev",{"*":".^.c-0","flg":4},{"->":".^.^.^.37"},{"c-0":["\n",{"->":"give_items"},null]}]}],"nop","\n","ev",{"VAR?":"saw_lockpick_used"},"/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^Thanks for the lockpick! It worked great.","/str","/ev",{"*":".^.c-0","flg":4},{"->":".^.^.^.43"},{"c-0":["\n",{"->":"lockpick_feedback"},null]}]}],"nop","\n","ev",{"VAR?":"trust_level"},3,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","ev","str","^What hints do you have for me?","/str","/ev",{"*":".^.c-0","flg":4},{"->":".^.^.^.51"},{"c-0":["\n",{"->":"give_hints"},null]}]}],"nop","\n",{"#f":5}],"c-1":["^ ","#","^exit_conversation","/#","\n","^Alright then. Let me know if you need anything else!","\n",{"->":"hub"},null]}],null],"who_are_you":["^I'm a friendly NPC who can help you progress through the mission.","\n","^I can unlock doors, give you items, and provide hints when you need them.","\n","ev",{"VAR?":"trust_level"},1,"+","/ev",{"VAR=":"trust_level","re":true},{"->":"hub"},null],"help_ceo_office":["ev",{"VAR?":"has_unlocked_ceo"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^I already unlocked the CEO's office for you! Just head on in.","\n",{"->":"hub"},{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","^The CEO's office? That's a tough one...","\n","ev",{"VAR?":"trust_level"},1,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Alright, I trust you enough. Let me unlock that door for you.","\n","ev",true,"/ev",{"VAR=":"has_unlocked_ceo","re":true},"ev",true,"/ev",{"VAR=":"asked_about_ceo","re":true},"^There you go! The door to the CEO's office is now unlocked. ","#","^unlock_door:ceo","/#","\n","ev",{"VAR?":"trust_level"},2,"+","/ev",{"VAR=":"trust_level","re":true},{"->":"hub"},{"->":".^.^.^.10"},null]}],[{"->":".^.b"},{"b":["\n","^I don't know you well enough yet. Ask me some questions first and we can build some trust.","\n",{"->":"hub"},{"->":".^.^.^.10"},null]}],"nop","\n",{"->":".^.^.^.5"},null]}],"nop","\n",null],"other_doors":["^What other doors do you need help with? I can try to unlock them if you tell me which ones.","\n","ev",{"VAR?":"trust_level"},1,"+","/ev",{"VAR=":"trust_level","re":true},{"->":"hub"},null],"give_items":["ev",{"VAR?":"has_given_lockpick"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^I already gave you a lockpick set. Check your inventory - it should be there!","\n",{"->":"hub"},{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","^Let me see what I have...","\n","ev",{"VAR?":"trust_level"},2,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Here's a lockpick set. Use it to open locked doors and containers! πŸ”“","\n","ev",true,"/ev",{"VAR=":"has_given_lockpick","re":true},"ev",true,"/ev",{"VAR=":"asked_for_items","re":true},"#","^give_item:lockpick","/#","ev",{"VAR?":"trust_level"},1,"+","/ev",{"VAR=":"trust_level","re":true},{"->":"hub"},{"->":".^.^.^.10"},null]}],[{"->":".^.b"},{"b":["\n","^I need to trust you more before I give you something like that.","\n","^Build up some trust first - ask me questions or help me out!","\n",{"->":"hub"},{"->":".^.^.^.10"},null]}],"nop","\n",{"->":".^.^.^.5"},null]}],"nop","\n",null],"other_items":["ev",{"VAR?":"trust_level"},4,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^I've got a keycard for restricted areas. Think you can use it responsibly?","\n","#","^give_item:keycard","/#","ev",{"VAR?":"trust_level"},1,"+","/ev",{"VAR=":"trust_level","re":true},{"->":"hub"},{"->":".^.^.^.7"},null]}],[{"->":".^.b"},{"b":["\n","^That's all I have right now. The lockpick set is your best tool for now.","\n",{"->":"hub"},{"->":".^.^.^.7"},null]}],"nop","\n",null],"lockpick_feedback":["^Great! I'm glad it helped you out. That's what I'm here for.","\n","^You're doing excellent work on this mission.","\n","ev",{"VAR?":"trust_level"},1,"+","/ev",{"VAR=":"trust_level","re":true},"ev",false,"/ev",{"VAR=":"saw_lockpick_used","re":true},{"->":"hub"},null],"give_hints":["ev",{"VAR?":"has_unlocked_ceo"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^The CEO's office has evidence you're looking for. Search the desk thoroughly.","\n","^Also, check any computers for sensitive files.","\n",{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","ev",{"VAR?":"has_given_lockpick"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Try using that lockpick set on locked doors and containers around the building.","\n","^You never know what secrets people hide behind locked doors!","\n",{"->":".^.^.^.6"},null]}],[{"->":".^.b"},{"b":["\n","^Explore every room carefully. Items are often hidden in places you'd least expect.","\n",{"->":".^.^.^.6"},null]}],"nop","\n",{"->":".^.^.^.5"},null]}],"nop","\n",{"->":"hub"},null],"on_lockpick_pickup":["ev",{"VAR?":"has_given_lockpick"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Great! You found the lockpick I gave you. Try it on a locked door or container!","\n",{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","^Nice find! That lockpick set looks professional. Could be very useful. πŸ”“","\n",{"->":".^.^.^.5"},null]}],"nop","\n",{"->":"hub"},null],"on_lockpick_success":["ev",true,"/ev",{"VAR=":"saw_lockpick_used","re":true},"ev",{"VAR?":"has_given_lockpick"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Excellent! Glad I could help you get through that. 🎯","\n",{"->":".^.^.^.9"},null]}],[{"->":".^.b"},{"b":["\n","^Nice work getting through that lock! πŸ”“","\n",{"->":".^.^.^.9"},null]}],"nop","\n",{"->":"hub"},null],"on_lockpick_failed":["ev",{"VAR?":"has_given_lockpick"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Don't give up! Lockpicking takes practice. Try adjusting the tension. πŸ”§","\n","^Want me to help you with anything else?","\n",{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","^Tough break. Lockpicking isn't easy without the right tools...","\n","^I might be able to help with that if you ask.","\n",{"->":".^.^.^.5"},null]}],"nop","\n",{"->":"hub"},null],"on_door_unlocked":["ev",true,"/ev",{"VAR=":"saw_door_unlock","re":true},"ev",{"VAR?":"has_unlocked_ceo"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Another door open! You're making great progress. πŸšͺβœ“","\n",{"->":".^.^.^.9"},null]}],[{"->":".^.b"},{"b":["\n","^Nice! You found a way through that door. Keep going!","\n",{"->":".^.^.^.9"},null]}],"nop","\n",{"->":"hub"},null],"on_door_attempt":["^That door's locked tight. You'll need to find a way to unlock it. πŸ”’","\n","ev",{"VAR?":"trust_level"},2,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Want me to help you out? Just ask!","\n",{"->":".^.^.^.9"},null]}],[{"->":".^.b"},{"b":["\n","ev",{"VAR?":"trust_level"},1,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^I might be able to help if you get to know me better first.","\n",{"->":".^.^.^.7"},null]}],"nop","\n",{"->":".^.^.^.9"},null]}],"nop","\n",{"->":"hub"},null],"on_ceo_desk_interact":["ev",{"VAR?":"has_unlocked_ceo"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^The CEO's desk - you made it! Nice work. πŸ“‹","\n","^That's where the important evidence is kept.","\n",{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","^Trying to get into the CEO's office? I might be able to help with that...","\n",{"->":".^.^.^.5"},null]}],"nop","\n",{"->":"hub"},null],"on_item_found":["ev",{"VAR?":"trust_level"},1,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Good find! Every item could be important for your mission. πŸ“¦","\n",{"->":".^.^.^.6"},null]}],"nop","\n",{"->":"hub"},null],"on_room_entered":["ev",{"VAR?":"has_unlocked_ceo"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^Keep searching for that evidence! πŸ”","\n",{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","ev",{"VAR?":"trust_level"},1,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^You're making progress through the building. 🚢","\n","^Let me know if you need help with anything.","\n",{"->":".^.^.^.8"},null]}],[{"->":".^.b"},{"b":["\n","^Exploring new areas... 🚢","\n",{"->":".^.^.^.8"},null]}],"nop","\n",{"->":".^.^.^.5"},null]}],"nop","\n",{"->":"hub"},null],"on_room_discovered":["ev",{"VAR?":"trust_level"},2,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Great find! This new area might have what we need. πŸ—ΊοΈβœ¨","\n","^Search it thoroughly!","\n",{"->":".^.^.^.7"},null]}],[{"->":".^.b"},{"b":["\n","ev",{"VAR?":"trust_level"},1,">=","/ev",[{"->":".^.b","c":true},{"b":["\n","^Interesting! You've found a new area. Be careful exploring. πŸ—ΊοΈ","\n",{"->":".^.^.^.8"},null]}],[{"->":".^.b"},{"b":["\n","^A new room... wonder what's inside. πŸšͺ","\n",{"->":".^.^.^.8"},null]}],"nop","\n",{"->":".^.^.^.7"},null]}],"nop","\n",{"->":"hub"},null],"on_ceo_office_entered":["ev",{"VAR?":"has_unlocked_ceo"},"/ev",[{"->":".^.b","c":true},{"b":["\n","^You're in! Remember, you're looking for evidence of the data breach. πŸ•΅οΈ","\n","^Check the desk, computer, and any drawers.","\n",{"->":".^.^.^.5"},null]}],[{"->":".^.b"},{"b":["\n","^Whoa, you got into the CEO's office! That's impressive! πŸŽ‰","\n","ev",{"VAR?":"trust_level"},1,"+","/ev",{"VAR=":"trust_level","re":true},"^Maybe I underestimated you. Impressive work!","\n",{"->":".^.^.^.5"},null]}],"nop","\n",{"->":"hub"},null],"global decl":["ev",0,{"VAR=":"trust_level"},false,{"VAR=":"has_unlocked_ceo"},false,{"VAR=":"has_given_lockpick"},false,{"VAR=":"saw_lockpick_used"},false,{"VAR=":"saw_door_unlock"},false,{"VAR=":"has_greeted"},false,{"VAR=":"asked_about_self"},false,{"VAR=":"asked_about_ceo"},false,{"VAR=":"asked_for_items"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file