From 6ace681a91779fbdf05199ceab63c377a908b8c6 Mon Sep 17 00:00:00 2001 From: AndySky21 Date: Mon, 15 Feb 2016 21:04:02 +0100 Subject: [PATCH 01/12] Pause during fight This commit adds a pause button during the fight. It relies upon the new Events.paused property: when set to true, no buttons will work except the pause button itself, and cooldown on attack/healing buttons is interrupted. This commit also groups event buttons in different groups (attack, healing, scene), so that the position of "eat meat" and "use meds" does not depend on how many scene buttons are present (sometimes 1, other times 2) --- css/dark.css | 2 +- css/main.css | 17 +++++- script/Button.js | 12 ++-- script/events.js | 147 ++++++++++++++++++++++++++++++++++------------- 4 files changed, 130 insertions(+), 48 deletions(-) diff --git a/css/dark.css b/css/dark.css index 2d04f7c..e34cb34 100644 --- a/css/dark.css +++ b/css/dark.css @@ -117,7 +117,7 @@ div.button { border: 1px solid #EEE; } -div.button.disabled, div.button.disabled:hover { +div.button.disabled, div.button.disabled:hover, #event.paused > #buttons .button { border-color: #444; color: #444; } diff --git a/css/main.css b/css/main.css index 869d6e7..35ceb0e 100644 --- a/css/main.css +++ b/css/main.css @@ -245,7 +245,7 @@ div.button:hover { text-decoration: underline; } -div.button.disabled, div.button.disabled:hover { +div.button.disabled, div.button.disabled:hover, #event.paused > #buttons .button { cursor: default; border-color: #b2b2b2; color: #b2b2b2; @@ -413,6 +413,16 @@ div.tooltip:hover { display: block; } +#pauseButton { + text-align:center; + margin: 0 0 1.2em; +} + +#pauseButton > .button { + float: none; + margin: 0 auto; +} + /* Events */ .eventPanel { @@ -520,8 +530,11 @@ body.noMask #description { float: none; } -#buttons > .button { +#buttons .button { margin: 0 5px 5px; +} + +#buttons .button, #pauseButton { margin-right: 15px; } diff --git a/script/Button.js b/script/Button.js index 35d46ef..b72c965 100644 --- a/script/Button.js +++ b/script/Button.js @@ -13,7 +13,7 @@ var Button = { .addClass('button') .text(typeof(options.text) != 'undefined' ? options.text : "button") .click(function() { - if(!$(this).hasClass('disabled')) { + if(!$(this).hasClass('disabled') && (!Events.paused || $(this).data("handler") == Events.togglePause)) { Button.cooldown($(this)); $(this).data("handler")($(this)); } @@ -73,13 +73,16 @@ var Button = { // param "start" takes value from cooldown time if not specified var start, left; switch(option){ - // a switch will allow for several uses of cooldown function case 'state': if(!$SM.get(id)){ return; } start = Math.min($SM.get(id), cd); - left = (start / cd).toFixed(4); + left = (start / cd).toFixed(3); + break; + case 'pause': + left = (btn.children('div.cooldown').width() / btn.width()).toFixed(3); + start = cd * left; break; default: start = cd; @@ -98,7 +101,7 @@ var Button = { if (Engine.options.doubleTime){ time /= 2; } - $('div.cooldown', btn).width(left * 100 +"%").animate({width: '0%'}, time * 1000, 'linear', function() { + $('div.cooldown', btn).width(Math.floor(left * 100) +"%").animate({width: '0%'}, time * 1000, 'linear', function() { Button.clearCooldown(btn, true); }); btn.addClass('disabled'); @@ -107,7 +110,6 @@ var Button = { }, clearCooldown: function(btn, ended) { - var ended = ended || false; if(!ended){ $('div.cooldown', btn).stop(true, true); } diff --git a/script/events.js b/script/events.js index 11d077d..ec9ef5e 100644 --- a/script/events.js +++ b/script/events.js @@ -9,6 +9,7 @@ var Events = { _EAT_COOLDOWN: 5, _MEDS_COOLDOWN: 7, _LEAVE_COOLDOWN: 1, + _PAUSE_COOLDOWN: 0.4, STUN_DURATION: 4000, BLINK_INTERVAL: false, @@ -77,15 +78,29 @@ var Events = { $('
').text(scene.notification).appendTo(desc); - // Draw the wanderer - Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(desc); + // Draw pause button + Events.paused = true; + var pauseBox = $('
').attr('id', 'pauseButton').appendTo(desc); + var pause = new Button.Button({ + id: 'pause', + text: '', + cooldown: Events._PAUSE_COOLDOWN, + click: Events.togglePause + }).appendTo(pauseBox); + $('').addClass('text').insertBefore(pause.children('.cooldown')); + $('
').addClass('clear').appendTo(pauseBox); + Events.togglePause(pause); + var fightBox = $('
').attr('id', 'fight').appendTo(desc); + // Draw the wanderer + Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(fightBox); // Draw the enemy - Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(desc); + Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(fightBox); // Draw the action buttons var btns = $('#buttons', Events.eventPanel()); + var attackBtns = $('
').appendTo(btns).attr('id','attackButtons'); var numWeapons = 0; for(var k in World.Weapons) { var weapon = World.Weapons[k]; @@ -103,21 +118,81 @@ var Events = { } } numWeapons++; - Events.createAttackButton(k).appendTo(btns); + Events.createAttackButton(k).appendTo(attackBtns); } } if(numWeapons === 0) { // No weapons? You can punch stuff! - Events.createAttackButton('fists').prependTo(btns); + Events.createAttackButton('fists').prependTo(attackBtns); } + $('
').addClass('clear').appendTo(attackBtns); - Events.createEatMeatButton().appendTo(btns); + var healBtns = $('
').appendTo(btns).attr('id','healButtons'); + Events.createEatMeatButton().appendTo(healBtns); if((Path.outfit['medicine'] || 0) !== 0) { - Events.createUseMedsButton().appendTo(btns); + Events.createUseMedsButton().appendTo(healBtns); } + $('
').addClass('clear').appendTo(healBtns); // Set up the enemy attack timer - Events._enemyAttackTimer = Engine.setTimeout(Events.enemyAttack, scene.attackDelay * 1000); + Events._enemyAttackTimer = Engine.setInterval(Events.enemyAttack, scene.attackDelay * 1000); + }, + + setPause: function(btn){ + Events.paused = true; + $('#event').addClass('paused'); + Button.clearCooldown(btn); + var active = 0; + $('#buttons').find('.button').each(function(i){ + if($(this).data('onCooldown')){ + $(this).children('.cooldown').stop(true,false); + active++; + } + }); + Engine.log('fight paused. stopped '+ active +' buttons'); + }, + + removePause: function(state){ + var log, time, target; + switch(state){ + case 'set': + log = 'started'; + time = 0; + target = $(); + break; + case 'end': + $('#pause').addClass('disabled'); + log = 'ended'; + time = Events._FIGHT_SPEED; + target = $(); + break; + default: + log = 'resumed'; + time = Events._PAUSE_COOLDOWN * 1000; + target = $('#buttons').find('.button'); + break; + } + Engine.setTimeout(function(){ + Events.paused = false; + $('#event').removeClass('paused'); + target.each(function(i){ + if($(this).data('onCooldown')){ + Button.cooldown($(this), 'pause'); + } + }); + Engine.log('Event '+ log); + }, time); + }, + + togglePause: function(btn){ + var text = btn.children('.text').first(); + if(Events.paused) { + Events.removePause() + text.text( _('pause.') ); + } else { + Events.setPause(btn); + text.text( _('resume.') ) + } }, createEatMeatButton: function(cooldown) { @@ -201,52 +276,35 @@ var Events = { }); }, - eatMeat: function() { - if(Path.outfit['cured meat'] > 0) { - Path.outfit['cured meat']--; + doHeal: function(healing, cured, btn){ + if(Path.outfit[healing] > 0) { + Path.outfit[healing]--; World.updateSupplies(); - if(Path.outfit['cured meat'] === 0) { - Button.setDisabled($('#eat'), true); + if(Path.outfit[healing] === 0) { + Button.setDisabled(btn, true); } - var hp = World.health; - hp += World.meatHeal(); - hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp; + var hp = World.health + cured; + hp = Math.min(World.getMaxHealth(),hp); World.setHp(hp); if(Events.activeEvent()) { var w = $('#wanderer'); w.data('hp', hp); Events.updateFighterDiv(w); - Events.drawFloatText('+' + World.meatHeal(), '#wanderer .hp'); + Events.drawFloatText('+' + cured, '#wanderer .hp'); var takeETbutton = Events.setTakeAll(); Events.canLeave(takeETbutton); } } }, - useMeds: function() { - if(Path.outfit['medicine'] > 0) { - Path.outfit['medicine']--; - World.updateSupplies(); - if(Path.outfit['medicine'] === 0) { - Button.setDisabled($('#meds'), true); - } + eatMeat: function(btn) { + Events.doHeal('cured meat', World.meatHeal(), btn); + }, - var hp = World.health; - hp += World.medsHeal(); - hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp; - World.setHp(hp); - - if(Events.activeEvent()) { - var w = $('#wanderer'); - w.data('hp', hp); - Events.updateFighterDiv(w); - Events.drawFloatText('+' + World.medsHeal(), '#wanderer .hp'); - var takeETbutton = Events.setTakeAll(); - Events.canLeave(takeETbutton); - } - } + useMeds: function(btn) { + Events.doHeal('medicine', World.medsHeal(), btn); }, useWeapon: function(btn) { @@ -424,6 +482,10 @@ var Events = { enemyAttack: function() { + if(Events.paused){ + return; + } + var scene = Events.activeEvent().scenes[Events.activeScene]; if(!$('#enemy').data('stunned')) { @@ -445,12 +507,11 @@ var Events = { } }); } - - Events._enemyAttackTimer = Engine.setTimeout(Events.enemyAttack, scene.attackDelay * 1000); }, winFight: function() { Events.won = true; + Events.removePause('end'); clearTimeout(Events._enemyAttackTimer); $('#enemy').animate({opacity: 0}, 300, 'linear', function() { Engine.setTimeout(function() { @@ -465,6 +526,7 @@ var Events = { var takeETbtn = Events.drawLoot(scene.loot); + var exitBtns = $('
').appendTo(btns).attr('id','exitButtons'); if(scene.buttons) { // Draw the buttons leaveBtn = Events.drawButtons(scene); @@ -483,11 +545,15 @@ var Events = { }); Button.cooldown(leaveBtn.appendTo(btns)); + var healBtns = $('
').appendTo(btns).attr('id','healButtons'); Events.createEatMeatButton(0).appendTo(btns); if((Path.outfit['medicine'] || 0) !== 0) { Events.createUseMedsButton(0).appendTo(btns); } + $('
').addClass('clear').appendTo(healBtns); } + $('
').addClass('clear').appendTo(exitBtns); + Events.allowLeave(takeETbtn, leaveBtn); } catch(e) { // It is possible to die and win if the timing is perfect. Just let it fail. @@ -983,6 +1049,7 @@ var Events = { endEvent: function() { Events.eventPanel().animate({opacity:0}, Events._PANEL_FADE, 'linear', function() { + Events.removePause('end'); Events.eventPanel().remove(); Events.activeEvent().eventPanel = null; Events.eventStack.shift(); From 091929cf90c5c573c3b9fefe9902d6bce805305a Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Tue, 16 Feb 2016 00:26:23 +0100 Subject: [PATCH 02/12] Cleanup Events.damage method now groups all common lines for Events.animateRanged and Events.animateMelee. Balance between success and failure is now determined by Events.lost. It is set to "true" when the player is killed and prevents Events.winFight() altogether. Events.endFight() groups the 2 consistent actions in winFight and loseFight, i.e., pause unsetting and stopping the enemy. Completely renewed trap method: instead of relying on a separate counter, enemy.data('stunned') now returns the number of remaining seconds of stunning. Enemy's timed attack decreases this value by the attack delay time (the enemy fights for its freedom). --- script/events.js | 143 ++++++++++++++++++++++------------------------- 1 file changed, 66 insertions(+), 77 deletions(-) diff --git a/script/events.js b/script/events.js index ec9ef5e..e82b8c2 100644 --- a/script/events.js +++ b/script/events.js @@ -10,7 +10,7 @@ var Events = { _MEDS_COOLDOWN: 7, _LEAVE_COOLDOWN: 1, _PAUSE_COOLDOWN: 0.4, - STUN_DURATION: 4000, + STUN_DURATION: 4, BLINK_INTERVAL: false, init: function(options) { @@ -73,7 +73,7 @@ var Events = { startCombat: function(scene) { Engine.event('game event', 'combat'); - Events.won = false; + Events.lost = false; var desc = $('#description', Events.eventPanel()); $('
').text(scene.notification).appendTo(desc); @@ -138,10 +138,10 @@ var Events = { Events._enemyAttackTimer = Engine.setInterval(Events.enemyAttack, scene.attackDelay * 1000); }, - setPause: function(btn){ + setPause: function(){ Events.paused = true; $('#event').addClass('paused'); - Button.clearCooldown(btn); + Button.clearCooldown($('#pause')); var active = 0; $('#buttons').find('.button').each(function(i){ if($(this).data('onCooldown')){ @@ -190,7 +190,7 @@ var Events = { Events.removePause() text.text( _('pause.') ); } else { - Events.setPause(btn); + Events.setPause(); text.text( _('resume.') ) } }, @@ -380,7 +380,7 @@ var Events = { var attackFn = weapon.type == 'ranged' ? Events.animateRanged : Events.animateMelee; attackFn($('#wanderer'), dmg, function() { - if($('#enemy').data('hp') <= 0 && !Events.won) { + if($('#enemy').data('hp') <= 0) { // Success! Events.winFight(); } @@ -388,6 +388,32 @@ var Events = { } }, + damage: function(fighter, enemy, dmg) { + var enemyHp = enemy.data('hp'); + var msg = ""; + if(typeof dmg == 'number') { + if(dmg < 0) { + msg = _('miss'); + dmg = 0; + } else { + msg = '-' + dmg; + enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); + enemy.data('hp', enemyHp); + if(fighter.attr('id') == 'enemy') { + World.setHp(enemyHp); + } + Events.updateFighterDiv(enemy); + } + } else { + if(dmg == 'stun') { + msg = _('stunned'); + enemy.data('stunned', Events.STUN_DURATION); + } + } + + Events.drawFloatText(msg, $('.hp', enemy)); + }, + animateMelee: function(fighter, dmg, callback) { var start, end, enemy; if(fighter.attr('id') == 'wanderer') { @@ -401,32 +427,8 @@ var Events = { } fighter.stop(true, true).animate(start, Events._FIGHT_SPEED, function() { - var enemyHp = enemy.data('hp'); - var msg = ""; - if(typeof dmg == 'number') { - if(dmg < 0) { - msg = _('miss'); - dmg = 0; - } else { - msg = '-' + dmg; - enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); - enemy.data('hp', enemyHp); - if(fighter.attr('id') == 'enemy') { - World.setHp(enemyHp); - } - Events.updateFighterDiv(enemy); - } - } else { - if(dmg == 'stun') { - msg = _('stunned'); - enemy.data('stunned', true); - Engine.setTimeout(function() { - enemy.data('stunned', false); - }, Events.STUN_DURATION); - } - } - Events.drawFloatText(msg, $('.hp', enemy)); + Events.damage(fighter, enemy, dmg); $(this).animate(end, Events._FIGHT_SPEED, callback); }); @@ -445,33 +447,9 @@ var Events = { } $('
').css(start).addClass('bullet').text('o').appendTo('#description') - .animate(end, Events._FIGHT_SPEED * 2, 'linear', function() { - var enemyHp = enemy.data('hp'); - var msg = ""; - if(typeof dmg == 'number') { - if(dmg < 0) { - msg = _('miss'); - dmg = 0; - } else { - msg = '-' + dmg; - enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); - enemy.data('hp', enemyHp); - if(fighter.attr('id') == 'enemy') { - World.setHp(enemyHp); - } - Events.updateFighterDiv(enemy); - } - } else { - if(dmg == 'stun') { - msg = _('stunned'); - enemy.data('stunned', true); - Engine.setTimeout(function() { - enemy.data('stunned', false); - }, Events.STUN_DURATION); - } - } + .animate(end, Events._FIGHT_SPEED * 2, 'linear', function() { - Events.drawFloatText(msg, $('.hp', enemy)); + Events.damage(fighter, enemy, dmg); $(this).remove(); if(typeof callback == 'function') { @@ -488,7 +466,13 @@ var Events = { var scene = Events.activeEvent().scenes[Events.activeScene]; - if(!$('#enemy').data('stunned')) { + var enemy = $('#enemy'); + var stunning = enemy.data('stunned'); + + if(stunning) { + stunning -= scene.attackDelay; + enemy.data('stunned', Math.max(stunning, 0)); + } else { var toHit = scene.hit; toHit *= $SM.hasPerk('evasive') ? 0.8 : 1; var dmg = -1; @@ -499,23 +483,24 @@ var Events = { var attackFn = scene.ranged ? Events.animateRanged : Events.animateMelee; attackFn($('#enemy'), dmg, function() { - if($('#wanderer').data('hp') <= 0) { - // Failure! - clearTimeout(Events._enemyAttackTimer); - Events.endEvent(); - World.die(); - } + if($('#wanderer').data('hp') <= 0) { + // Failure! + Events.loseFight(); + } }); } }, - winFight: function() { - Events.won = true; - Events.removePause('end'); + endFight: function() { clearTimeout(Events._enemyAttackTimer); - $('#enemy').animate({opacity: 0}, 300, 'linear', function() { - Engine.setTimeout(function() { - try { + Events.removePause('end'); + }, + + winFight: function() { + if(!Events.lost) { + Events.endFight(); + $('#enemy').animate({opacity: 0}, 300, 'linear', function() { + Engine.setTimeout(function() { var scene = Events.activeEvent().scenes[Events.activeScene]; var leaveBtn = false; var desc = $('#description', Events.eventPanel()); @@ -555,14 +540,19 @@ var Events = { $('
').addClass('clear').appendTo(exitBtns); Events.allowLeave(takeETbtn, leaveBtn); - } catch(e) { - // It is possible to die and win if the timing is perfect. Just let it fail. - } - }, 1000, true); - }); + }, 1000, true); + }); + } }, - drawDrop:function(btn) { + loseFight: function(){ + Events.lost = true; + Events.endFight(); + Events.endEvent(); + World.die(); + }, + + drawDrop: function(btn) { var name = btn.attr('id').substring(5).replace('-', ' '); var needsAppend = false; var weight = Path.getWeight(name); @@ -1049,7 +1039,6 @@ var Events = { endEvent: function() { Events.eventPanel().animate({opacity:0}, Events._PANEL_FADE, 'linear', function() { - Events.removePause('end'); Events.eventPanel().remove(); Events.activeEvent().eventPanel = null; Events.eventStack.shift(); From def892953aae7a16a1d0288e9916221774306118 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Tue, 16 Feb 2016 00:27:44 +0100 Subject: [PATCH 03/12] Cooldown time from graphics Not a problem of precision, but a width measurement issue. Fixed and restored to previous precision level. --- script/Button.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/script/Button.js b/script/Button.js index b72c965..4d92077 100644 --- a/script/Button.js +++ b/script/Button.js @@ -78,10 +78,10 @@ var Button = { return; } start = Math.min($SM.get(id), cd); - left = (start / cd).toFixed(3); + left = (start / cd).toFixed(4); break; case 'pause': - left = (btn.children('div.cooldown').width() / btn.width()).toFixed(3); + left = (btn.children('div.cooldown').width() / btn.innerWidth()).toFixed(4); start = cd * left; break; default: @@ -101,7 +101,7 @@ var Button = { if (Engine.options.doubleTime){ time /= 2; } - $('div.cooldown', btn).width(Math.floor(left * 100) +"%").animate({width: '0%'}, time * 1000, 'linear', function() { + $('div.cooldown', btn).width(left * 100 +"%").animate({width: '0%'}, time * 1000, 'linear', function() { Button.clearCooldown(btn, true); }); btn.addClass('disabled'); From bf7472ba3752a2790cd4407cd04c03370c3d12b0 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Tue, 16 Feb 2016 02:56:44 +0100 Subject: [PATCH 04/12] Buttons positioning Residual structure fixed. --- script/events.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/script/events.js b/script/events.js index e82b8c2..13578b9 100644 --- a/script/events.js +++ b/script/events.js @@ -528,7 +528,7 @@ var Events = { }, text: _('leave') }); - Button.cooldown(leaveBtn.appendTo(btns)); + Button.cooldown(leaveBtn.appendTo(exitBtns)); var healBtns = $('
').appendTo(btns).attr('id','healButtons'); Events.createEatMeatButton(0).appendTo(btns); @@ -827,13 +827,15 @@ var Events = { } // Draw the buttons + var exitBtns = $('
').attr('id','exitButtons').appendTo($('#buttons', Events.eventPanel())); leaveBtn = Events.drawButtons(scene); + $('
').addClass('clear').appendTo(exitBtns); Events.allowLeave(takeETbtn, leaveBtn); }, drawButtons: function(scene) { - var btns = $('#buttons', Events.eventPanel()); + var btns = $('#exitButtons', Events.eventPanel()); var btnsList = []; for(var id in scene.buttons) { var info = scene.buttons[id]; From aa62b7f9beaf3496d977b0e6e3b2662dd413e656 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Tue, 16 Feb 2016 02:58:51 +0100 Subject: [PATCH 05/12] Buttons positioning 2 The last 2 remainings from original structure --- script/events.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/script/events.js b/script/events.js index 13578b9..672f90b 100644 --- a/script/events.js +++ b/script/events.js @@ -531,9 +531,9 @@ var Events = { Button.cooldown(leaveBtn.appendTo(exitBtns)); var healBtns = $('
').appendTo(btns).attr('id','healButtons'); - Events.createEatMeatButton(0).appendTo(btns); + Events.createEatMeatButton(0).appendTo(healBtns); if((Path.outfit['medicine'] || 0) !== 0) { - Events.createUseMedsButton(0).appendTo(btns); + Events.createUseMedsButton(0).appendTo(healBtns); } $('
').addClass('clear').appendTo(healBtns); } From 24e744a27e0e5df3fc2aa61337c5371f79e65db3 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Tue, 16 Feb 2016 03:02:45 +0100 Subject: [PATCH 06/12] Heal when necessary Events.setHeal() enables/disables eatMeat and useMeds buttons depending on player's HP. The check is done in 4 cases: * when a fight starts * after an attack * after healing * in the loot screen --- script/events.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/script/events.js b/script/events.js index 672f90b..02fe11a 100644 --- a/script/events.js +++ b/script/events.js @@ -133,6 +133,7 @@ var Events = { Events.createUseMedsButton().appendTo(healBtns); } $('
').addClass('clear').appendTo(healBtns); + Events.setHeal(healBtns); // Set up the enemy attack timer Events._enemyAttackTimer = Engine.setInterval(Events.enemyAttack, scene.attackDelay * 1000); @@ -276,6 +277,18 @@ var Events = { }); }, + setHeal: function(healBtns){ + if(!healBtns){ + healBtns = $('#healButtons'); + } + healBtns = healBtns.children('.button'); + var canHeal = (World.health < World.getMaxHealth()); + healBtns.each(function(i){ + Button.setDisabled($(this), !canHeal); + }); + return canHeal; + }, + doHeal: function(healing, cured, btn){ if(Path.outfit[healing] > 0) { Path.outfit[healing]--; @@ -287,6 +300,7 @@ var Events = { var hp = World.health + cured; hp = Math.min(World.getMaxHealth(),hp); World.setHp(hp); + Events.setHeal(); if(Events.activeEvent()) { var w = $('#wanderer'); @@ -401,6 +415,7 @@ var Events = { enemy.data('hp', enemyHp); if(fighter.attr('id') == 'enemy') { World.setHp(enemyHp); + Events.setHeal(); } Events.updateFighterDiv(enemy); } @@ -536,6 +551,7 @@ var Events = { Events.createUseMedsButton(0).appendTo(healBtns); } $('
').addClass('clear').appendTo(healBtns); + Events.setHeal(); } $('
').addClass('clear').appendTo(exitBtns); From aae770c5a1886ef87fd9cfac8ac836ee81a52c36 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Tue, 16 Feb 2016 11:02:10 +0100 Subject: [PATCH 07/12] Timing for winning and efficiency --- script/events.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/script/events.js b/script/events.js index 02fe11a..f6d614b 100644 --- a/script/events.js +++ b/script/events.js @@ -512,7 +512,11 @@ var Events = { }, winFight: function() { - if(!Events.lost) { + Engine.setTimeout(function() { + // Check after animation time, to see if the player has died before winning + if(Events.lost) { + return; + } Events.endFight(); $('#enemy').animate({opacity: 0}, 300, 'linear', function() { Engine.setTimeout(function() { @@ -551,14 +555,14 @@ var Events = { Events.createUseMedsButton(0).appendTo(healBtns); } $('
').addClass('clear').appendTo(healBtns); - Events.setHeal(); + Events.setHeal(healBtns); } $('
').addClass('clear').appendTo(exitBtns); Events.allowLeave(takeETbtn, leaveBtn); }, 1000, true); }); - } + }, Events._FIGHT_SPEED); }, loseFight: function(){ From 131e5c1140ef03ada121f4f1a7989ce66817448f Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Wed, 17 Feb 2016 14:06:09 +0100 Subject: [PATCH 08/12] Reverted changes Revert to previous version (no pause) --- css/dark.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/dark.css b/css/dark.css index e34cb34..2d04f7c 100644 --- a/css/dark.css +++ b/css/dark.css @@ -117,7 +117,7 @@ div.button { border: 1px solid #EEE; } -div.button.disabled, div.button.disabled:hover, #event.paused > #buttons .button { +div.button.disabled, div.button.disabled:hover { border-color: #444; color: #444; } From 7ba7f2247e6c88169e173220cd212c21528ef1f3 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Wed, 17 Feb 2016 14:08:41 +0100 Subject: [PATCH 09/12] Reverted changes Reverted to previous version. --- css/main.css | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/css/main.css b/css/main.css index 35ceb0e..869d6e7 100644 --- a/css/main.css +++ b/css/main.css @@ -245,7 +245,7 @@ div.button:hover { text-decoration: underline; } -div.button.disabled, div.button.disabled:hover, #event.paused > #buttons .button { +div.button.disabled, div.button.disabled:hover { cursor: default; border-color: #b2b2b2; color: #b2b2b2; @@ -413,16 +413,6 @@ div.tooltip:hover { display: block; } -#pauseButton { - text-align:center; - margin: 0 0 1.2em; -} - -#pauseButton > .button { - float: none; - margin: 0 auto; -} - /* Events */ .eventPanel { @@ -530,11 +520,8 @@ body.noMask #description { float: none; } -#buttons .button { +#buttons > .button { margin: 0 5px 5px; -} - -#buttons .button, #pauseButton { margin-right: 15px; } From 68732ce0d9d9842482478f2e7ef3fbd5d3cccbc3 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Wed, 17 Feb 2016 14:16:39 +0100 Subject: [PATCH 10/12] Reverted changes Revert to previous version --- script/Button.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/script/Button.js b/script/Button.js index 4d92077..35d46ef 100644 --- a/script/Button.js +++ b/script/Button.js @@ -13,7 +13,7 @@ var Button = { .addClass('button') .text(typeof(options.text) != 'undefined' ? options.text : "button") .click(function() { - if(!$(this).hasClass('disabled') && (!Events.paused || $(this).data("handler") == Events.togglePause)) { + if(!$(this).hasClass('disabled')) { Button.cooldown($(this)); $(this).data("handler")($(this)); } @@ -73,6 +73,7 @@ var Button = { // param "start" takes value from cooldown time if not specified var start, left; switch(option){ + // a switch will allow for several uses of cooldown function case 'state': if(!$SM.get(id)){ return; @@ -80,10 +81,6 @@ var Button = { start = Math.min($SM.get(id), cd); left = (start / cd).toFixed(4); break; - case 'pause': - left = (btn.children('div.cooldown').width() / btn.innerWidth()).toFixed(4); - start = cd * left; - break; default: start = cd; left = 1; @@ -110,6 +107,7 @@ var Button = { }, clearCooldown: function(btn, ended) { + var ended = ended || false; if(!ended){ $('div.cooldown', btn).stop(true, true); } From 368529f024bddf419be3b0891aadfe4e85601be6 Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Wed, 17 Feb 2016 15:07:26 +0100 Subject: [PATCH 11/12] Reverted changes Revert to previous version (no pause) --- script/events.js | 308 ++++++++++++++++++----------------------------- 1 file changed, 115 insertions(+), 193 deletions(-) diff --git a/script/events.js b/script/events.js index f6d614b..11d077d 100644 --- a/script/events.js +++ b/script/events.js @@ -9,8 +9,7 @@ var Events = { _EAT_COOLDOWN: 5, _MEDS_COOLDOWN: 7, _LEAVE_COOLDOWN: 1, - _PAUSE_COOLDOWN: 0.4, - STUN_DURATION: 4, + STUN_DURATION: 4000, BLINK_INTERVAL: false, init: function(options) { @@ -73,34 +72,20 @@ var Events = { startCombat: function(scene) { Engine.event('game event', 'combat'); - Events.lost = false; + Events.won = false; var desc = $('#description', Events.eventPanel()); $('
').text(scene.notification).appendTo(desc); - // Draw pause button - Events.paused = true; - var pauseBox = $('
').attr('id', 'pauseButton').appendTo(desc); - var pause = new Button.Button({ - id: 'pause', - text: '', - cooldown: Events._PAUSE_COOLDOWN, - click: Events.togglePause - }).appendTo(pauseBox); - $('').addClass('text').insertBefore(pause.children('.cooldown')); - $('
').addClass('clear').appendTo(pauseBox); - Events.togglePause(pause); - - var fightBox = $('
').attr('id', 'fight').appendTo(desc); // Draw the wanderer - Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(fightBox); + Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(desc); + // Draw the enemy - Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(fightBox); + Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(desc); // Draw the action buttons var btns = $('#buttons', Events.eventPanel()); - var attackBtns = $('
').appendTo(btns).attr('id','attackButtons'); var numWeapons = 0; for(var k in World.Weapons) { var weapon = World.Weapons[k]; @@ -118,82 +103,21 @@ var Events = { } } numWeapons++; - Events.createAttackButton(k).appendTo(attackBtns); + Events.createAttackButton(k).appendTo(btns); } } if(numWeapons === 0) { // No weapons? You can punch stuff! - Events.createAttackButton('fists').prependTo(attackBtns); + Events.createAttackButton('fists').prependTo(btns); } - $('
').addClass('clear').appendTo(attackBtns); - var healBtns = $('
').appendTo(btns).attr('id','healButtons'); - Events.createEatMeatButton().appendTo(healBtns); + Events.createEatMeatButton().appendTo(btns); if((Path.outfit['medicine'] || 0) !== 0) { - Events.createUseMedsButton().appendTo(healBtns); + Events.createUseMedsButton().appendTo(btns); } - $('
').addClass('clear').appendTo(healBtns); - Events.setHeal(healBtns); // Set up the enemy attack timer - Events._enemyAttackTimer = Engine.setInterval(Events.enemyAttack, scene.attackDelay * 1000); - }, - - setPause: function(){ - Events.paused = true; - $('#event').addClass('paused'); - Button.clearCooldown($('#pause')); - var active = 0; - $('#buttons').find('.button').each(function(i){ - if($(this).data('onCooldown')){ - $(this).children('.cooldown').stop(true,false); - active++; - } - }); - Engine.log('fight paused. stopped '+ active +' buttons'); - }, - - removePause: function(state){ - var log, time, target; - switch(state){ - case 'set': - log = 'started'; - time = 0; - target = $(); - break; - case 'end': - $('#pause').addClass('disabled'); - log = 'ended'; - time = Events._FIGHT_SPEED; - target = $(); - break; - default: - log = 'resumed'; - time = Events._PAUSE_COOLDOWN * 1000; - target = $('#buttons').find('.button'); - break; - } - Engine.setTimeout(function(){ - Events.paused = false; - $('#event').removeClass('paused'); - target.each(function(i){ - if($(this).data('onCooldown')){ - Button.cooldown($(this), 'pause'); - } - }); - Engine.log('Event '+ log); - }, time); - }, - - togglePause: function(btn){ - var text = btn.children('.text').first(); - if(Events.paused) { - Events.removePause() - text.text( _('pause.') ); - } else { - Events.setPause(); - text.text( _('resume.') ) - } + Events._enemyAttackTimer = Engine.setTimeout(Events.enemyAttack, scene.attackDelay * 1000); }, createEatMeatButton: function(cooldown) { @@ -277,48 +201,52 @@ var Events = { }); }, - setHeal: function(healBtns){ - if(!healBtns){ - healBtns = $('#healButtons'); - } - healBtns = healBtns.children('.button'); - var canHeal = (World.health < World.getMaxHealth()); - healBtns.each(function(i){ - Button.setDisabled($(this), !canHeal); - }); - return canHeal; - }, - - doHeal: function(healing, cured, btn){ - if(Path.outfit[healing] > 0) { - Path.outfit[healing]--; + eatMeat: function() { + if(Path.outfit['cured meat'] > 0) { + Path.outfit['cured meat']--; World.updateSupplies(); - if(Path.outfit[healing] === 0) { - Button.setDisabled(btn, true); + if(Path.outfit['cured meat'] === 0) { + Button.setDisabled($('#eat'), true); } - var hp = World.health + cured; - hp = Math.min(World.getMaxHealth(),hp); + var hp = World.health; + hp += World.meatHeal(); + hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp; World.setHp(hp); - Events.setHeal(); if(Events.activeEvent()) { var w = $('#wanderer'); w.data('hp', hp); Events.updateFighterDiv(w); - Events.drawFloatText('+' + cured, '#wanderer .hp'); + Events.drawFloatText('+' + World.meatHeal(), '#wanderer .hp'); var takeETbutton = Events.setTakeAll(); Events.canLeave(takeETbutton); } } }, - eatMeat: function(btn) { - Events.doHeal('cured meat', World.meatHeal(), btn); - }, + useMeds: function() { + if(Path.outfit['medicine'] > 0) { + Path.outfit['medicine']--; + World.updateSupplies(); + if(Path.outfit['medicine'] === 0) { + Button.setDisabled($('#meds'), true); + } - useMeds: function(btn) { - Events.doHeal('medicine', World.medsHeal(), btn); + var hp = World.health; + hp += World.medsHeal(); + hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp; + World.setHp(hp); + + if(Events.activeEvent()) { + var w = $('#wanderer'); + w.data('hp', hp); + Events.updateFighterDiv(w); + Events.drawFloatText('+' + World.medsHeal(), '#wanderer .hp'); + var takeETbutton = Events.setTakeAll(); + Events.canLeave(takeETbutton); + } + } }, useWeapon: function(btn) { @@ -394,7 +322,7 @@ var Events = { var attackFn = weapon.type == 'ranged' ? Events.animateRanged : Events.animateMelee; attackFn($('#wanderer'), dmg, function() { - if($('#enemy').data('hp') <= 0) { + if($('#enemy').data('hp') <= 0 && !Events.won) { // Success! Events.winFight(); } @@ -402,33 +330,6 @@ var Events = { } }, - damage: function(fighter, enemy, dmg) { - var enemyHp = enemy.data('hp'); - var msg = ""; - if(typeof dmg == 'number') { - if(dmg < 0) { - msg = _('miss'); - dmg = 0; - } else { - msg = '-' + dmg; - enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); - enemy.data('hp', enemyHp); - if(fighter.attr('id') == 'enemy') { - World.setHp(enemyHp); - Events.setHeal(); - } - Events.updateFighterDiv(enemy); - } - } else { - if(dmg == 'stun') { - msg = _('stunned'); - enemy.data('stunned', Events.STUN_DURATION); - } - } - - Events.drawFloatText(msg, $('.hp', enemy)); - }, - animateMelee: function(fighter, dmg, callback) { var start, end, enemy; if(fighter.attr('id') == 'wanderer') { @@ -442,8 +343,32 @@ var Events = { } fighter.stop(true, true).animate(start, Events._FIGHT_SPEED, function() { + var enemyHp = enemy.data('hp'); + var msg = ""; + if(typeof dmg == 'number') { + if(dmg < 0) { + msg = _('miss'); + dmg = 0; + } else { + msg = '-' + dmg; + enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); + enemy.data('hp', enemyHp); + if(fighter.attr('id') == 'enemy') { + World.setHp(enemyHp); + } + Events.updateFighterDiv(enemy); + } + } else { + if(dmg == 'stun') { + msg = _('stunned'); + enemy.data('stunned', true); + Engine.setTimeout(function() { + enemy.data('stunned', false); + }, Events.STUN_DURATION); + } + } - Events.damage(fighter, enemy, dmg); + Events.drawFloatText(msg, $('.hp', enemy)); $(this).animate(end, Events._FIGHT_SPEED, callback); }); @@ -462,9 +387,33 @@ var Events = { } $('
').css(start).addClass('bullet').text('o').appendTo('#description') - .animate(end, Events._FIGHT_SPEED * 2, 'linear', function() { + .animate(end, Events._FIGHT_SPEED * 2, 'linear', function() { + var enemyHp = enemy.data('hp'); + var msg = ""; + if(typeof dmg == 'number') { + if(dmg < 0) { + msg = _('miss'); + dmg = 0; + } else { + msg = '-' + dmg; + enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); + enemy.data('hp', enemyHp); + if(fighter.attr('id') == 'enemy') { + World.setHp(enemyHp); + } + Events.updateFighterDiv(enemy); + } + } else { + if(dmg == 'stun') { + msg = _('stunned'); + enemy.data('stunned', true); + Engine.setTimeout(function() { + enemy.data('stunned', false); + }, Events.STUN_DURATION); + } + } - Events.damage(fighter, enemy, dmg); + Events.drawFloatText(msg, $('.hp', enemy)); $(this).remove(); if(typeof callback == 'function') { @@ -475,19 +424,9 @@ var Events = { enemyAttack: function() { - if(Events.paused){ - return; - } - var scene = Events.activeEvent().scenes[Events.activeScene]; - var enemy = $('#enemy'); - var stunning = enemy.data('stunned'); - - if(stunning) { - stunning -= scene.attackDelay; - enemy.data('stunned', Math.max(stunning, 0)); - } else { + if(!$('#enemy').data('stunned')) { var toHit = scene.hit; toHit *= $SM.hasPerk('evasive') ? 0.8 : 1; var dmg = -1; @@ -498,28 +437,24 @@ var Events = { var attackFn = scene.ranged ? Events.animateRanged : Events.animateMelee; attackFn($('#enemy'), dmg, function() { - if($('#wanderer').data('hp') <= 0) { - // Failure! - Events.loseFight(); - } + if($('#wanderer').data('hp') <= 0) { + // Failure! + clearTimeout(Events._enemyAttackTimer); + Events.endEvent(); + World.die(); + } }); } - }, - endFight: function() { - clearTimeout(Events._enemyAttackTimer); - Events.removePause('end'); + Events._enemyAttackTimer = Engine.setTimeout(Events.enemyAttack, scene.attackDelay * 1000); }, winFight: function() { - Engine.setTimeout(function() { - // Check after animation time, to see if the player has died before winning - if(Events.lost) { - return; - } - Events.endFight(); - $('#enemy').animate({opacity: 0}, 300, 'linear', function() { - Engine.setTimeout(function() { + Events.won = true; + clearTimeout(Events._enemyAttackTimer); + $('#enemy').animate({opacity: 0}, 300, 'linear', function() { + Engine.setTimeout(function() { + try { var scene = Events.activeEvent().scenes[Events.activeScene]; var leaveBtn = false; var desc = $('#description', Events.eventPanel()); @@ -530,7 +465,6 @@ var Events = { var takeETbtn = Events.drawLoot(scene.loot); - var exitBtns = $('
').appendTo(btns).attr('id','exitButtons'); if(scene.buttons) { // Draw the buttons leaveBtn = Events.drawButtons(scene); @@ -547,32 +481,22 @@ var Events = { }, text: _('leave') }); - Button.cooldown(leaveBtn.appendTo(exitBtns)); + Button.cooldown(leaveBtn.appendTo(btns)); - var healBtns = $('
').appendTo(btns).attr('id','healButtons'); - Events.createEatMeatButton(0).appendTo(healBtns); + Events.createEatMeatButton(0).appendTo(btns); if((Path.outfit['medicine'] || 0) !== 0) { - Events.createUseMedsButton(0).appendTo(healBtns); + Events.createUseMedsButton(0).appendTo(btns); } - $('
').addClass('clear').appendTo(healBtns); - Events.setHeal(healBtns); } - $('
').addClass('clear').appendTo(exitBtns); - Events.allowLeave(takeETbtn, leaveBtn); - }, 1000, true); - }); - }, Events._FIGHT_SPEED); + } catch(e) { + // It is possible to die and win if the timing is perfect. Just let it fail. + } + }, 1000, true); + }); }, - loseFight: function(){ - Events.lost = true; - Events.endFight(); - Events.endEvent(); - World.die(); - }, - - drawDrop: function(btn) { + drawDrop:function(btn) { var name = btn.attr('id').substring(5).replace('-', ' '); var needsAppend = false; var weight = Path.getWeight(name); @@ -847,15 +771,13 @@ var Events = { } // Draw the buttons - var exitBtns = $('
').attr('id','exitButtons').appendTo($('#buttons', Events.eventPanel())); leaveBtn = Events.drawButtons(scene); - $('
').addClass('clear').appendTo(exitBtns); Events.allowLeave(takeETbtn, leaveBtn); }, drawButtons: function(scene) { - var btns = $('#exitButtons', Events.eventPanel()); + var btns = $('#buttons', Events.eventPanel()); var btnsList = []; for(var id in scene.buttons) { var info = scene.buttons[id]; From 189af75c31e48aa1ac484fc1b3a71af034ee8adf Mon Sep 17 00:00:00 2001 From: Andrea Rendine Date: Wed, 17 Feb 2016 15:22:13 +0100 Subject: [PATCH 12/12] Correct changes Limited subset of commits: * unified function for healing (Events.doHeal); * unified function for attacks (Events.damage); * check if health is max, and disable healing buttons (Events.setHeal and related calls) * grouping buttons (attackButtons, healButtons and exitButtons for weapon attacks, meat & meds, continue/leave) --- script/events.js | 173 ++++++++++++++++++++++------------------------- 1 file changed, 81 insertions(+), 92 deletions(-) diff --git a/script/events.js b/script/events.js index 11d077d..ae750e8 100644 --- a/script/events.js +++ b/script/events.js @@ -77,15 +77,16 @@ var Events = { $('
').text(scene.notification).appendTo(desc); + var fightBox = $('
').attr('id', 'fight').appendTo(desc); // Draw the wanderer - Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(desc); - + Events.createFighterDiv('@', World.health, World.getMaxHealth()).attr('id', 'wanderer').appendTo(fightBox); // Draw the enemy - Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(desc); + Events.createFighterDiv(scene.chara, scene.health, scene.health).attr('id', 'enemy').appendTo(fightBox); // Draw the action buttons var btns = $('#buttons', Events.eventPanel()); + var attackBtns = $('
').appendTo(btns).attr('id','attackButtons'); var numWeapons = 0; for(var k in World.Weapons) { var weapon = World.Weapons[k]; @@ -103,18 +104,22 @@ var Events = { } } numWeapons++; - Events.createAttackButton(k).appendTo(btns); + Events.createAttackButton(k).appendTo(attackBtns); } } if(numWeapons === 0) { // No weapons? You can punch stuff! - Events.createAttackButton('fists').prependTo(btns); + Events.createAttackButton('fists').prependTo(attackBtns); } + $('
').addClass('clear').appendTo(attackBtns); - Events.createEatMeatButton().appendTo(btns); + var healBtns = $('
').appendTo(btns).attr('id','healButtons'); + Events.createEatMeatButton().appendTo(healBtns); if((Path.outfit['medicine'] || 0) !== 0) { - Events.createUseMedsButton().appendTo(btns); + Events.createUseMedsButton().appendTo(healBtns); } + $('
').addClass('clear').appendTo(healBtns); + Events.setHeal(healBtns); // Set up the enemy attack timer Events._enemyAttackTimer = Engine.setTimeout(Events.enemyAttack, scene.attackDelay * 1000); @@ -201,52 +206,48 @@ var Events = { }); }, - eatMeat: function() { - if(Path.outfit['cured meat'] > 0) { - Path.outfit['cured meat']--; + setHeal: function(healBtns) { + if(!healBtns){ + healBtns = $('#healButtons'); + } + healBtns = healBtns.children('.button'); + var canHeal = (World.health < World.getMaxHealth()); + healBtns.each(function(i){ + Button.setDisabled($(this), !canHeal); + }); + return canHeal; + }, + + doHeal: function(healing, cured, btn) { + if(Path.outfit[healing] > 0) { + Path.outfit[healing]--; World.updateSupplies(); - if(Path.outfit['cured meat'] === 0) { - Button.setDisabled($('#eat'), true); + if(Path.outfit[healing] === 0) { + Button.setDisabled(btn, true); } - var hp = World.health; - hp += World.meatHeal(); - hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp; + var hp = World.health + cured; + hp = Math.min(World.getMaxHealth(),hp); World.setHp(hp); + Events.setHeal(); if(Events.activeEvent()) { var w = $('#wanderer'); w.data('hp', hp); Events.updateFighterDiv(w); - Events.drawFloatText('+' + World.meatHeal(), '#wanderer .hp'); + Events.drawFloatText('+' + cured, '#wanderer .hp'); var takeETbutton = Events.setTakeAll(); Events.canLeave(takeETbutton); } } }, - useMeds: function() { - if(Path.outfit['medicine'] > 0) { - Path.outfit['medicine']--; - World.updateSupplies(); - if(Path.outfit['medicine'] === 0) { - Button.setDisabled($('#meds'), true); - } + eatMeat: function(btn) { + Events.doHeal('cured meat', World.meatHeal(), btn); + }, - var hp = World.health; - hp += World.medsHeal(); - hp = hp > World.getMaxHealth() ? World.getMaxHealth() : hp; - World.setHp(hp); - - if(Events.activeEvent()) { - var w = $('#wanderer'); - w.data('hp', hp); - Events.updateFighterDiv(w); - Events.drawFloatText('+' + World.medsHeal(), '#wanderer .hp'); - var takeETbutton = Events.setTakeAll(); - Events.canLeave(takeETbutton); - } - } + useMeds: function(btn) { + Events.doHeal('medicine', World.medsHeal(), btn); }, useWeapon: function(btn) { @@ -330,6 +331,33 @@ var Events = { } }, + damage: function(fighter, enemy, dmg) { + var enemyHp = enemy.data('hp'); + var msg = ""; + if(typeof dmg == 'number') { + if(dmg < 0) { + msg = _('miss'); + dmg = 0; + } else { + msg = '-' + dmg; + enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); + enemy.data('hp', enemyHp); + if(fighter.attr('id') == 'enemy') { + World.setHp(enemyHp); + Events.setHeal(); + } + Events.updateFighterDiv(enemy); + } + } else { + if(dmg == 'stun') { + msg = _('stunned'); + enemy.data('stunned', Events.STUN_DURATION); + } + } + + Events.drawFloatText(msg, $('.hp', enemy)); + }, + animateMelee: function(fighter, dmg, callback) { var start, end, enemy; if(fighter.attr('id') == 'wanderer') { @@ -343,32 +371,8 @@ var Events = { } fighter.stop(true, true).animate(start, Events._FIGHT_SPEED, function() { - var enemyHp = enemy.data('hp'); - var msg = ""; - if(typeof dmg == 'number') { - if(dmg < 0) { - msg = _('miss'); - dmg = 0; - } else { - msg = '-' + dmg; - enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); - enemy.data('hp', enemyHp); - if(fighter.attr('id') == 'enemy') { - World.setHp(enemyHp); - } - Events.updateFighterDiv(enemy); - } - } else { - if(dmg == 'stun') { - msg = _('stunned'); - enemy.data('stunned', true); - Engine.setTimeout(function() { - enemy.data('stunned', false); - }, Events.STUN_DURATION); - } - } - Events.drawFloatText(msg, $('.hp', enemy)); + Events.damage(fighter, enemy, dmg); $(this).animate(end, Events._FIGHT_SPEED, callback); }); @@ -387,33 +391,9 @@ var Events = { } $('
').css(start).addClass('bullet').text('o').appendTo('#description') - .animate(end, Events._FIGHT_SPEED * 2, 'linear', function() { - var enemyHp = enemy.data('hp'); - var msg = ""; - if(typeof dmg == 'number') { - if(dmg < 0) { - msg = _('miss'); - dmg = 0; - } else { - msg = '-' + dmg; - enemyHp = ((enemyHp - dmg) < 0) ? 0 : (enemyHp - dmg); - enemy.data('hp', enemyHp); - if(fighter.attr('id') == 'enemy') { - World.setHp(enemyHp); - } - Events.updateFighterDiv(enemy); - } - } else { - if(dmg == 'stun') { - msg = _('stunned'); - enemy.data('stunned', true); - Engine.setTimeout(function() { - enemy.data('stunned', false); - }, Events.STUN_DURATION); - } - } + .animate(end, Events._FIGHT_SPEED * 2, 'linear', function() { - Events.drawFloatText(msg, $('.hp', enemy)); + Events.damage(fighter, enemy, dmg); $(this).remove(); if(typeof callback == 'function') { @@ -465,6 +445,7 @@ var Events = { var takeETbtn = Events.drawLoot(scene.loot); + var exitBtns = $('
').appendTo(btns).attr('id','exitButtons'); if(scene.buttons) { // Draw the buttons leaveBtn = Events.drawButtons(scene); @@ -481,13 +462,18 @@ var Events = { }, text: _('leave') }); - Button.cooldown(leaveBtn.appendTo(btns)); + Button.cooldown(leaveBtn.appendTo(exitBtns)); - Events.createEatMeatButton(0).appendTo(btns); + var healBtns = $('
').appendTo(btns).attr('id','healButtons'); + Events.createEatMeatButton(0).appendTo(healBtns); if((Path.outfit['medicine'] || 0) !== 0) { - Events.createUseMedsButton(0).appendTo(btns); + Events.createUseMedsButton(0).appendTo(healBtns); } + $('
').addClass('clear').appendTo(healBtns); + Events.setHeal(healBtns); } + $('
').addClass('clear').appendTo(exitBtns); + Events.allowLeave(takeETbtn, leaveBtn); } catch(e) { // It is possible to die and win if the timing is perfect. Just let it fail. @@ -771,13 +757,16 @@ var Events = { } // Draw the buttons + var exitBtns = $('
').attr('id','exitButtons').appendTo($('#buttons', Events.eventPanel())); leaveBtn = Events.drawButtons(scene); + $('
').addClass('clear').appendTo(exitBtns); + Events.allowLeave(takeETbtn, leaveBtn); }, drawButtons: function(scene) { - var btns = $('#buttons', Events.eventPanel()); + var btns = $('#exitButtons', Events.eventPanel()); var btnsList = []; for(var id in scene.buttons) { var info = scene.buttons[id];