心 态 爆 炸
This commit is contained in:
parent
0b23379efd
commit
837806f9cb
@ -589,11 +589,7 @@
|
|||||||
if (customlanpos > 0) {
|
if (customlanpos > 0) {
|
||||||
lanfile = decodeURIComponent(window.location.search.substring(customlanpos + 2));
|
lanfile = decodeURIComponent(window.location.search.substring(customlanpos + 2));
|
||||||
}
|
}
|
||||||
// for (let key in ls) {
|
|
||||||
// if (key.indexOf('e_e') === 6 && ls[key].length % 100 === 0) {
|
|
||||||
// adfile = '.' + adfile;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
reqO = new XMLHttpRequest();
|
reqO = new XMLHttpRequest();
|
||||||
reqO.open("GET", adfile);
|
reqO.open("GET", adfile);
|
||||||
reqO.send();
|
reqO.send();
|
||||||
@ -632,7 +628,6 @@
|
|||||||
<!-- 左上角一个用于标记版本号的 div, 默认状况下不显示, 部署时使用脚本替换内容, 颜色同理 -->
|
<!-- 左上角一个用于标记版本号的 div, 默认状况下不显示, 部署时使用脚本替换内容, 颜色同理 -->
|
||||||
<img src="thumb.jpg" width="0" height="0" />
|
<img src="thumb.jpg" width="0" height="0" />
|
||||||
<div class='ad_h'></div>
|
<div class='ad_h'></div>
|
||||||
<div class='ad_v'></div>
|
|
||||||
<div class='body'>
|
<div class='body'>
|
||||||
<iframe src='md5.html' class='mdframe'></iframe>
|
<iframe src='md5.html' class='mdframe'></iframe>
|
||||||
<div class="panels">
|
<div class="panels">
|
||||||
|
@ -589,11 +589,6 @@
|
|||||||
if (customlanpos > 0) {
|
if (customlanpos > 0) {
|
||||||
lanfile = decodeURIComponent(window.location.search.substring(customlanpos + 2));
|
lanfile = decodeURIComponent(window.location.search.substring(customlanpos + 2));
|
||||||
}
|
}
|
||||||
// for (let key in ls) {
|
|
||||||
// if (key.indexOf('e_e') === 6 && ls[key].length % 100 === 0) {
|
|
||||||
// adfile = '.' + adfile;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
reqO = new XMLHttpRequest();
|
reqO = new XMLHttpRequest();
|
||||||
reqO.open("GET", adfile);
|
reqO.open("GET", adfile);
|
||||||
reqO.send();
|
reqO.send();
|
||||||
@ -632,7 +627,6 @@
|
|||||||
<!-- 左上角一个用于标记版本号的 div, 默认状况下不显示, 部署时使用脚本替换内容, 颜色同理 -->
|
<!-- 左上角一个用于标记版本号的 div, 默认状况下不显示, 部署时使用脚本替换内容, 颜色同理 -->
|
||||||
<img src="thumb.jpg" width="0" height="0" />
|
<img src="thumb.jpg" width="0" height="0" />
|
||||||
<div class='ad_h'></div>
|
<div class='ad_h'></div>
|
||||||
<div class='ad_v'></div>
|
|
||||||
<div class='body'>
|
<div class='body'>
|
||||||
<iframe src='md5.html' class='mdframe'></iframe>
|
<iframe src='md5.html' class='mdframe'></iframe>
|
||||||
<div class="panels">
|
<div class="panels">
|
||||||
|
@ -134,7 +134,10 @@ async function score_callback(
|
|||||||
return await md5_module.score_callback(names, callback);
|
return await md5_module.score_callback(names, callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run_any(names: string, round: number): Promise<FightResult | WinRateResult | ScoreResult> {
|
async function run_any(
|
||||||
|
names: string,
|
||||||
|
round: number,
|
||||||
|
): Promise<FightResult | WinRateResult | ScoreResult> {
|
||||||
return await md5_module.run_any(names, round);
|
return await md5_module.run_any(names, round);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,59 +145,58 @@ const out_limit: number = 1000;
|
|||||||
|
|
||||||
async function wrap_any(names: string, round: number): Promise<string> {
|
async function wrap_any(names: string, round: number): Promise<string> {
|
||||||
const result = await run_any(names, round);
|
const result = await run_any(names, round);
|
||||||
if ('message' in result) {
|
if ("message" in result) {
|
||||||
// 对战结果
|
// 对战结果
|
||||||
return `赢家:|${result.source_plr}|`;
|
return `赢家:|${result.source_plr}|`;
|
||||||
} else if ('win_count' in result) {
|
}
|
||||||
|
if ("win_count" in result) {
|
||||||
// 胜率结果
|
// 胜率结果
|
||||||
const win_rate = result.win_count * 100 / round;
|
const win_rate = (result.win_count * 100) / round;
|
||||||
let win_rate_str = win_rate.toFixed(4);
|
const win_rate_str = win_rate.toFixed(4);
|
||||||
let output_str = `最终胜率:|${win_rate_str}%|(${round}轮)`;
|
let output_str = `最终胜率:|${win_rate_str}%|(${round}轮)`;
|
||||||
// 每 500 轮, 输出一次
|
// 每 500 轮, 输出一次
|
||||||
if (round > out_limit) {
|
if (round > out_limit) {
|
||||||
// 把所有要找的数据拿出来
|
// 把所有要找的数据拿出来
|
||||||
let output_datas: WinRate[] = [];
|
const output_datas: WinRate[] = [];
|
||||||
result.raw_data.forEach((data, index) => {
|
result.raw_data.forEach((data, index) => {
|
||||||
if (data.round % out_limit === 0) {
|
if (data.round % out_limit === 0) {
|
||||||
output_datas.push(data);
|
output_datas.push(data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
output_datas.forEach((data, index) => {
|
output_datas.forEach((data, index) => {
|
||||||
const win_rate = data.win_count * 100 / data.round;
|
const win_rate = (data.win_count * 100) / data.round;
|
||||||
output_str += `\n${win_rate.toFixed(2)}%(${data.round})`;
|
output_str += `\n${win_rate.toFixed(2)}%(${data.round})`;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return output_str;
|
return output_str;
|
||||||
// } else if ('score' in result) {
|
}
|
||||||
} else {
|
|
||||||
// 分数结果其实还是个胜率, 不过需要 * 100
|
// 分数结果其实还是个胜率, 不过需要 * 100
|
||||||
const win_rate = (result.score * 10000 / round).toFixed(2);
|
const win_rate = ((result.score * 10000) / round).toFixed(2);
|
||||||
let output_str = `分数:|${win_rate}|(${round}轮)`;
|
let output_str = `分数:|${win_rate}|(${round}轮)`;
|
||||||
if (round > out_limit) {
|
if (round > out_limit) {
|
||||||
// 把所有要找的数据拿出来
|
// 把所有要找的数据拿出来
|
||||||
let output_datas: Score[] = [];
|
const output_datas: Score[] = [];
|
||||||
result.raw_data.forEach((data, index) => {
|
result.raw_data.forEach((data, index) => {
|
||||||
if (data.round % out_limit === 0) {
|
if (data.round % out_limit === 0) {
|
||||||
output_datas.push(data);
|
output_datas.push(data);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
output_datas.forEach((data, index) => {
|
output_datas.forEach((data, index) => {
|
||||||
const win_rate = (data.score / data.round * 10000).toFixed(2);
|
const win_rate = ((data.score / data.round) * 10000).toFixed(2);
|
||||||
output_str += `\n${win_rate}(${data.round})`;
|
output_str += `\n${win_rate}(${data.round})`;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
return output_str;
|
return output_str;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
export {
|
export {
|
||||||
FightResult,
|
type FightResult,
|
||||||
WinRate,
|
type WinRate,
|
||||||
WinRateResult,
|
type WinRateResult,
|
||||||
WinRateCallback,
|
type WinRateCallback,
|
||||||
Score,
|
type Score,
|
||||||
ScoreResult,
|
type ScoreResult,
|
||||||
ScoreCallback,
|
type ScoreCallback,
|
||||||
fight,
|
fight,
|
||||||
win_rate,
|
win_rate,
|
||||||
win_rate_callback,
|
win_rate_callback,
|
||||||
|
@ -43,7 +43,7 @@ async function test() {
|
|||||||
if (result.source_plr === profile.winner) {
|
if (result.source_plr === profile.winner) {
|
||||||
console.log("pass");
|
console.log("pass");
|
||||||
} else {
|
} else {
|
||||||
throw new Error("fail" + result.source_plr + " " + profile.winner + " " + profile.test);
|
throw new Error(`fail${result.source_plr} ${profile.winner} ${profile.test}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const profile of test_profiles.win_chance) {
|
for (const profile of test_profiles.win_chance) {
|
||||||
@ -56,14 +56,14 @@ async function test() {
|
|||||||
if (rate === profile.round_10) {
|
if (rate === profile.round_10) {
|
||||||
console.log("pass");
|
console.log("pass");
|
||||||
} else {
|
} else {
|
||||||
throw new Error("fail" + rate + " " + profile.round_10);
|
throw new Error(`fail${rate} ${profile.round_10}`);
|
||||||
}
|
}
|
||||||
} else if (data.round === 100 * 100) {
|
} else if (data.round === 100 * 100) {
|
||||||
const rate = data.win_count / data.round;
|
const rate = data.win_count / data.round;
|
||||||
if (rate === profile.round_100) {
|
if (rate === profile.round_100) {
|
||||||
console.log("pass");
|
console.log("pass");
|
||||||
} else {
|
} else {
|
||||||
throw new Error("fail" + rate + " " + profile.round_100);
|
throw new Error(`fail${rate} ${profile.round_100}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,13 +77,13 @@ async function test() {
|
|||||||
if (data.score * 10 === profile.round_10) {
|
if (data.score * 10 === profile.round_10) {
|
||||||
console.log("pass");
|
console.log("pass");
|
||||||
} else {
|
} else {
|
||||||
throw new Error("fail" + data.score + " " + profile.round_10);
|
throw new Error(`fail${data.score} ${profile.round_10}`);
|
||||||
}
|
}
|
||||||
} else if (data.round === 100 * 100) {
|
} else if (data.round === 100 * 100) {
|
||||||
if (data.score === profile.round_100) {
|
if (data.score === profile.round_100) {
|
||||||
console.log("pass");
|
console.log("pass");
|
||||||
} else {
|
} else {
|
||||||
throw new Error("fail" + data.score + " " + profile.round_100);
|
throw new Error(`fail${data.score} ${profile.round_100}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -591,11 +591,7 @@
|
|||||||
if (customlanpos > 0) {
|
if (customlanpos > 0) {
|
||||||
lanfile = decodeURIComponent(window.location.search.substring(customlanpos + 2));
|
lanfile = decodeURIComponent(window.location.search.substring(customlanpos + 2));
|
||||||
}
|
}
|
||||||
// for (let key in ls) {
|
|
||||||
// if (key.indexOf('e_e') === 6 && ls[key].length % 100 === 0) {
|
|
||||||
// adfile = '.' + adfile;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
reqO = new XMLHttpRequest();
|
reqO = new XMLHttpRequest();
|
||||||
reqO.open("GET", adfile);
|
reqO.open("GET", adfile);
|
||||||
reqO.send();
|
reqO.send();
|
||||||
@ -634,7 +630,6 @@
|
|||||||
<!-- 左上角一个用于标记版本号的 div, 默认状况下不显示, 部署时使用脚本替换内容, 颜色同理 -->
|
<!-- 左上角一个用于标记版本号的 div, 默认状况下不显示, 部署时使用脚本替换内容, 颜色同理 -->
|
||||||
<img src="thumb.jpg" width="0" height="0" />
|
<img src="thumb.jpg" width="0" height="0" />
|
||||||
<div class='ad_h'></div>
|
<div class='ad_h'></div>
|
||||||
<div class='ad_v'></div>
|
|
||||||
<div class='body'>
|
<div class='body'>
|
||||||
<iframe src='md5.html' class='mdframe'></iframe>
|
<iframe src='md5.html' class='mdframe'></iframe>
|
||||||
<div class="panels">
|
<div class="panels">
|
||||||
|
1
info/.gitignore
vendored
Normal file
1
info/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
book
|
6
info/book.toml
Normal file
6
info/book.toml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
[book]
|
||||||
|
authors = ["shenjack"]
|
||||||
|
language = "zh"
|
||||||
|
multilingual = false
|
||||||
|
src = "src"
|
||||||
|
title = "namerena"
|
4
info/src/SUMMARY.md
Normal file
4
info/src/SUMMARY.md
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
# 目录
|
||||||
|
|
||||||
|
- [介绍](./start.md)
|
||||||
|
- [开箱用法](./use.md)
|
34
info/src/start.md
Normal file
34
info/src/start.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# 介绍
|
||||||
|
|
||||||
|
欢迎来到 [fast-namerna](https://fast-namerena.pages.dev/), 一个由 shenjack 和 超导体元素 构建的 namerena 镜像 + 修改版
|
||||||
|
|
||||||
|
## 特性
|
||||||
|
|
||||||
|
- 基于 [deepmess.com/namerena](https://deepmess.com/namerena/) 的 namerena 版本构建
|
||||||
|
- 去除了所有的广告
|
||||||
|
- 有多种 (目前其实就两种) 特化分支
|
||||||
|
- 完全开源 [GitHub](https://github.com/shenjackyuanjie/fast-namerena)
|
||||||
|
|
||||||
|
## 分支
|
||||||
|
|
||||||
|
### main
|
||||||
|
|
||||||
|
- 最稳定的版本
|
||||||
|
- 保证能用
|
||||||
|
- 支持 DIY 功能
|
||||||
|
- 通过跳过 delay 来加速
|
||||||
|
|
||||||
|
### fight
|
||||||
|
|
||||||
|
- 通过去掉了 delay 来加速
|
||||||
|
- 只支持战斗加速
|
||||||
|
- 当然, 战斗加速也是最快的
|
||||||
|
- 不支持 DIY
|
||||||
|
- 不支持其他功能 (测号, 开箱)
|
||||||
|
|
||||||
|
### latest
|
||||||
|
|
||||||
|
- 最新的版本
|
||||||
|
- 有可能会出现问题
|
||||||
|
- 支持 DIY 功能
|
||||||
|
- 通过跳过 delay 来加速
|
12
info/src/use.md
Normal file
12
info/src/use.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# 开箱用法
|
||||||
|
|
||||||
|
## 需求
|
||||||
|
|
||||||
|
你需要:
|
||||||
|
|
||||||
|
- 你的脑子
|
||||||
|
- 你的手
|
||||||
|
- 你的电脑
|
||||||
|
- 安装好 nodejs/bun (bun 更好)
|
||||||
|
- 安装好 python (如果你需要写点脚本)
|
||||||
|
- 下载好所需要的
|
208
md5-api.ts
Normal file
208
md5-api.ts
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
const md5_module = require("./md5.js");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对战结果的数据结构
|
||||||
|
* 其实只有 source_plr 是有用的, 是赢家之一
|
||||||
|
*/
|
||||||
|
type FightResult = {
|
||||||
|
message: string;
|
||||||
|
source_plr: string;
|
||||||
|
target_plr: string;
|
||||||
|
affect: string | number;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 每一行具体的胜率结果
|
||||||
|
*/
|
||||||
|
type WinRate = {
|
||||||
|
round: number;
|
||||||
|
win_count: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 胜率的数据结构
|
||||||
|
*/
|
||||||
|
type WinRateResult = {
|
||||||
|
win_count: number;
|
||||||
|
raw_data: WinRate[];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于接收胜率的回调函数
|
||||||
|
* 返回一个 bool, true 表示继续, false 表示停止
|
||||||
|
*/
|
||||||
|
type WinRateCallback = (run_round: number, win_count: number) => boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分数的数据结构
|
||||||
|
*/
|
||||||
|
type Score = {
|
||||||
|
round: number;
|
||||||
|
score: number;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分数的数据结构
|
||||||
|
*/
|
||||||
|
type ScoreResult = {
|
||||||
|
score: number;
|
||||||
|
raw_data: Score[];
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用于接收分数的回调函数
|
||||||
|
* 返回一个 bool, true 表示继续, false 表示停止
|
||||||
|
*/
|
||||||
|
type ScoreCallback = (run_round: number, score: number) => boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param names 原始的输入框输入
|
||||||
|
* @returns 对战结果
|
||||||
|
*/
|
||||||
|
async function fight(names: string): Promise<FightResult> {
|
||||||
|
// 检查一下输入是否合法
|
||||||
|
// 比如里面有没有 !test!
|
||||||
|
if (names.indexOf("!test!") !== -1) {
|
||||||
|
throw new Error("你怎么在对战输入里加 !test!(恼)\n${names}");
|
||||||
|
}
|
||||||
|
return await md5_module.fight(names);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对于胜率/评分的输入检查
|
||||||
|
* @param names
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
function test_check(names: string): boolean {
|
||||||
|
const have_test = names.trim().startsWith("!test!");
|
||||||
|
|
||||||
|
return have_test;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测量胜率
|
||||||
|
* @param names 原始的输入框输入
|
||||||
|
* @param round 战斗的回合数
|
||||||
|
* @returns 胜率结果
|
||||||
|
*/
|
||||||
|
async function win_rate(names: string, round: number): Promise<WinRateResult> {
|
||||||
|
// 检查 round 是否合法
|
||||||
|
if (round <= 0) {
|
||||||
|
throw new Error("round 必须大于 0");
|
||||||
|
}
|
||||||
|
if (!test_check(names)) {
|
||||||
|
throw new Error("你怎么在胜率输入里丢了 !test!(恼)\n${names}");
|
||||||
|
}
|
||||||
|
return await md5_module.win_rate(names, round);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param names 原始的输入框输入
|
||||||
|
* @param callback 用于接收胜率的回调函数
|
||||||
|
* @returns 胜率结果
|
||||||
|
*/
|
||||||
|
async function win_rate_callback(
|
||||||
|
names: string,
|
||||||
|
callback: WinRateCallback,
|
||||||
|
): Promise<WinRateResult> {
|
||||||
|
if (!test_check(names)) {
|
||||||
|
throw new Error("你怎么在胜率输入里丢了 !test!(恼)\n${names}");
|
||||||
|
}
|
||||||
|
return await md5_module.win_rate_callback(names, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function score(names: string, round: number): Promise<ScoreResult> {
|
||||||
|
// 检查 round 是否合法
|
||||||
|
if (round <= 0) {
|
||||||
|
throw new Error("round 必须大于 0");
|
||||||
|
}
|
||||||
|
if (!test_check(names)) {
|
||||||
|
throw new Error("你怎么在分数输入里丢了 !test!(恼)\n${names}");
|
||||||
|
}
|
||||||
|
return await md5_module.score(names, round);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function score_callback(
|
||||||
|
names: string,
|
||||||
|
callback: ScoreCallback,
|
||||||
|
): Promise<ScoreResult> {
|
||||||
|
if (!test_check(names)) {
|
||||||
|
throw new Error("你怎么在分数输入里加 !test!(恼)\n${names}");
|
||||||
|
}
|
||||||
|
return await md5_module.score_callback(names, callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function run_any(
|
||||||
|
names: string,
|
||||||
|
round: number,
|
||||||
|
): Promise<FightResult | WinRateResult | ScoreResult> {
|
||||||
|
return await md5_module.run_any(names, round);
|
||||||
|
}
|
||||||
|
|
||||||
|
const out_limit: number = 1000;
|
||||||
|
|
||||||
|
async function wrap_any(names: string, round: number): Promise<string> {
|
||||||
|
const result = await run_any(names, round);
|
||||||
|
if ("message" in result) {
|
||||||
|
// 对战结果
|
||||||
|
return `赢家:|${result.source_plr}|`;
|
||||||
|
}
|
||||||
|
if ("win_count" in result) {
|
||||||
|
// 胜率结果
|
||||||
|
const win_rate = (result.win_count * 100) / round;
|
||||||
|
const win_rate_str = win_rate.toFixed(4);
|
||||||
|
let output_str = `最终胜率:|${win_rate_str}%|(${round}轮)`;
|
||||||
|
// 每 500 轮, 输出一次
|
||||||
|
if (round > out_limit) {
|
||||||
|
// 把所有要找的数据拿出来
|
||||||
|
const output_datas: WinRate[] = [];
|
||||||
|
result.raw_data.forEach((data, index) => {
|
||||||
|
if (data.round % out_limit === 0) {
|
||||||
|
output_datas.push(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
output_datas.forEach((data, index) => {
|
||||||
|
const win_rate = (data.win_count * 100) / data.round;
|
||||||
|
output_str += `\n${win_rate.toFixed(2)}%(${data.round})`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return output_str;
|
||||||
|
// } else if ('score' in result) {
|
||||||
|
}
|
||||||
|
// 分数结果其实还是个胜率, 不过需要 * 100
|
||||||
|
const win_rate = ((result.score * 10000) / round).toFixed(2);
|
||||||
|
let output_str = `分数:|${win_rate}|(${round}轮)`;
|
||||||
|
if (round > out_limit) {
|
||||||
|
// 把所有要找的数据拿出来
|
||||||
|
const output_datas: Score[] = [];
|
||||||
|
result.raw_data.forEach((data, index) => {
|
||||||
|
if (data.round % out_limit === 0) {
|
||||||
|
output_datas.push(data);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
output_datas.forEach((data, index) => {
|
||||||
|
const win_rate = ((data.score / data.round) * 10000).toFixed(2);
|
||||||
|
output_str += `\n${win_rate}(${data.round})`;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return output_str;
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
type FightResult,
|
||||||
|
type WinRate,
|
||||||
|
type WinRateResult,
|
||||||
|
type WinRateCallback,
|
||||||
|
type Score,
|
||||||
|
type ScoreResult,
|
||||||
|
type ScoreCallback,
|
||||||
|
fight,
|
||||||
|
win_rate,
|
||||||
|
win_rate_callback,
|
||||||
|
score,
|
||||||
|
score_callback,
|
||||||
|
run_any,
|
||||||
|
wrap_any,
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user