添加 nodejs 的 runner

This commit is contained in:
shenjack 2024-03-17 15:09:57 +08:00
parent 357a55f4c9
commit 337e862948
Signed by: shenjack
GPG Key ID: 7B1134A979775551
13 changed files with 26471 additions and 0 deletions

4
node_run/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
node_modules
data.json
queue.json

64
node_run/child.js Normal file
View File

@ -0,0 +1,64 @@
const { JSDOM } = require('jsdom');
const chalk = require('chalk');
const path = require('path');
const fs = require('fs');
const config = JSON.parse(fs.readFileSync('./config.json'));
const testString = {
QP: '!test!\n!\n\n$name',
QD: '!test!\n!\n\n$name\n$name',
PP: '!test!\n\n$name',
PD: '!test!\n\n$name\n$name',
}
const id = process.argv[2];
console.log(chalk`{gray child {bold ${id}} started.}`);
process.on('message', ([mode, name]) => {
try {
console.log(chalk`{magentaBright [${id}] ${name} ${mode} started.}`)
// 创建一个简单的localStorage模拟
const localStorageMock = {
setItem: function (key, value) {
this[key] = value;
},
getItem: function (key) {
return this[key] || null;
},
removeItem: function (key) {
delete this[key];
},
clear: function () {
for (const key in this) {
if (this.hasOwnProperty(key) && key !== 'setItem' && key !== 'getItem' && key !== 'removeItem' && key !== 'clear') {
delete this[key];
}
}
}
};
new JSDOM(fs.readFileSync(path.join(__dirname, 'static/md5.html'), 'utf-8'), {
url: 'file://' + path.join(__dirname, 'static/'),
runScripts: 'dangerously',
resources: 'usable',
beforeParse(window) {
window.FakelocalStorage = localStorageMock;
window.config = config[mode].thresholds;
window.name_input = testString[mode].replace(/\$name/g, name);
window.stage = 0;
window.skillData = [];
window.resolve = (...args) => {
process.send(args);
window.close();
}
}
});
} catch (e) {
console.error(e);
}
});
// dom.window.onload = () => {
// console.log(dom.window.document.body.outerHTML)
// }
// const window = await new Promise(resolve => dom.window.document.addEventListener('DOMContentLoaded', () => console.log(dom.window.document.body.outerHTML)));

50
node_run/config.json Normal file
View File

@ -0,0 +1,50 @@
{
"备注": "//mode只有preliminary是测其它任何字段都是不测 //count应该是测多少次的意思//score是个分数限制低于这个就认为失败不记录",
"threads": 2,
"QP": {
"mode": "preliminary",
"thresholds": [
{
"score": 5500,
"count": 1000
},
{
"count": 10000,
"skillLabel": "QP 100%"
}
]
},
"QD": {
"mode": "preliminary",
"thresholds": [
{
"score": 5500,
"count": 1000
},
{
"count": 10000
}
]
},
"PP": {
"mode": "disabled",
"thresholds": [
{
"count": 10,
"score": 6050
},
{
"count": 100,
"score": 6850
}
]
},
"PD": {
"mode": "disabled",
"thresholds": [
{
"count": 10000
}
]
}
}

33
node_run/dump.py Normal file
View File

@ -0,0 +1,33 @@
import json
import csv# 打开json文件并加载数据
with open('data.json', 'r',encoding='utf-8') as f:
data = json.load(f)
with open('output.csv', 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['标签', 'QP', 'QD', 'skills'])
left_labels=[]
# 写入每行数据
rows = []
for index, (label, values) in enumerate(data['data'].items()):
qp = values['QP']
qd = values['QD']
if (qp==-1 or qd==-1):
left_labels.append(label)
continue
if (qp==0 or qd ==0): continue
if 'skills' in values.keys():
skills = ','.join([f"{k},{v}" for k, v in values['skills']['QP 100%'].items()])
else:
skills = ''
rows.append([label, qp, qd, skills])
# 按照QP字段降序排序
sorted_rows = sorted(rows, key=lambda x: int(x[1]), reverse=True)
with open('left_names.txt','w',newline='\n',encoding='utf-8') as f2:
for name in left_labels:
f2.write(name+'\n')
# 写入排序后的数据
for row in sorted_rows:
writer.writerow(row)

142
node_run/index.js Normal file
View File

