/* * conversifier * choice-based conversations for versifier */ function update_display() { // redefines the function in versifier.js, so make sure this one does everything that one does! describe_room(); show_holding(); show_inventory(); show_holding(); show_score(); //animate_heights(); set_heights(); draw_conversation(Game.talking_to); } Game.talking_to = ''; function talking_to(npc) { return Game.talking_to == npc; } Game.always.push(function() { if(Game.talking_to && (/* current_verb != 'talk' || */ !in_scope(Game.talking_to) )) { Game.talking_to = ''; } if(!Game.talking_to) { hide_conversation(); } do_conversation(); }); /* Game.before.push( function(verb, noun) { if(verb=='depart' || verb=='enter' || verb=='climb') { //anything that can change your location hide_conversation(); } } );*/ function do_conversation() { if(!Game.talking_to) { hide_conversation(); } else { draw_conversation(Game.talking_to); } } function draw_conversation(npc) { if(!npc) { hide_conversation(); return; } var html = ""; if(Game.things[npc].image) { html = ''; } html += "Talking to: " + Game.things[npc].description + "\n"; var conversifier = get_conversifier(npc); if(conversifier.says && Object.keys(conversifier.says).length) { html += "
Say:"; for(var subject in conversifier.says) { if(conversifier.says[subject]) { html += " " + draw_button( subject.split('_').join(' '), "talk('" + npc + "', 'say', '" + replaceAll(subject, "'", "\\'") + "')" ); } } } if(conversifier.asks && Object.keys(conversifier.asks).length) { html += "
\nAsk about:"; for(var subject in conversifier.asks) { if(conversifier.asks[subject]) { html += " " + draw_button( subject.split('_').join(' '), "talk('" + npc + "', 'ask', '" + replaceAll(subject, "'", "\\'") + "')" ); } } } if(conversifier.tells && Object.keys(conversifier.tells).length) { html += "
\nTell about:"; for(var subject in conversifier.tells) { if(conversifier.tells[subject]) { html += " " + draw_button( subject.split('_').join(' '), "talk('" + npc + "', 'tell', '" + replaceAll(subject, "'", "\\'") + "')" ); } } } html += '
\n'; html += draw_button("end conversation", "end_conversation('" + npc + "')"); $('#conversation').html(html); show_conversation(); } function show_conversation() { $('#conversation').slideDown(300); } function hide_conversation() { $('#conversation').slideUp(300); Game.talking_to = ''; // end without showing the npc's end_conversation message } function get_conversifier(npc) { //console.log('getting conversifier for ' + npc); if(typeof Game.things[npc].conversifier === 'function') { // allows data to be stored outside the Game object where it won't bloat savefile size return Game.things[npc].conversifier(); } else { return Game.things[npc].conversifier; } } function start_conversation(npc, suppress_start_message) { Game.talking_to = npc; do_conversation(); var conversifier = get_conversifier(npc); if(conversifier==null) { do_verb('talk', 'npc', true); }; if(!suppress_start_message && conversifier.start_conversation) { if(typeof conversifier.start_conversation === 'function') { conversifier.start_conversation(); } else { say(conversifier.start_conversation); } } if(is_landscape()) { $('#right_column').stop().scrollTop = 0; //$('#right_column').stop().animate({scrollTop: 0}); }; } function talk(npc, sayAskTell, subject) { dim_old_messages(); var promptText = sayAskTell + ' ' + (sayAskTell=='say' ? '' : (name(npc) + ' about ')) + subject.split('_').join(' ').toLowerCase(); say('\n> ' + promptText + ''); var response = get_conversifier(npc)[sayAskTell + 's'][subject]; if(typeof response === 'function') { response(); } else { say(response); } do_alwayses(); update_display(); } function end_conversation() { if(!Game.talking_to) { hide_conversation(); update_display(); return; } var conversifier = get_conversifier(Game.talking_to); if(conversifier.end_conversation) { dim_old_messages(); say('\n> end conversation'); if(typeof conversifier.end_conversation === 'function') { conversifier.end_conversation(); } else { say(conversifier.end_conversation); } } Game.talking_to = ''; hide_conversation(); update_display(); }