forked from sent/waves
132 lines
3.4 KiB
JavaScript
132 lines
3.4 KiB
JavaScript
var Button = {
|
|
Button: function(options) {
|
|
if(typeof options.cooldown == 'number') {
|
|
this.data_cooldown = options.cooldown;
|
|
}
|
|
this.data_remaining = 0;
|
|
if(typeof options.click == 'function') {
|
|
this.data_handler = options.click;
|
|
}
|
|
|
|
var el = $('<div>')
|
|
.attr('id', typeof(options.id) != 'undefined' ? options.id : "BTN_" + Engine.getGuid())
|
|
.addClass('button')
|
|
.text(typeof(options.text) != 'undefined' ? options.text : "button")
|
|
.click(function() {
|
|
if(!$(this).hasClass('disabled')) {
|
|
Button.cooldown($(this));
|
|
$(this).data("handler")($(this));
|
|
}
|
|
})
|
|
.data("handler", typeof options.click == 'function' ? options.click : function() { Engine.log("click"); })
|
|
.data("remaining", 0)
|
|
.data("cooldown", typeof options.cooldown == 'number' ? options.cooldown : 0)
|
|
.data('boosted', options.boosted ?? (() => false));
|
|
|
|
el.append($("<div>").addClass('cooldown'));
|
|
|
|
// waiting for expiry of residual cooldown detected in state
|
|
Button.cooldown(el, 'state');
|
|
|
|
if(options.cost) {
|
|
var ttPos = options.ttPos ? options.ttPos : "bottom right";
|
|
var costTooltip = $('<div>').addClass('tooltip ' + ttPos);
|
|
for(var k in options.cost) {
|
|
$("<div>").addClass('row_key').text(_(k)).appendTo(costTooltip);
|
|
$("<div>").addClass('row_val').text(options.cost[k]).appendTo(costTooltip);
|
|
}
|
|
if(costTooltip.children().length > 0) {
|
|
costTooltip.appendTo(el);
|
|
}
|
|
}
|
|
|
|
if(options.width) {
|
|
el.css('width', options.width);
|
|
}
|
|
|
|
return el;
|
|
},
|
|
|
|
saveCooldown: true,
|
|
|
|
setDisabled: function(btn, disabled) {
|
|
if(btn) {
|
|
if(!disabled && !btn.data('onCooldown')) {
|
|
btn.removeClass('disabled');
|
|
} else if(disabled) {
|
|
btn.addClass('disabled');
|
|
}
|
|
btn.data('disabled', disabled);
|
|
}
|
|
},
|
|
|
|
isDisabled: function(btn) {
|
|
if(btn) {
|
|
return btn.data('disabled') === true;
|
|
}
|
|
return false;
|
|
},
|
|
|
|
cooldown: function(btn, option) {
|
|
var cd = btn.data("cooldown");
|
|
if (btn.data('boosted')()) {
|
|
cd /= 2;
|
|
}
|
|
var id = 'cooldown.'+ btn.attr('id');
|
|
if(cd > 0) {
|
|
if(typeof option == 'number') {
|
|
cd = option;
|
|
}
|
|
// 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);
|
|
break;
|
|
default:
|
|
start = cd;
|
|
left = 1;
|
|
}
|
|
Button.clearCooldown(btn);
|
|
if(Button.saveCooldown){
|
|
$SM.set(id,start);
|
|
// residual value is measured in seconds
|
|
// saves program performance
|
|
btn.data('countdown', Engine.setInterval(function(){
|
|
$SM.set(id, $SM.get(id, true) - 0.5, true);
|
|
},500));
|
|
}
|
|
var time = start;
|
|
if (Engine.options.doubleTime){
|
|
time /= 2;
|
|
}
|
|
$('div.cooldown', btn).width(left * 100 +"%").animate({width: '0%'}, time * 1000, 'linear', function() {
|
|
Button.clearCooldown(btn, true);
|
|
});
|
|
btn.addClass('disabled');
|
|
btn.data('onCooldown', true);
|
|
}
|
|
},
|
|
|
|
clearCooldown: function(btn, cooldownEnded) {
|
|
var ended = cooldownEnded || false;
|
|
if(!ended){
|
|
$('div.cooldown', btn).stop(true, true);
|
|
}
|
|
btn.data('onCooldown', false);
|
|
if(btn.data('countdown')){
|
|
window.clearInterval(btn.data('countdown'));
|
|
$SM.remove('cooldown.'+ btn.attr('id'));
|
|
btn.removeData('countdown');
|
|
}
|
|
if(!btn.data('disabled')) {
|
|
btn.removeClass('disabled');
|
|
}
|
|
}
|
|
};
|