909 lines
32 KiB
JavaScript
909 lines
32 KiB
JavaScript
editor_blocklyconfig = function () {
|
||
// start mark sfergsvae
|
||
|
||
(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;
|
||
};
|
||
|
||
var toolboxObj = {
|
||
入口方块: [
|
||
'<label text="入口方块会根据当前类型在此数组中筛选,具体控制在editor_blockly.entranceCategoryCallback中"></label>',
|
||
MotaActionFunctions.actionParser.parse(
|
||
[
|
||
"欢迎使用事件编辑器",
|
||
"本事件触发一次后会消失",
|
||
{ type: "hide", time: 500 },
|
||
],
|
||
"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(
|
||
[
|
||
{
|
||
id: "shop1",
|
||
text: "\t[贪婪之神,moneyShop]勇敢的武士啊, 给我${20+2*flag:shop1}金币就可以:",
|
||
textInList: "1F金币商店",
|
||
choices: [
|
||
{
|
||
text: "生命+800",
|
||
need: "status:money>=20+2*flag:shop1",
|
||
action: [
|
||
{
|
||
type: "comment",
|
||
text: "新版商店中需要手动扣减金币和增加访问次数",
|
||
},
|
||
{
|
||
type: "setValue",
|
||
name: "status:money",
|
||
operator: "-=",
|
||
value: "20+2*flag:shop1",
|
||
},
|
||
{
|
||
type: "setValue",
|
||
name: "flag:shop1",
|
||
operator: "+=",
|
||
value: "1",
|
||
},
|
||
{
|
||
type: "setValue",
|
||
name: "status:hp",
|
||
operator: "+=",
|
||
value: "800",
|
||
},
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
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(
|
||
[
|
||
{
|
||
name: "bg.jpg",
|
||
x: 0,
|
||
y: 0,
|
||
canvas: "bg",
|
||
},
|
||
],
|
||
"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: [
|
||
{
|
||
action: [
|
||
{ type: "comment", text: "当判别值是值的场合执行此事件" },
|
||
],
|
||
},
|
||
{
|
||
case: "default",
|
||
action: [
|
||
{
|
||
type: "comment",
|
||
text: "当没有符合的值的场合执行default事件",
|
||
},
|
||
],
|
||
},
|
||
],
|
||
}),
|
||
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: [
|
||
{
|
||
type: "comment",
|
||
text: "当按下回车(keycode=13)或空格(keycode=32)时执行此事件\n超时剩余时间会写入flag:timeout",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
case: "mouse",
|
||
px: [0, 32],
|
||
py: [0, 32],
|
||
action: [
|
||
{
|
||
type: "comment",
|
||
text: "当点击地图左上角时执行此事件\n超时剩余时间会写入flag:timeout",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
case: "condition",
|
||
condition: "flag:type==0\n&&flag:keycode==13",
|
||
action: [
|
||
{
|
||
type: "comment",
|
||
text: "当满足自定义条件时会执行此事件\n超时剩余时间会写入flag:timeout",
|
||
},
|
||
],
|
||
},
|
||
{
|
||
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: [
|
||
{
|
||
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: [],
|
||
},
|
||
],
|
||
},
|
||
],
|
||
"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: "再次点击闪烁位置确认",
|
||
},
|
||
{
|
||
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",
|
||
},
|
||
{
|
||
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",
|
||
},
|
||
],
|
||
},
|
||
],
|
||
},
|
||
{
|
||
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()
|
||
|
||
for (var name in toolboxObj) {
|
||
var custom = null;
|
||
if (name == "最近使用事件") custom = "searchBlockCategory";
|
||
if (name == "入口方块") custom = "entranceCategory";
|
||
getCategory(name, custom).innerHTML = toolboxObj[name].join(toolboxgap);
|
||
}
|
||
|
||
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,
|
||
});
|
||
|
||
editor_blockly.isCommonEntry = function () {
|
||
var commonEntries = [
|
||
"beforeBattle",
|
||
"afterBattle",
|
||
"afterOpenDoor",
|
||
"firstArrive",
|
||
"eachArrive",
|
||
"commonEvent",
|
||
"item",
|
||
];
|
||
return commonEntries.indexOf(editor_blockly.entryType) >= 0;
|
||
};
|
||
|
||
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;
|
||
};
|
||
|
||
workspace.registerToolboxCategoryCallback(
|
||
"entranceCategory",
|
||
editor_blockly.entranceCategoryCallback
|
||
);
|
||
|
||
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);
|
||
}
|
||
return xmlList;
|
||
};
|
||
|
||
workspace.registerToolboxCategoryCallback(
|
||
"searchBlockCategory",
|
||
editor_blockly.searchBlockCategoryCallback
|
||
);
|
||
|
||
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);
|
||
|
||
//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);
|
||
};
|
||
|
||
var doubleClickCheck = [[0, "abc"]];
|
||
function omitedcheckUpdateFunction(event) {
|
||
if (event.type === "create") {
|
||
editor_blockly.addIntoLastUsedType(event.blockId);
|
||
}
|
||
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]);
|
||
}
|
||
}
|
||
}
|
||
// 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;
|
||
}
|
||
}
|
||
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);
|
||
}
|
||
}
|
||
|
||
workspace.addChangeListener(omitedcheckUpdateFunction);
|
||
|
||
workspace.addChangeListener(Blockly.Events.disableOrphans);
|
||
|
||
editor_blockly.workspace = workspace;
|
||
|
||
MotaActionFunctions.workspace = function () {
|
||
return editor_blockly.workspace;
|
||
};
|
||
|
||
// 因为在editor_blockly.parse里已经HTML转义过一次了,所以这里要覆盖掉以避免在注释中出现<等
|
||
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];
|