@ -0,0 +1,142 @@
const child_process = require('child_process');
const chalk = require('chalk');
const path = require('path');
const fs = require('fs');
const low = require('lowdb');
const FileSync = require('lowdb/adapters/FileSync');
function replacer(_key, value) {
if (value instanceof Set)
return { dataType: 'Set', value: [...value] };
return value;
}
function reviver(_key, value) {
if (typeof value === 'object' && value !== null)
if (value.dataType === 'Set') return new Set(value.value);
return value;
}
const queueAdapter = new FileSync(path.resolve(__dirname, 'queue.json'), {
serialize: obj => JSON.stringify(obj, replacer),
deserialize: str => JSON.parse(str, reviver)
});
const queueDB = low(queueAdapter);
queueDB.defaults({ queue: new Set() }).write();
const dataAdapter = new FileSync(path.resolve(__dirname, 'data.json'));
const dataDB = low(dataAdapter);
dataDB.defaults({ data: {} }).write();
const fullQueue = queueDB.get('queue').value(); // remove after finished
const queue = new Set([...fullQueue]); // remove when processing
const config = JSON.parse(fs.readFileSync(path.resolve(__dirname, 'config.json')));
const idleThreads = new Set();
const threads = [];
var count = 0;
function addItem(name, mode) {
if (dataDB.has(['data', name, mode]).value()) return;
const item = [mode, name];
dataDB.setWith(['data', name, mode], -1, Object).write();
fullQueue.add(item);
if (idleThreads.size) {
var thread = idleThreads.values().next().value;
item.processing = true;
thread.item = item;
thread.send(item);
idleThreads.delete(thread);
} else {
queue.add(item);
console.log(chalk`{cyanBright ${name} ${mode} pending.}`);
}
queueDB.write();
}
fs.readFileSync(path.resolve(__dirname, 'input.txt'), 'utf8').split('\n').forEach(name => {
name = name.trim();
if (name.length)
for (var mode in config)
if (config[mode].mode === 'preliminary') {
if (dataDB.has(['data', name, mode]).value()) continue;
dataDB.setWith(['data', name, mode], -1, Object).value();
const item = [mode, name];
fullQueue.add(item);
queue.add(item);
}
});
dataDB.write();
queueDB.write();
console.log(`queue size: ${fullQueue.size}`);
var it = queue.values();
for (var i = 0; i < config.threads; i++) {
threads[i] = child_process.fork(path.resolve(__dirname, 'child.js'), [i]);
threads[i].id = i;
threads[i].on('message', function ([success, skills, score, last]) {
const [mode, name] = this.item;
fullQueue.delete(this.item);
queueDB.write();
count++;
if (!success) {
console.log(chalk`{redBright [${this.id}] ${name} ${mode} failed with score {bold ${score}} at {bold ${(last / 100).toFixed(2).replace(/\.?0+$/, '')}%}}`);
dataDB.setWith(['data', name, mode], 0, Object).value();
for (var [label, data] of skills)
dataDB.setWith(['data', name, 'skills', label], data, Object).value();
const obj = dataDB.get(['data', name]).value();
var needDelete = true;
for (var i in obj)
if (i !== 'skills' && obj[i] !== 0) needDelete = false;
if (needDelete)
dataDB.unset(['data', name]).value();
} else {
console.log(chalk`{greenBright [${this.id}] ${name} ${mode} finished with score {bold ${score}}}.`);
dataDB.setWith(['data', name, mode], score, Object).value();
for (var [label, data] of skills)
dataDB.setWith(['data', name, 'skills', label], data, Object).value();
if (config[mode].mode === 'preliminary')
for (var filteredMode in config)
if (config[filteredMode].mode === 'filtered') addItem(name, filteredMode);
}
dataDB.write();
if (queue.size) {
var item = queue.values().next().value;
item.processing = true;
queue.delete(item);
this.item = item;
this.send(item);
} else
idleThreads.delete(this);
console.log(chalk`{yellowBright {bold progress: ${count} / ${fullQueue.size + count}}}`);
if (!fullQueue.size)
console.log(chalk`{yellowBright {bold queue is empty.}}`);
});
idleThreads.add(threads[i]);
var item = it.next().value;
if (item) {
item.processing = true;
queue.delete(item);
threads[i].item = item;
threads[i].send(item);
idleThreads.delete(threads[i]);
}
}

476
node_run/input.txt Normal file
View File

