From 7208b845b1e5a58ce80bf9c7f84a91ae0ef58da4 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Wed, 27 May 2015 14:35:08 +0200 Subject: [PATCH] Take all, take everything, leave if possible Multiple fixes: 1. take all of a kind 2. take everything 3. if possible, leave 4. drop menu on hover 5. Same item not shown as drop option --- script/events.js | 306 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 208 insertions(+), 98 deletions(-) diff --git a/script/events.js b/script/events.js index 566bc17..ee70bd5 100644 --- a/script/events.js +++ b/script/events.js @@ -46,13 +46,6 @@ var Events = { Events.activeScene = name; var scene = Events.activeEvent().scenes[name]; - // Scene reward - if(scene.reward) { - $SM.addM('stores', scene.reward); - } - - - // onLoad if(scene.onLoad) { scene.onLoad(); @@ -63,6 +56,11 @@ var Events = { Notifications.notify(null, scene.notification); } + // Scene reward + if(scene.reward) { + $SM.addM('stores', scene.reward); + } + $('#description', Events.eventPanel()).empty(); $('#buttons', Events.eventPanel()).empty(); if(scene.combat) { @@ -221,6 +219,8 @@ var Events = { w.data('hp', hp); Events.updateFighterDiv(w); Events.drawFloatText('+' + World.meatHeal(), '#wanderer .hp'); + var takeETbutton = Events.setTakeAll(); + Events.canLeave(takeETbutton); } } }, @@ -243,6 +243,8 @@ var Events = { w.data('hp', hp); Events.updateFighterDiv(w); Events.drawFloatText('+' + World.medsHeal(), '#wanderer .hp'); + var takeETbutton = Events.setTakeAll(); + Events.canLeave(takeETbutton); } } }, @@ -454,23 +456,23 @@ var Events = { Engine.setTimeout(function() { try { var scene = Events.activeEvent().scenes[Events.activeScene]; + var leaveBtn = false; var desc = $('#description', Events.eventPanel()); var btns = $('#buttons', Events.eventPanel()); desc.empty(); btns.empty(); $('
').text(scene.deathMessage).appendTo(desc); - Events.drawLoot(scene.loot); + var takeETbtn = Events.drawLoot(scene.loot); if(scene.buttons) { // Draw the buttons - Events.drawButtons(scene); + leaveBtn = Events.drawButtons(scene); } else { - Button.cooldown(new Button.Button({ + leaveBtn = new Button.Button({ id: 'leaveBtn', cooldown: Events._LEAVE_COOLDOWN, click: function() { - var scene = Events.activeEvent().scenes[Events.activeScene]; if(scene.nextScene && scene.nextScene != 'end') { Events.loadScene(scene.nextScene); } else { @@ -478,13 +480,15 @@ var Events = { } }, text: _('leave') - }).appendTo(btns)); + }); + Button.cooldown(leaveBtn.appendTo(btns)); Events.createEatMeatButton(0).appendTo(btns); if((Path.outfit['medicine'] || 0) !== 0) { Events.createUseMedsButton(0).appendTo(btns); } } + Events.allowLeave(takeETbtn, leaveBtn); } catch(e) { // It is possible to die and win if the timing is perfect. Just let it fail. } @@ -492,106 +496,212 @@ var Events = { }); }, + drawDrop:function(btn) { + var name = btn.attr('id').substring(5).replace('-', ' '); + var needsAppend = false; + var weight = Path.getWeight(name); + var freeSpace = Path.getFreeSpace(); + if(weight > freeSpace) { + // Draw the drop menu + Engine.log('drop menu'); + if($('#dropMenu').length){ + var dropMenu = $('#dropMenu'); + $('#dropMenu').empty(); + } else { + var dropMenu = $('
').attr({'id': 'dropMenu', 'data-legend': _('drop:')}); + needsAppend = true; + } + for(var k in Path.outfit) { + if(name == k) continue; + var itemWeight = Path.getWeight(k); + if(itemWeight > 0) { + var numToDrop = Math.ceil((weight - freeSpace) / itemWeight); + if(numToDrop > Path.outfit[k]) { + numToDrop = Path.outfit[k]; + } + if(numToDrop > 0) { + var dropRow = $('
').attr('id', 'drop_' + k.replace(' ', '-')) + .text(_(k) + ' x' + numToDrop) + .data('thing', k) + .data('num', numToDrop) + .click(Events.dropStuff) + .mouseenter(function(e){ + e.stopPropagation(); + }); + dropRow.appendTo(dropMenu); + } + } + } + $('
').attr('id','no_drop') + .text(_('nothing')) + .mouseenter(function(e){ + e.stopPropagation(); + }) + .click(function(e){ + e.stopPropagation(); + dropMenu.remove(); + }) + .appendTo(dropMenu); + if(needsAppend){ + dropMenu.appendTo(btn); + } + btn.one("mouseleave", function() { + $('#dropMenu').remove(); + }); + } + }, + + drawLootRow: function(name, num){ + var id = name.replace(' ', '-'); + var lootRow = $('
').attr('id','loot_' + id).data('item', name).addClass('lootRow'); + var take = new Button.Button({ + id: 'take_' + id, + text: _(name) + ' [' + num + ']', + click: Events.getLoot + }).addClass('lootTake').data('numLeft', num).appendTo(lootRow); + take.mouseenter(function(){ + Events.drawDrop(take); + }); + var takeall = new Button.Button({ + id: 'all_take_' + id, + text: _('take') + ' ', + click: Events.takeAll + }).addClass('lootTakeAll').appendTo(lootRow); + $('').insertBefore(takeall.children('.cooldown')); + $('
').addClass('clear').appendTo(lootRow); + return lootRow; + }, + drawLoot: function(lootList) { var desc = $('#description', Events.eventPanel()); - var lootButtons = $('
').attr('id', 'lootButtons'); + var lootButtons = $('
').attr({'id': 'lootButtons', 'data-legend': _('take:')}); for(var k in lootList) { var loot = lootList[k]; if(Math.random() < loot.chance) { var num = Math.floor(Math.random() * (loot.max - loot.min)) + loot.min; - new Button.Button({ - id: 'loot_' + k.replace(' ', '-'), - text: _(k) + ' [' + num + ']', - click: Events.getLoot - }).data('numLeft', num).appendTo(lootButtons); + var lootRow = Events.drawLootRow(k, num); + lootRow.appendTo(lootButtons); } } - $('
').addClass('clear').appendTo(lootButtons); - if(lootButtons.children().length > 1) { - lootButtons.appendTo(desc); - var takeAll = new Button.Button({ - id: 'loot_take_all', - text: _('take all'), - click: Events.takeAllLoot - }).addClass('take-all-button').appendTo(lootButtons); + lootButtons.appendTo(desc); + if(lootButtons.children().length > 0) { + var takeETrow = $('
').addClass('takeETrow'); + var takeET = new Button.Button({ + id: 'loot_takeEverything', + text: '', + click: Events.takeEverything + }).appendTo(takeETrow); + $('').insertBefore(takeET.children('.cooldown')); + $('
').addClass('clear').appendTo(takeETrow); + takeETrow.appendTo(lootButtons); + Events.setTakeAll(lootButtons); + } else { + var noLoot = $('
').addClass('noLoot').text( _('nothing to take') ); + noLoot.appendTo(lootButtons); + } + return takeET || false; + }, + + setTakeAll: function(lootButtons){ + var lootButtons = lootButtons || $('#lootButtons'); + var canTakeSomething = false; + var free = Path.getFreeSpace(); + var takeETbutton = lootButtons.find('#loot_takeEverything'); + lootButtons.children('.lootRow').each(function(i){ + var name = $(this).data('item'); + var take = $(this).children('.lootTake').first(); + var takeAll = $(this).children('.lootTakeAll').first(); + var numLeft = take.data('numLeft'); + var num = Math.min(Math.floor(Path.getFreeSpace() / Path.getWeight(name)), numLeft); + takeAll.data('numLeft', num); + free -= numLeft * Path.getWeight(name); + if(num > 0){ + takeAll.removeClass('disabled'); + canTakeSomething = true; + } else { + takeAll.addClass('disabled'); + } + if(num < numLeft){ + takeAll.children('span').first().text(num); + } else { + takeAll.children('span').first().text(_('all')); + } + }); + if(canTakeSomething){ + takeETbutton.removeClass('disabled'); + } else { + takeETbutton.addClass('disabled'); + } + takeETbutton.data('canTakeEverything', (free >= 0) ? true : false); + return takeETbutton; + }, + + allowLeave: function(takeETbtn, leaveBtn){ + if(takeETbtn){ + if(leaveBtn){ + takeETbtn.data('leaveBtn', leaveBtn); + } + Events.canLeave(takeETbtn); } }, - takeAllLoot: function(){ - - var stoppedEarly = false; - $('#lootButtons') - .children('.button') - .each(function(){ - if( $(this).hasClass('take-all-button') ) { - return; - } - - var weight = $(this).data('numLeft') * Path.getWeight($(this).attr('id').substring(5).replace('-', ' ')); - while( $(this).data('numLeft') > 0 && weight < Path.getFreeSpace() ){ - $(this).click(); - } - - if(weight > Path.getFreeSpace()){ - stoppedEarly = true; - return; - } - }); - - if( !stoppedEarly ){ - - $('#leave').click(); - $('#leaveBtn').click(); - + canLeave: function(btn){ + var basetext = _('take everything'); + var textbox = btn.children('span'); + var takeAndLeave = (btn.data('leaveBtn')) ? btn.data('canTakeEverything') : false; + if(takeAndLeave){ + textbox.text( basetext + _(' and ') + _('leave') ); + btn.data('canLeave', true); + } else { + textbox.text( basetext ); + btn.data('canLeave', false) } - }, dropStuff: function(e) { e.stopPropagation(); var btn = $(this); + var target = btn.closest('.button'); var thing = btn.data('thing'); + var id = 'take_' + thing.replace(' ', '-'); var num = btn.data('num'); var lootButtons = $('#lootButtons'); Engine.log('dropping ' + num + ' ' + thing); - var lootBtn = $('#loot_' + thing.replace(' ', '-'), lootButtons); + var lootBtn = $('#' + id, lootButtons); if(lootBtn.length > 0) { var curNum = lootBtn.data('numLeft'); curNum += num; lootBtn.text(_(thing) + ' [' + curNum + ']').data('numLeft', curNum); } else { - new Button.Button({ - id: 'loot_' + thing.replace(' ', '-'), - text: _(thing) + ' [' + num + ']', - click: Events.getLoot - }).data('numLeft', num).insertBefore($('.clear', lootButtons)); + var lootRow = Events.drawLootRow(thing, num); + lootRow.insertBefore($('.takeETrow', lootButtons)); } Path.outfit[thing] -= num; - Events.getLoot(btn.closest('.button')); + Events.getLoot(target); World.updateSupplies(); }, - getLoot: function(btn) { + getLoot: function(btn, skipButtonSet) { var name = btn.attr('id').substring(5).replace('-', ' '); if(btn.data('numLeft') > 0) { + var skipButtonSet = skipButtonSet || false; var weight = Path.getWeight(name); var freeSpace = Path.getFreeSpace(); if(weight <= freeSpace) { var num = btn.data('numLeft'); num--; btn.data('numLeft', num); + // #dropMenu gets removed by this. + btn.text(_(name) + ' [' + num + ']'); if(num === 0) { Button.setDisabled(btn); btn.animate({'opacity':0}, 300, 'linear', function() { - $(this).remove(); + $(this).parent().remove(); if($('#lootButtons').children().length == 1) { $('#lootButtons').remove(); } }); - } else { - // #dropMenu gets removed by this. - btn.text(_(name) + ' [' + num + ']'); } var curNum = Path.outfit[name]; curNum = typeof curNum == 'number' ? curNum : 0; @@ -599,39 +709,33 @@ var Events = { Path.outfit[name] = curNum; World.updateSupplies(); - // Update weight and free space variables so we can decide - // whether or not to bring up/update the drop menu. - weight = Path.getWeight(name); - freeSpace = Path.getFreeSpace(); - } - - if(weight > freeSpace && btn.data('numLeft') > 0) { - // Draw the drop menu - Engine.log('drop menu'); - $('#dropMenu').remove(); - var dropMenu = $('
').attr('id', 'dropMenu'); - for(var k in Path.outfit) { - var itemWeight = Path.getWeight(k); - if(itemWeight > 0) { - var numToDrop = Math.ceil((weight - freeSpace) / itemWeight); - if(numToDrop > Path.outfit[k]) { - numToDrop = Path.outfit[k]; - } - if(numToDrop > 0) { - var dropRow = $('
').attr('id', 'drop_' + k.replace(' ', '-')) - .text(_(k) + ' x' + numToDrop) - .data('thing', k) - .data('num', numToDrop) - .click(Events.dropStuff); - dropRow.appendTo(dropMenu); - } - } + if(!skipButtonSet){ + Events.setTakeAll(); } - dropMenu.appendTo(btn); - btn.one("mouseleave", function() { - $('#dropMenu').remove(); - }); } + if(!skipButtonSet){ + Events.drawDrop(btn); + } + } + }, + + takeAll: function(btn){ + var target = $('#'+ btn.attr('id').substring(4)); + for(var k = 0; k < btn.data('numLeft'); k++){ + Events.getLoot(target, true); + } + Events.setTakeAll(); + }, + + takeEverything: function(btn){ + $('#lootButtons').children('.lootRow').each(function(i){ + var target = $(this).children('.lootTakeAll').first(); + if(!target.hasClass('disabled')){ + Events.takeAll(target); + } + }); + if(btn.data('canLeave')){ + btn.data('leaveBtn').click(); } }, @@ -648,6 +752,7 @@ var Events = { startStory: function(scene) { // Write the text var desc = $('#description', Events.eventPanel()); + var leaveBtn = false; for(var i in scene.text) { $('
').text(scene.text[i]).appendTo(desc); } @@ -662,15 +767,18 @@ var Events = { // Draw any loot if(scene.loot) { - Events.drawLoot(scene.loot); + var takeETbtn = Events.drawLoot(scene.loot); } // Draw the buttons - Events.drawButtons(scene); + leaveBtn = Events.drawButtons(scene); + + Events.allowLeave(takeETbtn, leaveBtn); }, drawButtons: function(scene) { var btns = $('#buttons', Events.eventPanel()); + var btnsList = []; for(var id in scene.buttons) { var info = scene.buttons[id]; var b = new Button.Button({ @@ -686,9 +794,11 @@ var Events = { if(typeof info.cooldown == 'number') { Button.cooldown(b); } + btnsList.push(b); } Events.updateButtons(); + return (btnsList.length == 1) ? btnsList[0] : false; }, updateButtons: function() {