fix: 恢复上上提交删掉的文件,增加测试接口,增加显示用户名,增加显示薪资,允许自定义显示名
This commit is contained in:
parent
f1f1375dbc
commit
5184664f26
@ -85,7 +85,7 @@ var enemys_fcae963b_31c9_42b4_b48c_bb48d09f3f80 =
|
||||
"E344": {"name":"新敌人","hp":0,"atk":0,"def":0,"money":0,"exp":0,"point":0,"special":[],"bigImage":"heian.png"},
|
||||
"E345": {"name":"新敌人","hp":35000,"atk":5500,"def":2500,"money":0,"exp":500,"point":0,"special":[31]},
|
||||
"E346": {"name":"他人带来的心魔","hp":25000,"atk":3250,"def":800,"money":0,"exp":50,"point":0,"special":[28]},
|
||||
"E347": {"name":"家庭的压力","hp":200000,"atk":18888,"def":6000,"money":0,"exp":135,"point":0,"special":[29]},
|
||||
"E347": {"name":"家庭的压力","hp":200000,"atk":18888,"def":6000,"money":0,"exp":135,"point":0,"special":[6],"n":1.8},
|
||||
"E348": {"name":"细微的感觉","hp":50,"atk":14,"def":2,"money":0,"exp":1,"point":0,"special":[]},
|
||||
"E349": {"name":"未知的事物","hp":88,"atk":25,"def":3,"money":0,"exp":1,"point":0,"special":[]},
|
||||
"E350": {"name":"行走的困难","hp":70,"atk":20,"def":2,"money":0,"exp":1,"point":0,"special":[]},
|
||||
|
@ -19,7 +19,20 @@ main.floors.BOSS3=
|
||||
"events": {},
|
||||
"changeFloor": {},
|
||||
"beforeBattle": {},
|
||||
"afterBattle": {},
|
||||
"afterBattle": {
|
||||
"6,4": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:hp",
|
||||
"operator": "+=",
|
||||
"value": "item:yellowKey*120000+item:blueKey*300000+item:redKey*900000+item:pickaxe*1800000"
|
||||
},
|
||||
{
|
||||
"type": "win",
|
||||
"reason": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
"afterGetItem": {},
|
||||
"afterOpenDoor": {},
|
||||
"autoEvent": {},
|
||||
|
@ -31,7 +31,7 @@ main.floors.JQ1=
|
||||
"type": "setCurtain",
|
||||
"time": 1000
|
||||
},
|
||||
"\t[母亲,N385]明天就要送bdf去幼儿园了。",
|
||||
"\t[母亲,N385]明天就要送${core.status.hero.flags.truename || core.status.hero.name}去幼儿园了。",
|
||||
"\t[父亲,N389]怎么?担心他吗?",
|
||||
"\t[母亲,N385]那倒不至于...唉,确实有点。",
|
||||
"\t[父亲,N389]担心也没办法啊,这是他成长过程当中必须要经历的事情。",
|
||||
|
@ -64,8 +64,8 @@ main.floors.JQ2=
|
||||
"\t[母亲,N385]老师问你叫什么名字,对老师说你叫什么名字...",
|
||||
"\t[hero]...",
|
||||
"\t[幼儿园老师,N401]小朋友有点害羞啊。",
|
||||
"\t[母亲,N385]他叫bdf,不久前才学会说话,对陌生环境也比较害怕。",
|
||||
"\t[幼儿园老师,N401]你叫bdf是吧?从今往后起我就是你的老师了,我们一起在这里玩耍好不好啊?",
|
||||
"\t[母亲,N385]他叫${core.status.hero.flags.truename || core.status.hero.name},不久前才学会说话,对陌生环境也比较害怕。",
|
||||
"\t[幼儿园老师,N401]你叫${core.status.hero.flags.truename || core.status.hero.name}是吧?从今往后起我就是你的老师了,我们一起在这里玩耍好不好啊?",
|
||||
"\t[hero]\b[hero]...嗯...",
|
||||
"\t[父亲,N389]这孩子在幼儿园要麻烦你们这些老师照顾了,可能需要费点心。",
|
||||
"\t[幼儿园老师,N401]不麻烦,这都是我们应该做的",
|
||||
|
@ -28,9 +28,9 @@ main.floors.JQ4=
|
||||
},
|
||||
"\b[up,7,7]唉...你们的孩子实在是太难管了,不是上课乱跑就是下课搞小动作,有次趁我不注意,把我电脑都给弄坏了,文件也都弄没了。",
|
||||
"\b[up,5,7]不好意思了,我们儿子一直很顽皮,我们会尽力调教的。",
|
||||
"\b[down,5,8]这段时间我会帮您修复电脑,还望老师多照顾一下bdf",
|
||||
"\b[down,5,8]这段时间我会帮您修复电脑,还望老师多照顾一下${core.status.hero.flags.truename || core.status.hero.name}",
|
||||
"\b[up,7,7]嗯,孩子还小,顽皮点倒也正常,不过恕我直言,你们的孩子我们实在没办法,我建议你们换个幼儿园吧...",
|
||||
"\b[down,5,8]请您放心,我们一定好好教导bdf。",
|
||||
"\b[down,5,8]请您放心,我们一定好好教导${core.status.hero.flags.truename || core.status.hero.name}。",
|
||||
"\b[up,7,7]行吧,希望别有下一次了。",
|
||||
{
|
||||
"type": "setCurtain",
|
||||
|
@ -18,12 +18,12 @@ main.floors.JQ5=
|
||||
"type": "setCurtain",
|
||||
"time": 1000
|
||||
},
|
||||
"\t[父亲,N389]\b[up,9,7]过完年给bdf换一个幼儿园吧,他已经给人家添了不少麻烦了。",
|
||||
"\t[父亲,N389]\b[up,9,7]过完年给${core.status.hero.flags.truename || core.status.hero.name}换一个幼儿园吧,他已经给人家添了不少麻烦了。",
|
||||
"\t[母亲,N385]\b[up,8,7]但换一个还是一样啊,我们也没办法完全控制他啊,毕竟很多事他都还不懂。",
|
||||
"\t[父亲,N389]\b[up,9,7]目前来看,bdf现在的老师已经管不了他了,而那老师也不想管了,我们最好是给他换个幼儿园,我看清水嘉苑幼儿园就挺好,那里要求低。我们再给bdf找一个阿姨,帮他纠正一下坏习惯。",
|
||||
"\t[父亲,N389]\b[up,9,7]目前来看,${core.status.hero.flags.truename || core.status.hero.name}现在的老师已经管不了他了,而那老师也不想管了,我们最好是给他换个幼儿园,我看清水嘉苑幼儿园就挺好,那里要求低。我们再给${core.status.hero.flags.truename || core.status.hero.name}找一个阿姨,帮他纠正一下坏习惯。",
|
||||
"\t[母亲,N385]\b[up,8,7]这至少要耗费比半个月的工资啊,真的要这样吗?",
|
||||
"\t[父亲,N389]\b[up,9,7]给孩子一个良好的成长环境,代价大点又有啥呢?又不是永久,到幼儿园结束就行了。而且我们儿子又不坏,就是顽皮点,我相信他。",
|
||||
"\t[母亲,N385]\b[up,8,7]好,为了bdf,我支持你。希望他能健康成长。",
|
||||
"\t[母亲,N385]\b[up,8,7]好,为了${core.status.hero.flags.truename || core.status.hero.name},我支持你。希望他能健康成长。",
|
||||
{
|
||||
"type": "setCurtain",
|
||||
"color": [
|
||||
|
@ -22,14 +22,14 @@ main.floors.JQ8=
|
||||
"type": "sleep",
|
||||
"time": 2000
|
||||
},
|
||||
"\b[up,5,9]蔡老师,我强烈要求把bdf调班,我女儿都被他吓到了,上着课突然从座位离开到我女儿旁边看着。",
|
||||
"\b[up,5,9]蔡老师,我强烈要求把${core.status.hero.flags.truename || core.status.hero.name}调班,我女儿都被他吓到了,上着课突然从座位离开到我女儿旁边看着。",
|
||||
"\b[up,7,9]对,我也建议把他调到别班去,实在不行让他蹲一级也行啊。",
|
||||
"\b[up,6,9]我也希望他能离开,他之前还把我们家孩子打哭了呢。",
|
||||
"\b[up,8,9]我不想看着一个有问题的学生和我孩子在一个班上,这是一个安全隐患。",
|
||||
"\b[up,4,9]bdf是不是有啥问题?能不能叫他家长把他带进医院去看看?",
|
||||
"\b[up,4,9]${core.status.hero.flags.truename || core.status.hero.name}是不是有啥问题?能不能叫他家长把他带进医院去看看?",
|
||||
"\b[up,6,9]赶紧带他看看啊,到底是不是有问题!",
|
||||
"\b[up,7,9]希望蔡老师给我们个处理办法,我们不能容忍这么大的一个安全隐患!",
|
||||
"\b[up,6,7]各位家长请放心,我一定会给大家一个交代!请放心,只要我还是这个班的班主任,绝不会让bdf胡来!",
|
||||
"\b[up,6,7]各位家长请放心,我一定会给大家一个交代!请放心,只要我还是这个班的班主任,绝不会让${core.status.hero.flags.truename || core.status.hero.name}胡来!",
|
||||
{
|
||||
"type": "setCurtain",
|
||||
"color": [
|
||||
|
@ -22,10 +22,10 @@ main.floors.MT0=
|
||||
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40226,40204,40206, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 89,40214, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 0,40214, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 0,40150, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225,342,40150, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 0,40150, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 31,40150, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 31,40214, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 0,40150, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 45,40150, 0, 0, 0, 0, 0],
|
||||
[ 0, 0, 0, 0, 0,40225, 0,40150, 0, 0, 0, 0, 0],
|
||||
@ -34,6 +34,16 @@ main.floors.MT0=
|
||||
[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
],
|
||||
"firstArrive": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:uid",
|
||||
"value": "core.getCookie('id')"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:user",
|
||||
"value": "core.username[flag:uid]"
|
||||
},
|
||||
"浩瀚无际的宇宙中,有一颗星球格外美丽...它那蔚蓝色的外表下散发着无数的光芒,而那些光芒就是生命...",
|
||||
"生命究竟是什么?它的意义又是什么?这个问题很难...但是,正是因为每一条生命都不一样,这才会散发出不同的光芒不是吗?",
|
||||
"我们每一个人,都散发着各自的光芒...而这些光芒,就是人生,世界正是因为有了不同的人生才会如此精彩...",
|
||||
@ -361,6 +371,678 @@ main.floors.MT0=
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"5,7": [
|
||||
{
|
||||
"type": "choices",
|
||||
"text": "\t[${status:name},hero]各测塔员成绩\\i[yellowKey]",
|
||||
"choices": [
|
||||
{
|
||||
"text": "星宫白 - 3黄 5蓝 366",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "530366"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "顾 - 3黄 5蓝 282",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "530282"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "yztm889 - 3黄 5蓝 88",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "530088"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(主角) bdf - 0黄 4蓝 229",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "400229"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(作者) 王州 - 1黄 1蓝 21",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "110021"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(特殊) 测试 - 0黄 0蓝 1",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "1"
|
||||
},
|
||||
"此情况过不了啊"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Cancel",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "-1"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "if",
|
||||
"condition": "(flag:lhjnb>0)",
|
||||
"true": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:exp",
|
||||
"operator": "+=",
|
||||
"value": "235"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:atk",
|
||||
"operator": "+=",
|
||||
"value": "131"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:def",
|
||||
"operator": "+=",
|
||||
"value": "129"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:mdef",
|
||||
"operator": "+=",
|
||||
"value": "252"
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"time": 50
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:hp",
|
||||
"value": "1068"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:exp",
|
||||
"operator": "+=",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"time": 50
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:hp",
|
||||
"operator": "+=",
|
||||
"value": "flag:lhjnb%10000"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:hp",
|
||||
"operator": "-=",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "item:yellowKey",
|
||||
"value": "Math.floor(flag:lhjnb/10000)%10"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "item:blueKey",
|
||||
"value": "Math.floor(flag:lhjnb/100000)%10"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "114-5*item:blueKey-2*item:yellowKey"
|
||||
},
|
||||
{
|
||||
"type": "setBlock",
|
||||
"number": "specialDoor",
|
||||
"loc": [
|
||||
[
|
||||
4,
|
||||
6
|
||||
]
|
||||
],
|
||||
"floorId": "MT22"
|
||||
},
|
||||
{
|
||||
"type": "changeFloor",
|
||||
"floorId": "MT22",
|
||||
"loc": [
|
||||
5,
|
||||
6
|
||||
]
|
||||
}
|
||||
],
|
||||
"false": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "0"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"5,8": [
|
||||
{
|
||||
"type": "choices",
|
||||
"text": "\t[${status:name},hero]各测塔员成绩\\i[blueKey]",
|
||||
"choices": [
|
||||
{
|
||||
"text": "星宫白 - 7黄 3蓝 1红 74",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "1370074"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "yztm889 - 6黄 3蓝 1红 7",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "1360007"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "顾 - 5黄 3蓝 1红 95",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "1350095"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(主角) bdf - 5黄 3蓝 1红 88",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "1350088"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(特殊) 测试 - 0黄 0蓝 0红 1",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "1"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(作者) 王州 - 过不去",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "-1"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Cancel",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "-1"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "if",
|
||||
"condition": "(flag:lhjnb>0)",
|
||||
"true": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:exp",
|
||||
"operator": "+=",
|
||||
"value": "359"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:atk",
|
||||
"operator": "+=",
|
||||
"value": "251"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:def",
|
||||
"operator": "+=",
|
||||
"value": "246"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:mdef",
|
||||
"operator": "+=",
|
||||
"value": "520"
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"time": 50
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:hp",
|
||||
"value": "12664"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:exp",
|
||||
"operator": "+=",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"type": "sleep",
|
||||
"time": 50
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:hp",
|
||||
"operator": "+=",
|
||||
"value": "flag:lhjnb%10000"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:hp",
|
||||
"operator": "-=",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "item:yellowKey",
|
||||
"value": "Math.floor(flag:lhjnb/10000)%10"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "item:blueKey",
|
||||
"value": "Math.floor(flag:lhjnb/100000)%10"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "item:redKey",
|
||||
"value": "Math.floor(flag:lhjnb/1000000)%10"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "241-15*item:redKey-5*item:blueKey-2*item:yellowKey"
|
||||
},
|
||||
{
|
||||
"type": "changeFloor",
|
||||
"floorId": "MT33",
|
||||
"loc": [
|
||||
6,
|
||||
11
|
||||
]
|
||||
}
|
||||
],
|
||||
"false": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:lhjnb",
|
||||
"value": "0"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"7,3": [
|
||||
{
|
||||
"type": "choices",
|
||||
"text": "\t[${status:name},hero]修改主角名",
|
||||
"choices": [
|
||||
{
|
||||
"text": "星宫白",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"星宫白\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "鸣",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"鸣\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "yztm889",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"夜战天明889\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "顾",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"顾\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Farewell",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"Farewell\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(主角) bdf",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"bdf\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "α",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"α\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "(作者) 王州",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"王州\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "迷迭香",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"迷迭香\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Others",
|
||||
"action": [
|
||||
{
|
||||
"type": "choices",
|
||||
"text": "\t[${status:name},hero]修改主角名",
|
||||
"choices": [
|
||||
{
|
||||
"text": "鹿间裕贵",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"鹿间裕贵\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "rys",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"rys\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "北海小羊",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"北海小羊\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "影法师",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:nameb",
|
||||
"value": "\"影法师\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "袜子精Boris",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"袜子精Boris\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "金中梅西",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"金中梅西\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "喜食佩刀的米格",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"喜食佩刀的米格\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "千夜",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"千夜\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "魔羊羊1",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"魔羊羊1\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "castor_v_pollux",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"castor_v_pollux\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "雨落南洋",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"雨落南洋\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "悬壶桦雪",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"悬壶桦雪\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "古祠",
|
||||
"action": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "status:name",
|
||||
"value": "\"古祠\""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Cancel",
|
||||
"action": []
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Cancel",
|
||||
"action": []
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"5,3": [
|
||||
{
|
||||
"type": "choices",
|
||||
"text": "\t[${status:name},hero]重置信息",
|
||||
"choices": [
|
||||
{
|
||||
"text": "重置uid",
|
||||
"action": [
|
||||
{
|
||||
"type": "input",
|
||||
"text": "输入uid谢谢喵"
|
||||
},
|
||||
{
|
||||
"type": "if",
|
||||
"condition": "core.username[flag:input]",
|
||||
"true": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:uid",
|
||||
"value": "flag:input"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:user",
|
||||
"value": "core.username[flag:uid]"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "重置username",
|
||||
"action": [
|
||||
{
|
||||
"type": "input2",
|
||||
"text": "输入username谢谢喵"
|
||||
},
|
||||
{
|
||||
"type": "if",
|
||||
"condition": "flag:input",
|
||||
"true": [
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:uid",
|
||||
"value": "0"
|
||||
},
|
||||
{
|
||||
"type": "setValue",
|
||||
"name": "flag:user",
|
||||
"value": "flag:input"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"6,11": [
|
||||
{
|
||||
"type": "if",
|
||||
"condition": "(core.guanzhu && flag:uid)",
|
||||
"true": [
|
||||
{
|
||||
"type": "function",
|
||||
"function": "function(){\nvar fol = [],\n\tfan = []\nfor (var i of core.guanzhu) {\n\tif (i[0] == flags.uid && core.username[i[1]]) fol.push('[' + i[1] + ']' + core.username[i[1]]);\n\telse if (i[0] == flags.uid && !core.username[i[1]]) console.log(\"invaild foll: \", i[1]);\n\tif (i[1] == flags.uid && core.username[i[0]]) fan.push('[' + i[0] + ']' + core.username[i[0]]);\n\telse if (i[1] == flags.uid && !core.username[i[0]]) console.log(\"invaild fans: \", i[0]);\n}\nvar temp = fol.length + fan.length;\nvar lhjnb = [];\nif (fol.length <= 40)\n\tlhjnb.push(\"关注数 \" + fol.length + String.fromCharCode(10) + fol.toLocaleString())\nelse {\n\tlhjnb.push(\"关注数 \" + fol.length + String.fromCharCode(10) + fol.splice(0, 40).toLocaleString())\n\twhile (fol.length > 0) lhjnb.push(fol.splice(0, 40).toLocaleString())\n}\nif (fan.length <= 40)\n\tlhjnb.push(\"粉丝数 \" + fan.length + String.fromCharCode(10) + fan.toLocaleString())\nelse {\n\tlhjnb.push(\"粉丝数 \" + fan.length + String.fromCharCode(10) + fan.splice(0, 40).toLocaleString())\n\twhile (fan.length > 0) lhjnb.push(fan.splice(0, 40).toLocaleString())\n}\n\nif (temp > 0) core.insertAction(lhjnb)\n}"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"changeFloor": {},
|
||||
|
@ -80,7 +80,7 @@ main.floors.MT10=
|
||||
}
|
||||
]
|
||||
},
|
||||
"\t[bdf,N393]..."
|
||||
"\t[${status:name},N393]..."
|
||||
],
|
||||
"5,4": [
|
||||
{
|
||||
|
@ -41,7 +41,7 @@ main.floors.MT3=
|
||||
"time": 1000,
|
||||
"keep": true
|
||||
},
|
||||
"\t[父亲,N389]bdf已经一周岁了。许个愿望吧。",
|
||||
"\t[父亲,N389]${core.status.hero.flags.truename || core.status.hero.name}已经一周岁了。许个愿望吧。",
|
||||
"\t[母亲,N385]许个什么愿望呢...",
|
||||
"\t[母亲,N385]希望他能平平安安健健康康吧。以后的路还很长,要靠他自己,我们当父母的默默的支持他就好。",
|
||||
"\t[父亲,N389]嗯嗯,平安健康就好,我儿子将来一定会有出息的。",
|
||||
|
@ -36,7 +36,7 @@ main.floors.MT6=
|
||||
"time": 1000,
|
||||
"keep": true
|
||||
},
|
||||
"\t[母亲,N385]bdf学会了走路,但好像还不会说话啊...",
|
||||
"\t[母亲,N385]${core.status.hero.flags.truename || core.status.hero.name}学会了走路,但好像还不会说话啊...",
|
||||
"\t[父亲,N389]慢慢来呗,早晚都会的,他不过才两岁罢了。",
|
||||
{
|
||||
"type": "changeFloor",
|
||||
|
@ -134,13 +134,13 @@ main.floors.MT87=
|
||||
[182,182,182,182,182,182, 86,182,182,182,182,182,182],
|
||||
[182,182,733,733,733, 83, 0, 83,733,733,733,182,182],
|
||||
[182,182,182,182,182,182,504,182,182,182,182,182,182],
|
||||
[182,182,733, 82,731, 81, 0, 81,731, 82,733,182,182],
|
||||
[182,182,733, 82,733, 82, 0, 82,733, 82,733,182,182],
|
||||
[182,182,182,182,182,182,504,182,182,182,182,182,182],
|
||||
[182,182,733, 82,731, 81, 0, 81,731, 82,733,182,182],
|
||||
[182,182,733, 82,733, 82, 0, 82,733, 82,733,182,182],
|
||||
[182,182,182,182,182,182,607,182,182,182,182,182,182],
|
||||
[182,182,733, 82,731, 81, 0, 81,731, 82,733,182,182],
|
||||
[182,182,731, 81,731, 81, 0, 81,731, 81,731,182,182],
|
||||
[182,182,182,182,182,182,607,182,182,182,182,182,182],
|
||||
[182,182,733, 81,731, 81, 0, 81,731, 81,733,182,182],
|
||||
[182,182,731, 81,731, 81, 0, 81,731, 81,731,182,182],
|
||||
[182,182,182,182,182,182, 0,182,182,182,182,182,182],
|
||||
[182,182,182,182,182,182, 93,182,182,182,182,182,182]
|
||||
],
|
||||
|
@ -1622,7 +1622,39 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
core.ui.fillText(ctx, text, x, y, style);
|
||||
};
|
||||
core.ui.clearMap(ctx = core.dom.statusCanvasCtx);
|
||||
if (core.status.hero.flags.hideStatusBar) return;
|
||||
if (core.status.hero.flags.hideStatusBar) {
|
||||
var salary = ((core.itemCount('yellowKey') * 2 + core.itemCount('blueKey') * 5 + core.itemCount('redKey') * 15 + core.itemCount('pickaxe') * 30)) * 3 / 5;
|
||||
if (hero.lv < 5) salary = 0;
|
||||
|
||||
if (core.domStyle.isVertical) {} else if (!core.flags.hideLeftStatusBar) {
|
||||
if (salary <= 13.2) {
|
||||
core.ui.setFillStyle(ctx, [0, 255, 255]);
|
||||
ctx.fillRect(2, 280, 125 * salary / 13.2, 25)
|
||||
} else if (salary <= 52.8) {
|
||||
core.ui.setFillStyle(ctx, [0, 255, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 13.2) / 39.6, 25)
|
||||
core.ui.setFillStyle(ctx, [0, 255, 255]);
|
||||
ctx.fillRect(2 + 125 * (salary - 13.2) / 39.6, 280, 125 - 125 * (salary - 13.2) / 39.6, 25)
|
||||
} else if (salary <= 132) {
|
||||
core.ui.setFillStyle(ctx, [255, 255, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 52.8) / 79.2, 25)
|
||||
core.ui.setFillStyle(ctx, [0, 255, 0]);
|
||||
ctx.fillRect(2 + 125 * (salary - 52.8) / 79.2, 280, 125 - 125 * (salary - 52.8) / 79.2, 25)
|
||||
} else if (salary <= 150) {
|
||||
core.ui.setFillStyle(ctx, [255, 128, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 132) / 18, 25)
|
||||
core.ui.setFillStyle(ctx, [255, 255, 0]);
|
||||
ctx.fillRect(2 + 125 * (salary - 132) / 18, 280, 125 - 125 * (salary - 132) / 18, 25)
|
||||
} else if (salary <= 400) {
|
||||
core.ui.setFillStyle(ctx, [255, 0, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 150) / 250, 25)
|
||||
core.ui.setFillStyle(ctx, [255, 128, 0]);
|
||||
ctx.fillRect(2 + 125 * (salary - 150) / 250, 280, 125 - 125 * (salary - 150) / 250, 25)
|
||||
} else core.lose('你作弊了');
|
||||
if (hero.lv >= 5) fill("Salary: ¥" + (salary) + "/h", 2, 300, '#FA1489');
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (core.flags.statusCanvas) { // 系统开关「自绘状态栏」开启
|
||||
core.ui.clearMap(ctx = core.dom.statusCanvasCtx); // 清空状态栏
|
||||
core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor);
|
||||
@ -1688,8 +1720,36 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
fill(core.setTwoDigits(core.itemCount('blueKey')), 203, 86, '#AAAADD');
|
||||
fill(core.setTwoDigits(core.itemCount('redKey')), 247, 86, '#FF8888');
|
||||
fill(core.setTwoDigits(core.itemCount('pickaxe')), 291, 86, '#BC6E27');
|
||||
fill(core.setTwoDigits(core.itemCount('yellowKey') * 2 + core.itemCount('blueKey') * 5 + core.itemCount('redKey') * 15 + core.itemCount('pickaxe') * 30), 335, 86, '#FA1489');
|
||||
fill(core.setTwoDigits(core.getFlag('lhjnb', 0)), 379, 86, '#8D8600');
|
||||
var salary = ((core.itemCount('yellowKey') * 2 + core.itemCount('blueKey') * 5 + core.itemCount('redKey') * 15 + core.itemCount('pickaxe') * 30)) * 3 / 5;
|
||||
if (hero.lv < 5) salary = 0;
|
||||
if (salary <= 13.2) {
|
||||
core.ui.setFillStyle(ctx, [0, 255, 255]);
|
||||
ctx.fillRect(311, 66, 105 * salary / 13.2, 25)
|
||||
} else if (salary <= 52.8) {
|
||||
core.ui.setFillStyle(ctx, [0, 255, 0]);
|
||||
ctx.fillRect(311, 66, 105 * (salary - 13.2) / 39.6, 25)
|
||||
core.ui.setFillStyle(ctx, [0, 255, 255]);
|
||||
ctx.fillRect(311 + 105 * (salary - 13.2) / 39.6, 66, 105 - 105 * (salary - 13.2) / 39.6, 25)
|
||||
} else if (salary <= 132) {
|
||||
core.ui.setFillStyle(ctx, [255, 255, 0]);
|
||||
ctx.fillRect(311, 66, 105 * (salary - 52.8) / 79.2, 25)
|
||||
core.ui.setFillStyle(ctx, [0, 255, 0]);
|
||||
ctx.fillRect(311 + 105 * (salary - 52.8) / 79.2, 66, 105 - 105 * (salary - 52.8) / 79.2, 25)
|
||||
} else if (salary <= 150) {
|
||||
core.ui.setFillStyle(ctx, [255, 128, 0]);
|
||||
ctx.fillRect(311, 66, 105 * (salary - 132) / 18, 25)
|
||||
core.ui.setFillStyle(ctx, [255, 255, 0]);
|
||||
ctx.fillRect(311 + 105 * (salary - 132) / 18, 66, 105 - 105 * (salary - 132) / 18, 25)
|
||||
} else if (salary <= 400) {
|
||||
core.ui.setFillStyle(ctx, [255, 0, 0]);
|
||||
ctx.fillRect(311, 66, 105 * (salary - 150) / 250, 25)
|
||||
core.ui.setFillStyle(ctx, [255, 128, 0]);
|
||||
ctx.fillRect(311 + 105 * (salary - 150) / 250, 66, 105 - 105 * (salary - 150) / 250, 25)
|
||||
} else core.lose('你作弊了');
|
||||
|
||||
if (hero.lv >= 5) fill("Pay: ¥" + (salary) + "/h", 311, 86, '#FA1489');
|
||||
//fill(core.setTwoDigits(core.getFlag('lhjnb', 0)), 92, 300, '#8D8600');
|
||||
if (flags.user) fill1(flags.user, 6, 86, '#FFFFFF');
|
||||
} else if (!core.flags.hideLeftStatusBar) { // 横屏且未隐藏状态栏
|
||||
core.drawIcon(ctx, 18, 6, 5, 25, 25);
|
||||
core.drawIcon(ctx, 34, 6, 35, 25, 25);
|
||||
@ -1751,8 +1811,36 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
|
||||
fill(core.setTwoDigits(core.itemCount('blueKey')), 92, 240, '#AAAADD');
|
||||
fill(core.setTwoDigits(core.itemCount('redKey')), 32, 270, '#FF8888');
|
||||
fill(core.setTwoDigits(core.itemCount('pickaxe')), 92, 270, '#BC6E27');
|
||||
fill(core.setTwoDigits(core.itemCount('yellowKey') * 2 + core.itemCount('blueKey') * 5 + core.itemCount('redKey') * 15 + core.itemCount('pickaxe') * 30), 32, 300, '#FA1489');
|
||||
fill(core.setTwoDigits(core.getFlag('lhjnb', 0)), 92, 300, '#8D8600');
|
||||
var salary = ((core.itemCount('yellowKey') * 2 + core.itemCount('blueKey') * 5 + core.itemCount('redKey') * 15 + core.itemCount('pickaxe') * 30)) * 3 / 5;
|
||||
if (hero.lv < 5) salary = 0;
|
||||
if (salary <= 13.2) {
|
||||
core.ui.setFillStyle(ctx, [0, 255, 255]);
|
||||
ctx.fillRect(2, 280, 125 * salary / 13.2, 25)
|
||||
} else if (salary <= 52.8) {
|
||||
core.ui.setFillStyle(ctx, [0, 255, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 13.2) / 39.6, 25)
|
||||
core.ui.setFillStyle(ctx, [0, 255, 255]);
|
||||
ctx.fillRect(2 + 125 * (salary - 13.2) / 39.6, 280, 125 - 125 * (salary - 13.2) / 39.6, 25)
|
||||
} else if (salary <= 132) {
|
||||
core.ui.setFillStyle(ctx, [255, 255, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 52.8) / 79.2, 25)
|
||||
core.ui.setFillStyle(ctx, [0, 255, 0]);
|
||||
ctx.fillRect(2 + 125 * (salary - 52.8) / 79.2, 280, 125 - 125 * (salary - 52.8) / 79.2, 25)
|
||||
} else if (salary <= 150) {
|
||||
core.ui.setFillStyle(ctx, [255, 128, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 132) / 18, 25)
|
||||
core.ui.setFillStyle(ctx, [255, 255, 0]);
|
||||
ctx.fillRect(2 + 125 * (salary - 132) / 18, 280, 125 - 125 * (salary - 132) / 18, 25)
|
||||
} else if (salary <= 400) {
|
||||
core.ui.setFillStyle(ctx, [255, 0, 0]);
|
||||
ctx.fillRect(2, 280, 125 * (salary - 150) / 250, 25)
|
||||
core.ui.setFillStyle(ctx, [255, 128, 0]);
|
||||
ctx.fillRect(2 + 125 * (salary - 150) / 250, 280, 125 - 125 * (salary - 150) / 250, 25)
|
||||
} else core.lose('你作弊了');
|
||||
|
||||
if (hero.lv >= 5) fill("Salary: ¥" + (salary) + "/h", 2, 300, '#FA1489');
|
||||
//fill(core.setTwoDigits(core.getFlag('lhjnb', 0)), 92, 300, '#8D8600');
|
||||
if (flags.user) fill1(flags.user, 6, 315, '#FFFFFF');
|
||||
|
||||
}
|
||||
} else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { // 横屏且隐藏状态栏
|
||||
|
@ -289,7 +289,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a =
|
||||
"cls": "tools",
|
||||
"name": "破墙镐",
|
||||
"text": "可以破坏勇士面前的墙",
|
||||
"useItemEffect": "(function () {\n\tvar canBreak = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable) return false;\n\t\treturn block.event.canBreak;\n\t};\n\n\tvar success = false;\n\tvar pickaxeFourDirections = false; // 是否多方向破;如果是将其改成true\n\tif (pickaxeFourDirections) {\n\t\t// 多方向破\n\t\tfor (var direction in core.utils.scan) { // 多方向破默认四方向,如需改成八方向请将这两个scan改为scan2\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBreak(nx, ny)) {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅破当前\n\t\tif (canBreak(core.nextX(), core.nextY())) {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t}\n\t}\n\n\tif (success) {\n\t\tcore.playSound('破墙镐');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功', itemId);\n\t} else {\n\t\t// 无法使用\n\t\tcore.playSound('操作失败');\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name, itemId);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();",
|
||||
"useItemEffect": "(function () {\n\tvar canBreak = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable) return false;\n\t\treturn block.event.cls.indexOf('enemy') != 0 && block.event.cls.indexOf('items') != 0;\n\t};\n\tvar canBomb = function (x, y) {\n\t\tvar block = core.getBlock(x, y);\n\t\tif (block == null || block.disable || block.event.cls.indexOf('enemy') != 0) return false;\n\t\tvar enemy = core.material.enemys[block.event.id];\n\t\treturn enemy && !enemy.notBomb;\n\t};\n\n\tvar success = false,\n\t\tfail = false;\n\tvar pickaxeFourDirections = false; // 是否多方向破;如果是将其改成true\n\tif (pickaxeFourDirections) {\n\t\t// 多方向破\n\t\tfor (var direction in core.utils.scan) { // 多方向破默认四方向,如需改成八方向请将这两个scan改为scan2\n\t\t\tvar delta = core.utils.scan[direction];\n\t\t\tvar nx = core.getHeroLoc('x') + delta.x,\n\t\t\t\tny = core.getHeroLoc('y') + delta.y;\n\t\t\tif (canBreak(nx, ny)) {\n\t\t\t\tcore.removeBlock(nx, ny);\n\t\t\t\tsuccess = true;\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// 仅破当前\n\t\tif (canBreak(core.nextX(), core.nextY())) {\n\t\t\tcore.removeBlock(core.nextX(), core.nextY());\n\t\t\tsuccess = true;\n\t\t} else if (canBomb(core.nextX(), core.nextY())) {\n\t\t\tcore.setEnemyOnPoint(core.nextX(), core.nextY(), null, 'atk', 0);\n\t\t\tcore.setEnemyOnPoint(core.nextX(), core.nextY(), null, 'def', 0);\n\t\t\tcore.setEnemyOnPoint(core.nextX(), core.nextY(), null, 'hp', 0);\n\t\t\tcore.setEnemyOnPoint(core.nextX(), core.nextY(), null, 'special', 0);\n\t\t\tcore.saveAndStopAutomaticRoute();\n\t\t\tcore.afterBattle(core.getBlockId(core.nextX(), core.nextY()), core.nextX(), core.nextY());\n\t\t\tfail = true;\n\t\t}\n\t}\n\n\tif (success || fail) {\n\t\tcore.playSound('破墙镐');\n\t\tcore.drawTip(core.material.items[itemId].name + '使用成功', itemId);\n\t} else {\n\t\t// 无法使用\n\t\tcore.playSound('操作失败');\n\t\tcore.drawTip(\"当前无法使用\" + core.material.items[itemId].name, itemId);\n\t\tcore.addItem(itemId, 1);\n\t\treturn;\n\t}\n})();",
|
||||
"canUseItemEffect": "true"
|
||||
},
|
||||
"icePickaxe": {
|
||||
|
File diff suppressed because one or more lines are too long
3052
runtime.d.ts
vendored
3052
runtime.d.ts
vendored
File diff suppressed because it is too large
Load Diff
1
runtime.min.d.ts
vendored
1
runtime.min.d.ts
vendored
File diff suppressed because one or more lines are too long
651
server.js
651
server.js
@ -0,0 +1,651 @@
|
||||
const http = require('http');
|
||||
const fs = require('fs/promises');
|
||||
const fss = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
const name = (() => {
|
||||
const data = fss.readFileSync('./project/data.js', 'utf-8');
|
||||
const json = JSON.parse(
|
||||
data
|
||||
.split(/(\n|\r\n)/)
|
||||
.slice(1)
|
||||
.join('\n')
|
||||
);
|
||||
return json.firstData.name;
|
||||
})();
|
||||
|
||||
/** 核心服务器 */
|
||||
const server = http.createServer();
|
||||
|
||||
/** 是否需要重新加载浏览器 */
|
||||
let needReload = true;
|
||||
|
||||
/** 热重载信息 */
|
||||
let hotReloadData = '';
|
||||
|
||||
/** 是否已经启动了热重载模块 */
|
||||
let watched = false;
|
||||
|
||||
/** 是否已经启动了录像调试模块 */
|
||||
let replayed = false;
|
||||
|
||||
/** 监听端口 */
|
||||
let port = 3000;
|
||||
const next = () => {
|
||||
server.listen(port, '127.0.0.1');
|
||||
server.on('error', () => {
|
||||
console.log(`${port}端口已被占用`);
|
||||
port++;
|
||||
next();
|
||||
});
|
||||
};
|
||||
next();
|
||||
|
||||
let repStart;
|
||||
|
||||
const listenedFloors = [];
|
||||
|
||||
// ----- GET file
|
||||
|
||||
/**
|
||||
* 请求文件
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
* @param {string} path
|
||||
*/
|
||||
async function getFile(req, res, path) {
|
||||
try {
|
||||
const data = await fs.readFile(path);
|
||||
if (path.endsWith('.js'))
|
||||
res.writeHead(200, { 'Content-type': 'text/javascript' });
|
||||
if (path.endsWith('.css'))
|
||||
res.writeHead(200, { 'Content-type': 'text/css' });
|
||||
if (path.endsWith('.html'))
|
||||
res.writeHead(200, { 'Content-type': 'text/html' });
|
||||
return res.end(data), true;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 高层塔优化及动画加载
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
* @param {string[]} ids
|
||||
* @param {string} suffix 后缀名
|
||||
* @param {string} dir 文件夹路径
|
||||
* @param {string} join 分隔符
|
||||
*/
|
||||
async function getAll(req, res, ids, suffix, dir, join) {
|
||||
let data = {};
|
||||
const tasks = ids.map(v => {
|
||||
return new Promise(res => {
|
||||
const d = path.resolve(__dirname, `${dir}${v}${suffix}`);
|
||||
try {
|
||||
fs.readFile(d).then(vv => {
|
||||
data[v] = vv;
|
||||
res(`${v} pack success.`);
|
||||
});
|
||||
} catch {
|
||||
throw new ReferenceError(`The file ${d} does not exists.`);
|
||||
}
|
||||
});
|
||||
});
|
||||
await Promise.all(tasks);
|
||||
const result = ids.map(v => data[v]);
|
||||
return res.end(result.join(join)), true;
|
||||
}
|
||||
|
||||
// ----- 样板的fs功能
|
||||
|
||||
/**
|
||||
* 获取POST的数据
|
||||
* @param {http.IncomingMessage} req
|
||||
*/
|
||||
async function getPostData(req) {
|
||||
let data = '';
|
||||
await new Promise(res => {
|
||||
req.on('data', chunk => {
|
||||
data += chunk.toString();
|
||||
});
|
||||
req.on('end', res);
|
||||
});
|
||||
return data;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function readDir(req, res) {
|
||||
const data = await getPostData(req);
|
||||
const dir = path.resolve(__dirname, data.toString().slice(5));
|
||||
try {
|
||||
const info = await fs.readdir(dir);
|
||||
res.end(JSON.stringify(info));
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.end(`error: Read dir ${dir} fail. Does the dir exists?`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function mkdir(req, res) {
|
||||
const data = await getPostData(req);
|
||||
const dir = path.resolve(__dirname, data.toString().slice(5));
|
||||
try {
|
||||
await fs.mkdir(dir);
|
||||
} catch (e) {}
|
||||
res.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function readFile(req, res) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const dir = path.resolve(__dirname, data.split('&name=')[1]);
|
||||
try {
|
||||
const type = /^type=(utf8|base64)/.exec(data)[0];
|
||||
const info = await fs.readFile(dir, { encoding: type.slice(5) });
|
||||
res.end(info);
|
||||
} catch (e) {
|
||||
res.end();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function writeFile(req, res) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const name = data.split('&name=')[1].split('&value=')[0];
|
||||
const dir = path.resolve(__dirname, name);
|
||||
try {
|
||||
const type = /^type=(utf8|base64)/.exec(data)[0].slice(5);
|
||||
const value = /&value=[^]+/.exec(data)[0].slice(7);
|
||||
await fs.writeFile(dir, value, { encoding: type });
|
||||
testWatchFloor(name);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.end(
|
||||
`error: Write file ${dir} fail. Does the parent folder exists?`
|
||||
);
|
||||
}
|
||||
res.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function rm(req, res) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const dir = path.resolve(__dirname, data.slice(5));
|
||||
try {
|
||||
await fs.rm(dir);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.end(`error: Remove file ${dir} fail. Does this file exists?`);
|
||||
}
|
||||
res.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function moveFile(req, res) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const info = data.split('&dest=');
|
||||
const src = path.resolve(__dirname, info[0].slice(4));
|
||||
const dest = info[1];
|
||||
try {
|
||||
const data = await fs.readFile(src);
|
||||
await fs.writeFile(path.resolve(__dirname, dest), data);
|
||||
await fs.rm(src);
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
res.end(`error: Move file ${dir} fail.`);
|
||||
}
|
||||
res.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function writeMultiFiles(req, res) {
|
||||
const data = (await getPostData(req)).toString();
|
||||
const names = /name=[^]+&value=/.exec(data)[0].slice(5, -7).split(';');
|
||||
const value = /&value=[^]+/.exec(data)[0].slice(7).split(';');
|
||||
|
||||
const tasks = names.map((v, i) => {
|
||||
try {
|
||||
return new Promise(res => {
|
||||
fs.writeFile(
|
||||
path.resolve(__dirname, v),
|
||||
value[i],
|
||||
'base64' // 多文件是base64写入的
|
||||
).then(v => {
|
||||
testWatchFloor(v);
|
||||
res(`write ${v} success.`);
|
||||
});
|
||||
});
|
||||
} catch {
|
||||
console.error(e);
|
||||
res.end(`error: Write multi files fail.`);
|
||||
}
|
||||
});
|
||||
await Promise.all(tasks);
|
||||
res.end();
|
||||
}
|
||||
|
||||
// ----- extract path & utils
|
||||
|
||||
/**
|
||||
* 解析路径
|
||||
* @param {...string} dirs
|
||||
* @returns {Promise<string[]>}
|
||||
*/
|
||||
async function extract(...dirs) {
|
||||
const res = [];
|
||||
const tasks = dirs.map(v => {
|
||||
return new Promise(resolve => {
|
||||
if (v.endsWith('/')) {
|
||||
// 匹配路径
|
||||
const dir = path.resolve(__dirname, v.slice(0, -1));
|
||||
fs.readdir(dir).then(files => {
|
||||
const all = files
|
||||
.filter(v => v !== 'thirdparty') // 排除第三方库
|
||||
.map(vv => v + vv);
|
||||
|
||||
res.push(...all);
|
||||
resolve('success');
|
||||
});
|
||||
} else if (/\/\*.\w+$/.test(v)) {
|
||||
// 匹配文件夹中的后缀名
|
||||
const suffix = /\.\w+$/.exec(v)[0];
|
||||
const d = v.split(`/*${suffix}`)[0];
|
||||
const dir = path.resolve(__dirname, d);
|
||||
fs.readdir(dir).then(files => {
|
||||
const all = files
|
||||
.filter(v => v.endsWith(suffix))
|
||||
.map(v => `${d === '' ? '' : d + '/'}${v}`);
|
||||
|
||||
res.push(...all);
|
||||
resolve('success');
|
||||
});
|
||||
} else {
|
||||
res.push(v);
|
||||
resolve('success');
|
||||
}
|
||||
});
|
||||
});
|
||||
await Promise.all(tasks);
|
||||
return res;
|
||||
}
|
||||
|
||||
// ----- hot reload
|
||||
|
||||
/**
|
||||
* 监听文件变化
|
||||
*/
|
||||
async function watch() {
|
||||
// 需要重新加载的文件
|
||||
const refresh = await extract('main.js', 'index.html', 'libs/');
|
||||
const option = {
|
||||
interval: 1000
|
||||
};
|
||||
refresh.forEach(v => {
|
||||
const dir = path.resolve(__dirname, v);
|
||||
fss.watchFile(dir, option, () => {
|
||||
needReload = true;
|
||||
console.log(`change: ${v}`);
|
||||
});
|
||||
});
|
||||
|
||||
// css 热重载
|
||||
const css = await extract('/*.css');
|
||||
css.forEach(v => {
|
||||
const dir = path.resolve(__dirname, v);
|
||||
fss.watchFile(dir, option, () => {
|
||||
hotReloadData += `@@css:${v}`;
|
||||
console.log(`css hot reload: ${v}`);
|
||||
});
|
||||
});
|
||||
|
||||
// 楼层 热重载
|
||||
// 注意这里要逐个监听,并通过创建文件来监听文件改变
|
||||
const floors = await extract('project/floors/*.js');
|
||||
floors.forEach(v => {
|
||||
watchOneFloor(v.slice(15));
|
||||
});
|
||||
|
||||
// 脚本编辑 及 插件 热重载
|
||||
const scripts = await extract('project/functions.js', 'project/plugins.js');
|
||||
scripts.forEach(v => {
|
||||
const dir = path.resolve(__dirname, v);
|
||||
const type = v.split('/').at(-1).slice(0, -3);
|
||||
fss.watchFile(dir, option, () => {
|
||||
hotReloadData += `@@script:${type}`;
|
||||
console.log(`script hot reload: ${type}.js`);
|
||||
});
|
||||
});
|
||||
|
||||
// 数据热重载
|
||||
const datas = (await extract('project/*.js')).filter(
|
||||
v => !v.endsWith('functions.js') && !v.endsWith('plugins.js')
|
||||
);
|
||||
datas.forEach(v => {
|
||||
const dir = path.resolve(__dirname, v);
|
||||
const type = v.split('/').at(-1).slice(0, -3);
|
||||
fss.watchFile(dir, option, () => {
|
||||
hotReloadData += `@@data:${type}`;
|
||||
console.log(`data hot reload: ${type}`);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 检测是否是楼层文件并进行监听
|
||||
* @param {string} url 要测试的路径
|
||||
*/
|
||||
function testWatchFloor(url) {
|
||||
if (/project(\/|\\)floors(\/|\\).*\.js/.test(url)) {
|
||||
const f = url.slice(15);
|
||||
if (!listenedFloors.includes(f.slice(0, -3))) {
|
||||
watchOneFloor(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 监听一个楼层文件
|
||||
* @param {string} file 要监听的文件
|
||||
*/
|
||||
function watchOneFloor(file) {
|
||||
if (!/.*\.js/.test(file)) return;
|
||||
const f = file.slice(0, -3);
|
||||
listenedFloors.push(file.slice(0, -3));
|
||||
fss.watchFile(`project/floors/${file}`, { interval: 1000 }, () => {
|
||||
const floorId = f;
|
||||
if (hotReloadData.includes(`@@floor:${floorId}`)) return;
|
||||
hotReloadData += `@@floor:${floorId}`;
|
||||
console.log(`floor hot reload: ${floorId}`);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改部分文件后重新加载及热重载
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
function reload(req, res, hot = false) {
|
||||
req.on('data', chunk => {
|
||||
if (chunk.toString() === 'test' && !watched) {
|
||||
watch();
|
||||
watched = true;
|
||||
console.log(`服务器热重载模块已开始服务`);
|
||||
}
|
||||
});
|
||||
|
||||
req.on('end', () => {
|
||||
if (!hot) {
|
||||
res.end(`${needReload}`);
|
||||
needReload = false;
|
||||
} else {
|
||||
res.end(hotReloadData);
|
||||
hotReloadData = '';
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// ----- replay debugger
|
||||
|
||||
/**
|
||||
* 录像调试
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
function replay(req, res) {
|
||||
req.on('data', async chunk => {
|
||||
if (chunk.toString() === 'test' && !replayed) {
|
||||
replayed = true;
|
||||
try {
|
||||
await fs.mkdir(path.resolve(__dirname, '_replay'));
|
||||
await fs.mkdir(path.resolve(__dirname, '_replay/status'));
|
||||
await fs.mkdir(path.resolve(__dirname, '_replay/save'));
|
||||
} catch {}
|
||||
|
||||
try {
|
||||
await fs.readFile(
|
||||
path.resolve(__dirname, '_replay/.info'),
|
||||
'utf-8'
|
||||
);
|
||||
} catch {
|
||||
await fs.writeFile(
|
||||
path.resolve(__dirname, '_replay/.info'),
|
||||
`{
|
||||
"cnt": 0
|
||||
}`,
|
||||
'utf-8'
|
||||
);
|
||||
}
|
||||
const data = fss.readFileSync(
|
||||
path.resolve(__dirname, '_replay/.info'),
|
||||
'utf-8'
|
||||
);
|
||||
repStart = Number(JSON.parse(data).cnt);
|
||||
console.log(`服务器录像调试模块已开始服务`);
|
||||
}
|
||||
});
|
||||
|
||||
req.on('end', () => {
|
||||
res.end();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取未占用的状态栏位
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function replayCnt() {
|
||||
const data = `{
|
||||
"cnt": ${++repStart}
|
||||
}`;
|
||||
fss.writeFileSync(path.resolve(__dirname, '_replay/.info'), data, 'utf-8');
|
||||
|
||||
return repStart;
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function replayWrite(req, res) {
|
||||
const data = await getPostData(req);
|
||||
const n = await replayCnt();
|
||||
|
||||
if (isNaN(n)) res.end('@error');
|
||||
|
||||
await Promise.all([
|
||||
fs.writeFile(
|
||||
path.resolve(__dirname, '_replay/.info'),
|
||||
`{
|
||||
"cnt": ${n + 1}
|
||||
}`,
|
||||
'utf-8'
|
||||
),
|
||||
fs.writeFile(
|
||||
path.resolve(__dirname, `_replay/status/${n}.rep`),
|
||||
data,
|
||||
'utf-8'
|
||||
)
|
||||
]);
|
||||
|
||||
res.end(n.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 比对录像与本地数据
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function replayCheck(req, res) {
|
||||
const ans = await getPostData(req);
|
||||
const [n, data] = ans.split('@-|-@');
|
||||
|
||||
const local = (
|
||||
await fs.readFile(
|
||||
path.resolve(__dirname, `_replay/status/${n}.rep`),
|
||||
'utf-8'
|
||||
)
|
||||
)
|
||||
.split('@---@')
|
||||
.map(v => JSON.parse(v));
|
||||
const rep = data.split('@---@').map(v => JSON.parse(v));
|
||||
|
||||
if (local.length !== rep.length) return res.end('false');
|
||||
|
||||
const check = (a, b) => {
|
||||
if (a === b) return true;
|
||||
if (typeof a !== typeof b) return false;
|
||||
if (typeof a === 'object' && a !== null) {
|
||||
for (const j in a) {
|
||||
if (j === 'statistics' || j === 'timeout') continue; // 忽略统计信息
|
||||
const aa = a[j];
|
||||
const bb = b[j];
|
||||
if (!check(aa, bb)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
if (
|
||||
typeof a === 'boolean' ||
|
||||
typeof a === 'number' ||
|
||||
typeof a === 'string' ||
|
||||
typeof a === 'symbol' ||
|
||||
typeof a === 'undefined' ||
|
||||
typeof a === 'bigint' ||
|
||||
a === null
|
||||
) {
|
||||
return a === b;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
for (let i = 0; i < local.length; i++) {
|
||||
const a = local[i];
|
||||
const b = rep[i];
|
||||
if (!check(a, b)) return res.end('false');
|
||||
}
|
||||
|
||||
res.end('true');
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取本地属性
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function replayGet(req, res, dir) {
|
||||
const ans = Number(await getPostData(req));
|
||||
|
||||
const data = await fs.readFile(
|
||||
path.resolve(__dirname, `_replay/${dir}/${ans}.rep`)
|
||||
);
|
||||
res.end(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* 录像回放存档
|
||||
* @param {http.IncomingMessage} req
|
||||
* @param {http.ServerResponse<http.IncomingMessage> & {req: http.IncomingMessage;}} res
|
||||
*/
|
||||
async function replaySave(req, res) {
|
||||
const data = await getPostData(req);
|
||||
const [cnt, save] = data.split('@-|-@');
|
||||
|
||||
if (isNaN(Number(cnt))) {
|
||||
console.log('Invalid input of save cnt');
|
||||
res.end('@error: 不合法的录像存档信息');
|
||||
}
|
||||
|
||||
await fs.writeFile(
|
||||
path.resolve(__dirname, `_replay/save/${cnt}.rep`),
|
||||
save,
|
||||
'utf-8'
|
||||
);
|
||||
|
||||
res.end('success');
|
||||
}
|
||||
|
||||
// ----- server
|
||||
|
||||
server.on('listening', () => {
|
||||
console.log(`服务已启动,编辑器地址:http://127.0.0.1:${port}/editor.html`);
|
||||
console.log(`游戏地址:http://127.0.0.1:${port}`);
|
||||
});
|
||||
|
||||
// 处理请求
|
||||
server.on('request', async (req, res) => {
|
||||
/** @type {string} */
|
||||
const p = req.url.replace(`/games/${name}`, '').replace('/all/', '/');
|
||||
|
||||
if (req.method === 'GET') {
|
||||
const dir = path
|
||||
.resolve(__dirname, p === '/' ? 'index.html' : p.slice(1))
|
||||
.split('?v=')[0];
|
||||
|
||||
if (await getFile(req, res, dir)) return;
|
||||
|
||||
if (p.startsWith('/__all_floors__.js')) {
|
||||
const all = p.split('&id=')[1].split(',');
|
||||
res.writeHead(200, { 'Content-type': 'text/javascript' });
|
||||
return await getAll(req, res, all, '.js', 'project/floors/', '\n');
|
||||
}
|
||||
|
||||
if (p.startsWith('/__all_animates__')) {
|
||||
const all = p.split('&id=')[1].split(',');
|
||||
return await getAll(
|
||||
req,
|
||||
res,
|
||||
all,
|
||||
'.animate',
|
||||
'project/animates/',
|
||||
'@@@~~~###~~~@@@'
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (req.method === 'POST') {
|
||||
if (p === '/listFile') return await readDir(req, res);
|
||||
if (p === '/makeDir') return await mkdir(req, res);
|
||||
if (p === '/readFile') return await readFile(req, res);
|
||||
if (p === '/writeFile') return await writeFile(req, res);
|
||||
if (p === '/deleteFile') return await rm(req, res);
|
||||
if (p === '/moveFile') return await moveFile(req, res);
|
||||
if (p === '/writeMultiFiles') return await writeMultiFiles(req, res);
|
||||
if (p === '/reload') return reload(req, res);
|
||||
if (p === '/hotReload') return reload(req, res, true);
|
||||
if (p === '/replay') return replay(req, res);
|
||||
if (p === '/replayWrite') return await replayWrite(req, res);
|
||||
if (p === '/replayCheck') return await replayCheck(req, res);
|
||||
if (p === '/replayGet') return await replayGet(req, res, 'status');
|
||||
if (p === '/replaySave') return await replaySave(req, res);
|
||||
if (p === '/replayGetSave') return await replayGet(req, res, 'save');
|
||||
}
|
||||
|
||||
res.statusCode = 404;
|
||||
res.end();
|
||||
});
|
243
server.py
243
server.py
@ -0,0 +1,243 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
# HTML5魔塔样板,启动服务Python版
|
||||
# 需要安装Python环境,并 pip install flask 安装Flask库
|
||||
# 运行方式:python server.py 或 python3 server.py
|
||||
|
||||
import sys
|
||||
import json
|
||||
import os
|
||||
import shutil
|
||||
import base64
|
||||
|
||||
isPy3 = sys.version_info > (3, 0)
|
||||
|
||||
def p(s): # s is unicode in py2 and str in py3
|
||||
if isPy3: print(s)
|
||||
else: print(s.decode('utf-8'))
|
||||
p("")
|
||||
|
||||
try:
|
||||
from flask import Flask, request, Response, abort
|
||||
import mimetypes
|
||||
import socket
|
||||
except:
|
||||
p("需要flask才可使用本服务。\n安装方式:%s install flask" % ("pip3" if isPy3 else "pip"))
|
||||
exit(1)
|
||||
|
||||
app = Flask(__name__, static_folder='__static__')
|
||||
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
|
||||
|
||||
@app.after_request
|
||||
def add_header(r):
|
||||
r.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
|
||||
r.headers["Pragma"] = "no-cache"
|
||||
r.headers["Expires"] = "0"
|
||||
r.headers['Cache-Control'] = 'public, max-age=0'
|
||||
return r
|
||||
|
||||
def is_sub(filename):
|
||||
try:
|
||||
return (os.path.realpath(filename) + os.sep).startswith(os.path.realpath(".") + os.sep)
|
||||
except:
|
||||
return True
|
||||
|
||||
def get_mimetype(path):
|
||||
return mimetypes.guess_type(path)[0] or 'application/octet-stream'
|
||||
|
||||
def get_file(path):
|
||||
if not os.path.isfile(path):
|
||||
if path.startswith('_saves/'):
|
||||
return ''
|
||||
abort(404)
|
||||
return None
|
||||
if not is_sub(path):
|
||||
abort(403)
|
||||
with open(path, 'rb') as f:
|
||||
content = f.read() # str in py2 and bytes in py3
|
||||
return content
|
||||
|
||||
@app.route('/', methods=['GET'])
|
||||
def root():
|
||||
return static_file('index.html')
|
||||
|
||||
@app.route('/__all_floors__.js', methods=['GET'])
|
||||
def all_floors():
|
||||
ids = request.args.get('id', '').split(',')
|
||||
if len(ids) == 0:
|
||||
abort(404)
|
||||
return None
|
||||
content = []
|
||||
for id in ids:
|
||||
v = get_file('project/floors/%s.js' % id)
|
||||
if isPy3: v = str(v, encoding = 'utf-8')
|
||||
content.append(v)
|
||||
return Response('\n'.join(content), mimetype = 'text/javascript')
|
||||
|
||||
@app.route('/__all_animates__', methods=['GET'])
|
||||
def all_animates():
|
||||
ids = request.args.get('id', '').split(',')
|
||||
if len(ids) == 0:
|
||||
abort(404)
|
||||
return None
|
||||
content = []
|
||||
for id in ids:
|
||||
animate = 'project/animates/%s.animate' % id
|
||||
if os.path.exists(animate):
|
||||
v = get_file(animate)
|
||||
if isPy3: v = str(v, encoding = 'utf-8')
|
||||
content.append(v)
|
||||
else: content.append('')
|
||||
return '@@@~~~###~~~@@@'.join(content)
|
||||
|
||||
@app.route('/favicon.ico', methods=['GET'])
|
||||
def favicon():
|
||||
return ''
|
||||
|
||||
@app.route('/<path:path>', methods=['GET'])
|
||||
def static_file(path):
|
||||
if os.path.isdir(path):
|
||||
if not path.endswith('/'): path += '/'
|
||||
path += 'index.html'
|
||||
if not os.path.isfile(path):
|
||||
abort(404)
|
||||
return None
|
||||
mimetype = get_mimetype(path)
|
||||
response = Response(get_file(path), mimetype = mimetype)
|
||||
if mimetype.startswith('audio/'): response.headers["Accept-Ranges"] = "bytes"
|
||||
return response
|
||||
|
||||
def process_request():
|
||||
data = request.get_data() # str in py2 and bytes in py3
|
||||
if isPy3: data = str(data, encoding = 'utf-8')
|
||||
params = data.split("&")
|
||||
d = {}
|
||||
for one in params:
|
||||
index = one.find("=")
|
||||
if index >= 0:
|
||||
d[one[:index]] = one[index+1:]
|
||||
return d # str in py2 & py3
|
||||
|
||||
@app.route('/readFile', methods=['POST'])
|
||||
def readFile():
|
||||
data = process_request()
|
||||
tp = data.get('type', 'base64')
|
||||
filename = data.get('name', None)
|
||||
content = get_file(filename)
|
||||
return content if tp == 'utf8' or content is None else base64.b64encode(content)
|
||||
|
||||
@app.route('/writeFile', methods=['POST'])
|
||||
def writeFile():
|
||||
data = process_request()
|
||||
tp = data.get('type', 'base64')
|
||||
filename = data.get('name', None)
|
||||
if not is_sub(filename):
|
||||
abort(403)
|
||||
return
|
||||
value = data.get('value', '')
|
||||
if isPy3: value = value.encode('utf-8')
|
||||
if tp == 'base64': value = base64.b64decode(value)
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(value) # str in py2 and bytes in py3
|
||||
return str(len(value))
|
||||
|
||||
@app.route('/writeMultiFiles', methods=['POST'])
|
||||
def writeMultiFiles():
|
||||
data = process_request()
|
||||
filenames = data.get('name', '').split(';')
|
||||
values = data.get('value', '').split(';')
|
||||
l = 0
|
||||
for i in range(len(filenames)):
|
||||
if i >= len(values):
|
||||
break
|
||||
filename = filenames[i]
|
||||
value = values[i].encode('utf-8') if isPy3 else values[i]
|
||||
value = base64.b64decode(value)
|
||||
if not is_sub(filename):
|
||||
abort(403)
|
||||
return
|
||||
with open(filename, 'wb') as f:
|
||||
f.write(value)
|
||||
l += len(value)
|
||||
return str(l)
|
||||
|
||||
@app.route('/listFile', methods=['POST'])
|
||||
def listFile():
|
||||
data = process_request()
|
||||
filename = data.get('name', None)
|
||||
if filename is None or not os.path.isdir(filename):
|
||||
abort(404)
|
||||
return
|
||||
if not is_sub(filename):
|
||||
abort(403)
|
||||
return
|
||||
files = [f
|
||||
for f in os.listdir(filename)
|
||||
if os.path.isfile(os.path.join(filename, f))]
|
||||
return "[" + ", ".join(['"'+f+'"' for f in files]) + "]"
|
||||
|
||||
@app.route('/makeDir', methods=['POST'])
|
||||
def makeDir():
|
||||
data = process_request()
|
||||
filename = data.get('name', None)
|
||||
if filename is None or not is_sub(filename):
|
||||
abort(403)
|
||||
return
|
||||
if not os.path.exists(filename):
|
||||
os.makedirs(filename)
|
||||
return 'Success'
|
||||
|
||||
@app.route('/moveFile', methods=['POST'])
|
||||
def moveFile():
|
||||
data = process_request()
|
||||
src = data.get('src', None)
|
||||
dest = data.get('dest', None)
|
||||
if src is None or dest is None or not is_sub(src) or not is_sub(dest):
|
||||
abort(403)
|
||||
return
|
||||
if not os.path.exists(src):
|
||||
abort(404)
|
||||
return
|
||||
if src == dest:
|
||||
return 'Success'
|
||||
if os.path.exists(dest):
|
||||
os.remove(dest)
|
||||
os.rename(src, dest)
|
||||
return 'Success'
|
||||
|
||||
@app.route('/deleteFile', methods=['POST'])
|
||||
def deleteFile():
|
||||
data = process_request()
|
||||
name = data.get('name', None)
|
||||
if name is None or not is_sub(name):
|
||||
abort(403)
|
||||
return
|
||||
if os.path.isfile(name):
|
||||
os.remove(name)
|
||||
elif os.path.isdir(name):
|
||||
shutil.rmtree(name)
|
||||
return 'Success'
|
||||
|
||||
@app.route('/games/upload.php', methods=['POST'])
|
||||
def upload():
|
||||
return ''
|
||||
|
||||
def port_used(port):
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
result = True
|
||||
try:
|
||||
sock.bind(("0.0.0.0", port))
|
||||
result = False
|
||||
except:
|
||||
pass
|
||||
sock.close()
|
||||
return result
|
||||
|
||||
if __name__ == '__main__':
|
||||
port = 1055
|
||||
while port_used(port):
|
||||
port += 1
|
||||
if port > 1055:
|
||||
p("默认的1055端口已被占用,自动选择%d端口。请注意,不同端口下的存档等信息都是不共用的。\n" % port)
|
||||
p("服务已启动...\n游戏地址:http://127.0.0.1:%d/\n编辑器地址:http://127.0.0.1:%d/editor.html\n" % (port, port))
|
||||
app.run(host = '0.0.0.0', port = port, debug = False)
|
512
styles.css
512
styles.css
@ -0,0 +1,512 @@
|
||||
html, body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: #000;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#gameGroup {
|
||||
position: absolute;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
background-color: #000;
|
||||
}
|
||||
|
||||
#mainTips {
|
||||
color: #fff;
|
||||
font-size: 0.8em;
|
||||
position: fixed;
|
||||
top: 10px;
|
||||
left: 10px;
|
||||
z-index: 370;
|
||||
}
|
||||
|
||||
#musicBtn {
|
||||
position: fixed;
|
||||
bottom: 3px;
|
||||
right: 3px;
|
||||
cursor: pointer;
|
||||
z-index: 400;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#startPanel {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background-color: #fff;
|
||||
overflow: hidden;
|
||||
z-index: 300;
|
||||
}
|
||||
|
||||
#startTop {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background-color: #000;
|
||||
z-index: 350;
|
||||
}
|
||||
|
||||
#startTopProgressBar {
|
||||
width: 90%;
|
||||
height: 5%;
|
||||
margin: 0 5%;
|
||||
position: absolute;
|
||||
top: 5%;
|
||||
background-color: #fff;
|
||||
z-index: 15;
|
||||
}
|
||||
|
||||
#startTopProgress {
|
||||
width: 0%;
|
||||
height: 100%;
|
||||
background-color: #666;
|
||||
}
|
||||
|
||||
#startTopLoadTips {
|
||||
color: #fff;
|
||||
font-size: 0.6em;
|
||||
position: absolute;
|
||||
top: 10%;
|
||||
left: 5%;
|
||||
z-index: 15;
|
||||
}
|
||||
|
||||
#startTopHint {
|
||||
color: #66CCFF;
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 5%;
|
||||
z-index: 15;
|
||||
font-size: 1.1em;
|
||||
}
|
||||
|
||||
#startBackground {
|
||||
position:absolute;
|
||||
top:50%;
|
||||
left:50%;
|
||||
height: 100%;
|
||||
width: auto;
|
||||
transform:translate(-50%,-50%);
|
||||
z-index: 260;
|
||||
}
|
||||
|
||||
#startLogo {
|
||||
user-select: none;
|
||||
position: absolute;
|
||||
z-index: 290;
|
||||
left: 0;
|
||||
right: 0;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-top: 8%;
|
||||
max-width: 100%;
|
||||
text-align: center;
|
||||
font: bold 4em STXingkai;
|
||||
}
|
||||
|
||||
#startTitle {
|
||||
user-select: none;
|
||||
position: absolute;
|
||||
z-index: 280;
|
||||
}
|
||||
|
||||
#startButtonGroup {
|
||||
width: auto;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
font-size: 1.4em;
|
||||
display: none;
|
||||
z-index: 310;
|
||||
bottom: 0;
|
||||
margin-bottom: 5%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
padding: 15px 25px;
|
||||
min-width: 20%;
|
||||
/* default value */
|
||||
background-color: #32369F;
|
||||
opacity: 0.85;
|
||||
color: #FFFFFF;
|
||||
border: #FFFFFF 2px solid;
|
||||
caret-color: #FFD700;
|
||||
border-radius: 10px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#startButtons {
|
||||
display: block;
|
||||
}
|
||||
|
||||
#levelChooseButtons {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.startButton {
|
||||
width: 30%;
|
||||
margin: 5px;
|
||||
font-weight: bold;
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
padding: 4px 0;
|
||||
border-color: transparent;
|
||||
border-width: 0px 0px 3px 0px;
|
||||
border-style: solid;
|
||||
border-radius: 6px;
|
||||
font-family: 得意黑;
|
||||
}
|
||||
.startButton:hover {
|
||||
transform: scale(1.2);
|
||||
}
|
||||
|
||||
.onChoiceAnimate {
|
||||
animation: onChoice 2s ease-in-out 0s infinite normal none running;
|
||||
}
|
||||
|
||||
#floorMsgGroup {
|
||||
top: 3px;
|
||||
right: 3px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
display: none;
|
||||
color: #fff;
|
||||
background-color: #000;
|
||||
z-index: 230;
|
||||
}
|
||||
|
||||
#logoLabel {
|
||||
margin-top: 8%;
|
||||
font: bold 3em STXingkai;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
#versionLabel {
|
||||
margin-top: -3%;
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#floorNameLabel {
|
||||
margin-top: 30px;
|
||||
font-size: 1.6em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#statusBar {
|
||||
position: absolute;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
background: url(project/materials/ground.png) repeat;
|
||||
z-index: 185;
|
||||
display: none;
|
||||
top: 0;
|
||||
left: 0;
|
||||
padding: 3px;
|
||||
}
|
||||
#statusBar .status{
|
||||
user-select: none;
|
||||
position: relative;
|
||||
display: block;
|
||||
float: left;
|
||||
width: 100%;
|
||||
}
|
||||
.status img{
|
||||
vertical-align: middle;
|
||||
width: auto;
|
||||
height: 100%;
|
||||
max-height: 1.6em;
|
||||
}
|
||||
#statusBar span{
|
||||
user-select: none;
|
||||
font: bold italic 1.1em Verdana;
|
||||
display: inline;
|
||||
}
|
||||
#statusBar p {
|
||||
user-select: none;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
width: 60%;
|
||||
margin: 0;
|
||||
color: white;
|
||||
font: bold italic 1.1em Verdana;
|
||||
white-space: nowrap;
|
||||
}
|
||||
#toolBar {
|
||||
position: absolute;
|
||||
background: url(project/materials/ground.png) repeat;
|
||||
z-index: 210;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
display: none;
|
||||
padding: 3px;
|
||||
}
|
||||
#toolBar .tools{
|
||||
position: relative;
|
||||
display: block;
|
||||
float: left;
|
||||
}
|
||||
|
||||
p#hard {
|
||||
user-select: none;
|
||||
width: 6em;
|
||||
vertical-align: middle;
|
||||
display: inline-block;
|
||||
color: red;
|
||||
font: bold normal 1.1em "Arial Black";
|
||||
text-align: center;
|
||||
margin: 0 6px 6px 0;
|
||||
word-break: keep-all;
|
||||
}
|
||||
|
||||
span#poison, span#weak, span#curse, span#pickaxe, span#bomb, span#fly {
|
||||
user-select: none;
|
||||
font-style: normal;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
p#name {
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
.gameCanvas {
|
||||
position: absolute;
|
||||
box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
}
|
||||
|
||||
#gif {
|
||||
z-index: 20;
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#gif2 {
|
||||
z-index: 90;
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#gameDraw {
|
||||
position: absolute;
|
||||
background: #000000;
|
||||
overflow: hidden;
|
||||
z-index: 185;
|
||||
}
|
||||
|
||||
#bg {
|
||||
z-index: 10;
|
||||
}
|
||||
|
||||
#event {
|
||||
z-index: 30;
|
||||
}
|
||||
|
||||
#hero {
|
||||
z-index: 40;
|
||||
}
|
||||
|
||||
#event2 {
|
||||
z-index: 50;
|
||||
}
|
||||
|
||||
#fg {
|
||||
z-index: 60;
|
||||
}
|
||||
|
||||
#damage {
|
||||
z-index: 65;
|
||||
}
|
||||
|
||||
#animate {
|
||||
z-index: 70;
|
||||
}
|
||||
|
||||
#curtain {
|
||||
z-index: 125;
|
||||
}
|
||||
|
||||
#ui {
|
||||
z-index: 140;
|
||||
}
|
||||
|
||||
#data {
|
||||
z-index: 170;
|
||||
}
|
||||
|
||||
#inputDiv {
|
||||
display: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
background: rgba(127,127,127,0.6);
|
||||
z-index: 2000
|
||||
}
|
||||
|
||||
#inputDialog {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -55%);
|
||||
background: white;
|
||||
width: 250px;
|
||||
min-height: 50px;
|
||||
}
|
||||
|
||||
#inputMessage {
|
||||
word-wrap: break-word;
|
||||
text-align: left;
|
||||
margin-left: 8%;
|
||||
margin-right: 5%;
|
||||
}
|
||||
|
||||
#inputBox {
|
||||
margin-left: 8%;
|
||||
width: 80%;
|
||||
margin-bottom: 10px;
|
||||
padding: 5px 3px;
|
||||
border: 1px solid;
|
||||
background: #F0F0F0;
|
||||
}
|
||||
|
||||
#inputYes {
|
||||
margin-bottom: 15px;
|
||||
margin-left: 8%;
|
||||
}
|
||||
|
||||
#inputNo {
|
||||
float:right;
|
||||
margin-right: 10%;
|
||||
}
|
||||
|
||||
#_selector, ._uievent_selector {
|
||||
animation: selector 2s ease-in-out 0s infinite normal none running;
|
||||
}
|
||||
|
||||
@-webkit-keyframes selector {
|
||||
0% { opacity: 0.95; }
|
||||
50% { opacity: 0.55; }
|
||||
100% { opacity: 0.95; }
|
||||
}
|
||||
|
||||
@keyframes selector {
|
||||
0% { opacity: 0.95; }
|
||||
50% { opacity: 0.55; }
|
||||
100% { opacity: 0.95; }
|
||||
}
|
||||
|
||||
#next {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
display: none;
|
||||
position: absolute;
|
||||
transform: rotate(45deg);
|
||||
border-bottom-width: 4px;
|
||||
border-bottom-style: solid;
|
||||
border-right-width: 4px;
|
||||
border-right-style: solid;
|
||||
-webkit-animation: next .5s ease-in-out alternate infinite;
|
||||
animation: next .5s ease-in-out alternate infinite;
|
||||
left: 0;
|
||||
top: 0;
|
||||
opacity: 0.7;
|
||||
z-index: 169;
|
||||
}
|
||||
|
||||
@-webkit-keyframes next {
|
||||
100% {
|
||||
transform: rotate(45deg) translate(-3px, -3px);
|
||||
}
|
||||
}
|
||||
@keyframes next {
|
||||
100% {
|
||||
transform: rotate(45deg) translate(-3px, -3px);
|
||||
}
|
||||
}
|
||||
|
||||
#startImageBackgroundDiv {
|
||||
display: none;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
#startImageDiv {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
background: black;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
#startImageLogo {
|
||||
opacity: 0;
|
||||
max-width: 60%;
|
||||
max-height: 60%;
|
||||
position: fixed;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
}
|
||||
|
||||
.startImageAnimation {
|
||||
-webkit-animation: startImage 4s ease-in-out 1s alternate 1;
|
||||
animation: startImage 4s ease-in-out 1s alternate 1;
|
||||
}
|
||||
|
||||
@-webkit-keyframes startImage {
|
||||
0% { opacity: 0; }
|
||||
60% { opacity: 1; }
|
||||
100% { opacity: 0; }
|
||||
}
|
||||
|
||||
@keyframes startImage {
|
||||
0% { opacity: 0; }
|
||||
60% { opacity: 1; }
|
||||
100% { opacity: 0; }
|
||||
}
|
||||
|
||||
.startImageDivAnimation {
|
||||
-webkit-animation: startImageDivDisappear 2s ease-in-out 5s alternate 1;
|
||||
animation: startImageDivDisappear 2s ease-in-out 5s alternate 1;
|
||||
}
|
||||
|
||||
@-webkit-keyframes startImageDivDisappear {
|
||||
0% { opacity: 1 }
|
||||
100% { opacity: 0 }
|
||||
}
|
||||
|
||||
@keyframes startImageDivDisappear {
|
||||
0% { opacity: 1 }
|
||||
100% { opacity: 0 }
|
||||
}
|
||||
|
||||
#ui-editor {
|
||||
z-index: 9999;
|
||||
position: absolute;
|
||||
overflow: visible;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: Fira Code;
|
||||
src: url(../src/fonts/FiraCode-Regular.ttf);
|
||||
}
|
||||
|
||||
/* 注释下面这三行以开启抗锯齿 */
|
||||
.anti-aliasing {
|
||||
image-rendering: pixelated;
|
||||
}
|
BIN
常用工具/EcmaScript.NET.dll
Normal file
BIN
常用工具/EcmaScript.NET.dll
Normal file
Binary file not shown.
BIN
常用工具/ICSharpCode.SharpZipLib.dll
Normal file
BIN
常用工具/ICSharpCode.SharpZipLib.dll
Normal file
Binary file not shown.
BIN
常用工具/Jint.dll
Normal file
BIN
常用工具/Jint.dll
Normal file
Binary file not shown.
BIN
常用工具/Newtonsoft.Json.dll
Normal file
BIN
常用工具/Newtonsoft.Json.dll
Normal file
Binary file not shown.
BIN
常用工具/RM动画导出器.exe
Normal file
BIN
常用工具/RM动画导出器.exe
Normal file
Binary file not shown.
BIN
常用工具/Yahoo.Yui.Compressor.dll
Normal file
BIN
常用工具/Yahoo.Yui.Compressor.dll
Normal file
Binary file not shown.
BIN
常用工具/rgss.dll
Normal file
BIN
常用工具/rgss.dll
Normal file
Binary file not shown.
BIN
常用工具/伤害和临界值计算器.exe
Normal file
BIN
常用工具/伤害和临界值计算器.exe
Normal file
Binary file not shown.
BIN
常用工具/便捷PS工具.exe
Normal file
BIN
常用工具/便捷PS工具.exe
Normal file
Binary file not shown.
BIN
常用工具/动画编辑器.exe
Normal file
BIN
常用工具/动画编辑器.exe
Normal file
Binary file not shown.
BIN
常用工具/怪物数据导出器.exe
Normal file
BIN
常用工具/怪物数据导出器.exe
Normal file
Binary file not shown.
BIN
常用工具/截图识别器.exe
Normal file
BIN
常用工具/截图识别器.exe
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user