@ -0,0 +1,476 @@
一一帼捨芀㴁@shenjack
一一幂掏僀㴁@shenjack
一一幆纍汀㴁@shenjack
一一幊喿桀㴁@shenjack
一一幍怺榀㴁@shenjack
一一嶏悋榀㴁@shenjack
一一嶢繚简㴁@shenjack
一一嶨夘崀㴁@shenjack
一一嶮扪嘀㴁@shenjack
一一嶽媃恀㴁@shenjack
一一巂又渀㴁@shenjack
一一巜攝甀㴁@shenjack
一一州洹蘀㴁@shenjack
一一巡摊畀㴁@shenjack
一一巤固嬀㴁@shenjack
一一差梢焀㴁@shenjack
一一师唒贀㴁@shenjack
一一師丄欀㴁@shenjack
一一常桙瘀㴁@shenjack
一一帹犼籀㴁@shenjack
一一寔缣荀㴁@shenjack
一一寵褐撀㴁@shenjack
一一将誟崀㴁@shenjack
一一尗蟛唀㴁@shenjack
一一尛梃狀㴁@shenjack
一一尡蕺櫀㴁@shenjack
一一尫吢礀㴁@shenjack
一一尭聟砀㴁@shenjack
一一尳跲往㴁@shenjack
一一尴獼简㴁@shenjack
一一尺哧掀㴁@shenjack
一一屇伂瞀㴁@shenjack
一一屌赪婀㴁@shenjack
一一屬帽碀㴁@shenjack
一一山婊灀㴁@shenjack
一一屶待綀㴁@shenjack
一一屷硥哀㴁@shenjack
一一岔简腀㴁@shenjack
一一岘繰焀㴁@shenjack
一一岡諭蠀㴁@shenjack
一一岢滂噀㴁@shenjack
一一岰焇椀㴁@shenjack
一一峈皝諀㴁@shenjack
一一峋曯甀㴁@shenjack
一一峫肿殀㴁@shenjack
一一峳胯矀㴁@shenjack
一一崀蘈最㴁@shenjack
一一崄壁噀㴁@shenjack
一一崋怍摀㴁@shenjack
一一崍坭傀㴁@shenjack
一一崓燲擀㴁@shenjack
一一崙咈枀㴁@shenjack
一一崥緂嵀㴁@shenjack
一一崨亰开㴁@shenjack
一一崸哩汀㴁@shenjack
一一嵀蠆蓀㴁@shenjack
一一嵇濗絀㴁@shenjack
一一嵊蘖蟀㴁@shenjack
一一嵓矶穀㴁@shenjack
一一嵥艝蕀㴁@shenjack
一一嵿疷翀㴁@shenjack
一一冠熑薀㴁@shenjack
一一冩囥笀㴁@shenjack
一一冹料姀㴁@shenjack
一一冾尲孀㴁@shenjack
一一凉枴瘀㴁@shenjack
一一凐圧叀㴁@shenjack
一一凔篎涀㴁@shenjack
一一凛噖薀㴁@shenjack
一一凝伋翀㴁@shenjack
一一凟杠儀㴁@shenjack
一一几撄喀㴁@shenjack
一一凣纭眀㴁@shenjack
一一凭摩枀㴁@shenjack
一一凬深袀㴁@shenjack
一一凷翊荀㴁@shenjack
一一刊晧蟀㴁@shenjack
一一刌衩榀㴁@shenjack
一一刓猾劀㴁@shenjack
一一划彃拀㴁@shenjack
一一刘糟澀㴁@shenjack
一一刜絡漀㴁@shenjack
一一判泭址㴁@shenjack
一一刣湁憀㴁@shenjack
一一刲媯噀㴁@shenjack
一一刷縧噀㴁@shenjack
一一剅泺绀㴁@shenjack
一一剕荦縀㴁@shenjack
一一剠腲庀㴁@shenjack
一一剥袸節㴁@shenjack
一一剫沇蔀㴁@shenjack
一一剭猩血㴁@shenjack
一一剸叾开㴁@shenjack
一一剸唈秀㴁@shenjack
一一劇焓址㴁@shenjack
一一劍暶殀㴁@shenjack
一一劌敻璀㴁@shenjack
一一办贰灀㴁@shenjack
一一劦武椀㴁@shenjack
一一劧季栀㴁@shenjack
一一励襦耀㴁@shenjack
一一勋眜泀㴁@shenjack
一一勜觼淀㴁@shenjack
一一勢娏蟀㴁@shenjack
一一勤苑艀㴁@shenjack
一一勫苞區㴁@shenjack
一一勨嵾貀㴁@shenjack
一一勰賙姀㴁@shenjack
一一勹瀛什㴁@shenjack
一一勴妟岀㴁@shenjack
一一勵螐帀㴁@shenjack
一一匊艽甀㴁@shenjack
一一匔瞩侀㴁@shenjack
一一匠幬囀㴁@shenjack
一一匩尠歀㴁@shenjack
一一卋櫻襀㴁@shenjack
一一単唶廀㴁@shenjack
一一卡苺猀㴁@shenjack
一一卩剱血㴁@shenjack
一一卮犿猀㴁@shenjack
一一即牀儀㴁@shenjack
一一卸茱慀㴁@shenjack
一一压杊氀㴁@shenjack
一一厞淦最㴁@shenjack
一一厜舯局㴁@shenjack
一一厜屩炀㴁@shenjack
一一厨脽慀㴁@shenjack
一一厷樟怀㴁@shenjack
一一叏卖摀㴁@shenjack
一一叉瘾曀㴁@shenjack
一一友竮蠀㴁@shenjack
一一变櫒瞀㴁@shenjack
一一叠祊晀㴁@shenjack
一一古并匀㴁@shenjack
一一叫愬梀㴁@shenjack
一一另噬曀㴁@shenjack
一一叮祓晀㴁@shenjack
一一叻萚址㴁@shenjack
一一吃尶貀㴁@shenjack
一一吇偠椀㴁@shenjack
一一吃炳塀㴁@shenjack
一一吓枆碀㴁@shenjack
一一吞膿岀㴁@shenjack
一一吡伸艀㴁@shenjack
一一吜堂嗀㴁@shenjack
一一吢泟冀㴁@shenjack
一一吷冡埀㴁@shenjack
一一吼读樀㴁@shenjack
一一吰綮檀㴁@shenjack
一一吱湟蘀㴁@shenjack
一一吼襰晀㴁@shenjack
一一告炐呀㴁@shenjack
一一呠毞埀㴁@shenjack
一一员蕘垀㴁@shenjack
一一呚蜶誀㴁@shenjack
一一呫姑烀㴁@shenjack
一一呫弿狀㴁@shenjack
一一呱侓忀㴁@shenjack
一一味帓樀㴁@shenjack
一一和藢繀㴁@shenjack
一一咛聮畀㴁@shenjack
一一咡氁磀㴁@shenjack
一一咱侚薀㴁@shenjack
一一咨游蒀㴁@shenjack
一一咬換曀㴁@shenjack
一一咭竳拀㴁@shenjack
一一咸刐谀㴁@shenjack
一一哀贆圀㴁@shenjack
一一咺甜曀㴁@shenjack
一一哔畿笀㴁@shenjack
一一哕秔儀㴁@shenjack
一一哑坃偀㴁@shenjack
一一哶毒磀㴁@shenjack
一一哨瑄搀㴁@shenjack
一一唂丣娀㴁@shenjack
一一唑汷狀㴁@shenjack
一一唒薬峀㴁@shenjack
一一唡橪侀㴁@shenjack
一一唪觜净㴁@shenjack
一一唹咤嵀㴁@shenjack
一一售祜娀㴁@shenjack
一一啤咷牀㴁@shenjack
一一啠烶劀㴁@shenjack
一一啫堁暀㴁@shenjack
一一喌戎區㴁@shenjack
一一啽圈懀㴁@shenjack
一一喐懻樀㴁@shenjack
一一喛稳蓀㴁@shenjack
一一喥岱劀㴁@shenjack
一一喧豫沀㴁@shenjack
一一喴懅一㴁@shenjack
一一喸膵开㴁@shenjack
一一喲猍刀㴁@shenjack
一一喵诀竀㴁@shenjack
一一喺呏瑀㴁@shenjack
一一嗌贆渀㴁@shenjack
一一嗓詐础㴁@shenjack
一一嗖壒覀㴁@shenjack
一一嗡磓檀㴁@shenjack
一一嗽槸囀㴁@shenjack
一一嗾庢蛀㴁@shenjack
一一嘎聋埀㴁@shenjack
一一嘤寢節㴁@shenjack
一一嘕婄蝀㴁@shenjack
一一嘭帘槀㴁@shenjack
一一嘦哛掀㴁@shenjack
一一噕嫽礀㴁@shenjack
一一噟緲检㴁@shenjack
一一噅犝柀㴁@shenjack
一一噳槅沀㴁@shenjack
一一噧纅技㴁@shenjack
一一噹贐謀㴁@shenjack
一一噼眒缀㴁@shenjack
一一噬崾悀㴁@shenjack
一一嚇蓅榀㴁@shenjack
一一噳厅豀㴁@shenjack
一一嚂穀竀㴁@shenjack
一一嚚圞着㴁@shenjack
一一嚠經瞀㴁@shenjack
一一嚓煌恀㴁@shenjack
一一嚞笡纀㴁@shenjack
一一嚟厑葀㴁@shenjack
一一嚢框峀㴁@shenjack
一一嚰稃皀㴁@shenjack
一一囋幙曀㴁@shenjack
一一囚讹诀㴁@shenjack
一一囌砽吀㴁@shenjack
一一囖覽往㴁@shenjack
一一図峩厀㴁@shenjack
一一圫茆绀㴁@shenjack
一一圜昻豀㴁@shenjack
一一圤呟崀㴁@shenjack
一一址荋潀㴁@shenjack
一一圮衹侀㴁@shenjack
一一场碓毀㴁@shenjack
一一坣慀趀㴁@shenjack
一一坜樁淀㴁@shenjack
一一坥壶囀㴁@shenjack
一一坺罪彀㴁@shenjack
一一坰葓嚀㴁@shenjack
一一垎蝛咀㴁@shenjack
一一垑栉熀㴁@shenjack
一一垚蛒昀㴁@shenjack
一一垉碝狀㴁@shenjack
一一垑漝珀㴁@shenjack
一一垕昙言㴁@shenjack
一一垣謸戀㴁@shenjack
一一埒稏夀㴁@shenjack
一一埉懀菀㴁@shenjack
一一埕昹娀㴁@shenjack
一一埥紋噀㴁@shenjack
一一埡盨彀㴁@shenjack
一一埫复暀㴁@shenjack
一一埓捰誀㴁@shenjack
一一埞底检㴁@shenjack
一一埛謊唀㴁@shenjack
一一堀蓣俀㴁@shenjack
一一堀浹尀㴁@shenjack
一一埫讋簀㴁@shenjack
一一埯蒆喀㴁@shenjack
一一埵疈秀㴁@shenjack
一一埲秏嬀㴁@shenjack
一一執嬁叀㴁@shenjack
一一堎螧猀㴁@shenjack
一一堆崥曀㴁@shenjack
一一堌棧杀㴁@shenjack
一一堳厩耀㴁@shenjack
一一堧傓捀㴁@shenjack
一一塄望烀㴁@shenjack
一一堷殇蒀㴁@shenjack
一一塒乛埀㴁@shenjack
一一塓櫋櫀㴁@shenjack
一一塖球夀㴁@shenjack
一一塞甲吀㴁@shenjack
一一塗俍嫀㴁@shenjack
一一塝砨嬀㴁@shenjack
一一塨渻綀㴁@shenjack
一一塭讬廀㴁@shenjack
一一塩衅罀㴁@shenjack
一一墥愕砀㴁@shenjack
一一墏涝嗀㴁@shenjack
一一墔檵櫀㴁@shenjack
一一墔珕艀㴁@shenjack
一一墠媒柀㴁@shenjack
一一墦豦恀㴁@shenjack
一一墭跀烀㴁@shenjack
一一墭蛤璀㴁@shenjack
一一壘潆蟀㴁@shenjack
一一壽盁璀㴁@shenjack
一一壻绩盀㴁@shenjack
一一壥晣检㴁@shenjack
一一处蒔寀㴁@shenjack
一一备緡塀㴁@shenjack
一一备庤搀㴁@shenjack
一一夎襡豀㴁@shenjack
一一夥疓栀㴁@shenjack
一一奁敺禀㴁@shenjack
一一夺玱歀㴁@shenjack
一一奃窒裀㴁@shenjack
一一夷窞兀㴁@shenjack
一一奔璓蜀㴁@shenjack
一一奌枷蕀㴁@shenjack
一一奦梉址㴁@shenjack
一一奝津妀㴁@shenjack
一一奺徨庀㴁@shenjack
一一妀翄倀㴁@shenjack
一一妆濿蛀㴁@shenjack
一一妆床庀㴁@shenjack
一一妢柑晀㴁@shenjack
一一妉暫蓀㴁@shenjack
一一妨窌窀㴁@shenjack
一一妕勏栀㴁@shenjack
一一妗谻囀㴁@shenjack
一一姄紼簀㴁@shenjack
一一妱塼榀㴁@shenjack
一一妺硤墀㴁@shenjack
一一妴葅璀㴁@shenjack
一一妾嵝貀㴁@shenjack
一一委袳埀㴁@shenjack
一一姇嫌貀㴁@shenjack
一一姐偬宀㴁@shenjack
一一姓烹袀㴁@shenjack
一一姱溏蜀㴁@shenjack
一一姮虛橀㴁@shenjack
一一娘哫叀㴁@shenjack
一一娢谳瀀㴁@shenjack
一一娍籟纀㴁@shenjack
一一娌茮杀㴁@shenjack
一一娵嬋一㴁@shenjack
一一娪殰珀㴁@shenjack
一一娡秞旀㴁@shenjack
一一娾盰薀㴁@shenjack
一一娫劍絀㴁@shenjack
一一婈枻蘀㴁@shenjack
一一婝蝞漀㴁@shenjack
一一婥杓吀㴁@shenjack
一一婼扣偀㴁@shenjack
一一媈槦樀㴁@shenjack
一一媕襹擀㴁@shenjack
一一媛怅胀㴁@shenjack
一一嫓慺褀㴁@shenjack
一一媹舨満㴁@shenjack
一一嫋赖諀㴁@shenjack
一一嫃衄漀㴁@shenjack
一一嫘围奀㴁@shenjack
一一嫝焖苀㴁@shenjack
一一嫶甌楀㴁@shenjack
一一嬎劄肀㴁@shenjack
一一嬋畘筀㴁@shenjack
一一嬡墲媀㴁@shenjack
一一嬩垄旀㴁@shenjack
一一嬴盉區㴁@shenjack
一一嬻嵕皀㴁@shenjack
一一嬷禺血㴁@shenjack
一一嬿历祀㴁@shenjack
一一孞扌區㴁@shenjack
一一孽教猀㴁@shenjack
一一守倠犀㴁@shenjack
一一宔羁臀㴁@shenjack
一一宷缶技㴁@shenjack
一一宦櫰开㴁@shenjack
一一宮琘葀㴁@shenjack
一一宝千痀㴁@shenjack
一一宭同泀㴁@shenjack
一一宻碤忀㴁@shenjack
一一宩员翀㴁@shenjack
一一家庚刀㴁@shenjack
一一宴眾堀㴁@shenjack
一一寔缣荀㴁@shenjack
一一作固嶀㴁@shenjack
一一佧掺蛀㴁@shenjack
一一佷瑞艀㴁@shenjack
一一佺盀裀㴁@shenjack
一一侄廳帀㴁@shenjack
一一侏兜璀㴁@shenjack
一一侜嫰痀㴁@shenjack
一一侮佀絀㴁@shenjack
一一促幹啀㴁@shenjack
一一促悮熀㴁@shenjack
一一俍哚佀㴁@shenjack
一一俍篱竀㴁@shenjack
一一俕甒绀㴁@shenjack
一一俤琄琀㴁@shenjack
一一俻僝甀㴁@shenjack
一一俻貒最㴁@shenjack
一一俽訑澀㴁@shenjack
一一倅毫宀㴁@shenjack
一一倇巼晀㴁@shenjack
一一倆潒埀㴁@shenjack
一一倐缥蔀㴁@shenjack
一一倚蒏圀㴁@shenjack
一一借睬曀㴁@shenjack
一一倞緻塀㴁@shenjack
一一倦衭詀㴁@shenjack
一一倴媩桀㴁@shenjack
一一偉槏穀㴁@shenjack
一一偐禢曀㴁@shenjack
一一偖榿毀㴁@shenjack
一一偞秾啀㴁@shenjack
一一偷變袀㴁@shenjack
一一偻瘴咀㴁@shenjack
一一傌賙粀㴁@shenjack
一一傒疁挀㴁@shenjack
一一傖仡腀㴁@shenjack
一一傟筶厀㴁@shenjack
一一傞僩讀㴁@shenjack
一一傠簍昀㴁@shenjack
一一傟悰觀㴁@shenjack
一一傤箚晀㴁@shenjack
一一傲寢誀㴁@shenjack
一一傳房菀㴁@shenjack
一一傻耚嚀㴁@shenjack
一一僄河妀㴁@shenjack
一一僅杈蘀㴁@shenjack
一一僈悂猀㴁@shenjack
一一僚大簀㴁@shenjack
一一僦蟸燀㴁@shenjack
一一僿紦譀㴁@shenjack
一一儅虎唀㴁@shenjack
一一儔哑聀㴁@shenjack
一一償审穀㴁@shenjack
一一儡环氀㴁@shenjack
一一儨耫诀㴁@shenjack
一一儽箈厀㴁@shenjack
一一允杳媀㴁@shenjack
一一儾弖敀㴁@shenjack
一一兤界晀㴁@shenjack
一一兢甫詀㴁@shenjack
一一公婕痀㴁@shenjack
一一六嵚庀㴁@shenjack
一一兴昛叀㴁@shenjack
一一丁皋儀㴁@shenjack
一一三欮怀㴁@shenjack
一一丕忍眀㴁@shenjack
一一丞摊侀㴁@shenjack
一一丟巷圀㴁@shenjack
一一串翂翀㴁@shenjack
一一丸煵慀㴁@shenjack
一一主儈諀㴁@shenjack
一一丼澜砀㴁@shenjack
一一丽窖蠀㴁@shenjack
一一乂耎蕀㴁@shenjack
一一乃抮薀㴁@shenjack
一一乏狗槀㴁@shenjack
一一乛犷羀㴁@shenjack
一一习晙裀㴁@shenjack
一一乥亐藀㴁@shenjack
一一乹覕瀀㴁@shenjack
一一亘愠矀㴁@shenjack
一一亥筻瀀㴁@shenjack
一一亦耫搀㴁@shenjack
一一产幽汀㴁@shenjack
一一亭虜冀㴁@shenjack
一一亼瑗曀㴁@shenjack
一一仂莳所㴁@shenjack
一一仇栟幀㴁@shenjack
一一仐晇蟀㴁@shenjack
一一仙埙満㴁@shenjack
一一仚择址㴁@shenjack
一一仟椐煀㴁@shenjack
一一仠橻縀㴁@shenjack
一一仵烁楀㴁@shenjack
一一仹咤哀㴁@shenjack
一一伄煃稀㴁@shenjack
一一伊匃净㴁@shenjack
一一伎濊蜀㴁@shenjack
一一休慛橀㴁@shenjack
一一伛娸庀㴁@shenjack
一一伛詀區㴁@shenjack
一一伣乷恀㴁@shenjack
一一伮圑湀㴁@shenjack
一一估渔痀㴁@shenjack
一一伲沈傀㴁@shenjack
一一伺磪莀㴁@shenjack
一一伾爱覀㴁@shenjack
一一伾窻玀㴁@shenjack

