Files
2024-07-20 15:46:46 +08:00

284 lines
9.6 KiB
JavaScript

'use strict';
decadeModule.import(function (lib, game, ui, get, ai, _status) {
decadeUI.effect = {
dialog: {
create: function (titleText) {
return decadeUI.dialog.create('effect-dialog dui-dialog');
},
compare: function (source, target) {
var dialog = this.create();
dialog.characters = [
decadeUI.dialog.create('player1 character', dialog),
decadeUI.dialog.create('player2 character', dialog)
];
decadeUI.dialog.create('back', dialog.characters[0]),
decadeUI.dialog.create('back', dialog.characters[1]),
dialog.content = decadeUI.dialog.create('content', dialog),
dialog.buttons = decadeUI.dialog.create('buttons', dialog.content)
dialog.cards = [
decadeUI.dialog.create('player1 card', dialog.buttons),
decadeUI.dialog.create('player2 card', dialog.buttons)
];
dialog.names = [
decadeUI.dialog.create('player1 name', dialog.buttons),
decadeUI.dialog.create('player2 name', dialog.buttons)
];
dialog.buttons.vs = decadeUI.dialog.create('vs', dialog.buttons);
dialog.names[0].innerHTML = get.translation(source) + '发起';
dialog.names[1].innerHTML = get.translation(target);
dialog.set = function (attr, value) {
switch (attr) {
case 'player1':
case 'source':
if (get.itemtype(value) != 'player' || value.isUnseen()) {
dialog.characters[0].firstChild.style.backgroundImage = '';
dialog.names[0].innerHTML = get.translation(value) + '发起';
return false;
}
var avatar = value.isUnseen(0) ? value.node.avatar2 : value.node.avatar;
dialog.characters[0].firstChild.style.backgroundImage = avatar.style.backgroundImage;
dialog.names[0].innerHTML = get.translation(value) + '发起';
break;
case 'player2':
case 'target':
if (get.itemtype(value) != 'player' || value.isUnseen()) {
dialog.characters[1].firstChild.style.backgroundImage = '';
dialog.names[1].innerHTML = get.translation(value);
return false;
}
var avatar = value.isUnseen(0) ? value.node.avatar2 : value.node.avatar;
dialog.characters[1].firstChild.style.backgroundImage = avatar.style.backgroundImage;
dialog.names[1].innerHTML = get.translation(value);
break;
case 'card1':
case 'sourceCard':
if (dialog.cards[0].firstChild) dialog.cards[0].removeChild(dialog.cards[0].firstChild);
dialog.cards[0].appendChild(value);
break;
case 'card2':
case 'targetCard':
if (dialog.cards[1].firstChild) dialog.cards[1].removeChild(dialog.cards[1].firstChild);
dialog.cards[1].appendChild(value);
break;
default:
return false;
}
return true;
},
dialog.set('source', source);
dialog.set('target', target);
return dialog;
},
},
gameStart: function () {
game.playAudio('../extension', decadeUI.extensionName, 'audio/game_start.mp3');
var animation = decadeUI.animation;
var bounds = animation.getSpineBounds('effect_youxikaishi');
if (bounds == null) return;
var sz = bounds.size;
var scale = Math.min(animation.canvas.width / sz.x, animation.canvas.height / sz.y) * 0.76;
animation.playSpine({
name: 'effect_youxikaishi',
scale: scale
});
},
line: function (dots) {
decadeUI.animate.add(function (source, target, e) {
var ctx = e.context;
ctx.shadowColor = 'yellow';
ctx.shadowBlur = 1;
if (!this.head) this.head = 0;
if (!this.tail) this.tail = -1;
this.head += 0.07 * (e.deltaTime / 17);
if (this.head >= 1) {
this.head = 1;
this.tail += (0.07 * (e.deltaTime / 17));
}
var tail = this.tail < 0 ? 0 : this.tail;
var head = this.head;
if (this.tail <= 1) {
var x1 = decadeUI.get.lerp(source.x, target.x, tail);
var y1 = decadeUI.get.lerp(source.y, target.y, tail);
var x2 = decadeUI.get.lerp(source.x, target.x, head);
var y2 = decadeUI.get.lerp(source.y, target.y, head);
e.drawLine(x1, y1, x2, y2, 'rgb(250,220,140)', 2.6);
return false;
} else {
return true;
}
}, true, { x: dots[0], y: dots[1] }, { x: dots[2], y: dots[3] });
},
kill: function (source, target) {
if (get.itemtype(source) != 'player' || get.itemtype(target) != 'player') throw 'arguments';
if (source == target) return;
if (source.isUnseen() || target.isUnseen()) return;
var sourceAvatar = source.isUnseen(0) ? source.node.avatar2 : source.node.avatar;
var targetAvatar = target.isUnseen(0) ? target.node.avatar2 : target.node.avatar;
var effect = decadeUI.dialog.create('effect-window');
var killerWarpper = decadeUI.dialog.create('killer-warpper', effect);
killerWarpper.killer = decadeUI.dialog.create('killer', killerWarpper);
killerWarpper.killer.style.backgroundImage = sourceAvatar.style.backgroundImage;
var victim = decadeUI.dialog.create('victim', effect);
victim.back = decadeUI.dialog.create('back', victim);
victim.back.part1 = decadeUI.dialog.create('part1', victim.back);
victim.back.part2 = decadeUI.dialog.create('part2', victim.back);
victim.back.part1.style.backgroundImage = targetAvatar.style.backgroundImage;
victim.back.part2.style.backgroundImage = targetAvatar.style.backgroundImage;
effect.style.backgroundColor = 'rgba(0,0,0,0.7)';
effect.style.transition = 'all 4s';
effect.style.zIndex = 7;
var anim = decadeUI.animation;
var bounds = anim.getSpineBounds('effect_jisha1');
game.playAudio('../extension', decadeUI.extensionName, 'audio/kill_effect_sound.mp3');
if (bounds == void 0) {
var lightLarge = decadeUI.dialog.create('li-big', effect);
victim.rout = decadeUI.dialog.create('rout', victim);
victim.rout2 = decadeUI.dialog.create('rout', victim);
victim.rout.innerHTML = '破敌';
victim.rout2.innerHTML = '破敌';
victim.rout2.classList.add('shadow');
ui.window.appendChild(effect);
var height = ui.window.offsetHeight;
var x, y, scale;
for (var i = 0; i < 10; i++) {
x = decadeUI.getRandom(0, 100) + 'px';
y = decadeUI.getRandom(0, height / 4) + 'px';
x = decadeUI.getRandom(0, 1) == 1 ? x : '-' + x;
y = decadeUI.getRandom(0, 1) == 1 ? y : '-' + y;
scale = decadeUI.getRandom(1, 10) / 10;
setTimeout(function (mx, my, mscale, meffect) {
var light = decadeUI.dialog.create('li', meffect);
light.style.transform = 'translate(' + mx + ', ' + my + ')' + 'scale(' + mscale + ')';
}, decadeUI.getRandom(50, 300), x, y, scale, effect);
}
} else {
var sz = bounds.size;
var scale = anim.canvas.width / sz.x * 1.2;
anim.playSpine('effect_jisha1', { scale: scale });
ui.window.appendChild(effect);
ui.refresh(effect);
}
decadeUI.delay(2000);
effect.style.backgroundColor = 'rgba(0,0,0,0)';
effect.close(3000);
effect = null;
},
skill: function (player, skillName, vice) {
if (get.itemtype(player) != 'player') return console.error('player');
var animation = decadeUI.animation;
var asset = animation.spine.assets['effect_xianding'];
if (!asset) return console.error('[effect_xianding]特效未加载');
if (!asset.ready) animation.prepSpine('effect_xianding');
var camp = player.group;
var playerName, playerAvatar;
if (vice === 'vice') {
playerName = get.translation(player.name2);
playerAvatar = player.node.avatar2;
} else {
playerName = get.translation(player.name);
playerAvatar = player.node.avatar;
}
var url = getComputedStyle(playerAvatar).backgroundImage;
var image = new Image();
var bgImage = new Image();
image.onload = function () {
bgImage.onload = function () {
var animation = decadeUI.animation;
var sprite = animation.playSpine('effect_xianding');
var skeleton = sprite.skeleton;
var slot = skeleton.findSlot('shilidipan');
var attachment = slot.getAttachment();
var region;
if (attachment.camp !== camp) {
if (!attachment.cached) attachment.cached = {};
if (!attachment.cached[camp]) {
region = animation.createTextureRegion(bgImage);
attachment.cached[camp] = region;
} else {
region = attachment.cached[camp];
}
attachment.width = region.width;
attachment.height = region.height;
attachment.setRegion(region);
attachment.updateOffset();
attachment.camp = camp;
}
slot = skeleton.findSlot('wujiang');
attachment = slot.getAttachment();
region = animation.createTextureRegion(image);
var scale = Math.min(288 / region.width, 378 / region.height);
attachment.width = region.width * scale;
attachment.height = region.height * scale;
attachment.setRegion(region);
attachment.updateOffset();
var size = skeleton.bounds.size;
sprite.scale = Math.max(animation.canvas.width / size.x, animation.canvas.height / size.y);
var effect = decadeUI.element.create('effect-window');
effect.view.skillName = decadeUI.element.create('skill-name', effect);
effect.view.skillName.innerHTML = skillName;
effect.view.skillName.style.top = 'calc(50% + ' + 165 * sprite.scale + 'px)';
animation.canvas.parentNode.insertBefore(effect, animation.canvas.nextSibling);
effect.removeSelf(2180);
};
bgImage.onerror = function () {
bgImage.onerror = void 0;
bgImage.src = decadeUIPath + 'assets/image/bg_xianding_qun.png';
};
bgImage.src = decadeUIPath + 'assets/image/bg_xianding_' + camp + '.png';
};
if(url.indexOf("url(\"") == 0){
image.src = url.slice(5, url.indexOf("\")"));
}else if(url.indexOf("url('") == 0){
image.src = url.slice(5, url.indexOf("\')"));
}
},
};
});