Eustia/_server/editor_blocklyconfig.js

909 lines
32 KiB
JavaScript
Raw Normal View History

2025-01-18 17:49:44 +08:00
editor_blocklyconfig = function () {
// start mark sfergsvae
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
(function () {
var getCategory = function (name, custom) {
for (var node of document.getElementById("toolbox").children) {
if (node.getAttribute("name") == name) return node;
}
var node = document.createElement("category");
node.setAttribute("name", name);
if (custom) node.setAttribute("custom", custom);
document.getElementById("toolbox").appendChild(node);
return node;
};
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
var toolboxObj = {
入口方块: [
'<label text="入口方块会根据当前类型在此数组中筛选,具体控制在editor_blockly.entranceCategoryCallback中"></label>',
MotaActionFunctions.actionParser.parse(
[
"欢迎使用事件编辑器",
"本事件触发一次后会消失",
{ type: "hide", time: 500 },
2024-11-29 12:38:58 +08:00
],
2025-01-18 17:49:44 +08:00
"event"
),
MotaActionFunctions.actionParser.parse(
{
condition: "flag:__door__===2",
currentFloor: true,
priority: 0,
delayExecute: false,
multiExecute: false,
data: [{ type: "openDoor", loc: [10, 5] }],
},
"autoEvent"
),
MotaActionBlocks["changeFloor_m"].xmlText(),
MotaActionFunctions.actionParser.parse(
[
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
id: "shop1",
text: "\t[贪婪之神,moneyShop]勇敢的武士啊, 给我${20+2*flag:shop1}金币就可以:",
textInList: "1F金币商店",
choices: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
text: "生命+800",
need: "status:money>=20+2*flag:shop1",
action: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
type: "comment",
text: "新版商店中需要手动扣减金币和增加访问次数",
2024-11-29 12:38:58 +08:00
},
{
2025-01-18 17:49:44 +08:00
type: "setValue",
name: "status:money",
operator: "-=",
value: "20+2*flag:shop1",
2024-11-29 12:38:58 +08:00
},
{
2025-01-18 17:49:44 +08:00
type: "setValue",
name: "flag:shop1",
operator: "+=",
value: "1",
2024-11-29 12:38:58 +08:00
},
{
2025-01-18 17:49:44 +08:00
type: "setValue",
name: "status:hp",
operator: "+=",
value: "800",
2024-11-29 12:38:58 +08:00
},
2025-01-18 17:49:44 +08:00
],
},
2024-11-29 12:38:58 +08:00
],
2025-01-18 17:49:44 +08:00
},
{
id: "itemShop",
item: true,
textInList: "道具商店",
choices: [{ id: "yellowKey", number: 10, money: 10 }],
},
{
id: "keyShop1",
textInList: "回收钥匙商店",
commonEvent: "回收钥匙商店",
args: "",
},
],
"shop"
),
MotaActionBlocks["common_m"].xmlText(),
MotaActionBlocks["beforeBattle_m"].xmlText(),
MotaActionBlocks["afterBattle_m"].xmlText(),
MotaActionBlocks["afterGetItem_m"].xmlText(),
MotaActionBlocks["afterOpenDoor_m"].xmlText(),
MotaActionBlocks["firstArrive_m"].xmlText(),
MotaActionBlocks["eachArrive_m"].xmlText(),
MotaActionBlocks["level_m"].xmlText(),
MotaActionFunctions.actionParser.parse([["MTx", ""]], "floorPartition"),
MotaActionBlocks["commonEvent_m"].xmlText(),
MotaActionBlocks["item_m"].xmlText(),
MotaActionFunctions.actionParser.parse(
[
{
title: "简单",
name: "Easy",
hard: 1,
action: [{ type: "comment", text: "在这里写该难度需执行的事件" }],
},
],
"levelChoose"
),
MotaActionFunctions.actionParser.parse(
{
type: 0,
value: { atk: 10 },
percentage: { speed: 10 },
},
"equip"
),
MotaActionFunctions.actionParser.parse(
[
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
name: "bg.jpg",
x: 0,
y: 0,
canvas: "bg",
2024-11-29 12:38:58 +08:00
},
2025-01-18 17:49:44 +08:00
],
"floorImage"
),
MotaActionFunctions.actionParser.parse(
{
time: 160,
openSound: "door.mp3",
closeSound: "door.mp3",
keys: { yellowKey: 1, orangeKey: 1 },
},
"doorInfo"
),
MotaActionBlocks["faceIds_m"].xmlText(),
MotaActionBlocks["mainStyle_m"].xmlText(),
MotaActionFunctions.actionParser.parse(
{
背景音乐: "bgm.mp3",
确定: "confirm.mp3",
攻击: "attack.mp3",
背景图: "bg.jpg",
领域: "zone",
文件名: "file.jpg",
},
"nameMap"
),
MotaActionFunctions.actionParser.parse(
[{ name: "hero.png", width: 32, height: 32, prefix: "hero_" }],
"splitImages"
),
],
显示文字: [
MotaActionBlocks["text_0_s"].xmlText(),
MotaActionBlocks["text_1_s"].xmlText(),
MotaActionFunctions.actionParser.parseList(
"\t[小妖精,fairy]\f[fairy.png,0,0]欢迎使用事件编辑器(双击方块可直接预览)"
),
MotaActionBlocks["moveTextBox_s"].xmlText(),
MotaActionBlocks["clearTextBox_s"].xmlText(),
MotaActionBlocks["comment_s"].xmlText(),
MotaActionBlocks["autoText_s"].xmlText(),
MotaActionBlocks["scrollText_s"].xmlText(),
MotaActionBlocks["setText_s"].xmlText(),
MotaActionBlocks["tip_s"].xmlText(),
MotaActionBlocks["confirm_s"].xmlText(),
MotaActionBlocks["choices_s"].xmlText([
"选择剑或者盾",
"流浪者",
"man",
0,
"",
MotaActionBlocks["choicesContext"].xmlText([
"剑",
"",
"",
null,
"",
"",
MotaActionFunctions.actionParser.parseList([
{ type: "openDoor", loc: [3, 3] },
]),
]),
]),
MotaActionBlocks["win_s"].xmlText(),
MotaActionBlocks["lose_s"].xmlText(),
MotaActionBlocks["restart_s"].xmlText(),
],
数据相关: [
MotaActionBlocks["setValue_s"].xmlText([
MotaActionBlocks["idIdList_e"].xmlText(["status", "生命"]),
"=",
"",
false,
]),
MotaActionBlocks["setEnemy_s"].xmlText(),
MotaActionBlocks["setEnemyOnPoint_s"].xmlText(),
MotaActionBlocks["resetEnemyOnPoint_s"].xmlText(),
MotaActionBlocks["moveEnemyOnPoint_s"].xmlText(),
MotaActionBlocks["moveEnemyOnPoint_1_s"].xmlText(),
MotaActionBlocks["setEquip_s"].xmlText(),
MotaActionBlocks["setFloor_s"].xmlText(),
MotaActionBlocks["setGlobalAttribute_s"].xmlText(),
MotaActionBlocks["setGlobalValue_s"].xmlText(),
MotaActionBlocks["setGlobalFlag_s"].xmlText(),
MotaActionBlocks["setNameMap_s"].xmlText(),
MotaActionBlocks["input_s"].xmlText(),
MotaActionBlocks["input2_s"].xmlText(),
MotaActionBlocks["update_s"].xmlText(),
MotaActionBlocks["moveAction_s"].xmlText(),
MotaActionBlocks["changeFloor_s"].xmlText(),
MotaActionBlocks["changePos_s"].xmlText(),
MotaActionBlocks["battle_s"].xmlText(),
MotaActionBlocks["useItem_s"].xmlText(),
MotaActionBlocks["loadEquip_s"].xmlText(),
MotaActionBlocks["unloadEquip_s"].xmlText(),
MotaActionBlocks["openShop_s"].xmlText(),
MotaActionBlocks["disableShop_s"].xmlText(),
MotaActionBlocks["setHeroIcon_s"].xmlText(),
MotaActionBlocks["follow_s"].xmlText(),
MotaActionBlocks["unfollow_s"].xmlText(),
],
地图处理: [
MotaActionBlocks["battle_1_s"].xmlText(),
MotaActionBlocks["openDoor_s"].xmlText(),
MotaActionBlocks["closeDoor_s"].xmlText(),
MotaActionBlocks["show_s"].xmlText(),
MotaActionBlocks["hide_s"].xmlText(),
MotaActionBlocks["setBlock_s"].xmlText(),
MotaActionBlocks["setBlockOpacity_s"].xmlText(),
MotaActionBlocks["setBlockFilter_s"].xmlText(),
MotaActionBlocks["turnBlock_s"].xmlText(),
MotaActionBlocks["moveHero_s"].xmlText(),
MotaActionBlocks["move_s"].xmlText(),
MotaActionBlocks["jumpHero_s"].xmlText(),
MotaActionBlocks["jumpHero_1_s"].xmlText(),
MotaActionBlocks["jump_s"].xmlText(),
MotaActionBlocks["jump_1_s"].xmlText(),
MotaActionBlocks["showBgFgMap_s"].xmlText(),
MotaActionBlocks["hideBgFgMap_s"].xmlText(),
MotaActionBlocks["setBgFgBlock_s"].xmlText(),
MotaActionBlocks["showFloorImg_s"].xmlText(),
MotaActionBlocks["hideFloorImg_s"].xmlText(),
],
事件控制: [
MotaActionBlocks["if_1_s"].xmlText(),
MotaActionBlocks["if_s"].xmlText(),
MotaActionFunctions.actionParser.parseList({
type: "switch",
condition: "判别值",
caseList: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
action: [
{ type: "comment", text: "当判别值是值的场合执行此事件" },
],
2024-11-29 12:38:58 +08:00
},
{
2025-01-18 17:49:44 +08:00
case: "default",
action: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
type: "comment",
text: "当没有符合的值的场合执行default事件",
2024-11-29 12:38:58 +08:00
},
2025-01-18 17:49:44 +08:00
],
},
],
}),
MotaActionFunctions.actionParser.parseList({
type: "for",
name: "temp:A",
from: "0",
to: "12",
step: "1",
data: [],
}),
MotaActionFunctions.actionParser.parseList({
type: "forEach",
name: "temp:A",
list: ["status:atk", "status:def"],
data: [],
}),
MotaActionBlocks["while_s"].xmlText(),
MotaActionBlocks["dowhile_s"].xmlText(),
MotaActionBlocks["break_s"].xmlText(),
MotaActionBlocks["continue_s"].xmlText(),
MotaActionBlocks["exit_s"].xmlText(),
MotaActionBlocks["trigger_s"].xmlText(),
MotaActionBlocks["insert_1_s"].xmlText(),
MotaActionBlocks["insert_2_s"].xmlText(),
],
特效表现: [
MotaActionBlocks["sleep_s"].xmlText(),
MotaActionFunctions.actionParser.parseList({
type: "wait",
timeout: 0,
data: [
{
case: "keyboard",
keycode: "13,32",
action: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
type: "comment",
text: "当按下回车(keycode=13)或空格(keycode=32)时执行此事件\n超时剩余时间会写入flag:timeout",
2024-11-29 12:38:58 +08:00
},
2025-01-18 17:49:44 +08:00
],
},
{
case: "mouse",
px: [0, 32],
py: [0, 32],
action: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
type: "comment",
text: "当点击地图左上角时执行此事件\n超时剩余时间会写入flag:timeout",
},
],
},
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
case: "condition",
condition: "flag:type==0\n&&flag:keycode==13",
action: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
type: "comment",
text: "当满足自定义条件时会执行此事件\n超时剩余时间会写入flag:timeout",
2024-11-29 12:38:58 +08:00
},
2025-01-18 17:49:44 +08:00
],
2024-11-29 12:38:58 +08:00
},
{
2025-01-18 17:49:44 +08:00
case: "timeout",
action: [{ type: "comment", text: "当超时未操作时执行此事件" }],
},
],
}),
MotaActionBlocks["waitAsync_s"].xmlText(),
MotaActionBlocks["stopAsync_s"].xmlText(),
MotaActionBlocks["vibrate_s"].xmlText(),
MotaActionBlocks["animate_s"].xmlText(),
MotaActionBlocks["animate_1_s"].xmlText(),
MotaActionBlocks["stopAnimate_s"].xmlText(),
MotaActionBlocks["setViewport_s"].xmlText(),
MotaActionBlocks["setViewport_1_s"].xmlText(),
MotaActionBlocks["lockViewport_s"].xmlText(),
MotaActionBlocks["showStatusBar_s"].xmlText(),
MotaActionBlocks["hideStatusBar_s"].xmlText(),
MotaActionBlocks["setHeroOpacity_s"].xmlText(),
MotaActionBlocks["setCurtain_0_s"].xmlText(),
MotaActionBlocks["setCurtain_1_s"].xmlText(),
MotaActionBlocks["screenFlash_s"].xmlText(),
MotaActionBlocks["setWeather_s"].xmlText(),
MotaActionBlocks["callBook_s"].xmlText(),
MotaActionBlocks["callSave_s"].xmlText(),
MotaActionBlocks["autoSave_s"].xmlText(),
MotaActionBlocks["forbidSave_s"].xmlText(),
MotaActionBlocks["callLoad_s"].xmlText(),
],
音像处理: [
MotaActionBlocks["showImage_s"].xmlText(),
MotaActionBlocks["showImage_1_s"].xmlText(),
MotaActionBlocks["hideImage_s"].xmlText(),
MotaActionBlocks["showTextImage_s"].xmlText(),
MotaActionBlocks["moveImage_s"].xmlText(),
MotaActionBlocks["rotateImage_s"].xmlText(),
MotaActionBlocks["scaleImage_s"].xmlText(),
MotaActionBlocks["showGif_s"].xmlText(),
MotaActionBlocks["playBgm_s"].xmlText(),
MotaActionBlocks["pauseBgm_s"].xmlText(),
MotaActionBlocks["resumeBgm_s"].xmlText(),
MotaActionBlocks["loadBgm_s"].xmlText(),
MotaActionBlocks["freeBgm_s"].xmlText(),
MotaActionBlocks["playSound_s"].xmlText(),
MotaActionBlocks["playSound_1_s"].xmlText(),
MotaActionBlocks["stopSound_s"].xmlText(),
MotaActionBlocks["setVolume_s"].xmlText(),
MotaActionBlocks["setBgmSpeed_s"].xmlText(),
],
UI绘制: [
MotaActionBlocks["previewUI_s"].xmlText(),
MotaActionBlocks["clearMap_s"].xmlText(),
MotaActionBlocks["setAttribute_s"].xmlText(),
MotaActionBlocks["setFilter_s"].xmlText(),
MotaActionBlocks["fillText_s"].xmlText(),
MotaActionBlocks["fillBoldText_s"].xmlText(),
MotaActionBlocks["drawTextContent_s"].xmlText(),
MotaActionBlocks["fillRect_s"].xmlText(),
MotaActionBlocks["strokeRect_s"].xmlText(),
MotaActionBlocks["drawLine_s"].xmlText(),
MotaActionBlocks["drawArrow_s"].xmlText(),
MotaActionBlocks["fillPolygon_s"].xmlText(),
MotaActionBlocks["strokePolygon_s"].xmlText(),
MotaActionBlocks["fillEllipse_s"].xmlText(),
MotaActionBlocks["strokeEllipse_s"].xmlText(),
MotaActionBlocks["fillArc_s"].xmlText(),
MotaActionBlocks["strokeArc_s"].xmlText(),
MotaActionBlocks["drawImage_s"].xmlText(),
MotaActionBlocks["drawImage_1_s"].xmlText(),
MotaActionBlocks["drawIcon_s"].xmlText(),
MotaActionBlocks["drawBackground_s"].xmlText(),
MotaActionBlocks["drawSelector_s"].xmlText(),
MotaActionBlocks["drawSelector_1_s"].xmlText(),
],
原生脚本: [
MotaActionBlocks["function_s"].xmlText(),
MotaActionBlocks["unknown_s"].xmlText(),
],
值块: [
MotaActionBlocks["setValue_s"].xmlText([
MotaActionBlocks["idIdList_e"].xmlText(["status", "生命"]),
"=",
"",
false,
]),
MotaActionBlocks["expression_arithmetic_0"].xmlText(),
MotaActionBlocks["idFlag_e"].xmlText(),
MotaActionBlocks["idTemp_e"].xmlText(),
MotaActionBlocks["negate_e"].xmlText(),
MotaActionBlocks["unaryOperation_e"].xmlText(),
MotaActionBlocks["bool_e"].xmlText(),
MotaActionBlocks["idString_e"].xmlText(),
MotaActionBlocks["idIdList_e"].xmlText(),
MotaActionBlocks["idFixedList_e"].xmlText(),
MotaActionBlocks["enemyattr_e"].xmlText(),
MotaActionBlocks["blockId_e"].xmlText(),
MotaActionBlocks["blockNumber_e"].xmlText(),
MotaActionBlocks["blockCls_e"].xmlText(),
MotaActionBlocks["hasEquip_e"].xmlText(),
MotaActionBlocks["equip_e"].xmlText(),
MotaActionBlocks["nextXY_e"].xmlText(),
MotaActionBlocks["isReplaying_e"].xmlText(),
MotaActionBlocks["hasVisitedFloor_e"].xmlText(),
MotaActionBlocks["isShopVisited_e"].xmlText(),
MotaActionBlocks["canBattle_e"].xmlText(),
MotaActionBlocks["damage_e"].xmlText(),
MotaActionBlocks["damage_1_e"].xmlText(),
MotaActionBlocks["rand_e"].xmlText(),
MotaActionBlocks["evalString_e"].xmlText(),
],
常见事件模板: [
'<label text="检测音乐如果没有开启则系统提示开启"></label>',
MotaActionFunctions.actionParser.parseList({
type: "if",
condition: "!core.musicStatus.bgmStatus",
true: ["\t[系统提示]你当前音乐处于关闭状态,本塔开音乐游戏效果更佳"],
false: [],
}),
'<label text="仿新新魔塔一次性商人"></label>',
MotaActionFunctions.actionParser.parse(
[
{
type: "if",
condition: "switch:A",
true: [
"\t[行商,trader]\b[this]这是购买我的道具后我给玩家的提示。",
{
type: "comment",
text: "下一条指令可视情况使用或不使用",
},
{
type: "hide",
remove: true,
time: 250,
},
],
false: [
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
type: "confirm",
text: "我有3把黄钥匙\n你出50金币就卖给你。",
yes: [
{
type: "if",
condition: "status:money>=50",
true: [
{
type: "setValue",
name: "status:money",
operator: "-=",
value: "50",
},
{
type: "setValue",
name: "item:yellowKey",
operator: "+=",
value: "3",
},
{
type: "playSound",
name: "确定",
stop: true,
},
{
type: "setValue",
name: "switch:A",
value: "true",
},
],
false: [
{
type: "playSound",
name: "操作失败",
},
"\t[行商,trader]\b[this]你的金币不足!",
],
},
],
no: [],
2024-11-29 12:38:58 +08:00
},
2025-01-18 17:49:44 +08:00
],
},
],
"event"
),
'<label text="全地图选中一个点"></label>',
MotaActionFunctions.actionParser.parse(
[
{
type: "comment",
text: "全地图选中一个点,需要用鼠标或触屏操作",
},
{
type: "setValue",
name: "temp:X",
value: "status:x",
},
{
type: "setValue",
name: "temp:Y",
value: "status:y",
},
{
type: "tip",
text: "再次点击闪烁位置确认",
2024-11-29 12:38:58 +08:00
},
{
2025-01-18 17:49:44 +08:00
type: "while",
condition: "true",
data: [
{
type: "drawSelector",
image: "winskin.png",
code: 1,
x: "32*temp:X",
y: "32*temp:Y",
width: 32,
height: 32,
},
{
type: "wait",
},
2024-11-29 12:38:58 +08:00
{
2025-01-18 17:49:44 +08:00
type: "if",
condition: "(flag:type === 1)",
true: [
{
type: "if",
condition: "((temp:X===flag:x)&&(temp:Y===flag:y))",
true: [
{
type: "break",
n: 1,
},
],
},
{
type: "setValue",
name: "temp:X",
value: "flag:x",
},
{
type: "setValue",
name: "temp:Y",
value: "flag:y",
},
],
2024-11-29 12:38:58 +08:00
},
2025-01-18 17:49:44 +08:00
],
2024-11-29 12:38:58 +08:00
},
{
2025-01-18 17:49:44 +08:00
type: "drawSelector",
code: 1,
},
{
type: "comment",
text: "流程进行到这里可以对[X,Y]点进行处理,比如",
},
{
type: "closeDoor",
id: "yellowDoor",
loc: ["temp:X", "temp:Y"],
},
],
"event"
),
'<label text="多阶段Boss战斗"></label>',
MotaActionFunctions.actionParser.parse(
[
{
type: "comment",
text: "多阶段boss请直接作为战后事件使用",
},
{
type: "setValue",
name: "switch:A",
operator: "+=",
value: "1",
},
{
type: "switch",
condition: "switch:A",
caseList: [
{
case: "1",
action: [
{
type: "setBlock",
number: "redSlime",
},
"\t[2阶段boss,redSlime]\b[this]你以为你已经打败我了吗?没听说过史莱姆有九条命吗?",
],
},
{
case: "2",
action: [
{
type: "setBlock",
number: "blackSlime",
},
"\t[3阶段boss,blackSlime]\b[this]不能消灭我的,只会让我更强大!",
],
},
{
case: "3",
action: [
{
type: "setBlock",
number: "slimelord",
},
"\t[4阶段boss,slimelord]\b[this]我还能打!",
],
},
{
case: "4",
action: ["\t[4阶段boss,slimelord]我一定会回来的!"],
},
],
},
],
"afterBattle"
),
],
最近使用事件: [
'<label text="此处只是占位符,实际定义在editor_blockly.searchBlockCategoryCallback中"></label>',
],
};
var toolboxgap = '<sep gap="5"></sep>';
//xml_text = MotaActionFunctions.actionParser.parse(obj,type||'event')
//MotaActionBlocks['idString_e'].xmlText()
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
for (var name in toolboxObj) {
var custom = null;
if (name == "最近使用事件") custom = "searchBlockCategory";
if (name == "入口方块") custom = "entranceCategory";
getCategory(name, custom).innerHTML = toolboxObj[name].join(toolboxgap);
2024-11-29 12:38:58 +08:00
}
2025-01-18 17:49:44 +08:00
var blocklyArea = document.getElementById("blocklyArea");
var blocklyDiv = document.getElementById("blocklyDiv");
var workspace = Blockly.inject(blocklyDiv, {
media: "_server/blockly/media/",
toolbox: document.getElementById("toolbox"),
zoom: {
controls: true,
wheel: false, //滚轮改为上下(shift:左右)翻滚
startScale: 1.0,
maxScale: 3,
minScale: 0.3,
scaleSpeed: 1.08,
},
trashcan: false,
});
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
editor_blockly.isCommonEntry = function () {
var commonEntries = [
"beforeBattle",
"afterBattle",
"afterOpenDoor",
"firstArrive",
"eachArrive",
"commonEvent",
"item",
];
return commonEntries.indexOf(editor_blockly.entryType) >= 0;
};
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
editor_blockly.entranceCategoryCallback = function (workspace) {
var list = toolboxObj["入口方块"];
var xmlList = [];
var eventType =
(editor_blockly.isCommonEntry() ? "common" : editor_blockly.entryType) +
"_m";
for (var ii = 0, blockText; (blockText = list[ii]); ii++) {
if (new RegExp('<block type="' + eventType + '">').exec(blockText)) {
var block = Blockly.Xml.textToDom(
"<xml>" + blockText + "</xml>"
).firstChild;
block.setAttribute("gap", 5);
xmlList.push(block);
}
}
return xmlList;
};
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
workspace.registerToolboxCategoryCallback(
"entranceCategory",
editor_blockly.entranceCategoryCallback
);
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
editor_blockly.searchBlockCategoryCallback = function (workspace) {
var xmlList = [];
var labels = editor_blockly.searchBlock();
for (var i = 0; i < labels.length; i++) {
var blockText =
"<xml>" + MotaActionBlocks[labels[i]].xmlText() + "</xml>";
var block = Blockly.Xml.textToDom(blockText).firstChild;
block.setAttribute("gap", 5);
xmlList.push(block);
2024-11-29 12:38:58 +08:00
}
2025-01-18 17:49:44 +08:00
return xmlList;
};
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
workspace.registerToolboxCategoryCallback(
"searchBlockCategory",
editor_blockly.searchBlockCategoryCallback
);
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
var onresize = function (e) {
blocklyDiv.style.width = blocklyArea.offsetWidth + "px";
blocklyDiv.style.height = blocklyArea.offsetHeight + "px";
Blockly.svgResize(workspace);
};
if (typeof editor !== "undefined" && !editor.isMobile)
window.addEventListener("resize", onresize, false);
onresize();
//Blockly.svgResize(workspace);
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
//Blockly.bindEventWithChecks_(workspace.svgGroup_,"wheel",workspace,function(e){});
document.getElementById("blocklyDiv").onmousewheel = function (e) {
//console.log(e);
e.preventDefault();
var hvScroll = e.shiftKey ? "hScroll" : "vScroll";
var mousewheelOffsetValue =
(20 / 380) * workspace.scrollbar[hvScroll].handleLength_ * 3;
workspace.scrollbar[hvScroll].handlePosition_ +=
(e.deltaY || 0) + (e.detail || 0) > 0
? mousewheelOffsetValue
: -mousewheelOffsetValue;
workspace.scrollbar[hvScroll].onScroll_();
// workspace.setScale(workspace.scale);
};
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
var doubleClickCheck = [[0, "abc"]];
function omitedcheckUpdateFunction(event) {
if (event.type === "create") {
editor_blockly.addIntoLastUsedType(event.blockId);
2024-11-29 12:38:58 +08:00
}
2025-01-18 17:49:44 +08:00
if (event.type === "ui" && event.element == "click") {
var newClick = [new Date().getTime(), event.blockId];
var lastClick = doubleClickCheck.shift();
doubleClickCheck.push(newClick);
if (newClick[0] - lastClick[0] < 500) {
if (newClick[1] === lastClick[1]) {
editor_blockly.doubleClickBlock(newClick[1]);
}
2024-11-29 12:38:58 +08:00
}
2025-01-18 17:49:44 +08:00
}
// Only handle these events
if (["create", "move", "change", "delete"].indexOf(event.type) < 0)
return;
if (editor_blockly.workspace.topBlocks_.length >= 2) {
editor_blockly.setValue("入口方块只能有一个");
return;
}
var eventType = editor_blockly.entryType;
if (editor_blockly.workspace.topBlocks_.length == 1) {
var blockType = editor_blockly.workspace.topBlocks_[0].type;
if (
blockType !== eventType + "_m" &&
!(editor_blockly.isCommonEntry() && blockType == "common_m")
) {
editor_blockly.setValue("入口方块类型错误");
return;
2024-11-29 12:38:58 +08:00
}
}
2025-01-18 17:49:44 +08:00
try {
var code = Blockly.JavaScript.workspaceToCode(workspace).replace(
/\\(i|c|d|e|g|z)/g,
"\\\\$1"
);
editor_blockly.setValue(code);
} catch (error) {
editor_blockly.setValue(String(error));
if (error instanceof OmitedError) {
var blockName = error.blockName;
var varName = error.varName;
var block = error.block;
}
// console.log(error);
}
2024-11-29 12:38:58 +08:00
}
2025-01-18 17:49:44 +08:00
workspace.addChangeListener(omitedcheckUpdateFunction);
workspace.addChangeListener(Blockly.Events.disableOrphans);
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
editor_blockly.workspace = workspace;
2024-11-29 12:38:58 +08:00
2025-01-18 17:49:44 +08:00
MotaActionFunctions.workspace = function () {
return editor_blockly.workspace;
};
// 因为在editor_blockly.parse里已经HTML转义过一次了,所以这里要覆盖掉以避免在注释中出现&lt;等
MotaActionFunctions.xmlText = function (
ruleName,
inputs,
isShadow,
comment,
collapsed,
disabled
) {
var rule = MotaActionBlocks[ruleName];
var blocktext = isShadow ? "shadow" : "block";
var xmlText = [];
xmlText.push(
"<" +
blocktext +
' type="' +
ruleName +
'"' +
(collapsed ? ' collapsed="true"' : "") +
(disabled ? ' disabled="true"' : "") +
">"
);
if (!inputs) inputs = [];
for (var ii = 0, inputType; (inputType = rule.argsType[ii]); ii++) {
var input = inputs[ii];
var _input = "";
var noinput = input === null || input === undefined;
if (
noinput &&
inputType === "field" &&
MotaActionBlocks[rule.argsGrammarName[ii]].type !== "field_dropdown"
)
continue;
if (noinput && inputType === "field") {
noinput = false;
input = rule.fieldDefault(rule.args[ii]);
}
if (noinput) input = "";
if (
inputType === "field" &&
MotaActionBlocks[rule.argsGrammarName[ii]].type === "field_checkbox"
)
input = input ? "TRUE" : "FALSE";
if (inputType !== "field") {
var subList = false;
var subrulename = rule.argsGrammarName[ii];
var subrule = MotaActionBlocks[subrulename];
if (subrule instanceof Array) {
subrulename = subrule[subrule.length - 1];
subrule = MotaActionBlocks[subrulename];
subList = true;
}
_input = subrule.xmlText([], true);
if (noinput && !subList && !isShadow) {
//无输入的默认行为是: 如果语句块的备选方块只有一个,直接代入方块
input = subrule.xmlText();
}
}
xmlText.push("<" + inputType + ' name="' + rule.args[ii] + '">');
xmlText.push(_input + input);
xmlText.push("</" + inputType + ">");
}
if (comment) {
xmlText.push("<comment>");
xmlText.push(comment);
xmlText.push("</comment>");
}
var next = inputs[rule.args.length];
if (next) {
//next
xmlText.push("<next>");
xmlText.push(next);
xmlText.push("</next>");
}
xmlText.push("</" + blocktext + ">");
return xmlText.join("");
};
})();
// end mark sfergsvae
}
.toString()
.split("// start mark sfergsvae")[1]
.split("// end mark sfergsvae")[0];