3279
node_run/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

11
node_run/package.json Normal file
View File

@ -0,0 +1,11 @@
{
"dependencies": {
"canvas": "^2.11.2",
"chalk": "^4.1.2",
"express": "^4.18.3",
"jsdom": "^16.7.0",
"lowdb": "^1.0.0",
"uuid": "^8.3.2",
"ws": "^7.5.9"
}
}

1299
node_run/pnpm-lock.yaml generated Normal file

File diff suppressed because it is too large Load Diff

14
node_run/readme.md Normal file
View File

@ -0,0 +1,14 @@
# 基于 Node js 的模拟器
## 使用
`pnpm i`
修改 `input.txt`
`node index.js`
## 注意事项
记得清理 `data.json`

311
node_run/static/md5.css Normal file

File diff suppressed because one or more lines are too long

196
node_run/static/md5.html Normal file
View File

@ -0,0 +1,196 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<style></style>
<link rel="stylesheet" href="md5.css">
<script>
var r = `{
"recover": "[1]回复体力[2]点",
"sklAbsorb": "[0]#吸血攻击",
"sklAccumulate": "[0]#聚气",
"sklAccumulated": "[1]攻击力上升",
"sklAccumulateCancel": "[1]的[聚气]被打消了",
"sklAssassinate1": "[0]#潜行",
"sklAssassinate2": "[0]#背刺",
"dodge": "[0]#回避",
"sklAssassinateFailed": "[0]的[潜行]被识破",
"sklBerserkEnd": "[1]从[狂暴]中解除",
"sklBerserkAttack": "[0]#狂暴攻击",
"sklBerserkHit": "[1]#狂暴",
"sklBerserk": "[0]#狂暴术",
"sklCharge": "[0]#蓄力",
"sklChargeCancel": "[1]的[蓄力]被中止了",
"sklCharmEnd": "[1]从[魅惑]中解除",
"sklCharm": "[0]#魅惑",
"sklCharmHit": "[1]被[魅惑]了",
"sklClone": "[0]#分身",
"sklCloned": "出现一个新的[1]",
"sklCritical": "[0]#会心一击",
"sklCurseDamage": "[诅咒]使伤害加倍",
"sklCurseEnd": "[1]从[诅咒]中解除",
"sklCurseHit": "[1]被[诅咒]了",
"sklCurse": "[0]#诅咒",
"sklDisperse": "[0]#净化",
"sklExchange": "[0]#生命之轮",
"sklExchanged": "[1]的体力值与[0]互换",
"sklFire": "[0]#火球术",
"sklHalf": "[0]#瘟疫",
"sklHalfDamage": "[1]体力减少[2]%",
"sklHasteEnd": "[1]从[疾走]中解除",
"sklHaste": "[0]#加速术",
"sklHasteHit": "[1]#疾走",
"sklHeal": "[0]#治愈魔法",
"sklIceEnd": "[1]从[冰冻]中解除",
"sklIceHit": "[1]被[冰冻]了",
"sklIce": "[0]#冰冻术",
"sklIron": "[0]#铁壁",
"sklIrond": "[0]防御力大幅上升",
"sklIronCancel": "[1]的[铁壁]被打消了",
"sklIronEnd": "[0]从[铁壁]中解除",
"sklPoisonDamage": "[1][毒性发作]",
"sklPoisonEnd": "[1]从[中毒]中解除",
"sklPoisonHit": "[1][中毒]",
"sklPoison": "[0]#投毒",
"sklQuake": "[0]#地裂术",
"SklRapid": "[0]发起攻击",
"SklRapidNext": "[0]#连击",
"sklRevive": "[0]#苏生术",
"sklRevived": "[1][复活]了",
"sklPossess": "[0]#附体",
"sklShadow": "[0]#幻术",
"sklShadowName": "幻影",
"sklShadowed": "召唤出[1]",
"sklSlowEnd": "[1]从[迟缓]中解除",
"sklSlow": "[0]#减速术",
"sklSlowHit": "[1]#迟缓",
"sklExplode": "[0]#自爆",
"sklSummon": "[0]#血祭",
"sklSummonName": "使魔",
"sklSummoned": "召唤出[1]",
"sklThunder": "[0]#雷击术",
"sklThunderEnd": "[0][回避]了攻击",
"benchmarking": "实力评估中...[2]%",
"benchmarkRatio": "》 胜率: [2]%",
"benchmarkScore": "》 实力评分: [2]",
"benchmarkSkill": "频率: [2]%",
"searchInvalid": "错误目前最多支持8000人搜索",
"searchStart": "搜索开始...",
"searchEnd": "搜索结束",
"searchFailed": "但是一无所获",
"bossName_aokiji": "青雉",
"sklAokijiDefend": "[0][吸收]所有冰冻伤害",
"sklAokijiIceAge": "[0]#冰河时代",
"bossName_conan": "柯南",
"sklConanKillUnknown": "[0]在一间密室中发现了一具无名尸体",
"sklConanThinking": "[0]正在进行推理",
"sklConanThinkingFinish": "[0]推理完毕",
"sklConanThinkingFinish2": "真相只有一个",
"sklConanThinkingFinish3": "凶手就是你",
"sklConanKillLast": "[1]",
"sklConanKill": "[0]在一间密室中发现了[1]的尸体",
"bossName_covid": "新冠病毒",
"sklCovidDamage": "[1][肺炎]发作",
"sklCovidICU": "[1]在重症监护室无法行动",
"sklCovidStayHome": "[1]在家中自我隔离",
"sklCovidInfect": "[0]和[1]近距离接触",
"sklCovidPrevent": "但[1]没被感染",
"sklAttack": "[0]发起攻击",
"sklCovidMutate": "[1]所感染的病毒发生变异",
"sklCovidHit": "[1]感染了[新冠病毒]",
"bossName_ikaruga": "斑鸠",
"sklIkarugaDefend": "[0][吸收]所有奇数伤害",
"sklIkarugaAttack": "[0]#能量释放",
"bossName_lazy": "懒癌",
"sklLazyDamage": "[1][懒癌]发作",
"sklLazySkipTurn1": "[0]打开了[Steam]",
"sklLazySkipTurn2": "[0]打开了[守望先锋]",
"sklLazySkipTurn3": "[0]打开了[文明6]",
"sklLazySkipTurn4": "[0]打开了[英雄联盟]",
"sklLazySkipTurn5": "[0]打开了[微博]",
"sklLazySkipTurn6": "[0]打开了[朋友圈]",
"sklLazySkipTurn0": "这回合什么也没做",
"sklLazyHit": "[1]感染了[懒癌]",
"bossName_mario": "马里奥",
"bossMarioGrow10": "[0]得到[蘑菇]",
"bossMarioGrow11": "[0]攻击力上升",
"bossMarioGrow20": "[0]得到[火焰花]",
"bossMarioGrow21": "[0]学会[火球术]",
"bossMarioGrow30": "[0]得到[奖命蘑菇]",
"bossMarioLife": "[0]还剩[2]条命",
"bossMarioRevive": "[0]满血复活",
"bossName_mosquito": "蚊",
"bossName_saitama": "一拳超人",
"saitamaHungry": "[0]觉得有点饿",
"saitamaLeave": "[0]离开了战场",
"bossName_slime": "史莱姆",
"sklSlimeSpawn": "[0][分裂]",
"sklSlimeSpawned": "分成了[0] 和 [1]",
"bossName_sonic": "索尼克",
"bossName_yuri": "尤里",
"sklYuriControl": "[0]#心灵控制",
"endMessage": "你已经玩了[0]局了",
"continueGame": "继续游戏",
"navigationLink": "navigation.html",
"errorMaxPlayer": "错误目前最多支持1000人PK",
"errorMinPlayer": "错误,请至少输入两行名字",
"welcome": "名字竞技场",
"welcome2": "(MD5大作战10周年纪念)",
"winnerName": "胜者",
"score": "得分",
"killedCount": "击杀",
"killerName": "致命一击",
"loserName": "败者",
"returnTitle": "返回",
"shareTitle": "分享",
"helpTitle": "帮助",
"HP": "HP",
"detail": " 攻 [] 防 [] 速 [] 敏 [] 魔 [] 抗 [] 智 []",
"inputTitle": "名字竞技场",
"inputPlaceholder": "每行输入一个名字 \\n \\n组队对战时用空行隔开组队",
"startFight": "开 始",
"closeTitle": "关闭",
"fastTitle": "快进",
"challengeLabel": "挑战Boss",
"selectBossHint": "选择Boss",
"win": "[2]获得胜利",
"minionDie": "[1]消失了",
"damage": "[1]受到[2]点伤害",
"die": "[1]被击倒了",
"sklMagicAttack": "[0]发起攻击",
"sklCounter": "[0]#反击",
"defend": "[0]#防御",
"sklHide": "[0]#隐匿",
"sklMerge": "[0]#吞噬",
"sklMerged": "[0]属性上升",
"sklProtect": "[0]#守护",
"sklReflect": "[0]#伤害反弹",
"sklReraise": "[0]#护身符",
"sklUpgrade": "[0]#垂死",
"sklUpgraded": "[0]所有属性上升",
"sklUpgradeCancel": "[1]的[垂死]属性被打消",
"sklZombieName": "丧尸",
"sklZombie": "[0]#召唤亡灵",
"sklZombied": "[2]变成了[1]",
"weaponDeathNoteAtk": "[0]在[死亡笔记]写下[1]的名字",
"weaponRModifierUse": "[0]#属性修改器",
"weaponS11_0": "[0]在促销日[购买]了武器",
"weaponS11_1": "但是并没有什么用",
"weaponS11_2": "增加了[2]点",
"weaponS11Done1": "[0]信用卡刷爆",
"weaponS11Done3": "[0]砍下了自己的左手",
"weaponS11Done2": "[0]砍下了自己的右手"
}`;
</script>
</head>
<body>
<div class="main" id="md5">
<div class="plist"></div>
<div class="pbody"></div>
</div>
<script src="md5.js"></script>
</body>
</html>

20592
node_run/static/md5.js Normal file

File diff suppressed because one or more lines are too long