fix: 恢复上上提交删掉的文件,增加测试接口,增加显示用户名,增加显示薪资,允许自定义显示名

This commit is contained in:
bdf1 2023-05-23 18:08:43 +13:00
parent f1f1375dbc
commit 5184664f26
32 changed files with 5601 additions and 256 deletions

View File

@ -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"}, "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]}, "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]}, "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":[]}, "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":[]}, "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":[]}, "E350": {"name":"行走的困难","hp":70,"atk":20,"def":2,"money":0,"exp":1,"point":0,"special":[]},

View File

@ -19,7 +19,20 @@ main.floors.BOSS3=
"events": {}, "events": {},
"changeFloor": {}, "changeFloor": {},
"beforeBattle": {}, "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": {}, "afterGetItem": {},
"afterOpenDoor": {}, "afterOpenDoor": {},
"autoEvent": {}, "autoEvent": {},

View File

@ -31,7 +31,7 @@ main.floors.JQ1=
"type": "setCurtain", "type": "setCurtain",
"time": 1000 "time": 1000
}, },
"\t[母亲,N385]明天就要送bdf去幼儿园了。", "\t[母亲,N385]明天就要送${core.status.hero.flags.truename || core.status.hero.name}去幼儿园了。",
"\t[父亲,N389]怎么?担心他吗?", "\t[父亲,N389]怎么?担心他吗?",
"\t[母亲,N385]那倒不至于...唉,确实有点。", "\t[母亲,N385]那倒不至于...唉,确实有点。",
"\t[父亲,N389]担心也没办法啊,这是他成长过程当中必须要经历的事情。", "\t[父亲,N389]担心也没办法啊,这是他成长过程当中必须要经历的事情。",

View File

@ -64,8 +64,8 @@ main.floors.JQ2=
"\t[母亲,N385]老师问你叫什么名字,对老师说你叫什么名字...", "\t[母亲,N385]老师问你叫什么名字,对老师说你叫什么名字...",
"\t[hero]...", "\t[hero]...",
"\t[幼儿园老师,N401]小朋友有点害羞啊。", "\t[幼儿园老师,N401]小朋友有点害羞啊。",
"\t[母亲,N385]他叫bdf,不久前才学会说话,对陌生环境也比较害怕。", "\t[母亲,N385]他叫${core.status.hero.flags.truename || core.status.hero.name},不久前才学会说话,对陌生环境也比较害怕。",
"\t[幼儿园老师,N401]你叫bdf是吧?从今往后起我就是你的老师了,我们一起在这里玩耍好不好啊?", "\t[幼儿园老师,N401]你叫${core.status.hero.flags.truename || core.status.hero.name}是吧?从今往后起我就是你的老师了,我们一起在这里玩耍好不好啊?",
"\t[hero]\b[hero]...嗯...", "\t[hero]\b[hero]...嗯...",
"\t[父亲,N389]这孩子在幼儿园要麻烦你们这些老师照顾了,可能需要费点心。", "\t[父亲,N389]这孩子在幼儿园要麻烦你们这些老师照顾了,可能需要费点心。",
"\t[幼儿园老师,N401]不麻烦,这都是我们应该做的", "\t[幼儿园老师,N401]不麻烦,这都是我们应该做的",

View File

@ -28,9 +28,9 @@ main.floors.JQ4=
}, },
"\b[up,7,7]唉...你们的孩子实在是太难管了,不是上课乱跑就是下课搞小动作,有次趁我不注意,把我电脑都给弄坏了,文件也都弄没了。", "\b[up,7,7]唉...你们的孩子实在是太难管了,不是上课乱跑就是下课搞小动作,有次趁我不注意,把我电脑都给弄坏了,文件也都弄没了。",
"\b[up,5,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[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]行吧,希望别有下一次了。", "\b[up,7,7]行吧,希望别有下一次了。",
{ {
"type": "setCurtain", "type": "setCurtain",

View File

@ -18,12 +18,12 @@ main.floors.JQ5=
"type": "setCurtain", "type": "setCurtain",
"time": 1000 "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[母亲,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[母亲,N385]\b[up,8,7]这至少要耗费比半个月的工资啊,真的要这样吗?",
"\t[父亲,N389]\b[up,9,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", "type": "setCurtain",
"color": [ "color": [

View File

@ -22,14 +22,14 @@ main.floors.JQ8=
"type": "sleep", "type": "sleep",
"time": 2000 "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,7,9]对,我也建议把他调到别班去,实在不行让他蹲一级也行啊。",
"\b[up,6,9]我也希望他能离开,他之前还把我们家孩子打哭了呢。", "\b[up,6,9]我也希望他能离开,他之前还把我们家孩子打哭了呢。",
"\b[up,8,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,6,9]赶紧带他看看啊,到底是不是有问题!",
"\b[up,7,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", "type": "setCurtain",
"color": [ "color": [

View File

@ -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, 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,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, 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,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, 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, 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, 45,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, 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] [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
], ],
"firstArrive": [ "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": {}, "changeFloor": {},

View File

@ -80,7 +80,7 @@ main.floors.MT10=
} }
] ]
}, },
"\t[bdf,N393]..." "\t[${status:name},N393]..."
], ],
"5,4": [ "5,4": [
{ {

View File

@ -41,7 +41,7 @@ main.floors.MT3=
"time": 1000, "time": 1000,
"keep": true "keep": true
}, },
"\t[父亲,N389]bdf已经一周岁了。许个愿望吧。", "\t[父亲,N389]${core.status.hero.flags.truename || core.status.hero.name}已经一周岁了。许个愿望吧。",
"\t[母亲,N385]许个什么愿望呢...", "\t[母亲,N385]许个什么愿望呢...",
"\t[母亲,N385]希望他能平平安安健健康康吧。以后的路还很长,要靠他自己,我们当父母的默默的支持他就好。", "\t[母亲,N385]希望他能平平安安健健康康吧。以后的路还很长,要靠他自己,我们当父母的默默的支持他就好。",
"\t[父亲,N389]嗯嗯,平安健康就好,我儿子将来一定会有出息的。", "\t[父亲,N389]嗯嗯,平安健康就好,我儿子将来一定会有出息的。",

View File

@ -36,7 +36,7 @@ main.floors.MT6=
"time": 1000, "time": 1000,
"keep": true "keep": true
}, },
"\t[母亲,N385]bdf学会了走路,但好像还不会说话啊...", "\t[母亲,N385]${core.status.hero.flags.truename || core.status.hero.name}学会了走路,但好像还不会说话啊...",
"\t[父亲,N389]慢慢来呗,早晚都会的,他不过才两岁罢了。", "\t[父亲,N389]慢慢来呗,早晚都会的,他不过才两岁罢了。",
{ {
"type": "changeFloor", "type": "changeFloor",

View File

@ -134,13 +134,13 @@ main.floors.MT87=
[182,182,182,182,182,182, 86,182,182,182,182,182,182], [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,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,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,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,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,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, 0,182,182,182,182,182,182],
[182,182,182,182,182,182, 93,182,182,182,182,182,182] [182,182,182,182,182,182, 93,182,182,182,182,182,182]
], ],

