战斗动画,属性更名
This commit is contained in:
parent
25fb914841
commit
396abfe222
@ -269,7 +269,7 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = {
|
|||||||
"_type": "textarea",
|
"_type": "textarea",
|
||||||
"_data": "法强",
|
"_data": "法强",
|
||||||
},
|
},
|
||||||
"spelldef": {
|
"mdef": {
|
||||||
"_leaf": true,
|
"_leaf": true,
|
||||||
"_type": "textarea",
|
"_type": "textarea",
|
||||||
"_data": "法抗百分比",
|
"_data": "法抗百分比",
|
||||||
@ -280,7 +280,7 @@ var data_comment_c456ea59_6018_45ef_8bcc_211a24c627dc = {
|
|||||||
"_data": "100为法强转化为等值魔攻",
|
"_data": "100为法强转化为等值魔攻",
|
||||||
"_docs": "魔攻比例"
|
"_docs": "魔攻比例"
|
||||||
},
|
},
|
||||||
"mdef": {
|
"mhp": {
|
||||||
"_leaf": true,
|
"_leaf": true,
|
||||||
"_type": "textarea",
|
"_type": "textarea",
|
||||||
"_data": "100为法强转化为等值护盾",
|
"_data": "100为法强转化为等值护盾",
|
||||||
|
@ -437,12 +437,14 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
|||||||
"face_440110.webp",
|
"face_440110.webp",
|
||||||
"green.webp",
|
"green.webp",
|
||||||
"hero.webp",
|
"hero.webp",
|
||||||
|
"jianji.webp",
|
||||||
"l.webp",
|
"l.webp",
|
||||||
"lane1.webp",
|
"lane1.webp",
|
||||||
"light.webp",
|
"light.webp",
|
||||||
"lock.webp",
|
"lock.webp",
|
||||||
"lr.webp",
|
"lr.webp",
|
||||||
"maba.webp",
|
"maba.webp",
|
||||||
|
"miwu.webp",
|
||||||
"null.webp",
|
"null.webp",
|
||||||
"other_0001.webp",
|
"other_0001.webp",
|
||||||
"other_0002.webp",
|
"other_0002.webp",
|
||||||
@ -1116,7 +1118,7 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
|||||||
"atk": 100,
|
"atk": 100,
|
||||||
"def": 100,
|
"def": 100,
|
||||||
"mdef": 0,
|
"mdef": 0,
|
||||||
"speed": 0,
|
"speed": 10,
|
||||||
"money": 0,
|
"money": 0,
|
||||||
"exp": 0,
|
"exp": 0,
|
||||||
"equipment": [],
|
"equipment": [],
|
||||||
@ -1494,14 +1496,12 @@ var data_a1e2fb4a_e986_4524_b0da_9b7ba7c0874d =
|
|||||||
],
|
],
|
||||||
"startText": [
|
"startText": [
|
||||||
{
|
{
|
||||||
"type": "setValue",
|
"type": "function",
|
||||||
"name": "item:book",
|
"function": "function(){\ncore.getItem('book',1);core.getItem('fly',1)\n}"
|
||||||
"value": "1"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "setValue",
|
"type": "insert",
|
||||||
"name": "item:fly",
|
"name": "战斗动画特效注册"
|
||||||
"value": "1"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "insert",
|
"type": "insert",
|
||||||
|
@ -4,7 +4,7 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 =
|
|||||||
"redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"magic":false},
|
"redSlime": {"name":"红头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"value":10,"magic":false},
|
||||||
"blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0},
|
"blackSlime": {"name":"青头怪","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0},
|
||||||
"slimelord": {"name":"怪王","hp":100,"atk":120,"def":0,"money":10,"exp":0,"point":0,"special":[1,9]},
|
"slimelord": {"name":"怪王","hp":100,"atk":120,"def":0,"money":10,"exp":0,"point":0,"special":[1,9]},
|
||||||
"bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":10},
|
"bat": {"name":"小蝙蝠","hp":100,"atk":120,"def":0,"money":2,"exp":0,"point":0,"special":[1],"mdef":0,"speed":15},
|
||||||
"bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0},
|
"bigBat": {"name":"大蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":0},
|
||||||
"redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]},
|
"redBat": {"name":"红蝙蝠","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[]},
|
||||||
"vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8},
|
"vampire": {"name":"冥灵魔王","hp":888,"atk":888,"def":888,"money":888,"exp":888,"point":0,"special":[6],"n":8},
|
||||||
|
@ -10883,6 +10883,136 @@ var events_c12a15a8_c380_4b28_8144_256cba95f760 =
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"战斗动画特效注册": [
|
||||||
|
{
|
||||||
|
"type": "setanimate",
|
||||||
|
"name": "sword",
|
||||||
|
"px": 48,
|
||||||
|
"py": 48,
|
||||||
|
"width": 192,
|
||||||
|
"height": 192,
|
||||||
|
"allFarme": 15,
|
||||||
|
"imageList": [
|
||||||
|
{
|
||||||
|
"image": "jianji.webp",
|
||||||
|
"beforefarme": 0,
|
||||||
|
"globalAlpha": 100,
|
||||||
|
"cx": 192,
|
||||||
|
"cy": 2112,
|
||||||
|
"cw": 192,
|
||||||
|
"ch": 192,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 96,
|
||||||
|
"h": 96,
|
||||||
|
"afterfarme": 3,
|
||||||
|
"acx": 192,
|
||||||
|
"acy": 2112,
|
||||||
|
"acw": 192,
|
||||||
|
"ach": 192,
|
||||||
|
"ax": 0,
|
||||||
|
"ay": 0,
|
||||||
|
"aw": 96,
|
||||||
|
"ah": 96
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"image": "jianji.webp",
|
||||||
|
"beforefarme": 4,
|
||||||
|
"globalAlpha": 100,
|
||||||
|
"cx": 384,
|
||||||
|
"cy": 2112,
|
||||||
|
"cw": 192,
|
||||||
|
"ch": 192,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 96,
|
||||||
|
"h": 96,
|
||||||
|
"afterfarme": 6,
|
||||||
|
"acx": 384,
|
||||||
|
"acy": 2112,
|
||||||
|
"acw": 192,
|
||||||
|
"ach": 192,
|
||||||
|
"ax": 0,
|
||||||
|
"ay": 0,
|
||||||
|
"aw": 96,
|
||||||
|
"ah": 96
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"image": "jianji.webp",
|
||||||
|
"beforefarme": 7,
|
||||||
|
"globalAlpha": 100,
|
||||||
|
"cx": 576,
|
||||||
|
"cy": 2112,
|
||||||
|
"cw": 192,
|
||||||
|
"ch": 192,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 96,
|
||||||
|
"h": 96,
|
||||||
|
"afterfarme": 9,
|
||||||
|
"acx": 576,
|
||||||
|
"acy": 2112,
|
||||||
|
"acw": 192,
|
||||||
|
"ach": 192,
|
||||||
|
"ax": 0,
|
||||||
|
"ay": 0,
|
||||||
|
"aw": 96,
|
||||||
|
"ah": 96
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"image": "jianji.webp",
|
||||||
|
"beforefarme": 10,
|
||||||
|
"globalAlpha": 100,
|
||||||
|
"cx": 768,
|
||||||
|
"cy": 2112,
|
||||||
|
"cw": 192,
|
||||||
|
"ch": 192,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 96,
|
||||||
|
"h": 96,
|
||||||
|
"afterfarme": 12,
|
||||||
|
"acx": 768,
|
||||||
|
"acy": 2112,
|
||||||
|
"acw": 192,
|
||||||
|
"ach": 192,
|
||||||
|
"ax": 0,
|
||||||
|
"ay": 0,
|
||||||
|
"aw": 96,
|
||||||
|
"ah": 96
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"image": "jianji.webp",
|
||||||
|
"beforefarme": 13,
|
||||||
|
"globalAlpha": 100,
|
||||||
|
"cx": 0,
|
||||||
|
"cy": 2304,
|
||||||
|
"cw": 192,
|
||||||
|
"ch": 192,
|
||||||
|
"x": 0,
|
||||||
|
"y": 0,
|
||||||
|
"w": 96,
|
||||||
|
"h": 96,
|
||||||
|
"afterfarme": 15,
|
||||||
|
"acx": 0,
|
||||||
|
"acy": 2304,
|
||||||
|
"acw": 192,
|
||||||
|
"ach": 192,
|
||||||
|
"ax": 0,
|
||||||
|
"ay": 0,
|
||||||
|
"aw": 96,
|
||||||
|
"ah": 96
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"soundList": [
|
||||||
|
{
|
||||||
|
"sound": "",
|
||||||
|
"startfarme": 0,
|
||||||
|
"stopbefore": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"CommonEventTemplate": {
|
"CommonEventTemplate": {
|
||||||
|
@ -982,8 +982,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
|||||||
mon_length = length,
|
mon_length = length,
|
||||||
hero_length = length,
|
hero_length = length,
|
||||||
mon_time = 0,
|
mon_time = 0,
|
||||||
hero_time = 0;
|
hero_time = 0; now_mon_hp > 0;
|
||||||
now_mon_hp > 0;
|
|
||||||
|
|
||||||
) {
|
) {
|
||||||
//勇士和怪物的长度
|
//勇士和怪物的长度
|
||||||
|
BIN
project/images/jianji.webp
Normal file
BIN
project/images/jianji.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 370 KiB |
BIN
project/images/miwu.webp
Normal file
BIN
project/images/miwu.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 21 KiB |
@ -113,7 +113,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
data.image,
|
data.image,
|
||||||
data.memory,
|
data.memory,
|
||||||
data.hidetime || 30,
|
data.hidetime || 30,
|
||||||
data.list || [{
|
data.list || [
|
||||||
|
{
|
||||||
text: "",
|
text: "",
|
||||||
sound: "",
|
sound: "",
|
||||||
time: 50,
|
time: 50,
|
||||||
@ -121,7 +122,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
boldColor: "#000000",
|
boldColor: "#000000",
|
||||||
font: "bold 48px Verdana",
|
font: "bold 48px Verdana",
|
||||||
frame: 0,
|
frame: 0,
|
||||||
}, ]
|
},
|
||||||
|
]
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
core.doAction();
|
core.doAction();
|
||||||
@ -201,9 +203,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
core.ui.cgText.head = core.clone(data.head);
|
core.ui.cgText.head = core.clone(data.head);
|
||||||
core.ui.cgText.index = data.index;
|
core.ui.cgText.index = data.index;
|
||||||
core.ui.cgText.name = core.ui.cgText.textList[data.index][0];
|
core.ui.cgText.name = core.ui.cgText.textList[data.index][0];
|
||||||
core.ui.cgText.text = data.text ?
|
core.ui.cgText.text = data.text
|
||||||
data.text :
|
? data.text
|
||||||
core.ui.cgText.textList[data.index][1];
|
: core.ui.cgText.textList[data.index][1];
|
||||||
core.ui.cgText.time = data.time;
|
core.ui.cgText.time = data.time;
|
||||||
core.ui.cgText.wait = data.wait;
|
core.ui.cgText.wait = data.wait;
|
||||||
core.ui.cgText.WindowSkin = data.WindowSkin;
|
core.ui.cgText.WindowSkin = data.WindowSkin;
|
||||||
@ -2845,10 +2847,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
const totalWidthScaled = totalWidth * core.domStyle.scale,
|
const totalWidthScaled = totalWidth * core.domStyle.scale,
|
||||||
totalHeightScaled = totalHeight * core.domStyle.scale;
|
totalHeightScaled = totalHeight * core.domStyle.scale;
|
||||||
|
|
||||||
const gameDrawBox = isVertical ? {
|
const gameDrawBox = isVertical ?
|
||||||
|
{
|
||||||
left: BORDER_WIDTH / 3,
|
left: BORDER_WIDTH / 3,
|
||||||
top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3,
|
top: BAR_HEIGHT_VERTICAL / 3 + BORDER_HEIGHT / 3,
|
||||||
} : { left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 };
|
} :
|
||||||
|
{ left: BAR_WIDTH / 3 + BORDER_WIDTH / 3, top: BORDER_HEIGHT / 3 };
|
||||||
|
|
||||||
const obj = {
|
const obj = {
|
||||||
clientWidth: clientWidth,
|
clientWidth: clientWidth,
|
||||||
@ -3485,10 +3489,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
this._update_infoWindow();
|
this._update_infoWindow();
|
||||||
}
|
}
|
||||||
_update_toolBox() {
|
_update_toolBox() {
|
||||||
const tools = core.isReplaying() ? [
|
const tools = core.isReplaying() ?
|
||||||
|
[
|
||||||
[core.status.replay.pausing ? "play" : "pause", "stop", "rewind"],
|
[core.status.replay.pausing ? "play" : "pause", "stop", "rewind"],
|
||||||
["speedDown", "speedUp", "save"],
|
["speedDown", "speedUp", "save"],
|
||||||
] : [
|
] :
|
||||||
|
[
|
||||||
["keyboard", "shop", "pack", "T332"],
|
["keyboard", "shop", "pack", "T332"],
|
||||||
["settings", "save", "load", "T331"],
|
["settings", "save", "load", "T331"],
|
||||||
];
|
];
|
||||||
@ -3842,7 +3848,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
var mid = Math.floor((start + end) / 2);
|
var mid = Math.floor((start + end) / 2);
|
||||||
if (mid - start > end - mid) mid--;
|
if (mid - start > end - mid) mid--;
|
||||||
var nextInfo = core.enemys.getDamageInfo(
|
var nextInfo = core.enemys.getDamageInfo(
|
||||||
enemy, { atk: mid },
|
enemy,
|
||||||
|
{ atk: mid },
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
floorId
|
floorId
|
||||||
@ -3852,15 +3859,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
else start = mid + 1;
|
else start = mid + 1;
|
||||||
}
|
}
|
||||||
var nextInfo = core.enemys.getDamageInfo(
|
var nextInfo = core.enemys.getDamageInfo(
|
||||||
enemy, { atk: start },
|
enemy,
|
||||||
|
{ atk: start },
|
||||||
x,
|
x,
|
||||||
y,
|
y,
|
||||||
floorId
|
floorId
|
||||||
);
|
);
|
||||||
return nextInfo == null ||
|
return nextInfo == null ||
|
||||||
typeof nextInfo == "number" ||
|
typeof nextInfo == "number" ||
|
||||||
nextInfo.damage >= pre ?
|
nextInfo.damage >= pre
|
||||||
null : [start, nextInfo.damage];
|
? null
|
||||||
|
: [start, nextInfo.damage];
|
||||||
};
|
};
|
||||||
var currAtk = start_atk;
|
var currAtk = start_atk;
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -4293,8 +4302,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
events.prototype.battle = function (id, x, y, force, callback) {
|
events.prototype.battle = function (id, x, y, force, callback) {
|
||||||
core.saveAndStopAutomaticRoute();
|
core.saveAndStopAutomaticRoute();
|
||||||
id = id || core.getBlockId(x, y);
|
id = id || core.getBlockId(x, y);
|
||||||
const cls = core.getClsFromId(id)
|
const cls = core.getClsFromId(id);
|
||||||
if (!id || !cls || !(cls === 'enemys' || cls === 'enemy48')) return core.clearContinueAutomaticRoute(callback);
|
if (!id || !cls || !(cls === "enemys" || cls === "enemy48"))
|
||||||
|
return core.clearContinueAutomaticRoute(callback);
|
||||||
// 非强制战斗
|
// 非强制战斗
|
||||||
if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) {
|
if (!core.enemys.canBattle(id, x, y) && !force && !core.status.event.id) {
|
||||||
core.stopSound();
|
core.stopSound();
|
||||||
@ -4311,7 +4321,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
this.afterBattle(id, x, y);
|
this.afterBattle(id, x, y);
|
||||||
if (callback) callback();
|
if (callback) callback();
|
||||||
};
|
};
|
||||||
|
|
||||||
},
|
},
|
||||||
"额外信息": function () {
|
"额外信息": function () {
|
||||||
/* 宝石血瓶左下角显示数值
|
/* 宝石血瓶左下角显示数值
|
||||||
@ -9180,7 +9189,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
const type = checkAudioType(data);
|
const type = checkAudioType(data);
|
||||||
if (type === "") {
|
if (type === "") {
|
||||||
console.error(
|
console.error(
|
||||||
"Unknown audio type. Header: '" + [...toCheck]
|
"Unknown audio type. Header: '" +
|
||||||
|
[...toCheck]
|
||||||
.map((v) => v.toString().padStart(2, "0"))
|
.map((v) => v.toString().padStart(2, "0"))
|
||||||
.join(" ")
|
.join(" ")
|
||||||
.toUpperCase() +
|
.toUpperCase() +
|
||||||
@ -9303,7 +9313,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
return !isNil(data.isFirstPage);
|
return !isNil(data.isFirstPage);
|
||||||
}
|
}
|
||||||
class AudioStreamSource {
|
class AudioStreamSource {
|
||||||
|
|
||||||
constructor(context) {
|
constructor(context) {
|
||||||
this.output = context.createBufferSource();
|
this.output = context.createBufferSource();
|
||||||
/** 是否已经完全加载完毕 */
|
/** 是否已经完全加载完毕 */
|
||||||
@ -9366,7 +9375,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
this.audioType = checkAudioType(data);
|
this.audioType = checkAudioType(data);
|
||||||
if (!this.audioType) {
|
if (!this.audioType) {
|
||||||
console.error(
|
console.error(
|
||||||
"Unknown audio type. Header: '" + [...toCheck]
|
"Unknown audio type. Header: '" +
|
||||||
|
[...toCheck]
|
||||||
.map((v) => v.toString(16).padStart(2, "0"))
|
.map((v) => v.toString(16).padStart(2, "0"))
|
||||||
.join(" ")
|
.join(" ")
|
||||||
.toUpperCase() +
|
.toUpperCase() +
|
||||||
@ -9663,7 +9673,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
class AudioElementSource {
|
class AudioElementSource {
|
||||||
|
|
||||||
constructor(context) {
|
constructor(context) {
|
||||||
const audio = new Audio();
|
const audio = new Audio();
|
||||||
audio.preload = "none";
|
audio.preload = "none";
|
||||||
@ -9721,7 +9730,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
class AudioBufferSource {
|
class AudioBufferSource {
|
||||||
|
|
||||||
constructor(context) {
|
constructor(context) {
|
||||||
this.output = context.createBufferSource();
|
this.output = context.createBufferSource();
|
||||||
/** 是否循环 */
|
/** 是否循环 */
|
||||||
@ -10810,251 +10818,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
core.playSound("确定");
|
core.playSound("确定");
|
||||||
core.ui._drawSwitchs_sounds();
|
core.ui._drawSwitchs_sounds();
|
||||||
};
|
};
|
||||||
},
|
|
||||||
"怪物碎裂特效": function () {
|
|
||||||
// 在此增加新插件
|
|
||||||
// -------------------- 安装说明 -------------------- //
|
|
||||||
// 先安装两个在插件简介中说明的前置插件
|
|
||||||
// 然后再将本插件复制到插件编写中即可
|
|
||||||
// 插件自带一个打怪后显示碎裂特效的功能
|
|
||||||
// -------------------- 使用说明 -------------------- //
|
|
||||||
/*
|
|
||||||
|
|
||||||
本插件的核心是一个名为 applyFragWith 的函数,打怪后的碎裂特效也是由它执行的。
|
|
||||||
我们来说明一下这个函数的使用方式。
|
|
||||||
1. 引入
|
|
||||||
你可以使用 const { applyFragWith } = core.plugin.frag; 在任何地方来引入这个函数。
|
|
||||||
|
|
||||||
2. 函数的参数
|
|
||||||
该函数有三个参数,分别是canvas, length, time。
|
|
||||||
其中,第一个参数意思是,在执行碎裂时,其内容由该画布决定,这个特效并不会修改传入的画布,因此原画布的内容会依然存在
|
|
||||||
第二个参数指的是每个碎片的边长,虽然原则上每个碎片都是正方形,但边缘一周的碎片可能不是正方形,但中间的碎片一定是
|
|
||||||
第三个参数指的是这个特效要执行多长时间
|
|
||||||
第四个参数是一个对象,包含四种配置量,均为可选,分别是maxMoveLength,moveFlush,maxRotate,fragTiming
|
|
||||||
当这些不存在时会默认取同名的常量作为默认值。这些值有什么用可以看下面的常量注释。
|
|
||||||
|
|
||||||
3. 函数的返回值
|
|
||||||
这个函数会返回一个特效控制器对象,这个控制器共有三个属性。
|
|
||||||
animation: 指的是当前特效的高级动画对象
|
|
||||||
onEnd: 一个Promise,当这个特效执行完毕后会被 fulfilled
|
|
||||||
canvas: 特效所显示的画布。这个画布不会自动部署到样板中,需要你手动使用appendChild来部署,具体可参考打怪后碎裂的样例
|
|
||||||
|
|
||||||
4. 修改一些常量
|
|
||||||
在下面有四个有注释的常量MAX_MOVE_LENGTH ~ FRAG_TIMING,你可以根据你自己的需要来更改。
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (main.replayChecking) return (core.plugin.frag = {});
|
|
||||||
|
|
||||||
const { Animation, linear, sleep } = core.plugin.animate;
|
|
||||||
const { has } = core.plugin.utils;
|
|
||||||
|
|
||||||
/** 最大移动距离,最终位置距离中心的距离变成原来的几倍 */
|
|
||||||
const MAX_MOVE_LENGTH = 1.15;
|
|
||||||
/** 移动距离波动,在最大移动距离的基础上加上多少倍距离的波动距离 */
|
|
||||||
const MOVE_FLUSH = 0.7;
|
|
||||||
/** 最大旋转角,单位是弧度,每个碎片都会有自己的旋转程度,是随机的 */
|
|
||||||
const MAX_ROTATE = 0.5;
|
|
||||||
/** 碎裂动画的速率曲线函数 */
|
|
||||||
const FRAG_TIMING = linear();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {HTMLCanvasElement} canvas 要执行特效的画布
|
|
||||||
* @param {number} length 切分成的碎片的边长,碎片为正方形
|
|
||||||
* @param {number} time 特效持续时长
|
|
||||||
* @returns 返回一个碎裂特效控制器,是一个对象,详见开头的使用注释
|
|
||||||
*/
|
|
||||||
function applyFragWith(canvas, length = 4, time = 2000, config = {}) {
|
|
||||||
// 先切分图片
|
|
||||||
const imgs = splitCanvas(canvas, length);
|
|
||||||
const cx = canvas.width / 2;
|
|
||||||
const cy = canvas.height / 2;
|
|
||||||
|
|
||||||
let maxX = 0;
|
|
||||||
let maxY = 0;
|
|
||||||
const toMove = imgs.map((v) => {
|
|
||||||
const centerX = v.x + v.canvas.width / 2;
|
|
||||||
const centerY = v.y + v.canvas.height / 2;
|
|
||||||
const onX = centerX === cx;
|
|
||||||
const onY = centerY === cy;
|
|
||||||
const mml = config.maxMoveLength ?? MAX_MOVE_LENGTH;
|
|
||||||
const mf = config.moveFlush ?? MOVE_FLUSH;
|
|
||||||
const rate = mml - 1 + Math.random() ** 3 * mf;
|
|
||||||
let endX = onY ? 0 : (centerX - cx) * rate;
|
|
||||||
let endY = onX ? 0 : (centerY - cy) * rate;
|
|
||||||
const mx = Math.abs(endX + centerX) + Math.abs(v.canvas.width);
|
|
||||||
const my = Math.abs(endY + centerY) + Math.abs(v.canvas.height);
|
|
||||||
if (mx > maxX) maxX = mx;
|
|
||||||
if (my > maxY) maxY = my;
|
|
||||||
const r = config.maxRotate ?? MAX_ROTATE;
|
|
||||||
const endRad = Math.random() * r * 2 - r;
|
|
||||||
|
|
||||||
return {
|
|
||||||
deltaX: endX,
|
|
||||||
deltaY: endY,
|
|
||||||
endRad,
|
|
||||||
x: centerX,
|
|
||||||
y: centerY,
|
|
||||||
canvas: v.canvas,
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
// 再执行动画
|
|
||||||
const frag = document.createElement("canvas");
|
|
||||||
const ctx = frag.getContext("2d");
|
|
||||||
const ani = new Animation();
|
|
||||||
ani.register("rate", 0);
|
|
||||||
const ft = config.fragTiming ?? FRAG_TIMING;
|
|
||||||
ani.absolute().time(time).mode(ft).apply("rate", 1);
|
|
||||||
frag.width = maxX * 2;
|
|
||||||
frag.height = maxY * 2;
|
|
||||||
ctx.save();
|
|
||||||
const dw = maxX - canvas.width / 2;
|
|
||||||
const dh = maxY - canvas.height / 2;
|
|
||||||
|
|
||||||
const fragFn = () => {
|
|
||||||
const rate = ani.value.rate;
|
|
||||||
const opacity = 1 - rate;
|
|
||||||
ctx.globalAlpha = opacity;
|
|
||||||
ctx.clearRect(0, 0, frag.width, frag.height);
|
|
||||||
toMove.forEach((v) => {
|
|
||||||
ctx.save();
|
|
||||||
const nx = v.deltaX * rate;
|
|
||||||
const ny = v.deltaY * rate;
|
|
||||||
const rotate = v.endRad * rate;
|
|
||||||
|
|
||||||
ctx.translate(nx + v.x + dw, ny + v.y + dh);
|
|
||||||
ctx.rotate(rotate);
|
|
||||||
ctx.drawImage(
|
|
||||||
v.canvas,
|
|
||||||
nx - v.canvas.width / 2,
|
|
||||||
ny - v.canvas.height / 2
|
|
||||||
);
|
|
||||||
ctx.restore();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
const onEnd = () => {};
|
|
||||||
ani.ticker.add(fragFn);
|
|
||||||
|
|
||||||
return makeFragManager(frag, ani, time, onEnd);
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeFragManager(canvas, ani, time, onEnd) {
|
|
||||||
const promise = sleep(time + 50);
|
|
||||||
|
|
||||||
return {
|
|
||||||
animation: ani,
|
|
||||||
|
|
||||||
onEnd: promise.then(() => {
|
|
||||||
ani.ticker.destroy();
|
|
||||||
onEnd();
|
|
||||||
}),
|
|
||||||
canvas,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function withImage(image, sx, sy, sw, sh) {
|
|
||||||
const canvas = document.createElement("canvas");
|
|
||||||
const ctx = canvas.getContext("2d");
|
|
||||||
canvas.width = sw;
|
|
||||||
canvas.height = sh;
|
|
||||||
ctx.drawImage(image, sx, sy, sw, sh, 0, 0, sw, sh);
|
|
||||||
return { canvas, x: sx, y: sy };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 切分画布
|
|
||||||
* @param canvas 要被切分的画布
|
|
||||||
* @param l 切分小块的边长
|
|
||||||
*/
|
|
||||||
function splitCanvas(canvas, l) {
|
|
||||||
if (canvas.width / l < 2 || canvas.height / l < 2) {
|
|
||||||
console.warn("切分画布要求切分边长大于等于画布长宽的一半!");
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
const w = canvas.width;
|
|
||||||
const h = canvas.height;
|
|
||||||
const numX = Math.floor(w / l);
|
|
||||||
const numY = Math.floor(h / l);
|
|
||||||
const rw = (w - numX * l) / 2;
|
|
||||||
const rh = (h - numY * l) / 2;
|
|
||||||
|
|
||||||
const res = [];
|
|
||||||
|
|
||||||
if (rw > 0) {
|
|
||||||
if (rh > 0) {
|
|
||||||
res.push(
|
|
||||||
withImage(canvas, 0, 0, rw, rh),
|
|
||||||
withImage(canvas, 0, canvas.height - rh, rw, rh),
|
|
||||||
withImage(canvas, canvas.width - rw, 0, rw, rh),
|
|
||||||
withImage(canvas, canvas.width - rw, canvas.height - rh, rw, rh)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
for (const x of [0, canvas.width - rw]) {
|
|
||||||
for (let ny = 0; ny < numY; ny++) {
|
|
||||||
res.push(withImage(canvas, x, rh + l * ny, rw, l));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rh > 0) {
|
|
||||||
for (const y of [0, canvas.height - rh]) {
|
|
||||||
for (let nx = 0; nx < numX; nx++) {
|
|
||||||
res.push(withImage(canvas, rw + l * nx, y, l, rh));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (let nx = 0; nx < numX; nx++) {
|
|
||||||
for (let ny = 0; ny < numY; ny++) {
|
|
||||||
res.push(withImage(canvas, rw + l * nx, rh + l * ny, l, l));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
const origin = core.events.afterBattle;
|
|
||||||
core.events.afterBattle = function (enemyId, x, y) {
|
|
||||||
// 打怪特效
|
|
||||||
if (has(x) && has(y)) {
|
|
||||||
const frame = core.status.globalAnimateStatus % 2;
|
|
||||||
// 生成怪物图像
|
|
||||||
const canvas = document.createElement("canvas");
|
|
||||||
canvas.width = 32;
|
|
||||||
canvas.height = 32;
|
|
||||||
core.drawIcon(canvas, enemyId, 0, 0, 32, 32, frame);
|
|
||||||
// 执行动画
|
|
||||||
const manager = applyFragWith(canvas);
|
|
||||||
const frag = manager.canvas;
|
|
||||||
// 设置特效画布的css属性
|
|
||||||
frag.style.imageRendering = "pixelated";
|
|
||||||
frag.style.width = `${frag.width * core.domStyle.scale}px`;
|
|
||||||
frag.style.height = `${frag.height * core.domStyle.scale}px`;
|
|
||||||
const left =
|
|
||||||
(x * 32 + 16 - frag.width / 2 - core.bigmap.offsetX) *
|
|
||||||
core.domStyle.scale;
|
|
||||||
const top =
|
|
||||||
(y * 32 + 16 - frag.height / 2 - core.bigmap.offsetY) *
|
|
||||||
core.domStyle.scale;
|
|
||||||
frag.style.left = `${left}px`;
|
|
||||||
frag.style.top = `${top}px`;
|
|
||||||
frag.style.zIndex = "45";
|
|
||||||
frag.style.position = "absolute";
|
|
||||||
// 将特效画布部署到样板上
|
|
||||||
core.dom.gameDraw.appendChild(frag);
|
|
||||||
// 当特效执行完毕后移除这个特效画布
|
|
||||||
manager.onEnd.then(() => {
|
|
||||||
frag.remove();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return origin.apply(this, arguments);
|
|
||||||
};
|
|
||||||
|
|
||||||
if ("frag" in core.plugin) {
|
|
||||||
throw new ReferenceError(`core.plugin上已存在名为frag的属性!`);
|
|
||||||
}
|
|
||||||
core.plugin.frag = {
|
|
||||||
applyFragWith,
|
|
||||||
};
|
|
||||||
},
|
},
|
||||||
"自定义常用事件": function () {
|
"自定义常用事件": function () {
|
||||||
// editorBlocklyconfigPlus.js
|
// editorBlocklyconfigPlus.js
|
||||||
@ -13096,8 +12859,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h);
|
core.drawImage(ctx, img, 0, 0, 60, 60, fx, fy, w, h);
|
||||||
const layer = info.upOrDown[id];
|
const layer = info.upOrDown[id];
|
||||||
const min = Math.min(w, h);
|
const min = Math.min(w, h);
|
||||||
if (core.getFlag("任务地点") && core.getFlag("任务地点") === id)
|
|
||||||
ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2);
|
|
||||||
if (layer?.includes("upFloor"))
|
if (layer?.includes("upFloor"))
|
||||||
core.drawIcon(
|
core.drawIcon(
|
||||||
ctx,
|
ctx,
|
||||||
@ -13116,7 +12879,13 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
min / 2,
|
min / 2,
|
||||||
min / 2
|
min / 2
|
||||||
);
|
);
|
||||||
|
if (core.getFlag("任务地点") && core.getFlag("任务地点") === id)
|
||||||
|
ctx.drawImage(tesk, fx + min / 4, fy + min / 4, min / 2, min / 2);
|
||||||
|
if (id === core.status.floorId) core.drawImage(ctx, "hero.webp",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
32,
|
||||||
|
19, fx + min / 4, fy + min * 5 / 16, 32, 19);
|
||||||
// 显示漏怪数量
|
// 显示漏怪数量
|
||||||
if (core.getFlag("showEnemy")) {
|
if (core.getFlag("showEnemy")) {
|
||||||
ctx.textAlign = "center";
|
ctx.textAlign = "center";
|
||||||
@ -13139,6 +12908,10 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
);
|
);
|
||||||
ctx.shadowBlur = 0;
|
ctx.shadowBlur = 0;
|
||||||
}
|
}
|
||||||
|
if (!core.hasVisitedFloor(id)) {
|
||||||
|
core.fillRect(ctx, fx, fy, w, h, "rgba(0,0,0,0.7)")
|
||||||
|
core.fillText(ctx, "?", fx + min / 2, fy + min * 3 / 4, "#FFFFFF", "bold 42px Verdana")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -13528,20 +13301,30 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
if (
|
if (
|
||||||
!core.status.maps[core.floorIds[page]].canFlyTo ||
|
!core.status.maps[core.floorIds[page]].canFlyTo ||
|
||||||
!core.hasVisitedFloor(core.floorIds[page])
|
!core.hasVisitedFloor(core.floorIds[page])
|
||||||
)
|
) {
|
||||||
|
/*core.fillRect("ui", 58,
|
||||||
|
58,
|
||||||
|
size - 50,
|
||||||
|
size - 50, "rgba(0,0,0,0.5)")*/
|
||||||
|
core.getContextByName("ui").globalAlpha = 0.7
|
||||||
|
|
||||||
core.drawImage(
|
core.drawImage(
|
||||||
"ui",
|
"ui",
|
||||||
"lock.webp",
|
"miwu.webp",
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
size,
|
size,
|
||||||
size,
|
size,
|
||||||
58,
|
58,
|
||||||
58,
|
58,
|
||||||
size - 8,
|
size - 50,
|
||||||
size - 8
|
size - 50
|
||||||
);
|
);
|
||||||
|
core.getContextByName("ui").globalAlpha = 1
|
||||||
|
/*core.fillText("ui", '?', 188,
|
||||||
|
278,
|
||||||
|
"rgba(255,255,255,0.2)", this._buildFont(250, true))*/
|
||||||
|
}
|
||||||
core.fillRoundRect(
|
core.fillRoundRect(
|
||||||
"ui",
|
"ui",
|
||||||
15 + 44 - 2,
|
15 + 44 - 2,
|
||||||
@ -13767,7 +13550,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
title,
|
title,
|
||||||
15 - 4 + size - 4 + 45,
|
15 - 4 + size - 4 + 45,
|
||||||
85,
|
85,
|
||||||
"#FFFFFF",
|
core.hasVisitedFloor(floorId) ? "#FFFFFF" : "#444444",
|
||||||
"#000000",
|
"#000000",
|
||||||
18
|
18
|
||||||
);
|
);
|
||||||
@ -14362,10 +14145,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
[x + w, y + h],
|
[x + w, y + h],
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
const inRect = ([x, y], [
|
const inRect = ([x, y], [[sx, sy], [dx, dy]]) => {
|
||||||
[sx, sy],
|
|
||||||
[dx, dy]
|
|
||||||
]) => {
|
|
||||||
return sx <= x && x <= dx && sy <= y && y <= dy;
|
return sx <= x && x <= dx && sy <= y && y <= dy;
|
||||||
};
|
};
|
||||||
const pos = [px, py];
|
const pos = [px, py];
|
||||||
@ -15404,10 +15184,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
[x + w, y + h],
|
[x + w, y + h],
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
const inRect = ([x, y], [
|
const inRect = ([x, y], [[sx, sy], [dx, dy]]) => {
|
||||||
[sx, sy],
|
|
||||||
[dx, dy]
|
|
||||||
]) => {
|
|
||||||
return sx <= x && x <= dx && sy <= y && y <= dy;
|
return sx <= x && x <= dx && sy <= y && y <= dy;
|
||||||
};
|
};
|
||||||
const pos = [px, py];
|
const pos = [px, py];
|
||||||
@ -15588,9 +15365,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
config.defaultFont = config.font = config.font || globalAttribute.font;
|
config.defaultFont = config.font = config.font || globalAttribute.font;
|
||||||
config.time = config.time || 0;
|
config.time = config.time || 0;
|
||||||
config.letterSpacing =
|
config.letterSpacing =
|
||||||
config.letterSpacing == null ?
|
config.letterSpacing == null
|
||||||
textAttribute.letterSpacing || 0 :
|
? textAttribute.letterSpacing || 0
|
||||||
config.letterSpacing;
|
: config.letterSpacing;
|
||||||
|
|
||||||
config.index = 0;
|
config.index = 0;
|
||||||
config.currcolor = config.color;
|
config.currcolor = config.color;
|
||||||
@ -15644,9 +15421,9 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
var block = config.blocks[config.index++];
|
var block = config.blocks[config.index++];
|
||||||
if (block != null) {
|
if (block != null) {
|
||||||
// It works, why?
|
// It works, why?
|
||||||
const scale = config.isHD ?
|
const scale = config.isHD
|
||||||
devicePixelRatio * core.domStyle.scale :
|
? devicePixelRatio * core.domStyle.scale
|
||||||
1;
|
: 1;
|
||||||
ctx.restore();
|
ctx.restore();
|
||||||
ctx.save(); //保存设置
|
ctx.save(); //保存设置
|
||||||
if (core.domStyle.isVertical) {
|
if (core.domStyle.isVertical) {
|
||||||
@ -15749,15 +15526,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
const indexList = this.textList;
|
const indexList = this.textList;
|
||||||
core.setTextAlign(logctx, "left");
|
core.setTextAlign(logctx, "left");
|
||||||
for (
|
for (
|
||||||
let i = (page - 1) * 6; i <= Math.min(this.index, page * 6 - 1); i++
|
let i = (page - 1) * 6;
|
||||||
|
i <= Math.min(this.index, page * 6 - 1);
|
||||||
|
i++
|
||||||
) {
|
) {
|
||||||
const text = this.textList[i][1].replaceAll(
|
const text = this.textList[i][1].replaceAll(
|
||||||
/(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g,
|
/(\\(d|e|f|g|i|n|r|b|c|t|z))(\[.*?\])?/g,
|
||||||
""
|
""
|
||||||
); //取消打字机
|
); //取消打字机
|
||||||
const name = this.textList[i][0] ?
|
const name = this.textList[i][0]
|
||||||
"【" + this.textList[i][0] + "】" :
|
? "【" + this.textList[i][0] + "】"
|
||||||
"";
|
: "";
|
||||||
if (name) {
|
if (name) {
|
||||||
core.fillBoldText1(
|
core.fillBoldText1(
|
||||||
logctx,
|
logctx,
|
||||||
@ -18096,7 +17875,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
music.loop = "loop";
|
music.loop = "loop";
|
||||||
core.material.bgms[name] = music;*/
|
core.material.bgms[name] = music;*/
|
||||||
};
|
};
|
||||||
|
|
||||||
},
|
},
|
||||||
"横屏切换": function () {
|
"横屏切换": function () {
|
||||||
// 在此增加新插件
|
// 在此增加新插件
|
||||||
@ -18210,7 +17988,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
core.setFlag("animate_" + name);
|
core.setFlag("animate_" + name);
|
||||||
};
|
};
|
||||||
let thistime = 0;
|
let thistime = 0;
|
||||||
this.playanimate = function (name, x, y, hero, scalex, scaley) {
|
this.playanimate = function (name, x, y, hero, scalex, scaley, callback) {
|
||||||
const data = {
|
const data = {
|
||||||
name: name,
|
name: name,
|
||||||
x: x,
|
x: x,
|
||||||
@ -18219,6 +17997,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
scalex: scalex,
|
scalex: scalex,
|
||||||
scaley: scaley,
|
scaley: scaley,
|
||||||
farme: 0,
|
farme: 0,
|
||||||
|
callback
|
||||||
};
|
};
|
||||||
|
|
||||||
core.plugin.playing.add(data);
|
core.plugin.playing.add(data);
|
||||||
@ -18357,7 +18136,10 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
one.farme++;
|
one.farme++;
|
||||||
if (one.farme > data.allFarme) core.plugin.playing.delete(one);
|
if (one.farme > data.allFarme) {
|
||||||
|
core.plugin.playing.delete(one)
|
||||||
|
if (one.callback) { one.callback() }
|
||||||
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -18728,8 +18510,13 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
oneTurn,
|
oneTurn,
|
||||||
enemyInfo,
|
enemyInfo,
|
||||||
equipInfo,
|
equipInfo,
|
||||||
farme
|
farme,
|
||||||
|
damageInfo
|
||||||
) {
|
) {
|
||||||
|
let attack = false
|
||||||
|
if (heroInfo.isAttack) attack = true
|
||||||
|
if (enemyInfo.isAttack) attack = true
|
||||||
|
equipInfo.forEach(function (v) { if (v.isAttack) attack = true })
|
||||||
core.clearMap(ctx);
|
core.clearMap(ctx);
|
||||||
let animate = Math.floor(farme / 30);
|
let animate = Math.floor(farme / 30);
|
||||||
core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)");
|
core.fillRect(ctx, 64, 64, 288, 288, "rgba(0,0,0,0.5)");
|
||||||
@ -18739,46 +18526,49 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
ctx,
|
ctx,
|
||||||
hero.name,
|
hero.name,
|
||||||
127,
|
127,
|
||||||
123,
|
128,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.setTextAlign(ctx, "left");
|
core.setTextAlign(ctx, "left");
|
||||||
core.drawIcon(ctx, 'hp', 70, 190, 16, 16)
|
core.drawIcon(ctx, "hp", 70, 190, 16, 16);
|
||||||
core.drawIcon(ctx, 'atk', 70, 210, 16, 16)
|
core.drawIcon(ctx, "atk", 70, 210, 16, 16);
|
||||||
core.drawIcon(ctx, 'def', 70, 230, 16, 16)
|
core.drawIcon(ctx, "def", 70, 230, 16, 16);
|
||||||
core.drawIcon(ctx, 'I374', 70, 250, 16, 16)
|
core.drawIcon(ctx, "I374", 70, 250, 16, 16);
|
||||||
core.drawIcon(ctx, 'I375', 70, 270, 16, 16)
|
core.drawIcon(ctx, "I375", 70, 270, 16, 16);
|
||||||
core.drawIcon(ctx, 'mdef', 70, 290, 16, 16)
|
core.drawIcon(ctx, "mdef", 70, 290, 16, 16);
|
||||||
core.drawIcon(ctx, 'amulet', 70, 310, 16, 16)
|
core.drawIcon(ctx, "amulet", 70, 310, 16, 16);
|
||||||
core.drawIcon(ctx, 'jumpShoes', 70, 330, 16, 16)
|
core.drawIcon(ctx, "jumpShoes", 70, 330, 16, 16);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
'生命 ' + core.formatBigNumber(heroInfo.hp, true) + " / " + core.formatBigNumber(heroInfo.hpmax, true),
|
"生命 " +
|
||||||
|
core.formatBigNumber(heroInfo.hp, true) +
|
||||||
|
" / " +
|
||||||
|
core.formatBigNumber(heroInfo.hpmax, true),
|
||||||
90,
|
90,
|
||||||
205,
|
205,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
'攻击 ' + core.formatBigNumber(heroInfo.atk),
|
"攻击 " + core.formatBigNumber(heroInfo.atk),
|
||||||
90,
|
90,
|
||||||
225,
|
225,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
'防御 ' + core.formatBigNumber(heroInfo.def),
|
"防御 " + core.formatBigNumber(heroInfo.def),
|
||||||
90,
|
90,
|
||||||
245,
|
245,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
@ -18787,43 +18577,51 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
265,
|
265,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
"法攻 " + core.formatBigNumber(heroInfo.matk / 100 * heroInfo.spell) + "(" + heroInfo.matk + "%)",
|
"法攻 " +
|
||||||
|
core.formatBigNumber((heroInfo.matk / 100) * heroInfo.spell) +
|
||||||
|
"(" +
|
||||||
|
heroInfo.matk +
|
||||||
|
"%)",
|
||||||
90,
|
90,
|
||||||
285,
|
285,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
'护盾 ' + core.formatBigNumber(heroInfo.mdef / 100 * heroInfo.spell) + "(" + heroInfo.mdef + "%)",
|
"护盾 " +
|
||||||
|
core.formatBigNumber((heroInfo.mhp / 100) * heroInfo.spell) +
|
||||||
|
"(" +
|
||||||
|
heroInfo.mhp +
|
||||||
|
"%)",
|
||||||
90,
|
90,
|
||||||
305,
|
305,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
'法抗 ' + heroInfo.spelldef + "%",
|
"法抗 " + heroInfo.mdef + "%",
|
||||||
90,
|
90,
|
||||||
325,
|
325,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
'速度 ' + core.formatBigNumber(heroInfo.speed),
|
"速度 " + core.formatBigNumber(heroInfo.speed),
|
||||||
90,
|
90,
|
||||||
345,
|
345,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
|
|
||||||
core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1);
|
core.strokeRect(ctx, 112, 139, 32, 48, "rgba(255,255,255,1)", 1);
|
||||||
@ -18840,17 +18638,17 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
48
|
48
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
core.setTextAlign(ctx, "center");
|
core.setTextAlign(ctx, "center");
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
enemyInfo.name,
|
enemyInfo.name,
|
||||||
289,
|
289,
|
||||||
123,
|
128,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
|
|
||||||
core.setTextAlign(ctx, "right");
|
core.setTextAlign(ctx, "right");
|
||||||
if (enemyInfo.cls === "enemys") {
|
if (enemyInfo.cls === "enemys") {
|
||||||
core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1);
|
core.strokeRect(ctx, 272, 155, 32, 32, "rgba(255,255,255,1)", 1);
|
||||||
@ -18883,37 +18681,37 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
48
|
48
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
core.drawIcon(ctx, 'hp', 330, 190, 16, 16)
|
core.drawIcon(ctx, "hp", 330, 190, 16, 16);
|
||||||
core.drawIcon(ctx, 'atk', 330, 210, 16, 16)
|
core.drawIcon(ctx, "atk", 330, 210, 16, 16);
|
||||||
core.drawIcon(ctx, 'def', 330, 230, 16, 16)
|
core.drawIcon(ctx, "def", 330, 230, 16, 16);
|
||||||
core.drawIcon(ctx, 'amulet', 330, 250, 16, 16)
|
core.drawIcon(ctx, "amulet", 330, 250, 16, 16);
|
||||||
core.drawIcon(ctx, 'jumpShoes', 330, 270, 16, 16)
|
core.drawIcon(ctx, "jumpShoes", 330, 270, 16, 16);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
core.formatBigNumber(enemyInfo.hp, true) + ' 生命',
|
core.formatBigNumber(enemyInfo.hp, true) + " 生命",
|
||||||
330,
|
330,
|
||||||
205,
|
205,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
core.formatBigNumber(enemyInfo.atk) + ' 攻击',
|
core.formatBigNumber(enemyInfo.atk) + " 攻击",
|
||||||
330,
|
330,
|
||||||
225,
|
225,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
core.formatBigNumber(enemyInfo.def) + ' 防御',
|
core.formatBigNumber(enemyInfo.def) + " 防御",
|
||||||
330,
|
330,
|
||||||
245,
|
245,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
|
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
@ -18923,7 +18721,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
265,
|
265,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(
|
core.fillBoldText(
|
||||||
ctx,
|
ctx,
|
||||||
@ -18932,24 +18730,147 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
285,
|
285,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 14px pala'
|
"bold 14px pala"
|
||||||
);
|
);
|
||||||
core.fillBoldText(ctx,
|
core.fillBoldText(
|
||||||
|
ctx,
|
||||||
"V",
|
"V",
|
||||||
219,
|
219,
|
||||||
163,
|
163,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 48px pala')
|
"bold 48px pala"
|
||||||
core.fillBoldText(ctx,
|
);
|
||||||
|
core.fillBoldText(
|
||||||
|
ctx,
|
||||||
"s",
|
"s",
|
||||||
231,
|
231,
|
||||||
163,
|
163,
|
||||||
"#FFFFFF",
|
"#FFFFFF",
|
||||||
"#000000",
|
"#000000",
|
||||||
'bold 36px pala')
|
"bold 36px pala"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!attack) enemyInfo.now += enemyInfo.speed / oneTurn * 215
|
||||||
|
let enemynow = Math.min(100 + enemyInfo.now, 315)
|
||||||
|
ctx.fillStyle = "#FFFFFF"
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.moveTo(enemynow, 100)
|
||||||
|
ctx.lineTo(enemynow + 3, 90)
|
||||||
|
ctx.lineTo(enemynow - 3, 90)
|
||||||
|
ctx.closePath()
|
||||||
|
ctx.fill()
|
||||||
|
|
||||||
|
if (enemyInfo.cls === "enemys") {
|
||||||
|
|
||||||
|
|
||||||
|
core.drawImage(
|
||||||
|
ctx,
|
||||||
|
core.getBlockInfo(enemyInfo.id).image,
|
||||||
|
32,
|
||||||
|
core.getBlockInfo(enemyInfo.id).posY * 32,
|
||||||
|
32,
|
||||||
|
32,
|
||||||
|
enemynow - 16,
|
||||||
|
64,
|
||||||
|
32,
|
||||||
|
32
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
|
||||||
|
|
||||||
|
core.drawImage(
|
||||||
|
ctx,
|
||||||
|
core.getBlockInfo(enemyInfo.id).image,
|
||||||
|
32,
|
||||||
|
core.getBlockInfo(enemyInfo.id).posY * 48,
|
||||||
|
32,
|
||||||
|
19,
|
||||||
|
enemynow - 16,
|
||||||
|
70,
|
||||||
|
32,
|
||||||
|
19
|
||||||
|
);
|
||||||
|
}
|
||||||
|
core.drawLine(ctx, 100, 105, 315, 105, '#FFFFFF', 5)
|
||||||
|
equipInfo.forEach(function (v) {
|
||||||
|
if (!attack) v.now += v.speed / oneTurn * 215
|
||||||
|
let vnow = Math.min(100 + v.now, 315)
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.moveTo(vnow, 100)
|
||||||
|
ctx.lineTo(vnow + 3, 90)
|
||||||
|
ctx.lineTo(vnow - 3, 90)
|
||||||
|
ctx.closePath()
|
||||||
|
|
||||||
|
ctx.fill()
|
||||||
|
|
||||||
|
core.drawIcon(ctx,
|
||||||
|
v.id,
|
||||||
|
vnow - 16,
|
||||||
|
64,
|
||||||
|
32,
|
||||||
|
32)
|
||||||
|
|
||||||
|
})
|
||||||
|
if (!attack) heroInfo.now += heroInfo.speed / oneTurn * 215
|
||||||
|
let heronow = Math.min(100 + heroInfo.now, 315)
|
||||||
|
ctx.beginPath()
|
||||||
|
ctx.moveTo(heronow, 100)
|
||||||
|
ctx.lineTo(heronow + 3, 90)
|
||||||
|
ctx.lineTo(heronow - 3, 90)
|
||||||
|
ctx.closePath()
|
||||||
|
|
||||||
|
ctx.fill()
|
||||||
|
console.log(heronow)
|
||||||
|
core.drawImage(ctx,
|
||||||
|
"hero.webp",
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
32,
|
||||||
|
19,
|
||||||
|
heronow - 16,
|
||||||
|
70,
|
||||||
|
32,
|
||||||
|
19)
|
||||||
|
|
||||||
|
if (heroInfo.now >= 215) {
|
||||||
|
heroInfo.isAttack = true;
|
||||||
|
animateOnAttack("sword", true, () => {
|
||||||
|
heroInfo.now -= 215
|
||||||
|
heroInfo.isAttack = false
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
if (enemyInfo.now >= 215) {
|
||||||
|
enemyInfo.isAttack = true
|
||||||
|
animateOnAttack("sword", false, () => {
|
||||||
|
enemyInfo.now -= 215
|
||||||
|
enemyInfo.isAttack = false
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
equipInfo.forEach(v => {
|
||||||
|
if (v.now >= 215) {
|
||||||
|
v.isAttack = true
|
||||||
|
|
||||||
|
animateOnAttack("sword", true, () => {
|
||||||
|
v.now -= 215
|
||||||
|
v.isAttack = false
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function animateOnAttack(name, onenemy, callback) {
|
||||||
|
if (onenemy) {
|
||||||
|
core.playanimate(name, 290, 160, null, 1, 1, callback)
|
||||||
|
} else {
|
||||||
|
core.playanimate(name, 130, 160, null, 1, 1, callback)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.attackAnimate = function (
|
this.attackAnimate = function (
|
||||||
enemyId,
|
enemyId,
|
||||||
enemyInfo,
|
enemyInfo,
|
||||||
@ -18964,36 +18885,43 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
hero_atk = core.getRealStatusOrDefault(hero, "atk"),
|
hero_atk = core.getRealStatusOrDefault(hero, "atk"),
|
||||||
hero_def = core.getRealStatusOrDefault(hero, "def"),
|
hero_def = core.getRealStatusOrDefault(hero, "def"),
|
||||||
hero_spell = core.getRealStatusOrDefault(hero, "spell"),
|
hero_spell = core.getRealStatusOrDefault(hero, "spell"),
|
||||||
hero_matk = core.getRealStatusOrDefault(hero, "mdef"),
|
hero_matk = core.getRealStatusOrDefault(hero, "matk"),
|
||||||
hero_mdef = core.getRealStatusOrDefault(hero, "mdef"),
|
hero_mdef = core.getRealStatusOrDefault(hero, "mdef"),
|
||||||
hero_speed = core.getRealStatusOrDefault(hero, "speed"),
|
hero_speed = core.getRealStatusOrDefault(hero, "speed"),
|
||||||
hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"),
|
hero_hpmax = core.getRealStatusOrDefault(hero, "hpmax"),
|
||||||
hero_spelldef = core.getRealStatusOrDefault(hero, "spelldef");
|
hero_mhp = core.getRealStatusOrDefault(hero, "mhp");
|
||||||
const heroInfo = {
|
const heroInfo = {
|
||||||
hp: hero_hp,
|
hp: hero_hp,
|
||||||
hpmax: hero_hpmax,
|
hpmax: hero_hpmax,
|
||||||
atk: hero_atk,
|
atk: hero_atk,
|
||||||
def: hero_def,
|
def: hero_def,
|
||||||
spell: hero_spell,
|
spell: hero_spell,
|
||||||
spelldef: hero_spelldef,
|
mhp: hero_mhp,
|
||||||
matk: hero_matk,
|
matk: hero_matk,
|
||||||
mdef: hero_mdef,
|
mdef: hero_mdef,
|
||||||
speed: hero_speed,
|
speed: hero_speed,
|
||||||
now: 0,
|
now: 0,
|
||||||
|
isAttack: false
|
||||||
};
|
};
|
||||||
enemyInfo.id = enemyId;
|
enemyInfo.id = enemyId;
|
||||||
enemyInfo.cls = core.getClsFromId(enemyId);
|
enemyInfo.cls = core.getClsFromId(enemyId);
|
||||||
enemyInfo.name = core.material.enemys[enemyId].name;
|
enemyInfo.name = core.material.enemys[enemyId].name;
|
||||||
|
enemyInfo.now = 0;
|
||||||
|
enemyInfo.isAttack = false
|
||||||
let oneTurn = heroInfo.speed + enemyInfo.speed;
|
let oneTurn = heroInfo.speed + enemyInfo.speed;
|
||||||
if (equipInfo.length > 0) {
|
if (equipInfo.length > 0) {
|
||||||
for (let i; i < equipInfo.length - 1; i++) {
|
for (let i; i < equipInfo.length - 1; i++) {
|
||||||
|
equipInfo[i].now = 0
|
||||||
|
equipInfo[i].isAttack = false
|
||||||
oneTurn += equipInfo[i].speed;
|
oneTurn += equipInfo[i].speed;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
oneTurn *= 100;
|
oneTurn *= 25;
|
||||||
let time = 0,
|
let time = 0,
|
||||||
farme = 0;
|
farme = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
core.registerAnimationFrame("attackAnimate", true, (temptime) => {
|
core.registerAnimationFrame("attackAnimate", true, (temptime) => {
|
||||||
if (temptime - time > 1000 / 60) {
|
if (temptime - time > 1000 / 60) {
|
||||||
time = temptime;
|
time = temptime;
|
||||||
@ -19002,7 +18930,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 =
|
|||||||
oneTurn,
|
oneTurn,
|
||||||
enemyInfo,
|
enemyInfo,
|
||||||
equipInfo,
|
equipInfo,
|
||||||
farme
|
farme,
|
||||||
|
damageInfo
|
||||||
);
|
);
|
||||||
farme++;
|
farme++;
|
||||||
}
|
}
|
||||||
|
@ -544,9 +544,9 @@ p#name {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* 注释下面这三行以开启抗锯齿 */
|
/* 注释下面这三行以开启抗锯齿 */
|
||||||
.anti-aliasing {
|
/* .anti-aliasing {
|
||||||
image-rendering: pixelated;
|
image-rendering: pixelated;
|
||||||
}
|
} */
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s;
|
transition: left cubic-bezier(0, 0.9, 1, 0.1) 2.5s;
|
||||||
|
Loading…
Reference in New Issue
Block a user