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();