View File

@ -1622,7 +1622,39 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a =
core.ui.fillText(ctx, text, x, y, style); core.ui.fillText(ctx, text, x, y, style);
}; };
core.ui.clearMap(ctx = core.dom.statusCanvasCtx); 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) { // 系统开关「自绘状态栏」开启 if (core.flags.statusCanvas) { // 系统开关「自绘状态栏」开启
core.ui.clearMap(ctx = core.dom.statusCanvasCtx); // 清空状态栏 core.ui.clearMap(ctx = core.dom.statusCanvasCtx); // 清空状态栏
core.ui.setFillStyle(ctx, core.status.globalAttribute.statusBarColor); 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('blueKey')), 203, 86, '#AAAADD');
fill(core.setTwoDigits(core.itemCount('redKey')), 247, 86, '#FF8888'); fill(core.setTwoDigits(core.itemCount('redKey')), 247, 86, '#FF8888');
fill(core.setTwoDigits(core.itemCount('pickaxe')), 291, 86, '#BC6E27'); 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'); var salary = ((core.itemCount('yellowKey') * 2 + core.itemCount('blueKey') * 5 + core.itemCount('redKey') * 15 + core.itemCount('pickaxe') * 30)) * 3 / 5;
fill(core.setTwoDigits(core.getFlag('lhjnb', 0)), 379, 86, '#8D8600'); 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) { // 横屏且未隐藏状态栏 } else if (!core.flags.hideLeftStatusBar) { // 横屏且未隐藏状态栏
core.drawIcon(ctx, 18, 6, 5, 25, 25); core.drawIcon(ctx, 18, 6, 5, 25, 25);
core.drawIcon(ctx, 34, 6, 35, 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('blueKey')), 92, 240, '#AAAADD');
fill(core.setTwoDigits(core.itemCount('redKey')), 32, 270, '#FF8888'); fill(core.setTwoDigits(core.itemCount('redKey')), 32, 270, '#FF8888');
fill(core.setTwoDigits(core.itemCount('pickaxe')), 92, 270, '#BC6E27'); 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'); var salary = ((core.itemCount('yellowKey') * 2 + core.itemCount('blueKey') * 5 + core.itemCount('redKey') * 15 + core.itemCount('pickaxe') * 30)) * 3 / 5;
fill(core.setTwoDigits(core.getFlag('lhjnb', 0)), 92, 300, '#8D8600'); 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) { // 横屏且隐藏状态栏 } else if (core.flags.hideLeftStatusBar && !core.domStyle.isVertical) { // 横屏且隐藏状态栏

View File

@ -289,7 +289,7 @@ var items_296f5d02_12fd_4166_a7c1_b5e830c9ee3a =
"cls": "tools", "cls": "tools",
"name": "破墙镐", "name": "破墙镐",
"text": "可以破坏勇士面前的墙", "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" "canUseItemEffect": "true"
}, },
"icePickaxe": { "icePickaxe": {

File diff suppressed because one or more lines are too long

3052
runtime.d.ts vendored

File diff suppressed because it is too large Load Diff

1
runtime.min.d.ts vendored

File diff suppressed because one or more lines are too long

651
server.js
View File

@ -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
View File

@ -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)

View File

@ -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;
}

Binary file not shown.

Binary file not shown.

BIN
常用工具/Jint.dll Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
常用工具/rgss.dll Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.