(function() {
const ac_prefix = 'ac_';
// 获取DOM元素 v20250714
const ac_getElement = (id) => document.getElementById(id);
let totalButtonClicks = 0;
let positiveProfitClicks = 0;
// 格式化时间显示(秒 → 分钟/小时)
function ac_formatTime(seconds) {
if (seconds < 60) {
return `${seconds.toFixed(1)}秒`;
}
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
if (minutes < 60) {
return `${minutes}分${remainingSeconds > 0 ? remainingSeconds.toFixed(1) + '秒' : ''}`;
}
const hours = Math.floor(minutes / 60);
const remainingMinutes = minutes % 60;
return `${hours}小时${remainingMinutes > 0 ? remainingMinutes + '分' : ''}`;
}
// 新增函数:计算实际动作次数
function calculateActualAttempts(baseAttempts, efficiencyRate) {
let actualAttempts = 0;
for (let i = 0; i < baseAttempts; i++) {
// 基础动作
actualAttempts += 1;
// 基础重复(效率≤100%部分)
if (efficiencyRate > 0) {
const baseChance = Math.min(efficiencyRate, 100) / 100;
if (Math.random() < baseChance) {
actualAttempts += 1;
}
// 额外重复(效率>100%部分)
if (efficiencyRate > 100) {
const extraChance = (efficiencyRate - 100) / 100;
if (Math.random() < extraChance) {
actualAttempts += 1;
}
}
}
}
return actualAttempts;
}
// 模拟炼金过程
function ac_simulateAlchemy() {
document.querySelectorAll('.output-allquantity').forEach(input => {
input.value = '0';
});
const simulateTimes = parseInt(ac_getElement('simulateTimes').value) || 0;
const efficiencyRate = parseInt(ac_getElement('efficiencyRate').value) || 0;
const successRate = parseInt(ac_getElement('successRate').value) || 0;
const baseTimePerTry = parseInt(ac_getElement('timePerTry').value) || 0;
// 验证输入
if (simulateTimes <= 0 || simulateTimes > 1000000) {
alert('请输入1-1000000之间的模拟次数');
return;
}
if (successRate < 0 || successRate > 100) {
alert('成功率必须在0-100之间');
return;
}
if (efficiencyRate < 0 || efficiencyRate > 200) {
alert('效率必须在0-200之间');
return;
}
// 获取产出物品信息
const outputRows = document.querySelectorAll('#outputItems tr');
const items = [];
let totalProbability = 0;
let maxValueItem = null;
let maxValue = 0;
outputRows.forEach(row => {
const probability = parseFloat(row.querySelector('.output-probability').value) || 0;
const itemName = row.querySelector('.output-item').value;
const price = parseInt(row.querySelector('.output-price').value) || 0;
const baseQuantity = parseInt(row.querySelector('.output-quantity').value) || 1;
items.push({
name: itemName,
probability,
price,
baseQuantity, // 单次掉落数量(output-quantity)
currentQuantity: 0, // 本次模拟的数量
total: 0
});
totalProbability += probability;
const itemValue = price * baseQuantity;
if (itemValue > maxValue) {
maxValue = itemValue;
maxValueItem = items[items.length - 1]; // 指向刚添加的item
}
});
// 验证概率总和
const roundedTotal = Math.round(totalProbability * 100) / 100;
if (roundedTotal !== 100) {
alert(`所有物品的概率总和必须为100%,当前为${totalProbability.toFixed(2)}%`);
return;
}
// 重置物品数量
items.forEach(item => {
item.quantity = 0;
item.total = 0;
});
// 开始模拟
const totalActions = calculateActualAttempts(simulateTimes, efficiencyRate);
const baseTotalTime = simulateTimes * baseTimePerTry;
const totalTime = baseTotalTime * (simulateTimes / totalActions);
let successCount = 0;
let totalAttempts = 0;
let highValueSuccess = 0;
for (let i = 0; i < simulateTimes; i++) {
totalAttempts++; // 无论成功与否,都算一次尝试
if (Math.random() * 100 < successRate) {
successCount++;
// 随机选择产出物品(保持不变)
let random = Math.random() * 100;
let accumulated = 0;
for (const item of items) {
accumulated += item.probability;
if (random <= accumulated) {
item.currentQuantity += item.baseQuantity;
item.total += item.price * item.baseQuantity;
// 新增:检查是否获得最高价值物品
if (item === maxValueItem) {
highValueSuccess++;
}
break;
}
}
}
}
const ac_allCostPerTry = parseFloat(ac_getElement('allcostPerTry').value) || 0;
const ac_catalystCost = parseFloat(ac_getElement('Catalyst').value) || 0;
// 计算期望利润
let expectedProfit = 0;
items.forEach(item => {
const expectedQuantity = (successRate / 100) * (item.probability / 100) * simulateTimes * item.baseQuantity;
expectedProfit += expectedQuantity * item.price;
});
const expectedCost = simulateTimes * ac_allCostPerTry - (simulateTimes * (1 - successRate / 100) * ac_catalystCost);
const expectedValue = expectedProfit - expectedCost;
// 计算标准差(需要计算方差)
let variance = 0;
items.forEach(item => {
const p = (successRate / 100) * (item.probability / 100);
const value = item.price * item.baseQuantity;
variance += p * (1 - p) * Math.pow(value, 2) * simulateTimes;
});
// 添加催化剂返还的方差(假设是固定返还)
const catalystVariance = (successRate / 100) * (1 - successRate / 100) * Math.pow(ac_catalystCost, 2) * simulateTimes;
variance += catalystVariance;
const stdDeviation = Math.sqrt(variance);
// 更新UI
ac_getElement('expectation').textContent = Math.round(expectedValue).toLocaleString();
ac_getElement('stdDeviation').textContent = Math.round(stdDeviation).toLocaleString();
// 更新UI显示物品数量
outputRows.forEach((row, index) => {
const item = items[index];
// 显示本次模拟结果
row.querySelector('.output-allquantity').value =
(parseInt(row.querySelector('.output-allquantity').value) || 0) + item.currentQuantity;
// 显示本次模拟的总价
row.querySelector('.output-total').value = item.total;
});
// 计算并显示结果
ac_getElement('timeCost').textContent = ac_formatTime(totalTime);
// 存储成功次数
if (!ac_getElement('successCount')) {
const hiddenInput = document.createElement('input');
hiddenInput.type = 'hidden';
hiddenInput.id = 'successCount';
document.body.appendChild(hiddenInput);
}
ac_getElement('successCount').value = successCount;
// 触发盈亏计算
ac_calculateProfit();
const profitText = ac_getElement('profitLoss').textContent.replace(/,/g, '');
const currentProfit = parseFloat(profitText) || 0;
// 更新统计
totalButtonClicks++;
if (currentProfit > 0) positiveProfitClicks++;
// 显示统计结果
ac_getElement('Besimulationsisk').textContent = `${positiveProfitClicks}|${totalButtonClicks}`;
ac_getElement('positivereturn').textContent = `${((positiveProfitClicks / totalButtonClicks) * 100).toFixed(2)}%`;
// 在
const actualSuccessRate = (successCount / simulateTimes) * 100;
const actualHighValueRate = (highValueSuccess / simulateTimes) * 100;
ac_getElement('ActualSuccessrate').textContent = `${actualSuccessRate.toFixed(2)}% | ${actualHighValueRate.toFixed(2)}%`;
// 同时更新消耗显示
const catalystConsumed = successCount;
ac_getElement('Consumable').textContent = `${successCount}|${totalAttempts}`;
// 计算变异系数(CV) = 标准差/期望值
let cv, riskLevel, riskClass;
if (expectedValue > 0) {
cv = stdDeviation / expectedValue;
if (cv < 1) {
riskLevel = "低风险";
riskClass = "profit";
} else if (cv < 2) {
riskLevel = "较高风险";
riskClass = "loss";
} else {
riskLevel = "高风险";
riskClass = "high-risk";
}
} else {
// 负期望值直接标记为极高风险
cv = Infinity;
riskLevel = "超高风险";
riskClass = "extreme-risk";
}
// 更新风险显示
const riskElement = ac_getElement('Risk');
riskElement.textContent = `${riskLevel} (CV: ${cv.toFixed(2)})`;
riskElement.className = 'result-value ' + riskClass;
}
// 模拟炼金过程2
// 模拟炼金过程2
function ac_simulateUntilTarget() {
// 重置输出数量
document.querySelectorAll('.output-allquantity').forEach(input => {
input.value = '0';
});
// 获取输入参数
const efficiencyRate = parseInt(ac_getElement('efficiencyRate').value) || 0;
const successRate = parseInt(ac_getElement('successRate').value) || 0;
const baseTimePerTry = parseInt(ac_getElement('timePerTry').value) || 0;
// 获取产出物品信息
const outputRows = document.querySelectorAll('#outputItems tr');
const items = [];
let totalProbability = 0;
let maxValueItem = null;
let maxValue = 0;
outputRows.forEach(row => {
const probability = parseFloat(row.querySelector('.output-probability').value) || 0;
const itemName = row.querySelector('.output-item').value;
const price = parseInt(row.querySelector('.output-price').value) || 0;
const baseQuantity = parseInt(row.querySelector('.output-quantity').value) || 1;
const item = {
name: itemName,
probability,
price,
baseQuantity,
currentQuantity: 0,
total: 0,
row: row
};
items.push(item);
totalProbability += probability;
// 找出价值最高的物品
const itemValue = price * baseQuantity;
if (itemValue > maxValue) {
maxValue = itemValue;
maxValueItem = item;
}
});
// 验证概率总和
const roundedTotal = Math.round(totalProbability * 100) / 100;
if (roundedTotal !== 100) {
alert(`所有物品的概率总和必须为100%,当前为${totalProbability.toFixed(2)}%`);
return;
}
// 开始模拟直到获得最高价值物品
let totalSuccess = 0; // 所有成功次数(包括非高价值)
let highValueSuccess = 0; // 仅高价值物品成功次数
let totalAttempts = 0; // 炼金动作次数(每次点击按钮算 1 次)
let gotMaxValueItem = false;
let totalTime = 0;
while (!gotMaxValueItem) {
totalAttempts++; // 每次循环代表 1 次基础炼金动作
if (Math.random() * 100 < successRate) {
totalSuccess++; // 成功次数+1
// 随机选择产出物品
let random = Math.random() * 100;
let accumulated = 0;
for (const item of items) {
accumulated += item.probability;
if (random <= accumulated) {
item.currentQuantity += item.baseQuantity;
item.total += item.price * item.baseQuantity;
// 检查是否获得最高价值物品
if (item === maxValueItem) {
highValueSuccess++;
gotMaxValueItem = true;
}
break;
}
}
}
}
// 效率系数 = 1 + (efficiencyRate / 100)
const efficiencyFactor = 1 + (efficiencyRate / 100);
totalTime = (totalAttempts * baseTimePerTry) / efficiencyFactor;
// 更新UI显示物品数量
items.forEach(item => {
item.row.querySelector('.output-allquantity').value = item.currentQuantity;
item.row.querySelector('.output-total').value = item.total;
});
// 计算成本(总炼金动作次数 * 物品价格 + 总成功次数 * 催化剂价格)
const itemPrice = parseFloat(ac_getElement('itemPrice').value) || 0;
const catalystPrice = parseFloat(ac_getElement('Catalyst').value) || 0;
const newTotalCost = totalAttempts * itemPrice + totalSuccess * catalystPrice;
// 计算产出物品总价
let totalOutputValue = 0;
items.forEach(item => {
totalOutputValue += item.total;
});
// 计算盈亏
const profitLoss = totalOutputValue - newTotalCost;
if (!ac_getElement('successCount')) {
const hiddenInput = document.createElement('input');
hiddenInput.type = 'hidden';
hiddenInput.id = 'successCount';
document.body.appendChild(hiddenInput);
}
// 更新UI显示
ac_getElement('timeCost').textContent = ac_formatTime(totalTime);
ac_getElement('successCount').value = highValueSuccess;
ac_getElement('Consumable').textContent = `${totalSuccess}|${totalAttempts}`;
ac_getElement('totalCost').textContent = newTotalCost.toLocaleString();
const profitElement = ac_getElement('profitLoss');
profitElement.textContent = profitLoss.toLocaleString();
profitElement.className = 'result-value ' + (profitLoss >= 0 ? 'profit' : 'loss');
// 计算利润率
let profitMargin = 0;
if (newTotalCost > 0) {
profitMargin = (profitLoss / newTotalCost) * 100;
}
const profitMarginElement = ac_getElement('profit_margin');
profitMarginElement.textContent = profitMargin.toFixed(2) + '%';
profitMarginElement.className = 'result-value ' + (profitMargin >= 0 ? 'profit' : 'loss');
// 显示两种成功率
const actualTotalSuccessRate = (totalSuccess / totalAttempts) * 100;
const actualHighValueRate = (highValueSuccess / totalAttempts) * 100;
ac_getElement('ActualSuccessrate').textContent =
` ${actualTotalSuccessRate.toFixed(2)}% | ${actualHighValueRate.toFixed(2)}%`;
}
// 模拟递归
function ac_simulateRecursiveAlchemy() {
// 重置所有数量
document.querySelectorAll('.output-allquantity').forEach(input => {
input.value = '0';
});
const simulateTimes = parseInt(ac_getElement('simulateTimes').value) || 0;
const efficiencyRate = parseInt(ac_getElement('efficiencyRate').value) || 0;
const successRate = parseInt(ac_getElement('successRate').value) || 0;
const baseTimePerTry = parseInt(ac_getElement('timePerTry').value) || 0;
const inputItemName = ac_getElement('alchemyitem').value;
// 验证输入
if (simulateTimes <= 0 || simulateTimes > 1000000) {
alert('请输入1-1000000之间的模拟次数');
return;
}
if (successRate < 0 || successRate > 100) {
alert('成功率必须在0-100之间');
return;
}
if (efficiencyRate < 0 || efficiencyRate > 200) {
alert('效率必须在0-200之间');
return;
}
// 获取产出物品信息
const outputRows = document.querySelectorAll('#outputItems tr');
const items = [];
let totalProbability = 0;
let inputItemInOutput = false; // 标记输入物品是否在产出列表中
let maxValueItem = null;
let maxValue = 0;
outputRows.forEach(row => {
const probability = parseFloat(row.querySelector('.output-probability').value) || 0;
const itemName = row.querySelector('.output-item').value;
const price = parseInt(row.querySelector('.output-price').value) || 0;
const baseQuantity = parseInt(row.querySelector('.output-quantity').value) || 1;
const newItem = {
name: itemName,
probability,
price,
baseQuantity,
currentQuantity: 0,
total: 0,
row: row
};
items.push(newItem);
totalProbability += probability;
const itemValue = price * baseQuantity;
if (itemValue > maxValue) {
maxValue = itemValue;
maxValueItem = newItem;
}
if (itemName === inputItemName) {
inputItemInOutput = true;
}
});
// 验证概率总和
const roundedTotal = Math.round(totalProbability * 100) / 100;
if (roundedTotal !== 100) {
alert(`所有物品的概率总和必须为100%,当前为${totalProbability.toFixed(2)}%`);
return;
}
// 如果没有递归转换的可能,则使用普通模拟
if (!inputItemInOutput) {
return ac_simulateAlchemy();
}
// 开始递归模拟
let totalSuccess = 0;
let totalAttempts = 0;
let totalTime = 0;
let remainingInputItems = simulateTimes;
// 递归转换函数
let highValueSuccess = 0;
function recursiveConversion() {
if (remainingInputItems <= 0) return;
remainingInputItems--;
totalAttempts++;
const actualAttempts = calculateActualAttempts(1, efficiencyRate);
totalTime += baseTimePerTry * (1 / actualAttempts);
if (Math.random() * 100 < successRate) {
totalSuccess++;
let random = Math.random() * 100;
let accumulated = 0;
for (const item of items) {
accumulated += item.probability;
if (random <= accumulated) {
if (item.name === inputItemName) {
item.currentQuantity += item.baseQuantity;
remainingInputItems += item.baseQuantity;
} else {
item.currentQuantity += item.baseQuantity;
item.total += item.price * item.baseQuantity;
// 新增:检查是否获得最高价值物品
if (item === maxValueItem) {
highValueSuccess++;
}
}
break;
}
}
recursiveConversion();
}
}
// 初始模拟
for (let i = 0; i < simulateTimes; i++) {
recursiveConversion();
}
// 更新UI显示物品数量
items.forEach(item => {
item.row.querySelector('.output-allquantity').value = item.currentQuantity;
item.row.querySelector('.output-total').value = item.total;
});
// 计算成本(输入物品*初始次数 + (金币+催化剂)*成功次数)
const itemPrice = parseFloat(ac_getElement('itemPrice').value) || 0;
const catalystPrice = parseFloat(ac_getElement('Catalyst').value) || 0;
const goldCost = parseFloat(ac_getElement('costPerTry').value) || 0;
const totalCost = (simulateTimes * itemPrice) + (totalSuccess * (goldCost + catalystPrice));
// 计算产出物品总价(不包括递归物品)
let totalOutputValue = 0;
items.forEach(item => {
if (item.name !== inputItemName) {
totalOutputValue += item.total;
}
});
// 计算盈亏
const profitLoss = totalOutputValue - totalCost;
totalButtonClicks++;
if (profitLoss > 0) positiveProfitClicks++;
// 更新统计显示
ac_getElement('Besimulationsisk').textContent = `${positiveProfitClicks}|${totalButtonClicks}`;
ac_getElement('positivereturn').textContent = `${((positiveProfitClicks / totalButtonClicks) * 100).toFixed(2)}%`;
// 更新UI显示
ac_getElement('timeCost').textContent = ac_formatTime(totalTime);
ac_getElement('Consumable').textContent = `${totalSuccess}|${totalAttempts}`;
ac_getElement('totalCost').textContent = totalCost.toLocaleString();
const profitElement = ac_getElement('profitLoss');
profitElement.textContent = profitLoss.toLocaleString();
profitElement.className = 'result-value ' + (profitLoss >= 0 ? 'profit' : 'loss');
// 计算利润率
let profitMargin = 0;
if (totalCost > 0) {
profitMargin = (profitLoss / totalCost) * 100;
}
const profitMarginElement = ac_getElement('profit_margin');
profitMarginElement.textContent = profitMargin.toFixed(2) + '%';
profitMarginElement.className = 'result-value ' + (profitMargin >= 0 ? 'profit' : 'loss');
// 计算实际成功率
const actualSuccessRate = (totalSuccess / totalAttempts) * 100;
const actualHighValueRate = (highValueSuccess / totalAttempts) * 100;
ac_getElement('ActualSuccessrate').textContent = `${actualSuccessRate.toFixed(2)}% | ${actualHighValueRate.toFixed(2)}%`;
// 计算期望利润和标准差
let expectedProfit = 0;
items.forEach(item => {
if (item.name !== inputItemName) {
const expectedQuantity = (successRate / 100) * (item.probability / 100) * simulateTimes * item.baseQuantity;
expectedProfit += expectedQuantity * item.price;
}
});
const expectedCost = simulateTimes * itemPrice + (successRate / 100 * simulateTimes * (goldCost + catalystPrice));
const expectedValue = expectedProfit - expectedCost;
// 计算标准差(需要计算方差)
let variance = 0;
items.forEach(item => {
if (item.name !== inputItemName) {
const p = (successRate / 100) * (item.probability / 100);
const value = item.price * item.baseQuantity;
variance += p * (1 - p) * Math.pow(value, 2) * simulateTimes;
}
});
const stdDeviation = Math.sqrt(variance);
// 更新期望和标准差显示
ac_getElement('expectation').textContent = Math.round(expectedValue).toLocaleString();
ac_getElement('stdDeviation').textContent = Math.round(stdDeviation).toLocaleString();
// 计算变异系数(CV) = 标准差/期望值
let cv, riskLevel, riskClass;
if (expectedValue > 0) {
cv = stdDeviation / expectedValue;
if (cv < 1) {
riskLevel = "低风险";
riskClass = "profit";
} else if (cv < 2) {
riskLevel = "较高风险";
riskClass = "loss";
} else {
riskLevel = "高风险";
riskClass = "high-risk";
}
} else {
// 负期望值直接标记为极高风险
cv = Infinity;
riskLevel = "超高风险";
riskClass = "extreme-risk";
}
// 更新风险显示
const riskElement = ac_getElement('Risk');
riskElement.textContent = `${riskLevel} (CV: ${cv.toFixed(2)})`;
riskElement.className = 'result-value ' + riskClass;
}
// 计算盈亏
// 计算盈亏
// 计算盈亏
function ac_calculateProfit() {
// 计算总成本
const ac_simulateTimes = parseFloat(ac_getElement('simulateTimes').value) || 0;
const ac_allCostPerTry = parseFloat(ac_getElement('allcostPerTry').value) || 0;
const ac_catalystCost = parseFloat(ac_getElement('Catalyst').value) || 0;
// 获取成功次数(从模拟结果中获取)
const successCount = parseInt(ac_getElement('successCount')?.value) || 0;
const failCount = ac_simulateTimes - successCount;
const ac_totalCost = (ac_simulateTimes * ac_allCostPerTry) - (failCount * ac_catalystCost);
ac_getElement('totalCost').textContent = ac_totalCost.toLocaleString();
// 计算产出物品总价
let ac_totalOutputValue = 0;
document.querySelectorAll('#outputItems tr').forEach(row => {
const quantity = parseInt(row.querySelector('.output-allquantity').value) || 0;
const price = parseInt(row.querySelector('.output-price').value) || 0;
ac_totalOutputValue += quantity * price;
});
// 计算盈亏
const ac_profitLoss = ac_totalOutputValue - ac_totalCost;
const ac_profitElement = ac_getElement('profitLoss');
ac_profitElement.textContent = ac_profitLoss.toLocaleString();
ac_profitElement.className = 'result-value ' + (ac_profitLoss >= 0 ? 'profit' : 'loss');
// 新增:计算利润率
let profitMargin = 0;
if (ac_totalCost > 0) { // 避免除以0
profitMargin = (ac_profitLoss / ac_totalCost) * 100;
}
const profitMarginElement = ac_getElement('profit_margin');
profitMarginElement.textContent = profitMargin.toFixed(2) + '%';
profitMarginElement.className = 'result-value ' + (profitMargin >= 0 ? 'profit' : 'loss');
}
// 计算单次成本
function ac_calculateSingleCost() {
const ac_itemPrice = parseFloat(ac_getElement('itemPrice').value) || 0;
const ac_catalystCost = parseFloat(ac_getElement('Catalyst').value) || 0;
const ac_costPerTry = parseFloat(ac_getElement('costPerTry').value) || 0;
const ac_singleCost = ac_itemPrice + ac_catalystCost + ac_costPerTry;
ac_getElement('allcostPerTry').value = ac_singleCost;
// 触发重新计算
ac_calculateProfit();
}
// 初始化事件监听器
function ac_initEventListeners() {
// 监听所有相关输入的变化
const ac_inputsToWatch = [
'simulateTimes', 'itemPrice', 'Catalyst', 'costPerTry',
'timePerTry', 'successRate', 'efficiencyRate'
];
ac_inputsToWatch.forEach(id => {
ac_getElement(id).addEventListener('input', ac_calculateSingleCost);
});
// 监听产出物品表格的变化
document.querySelectorAll('#outputItems .output-price, #outputItems .output-probability').forEach(input => {
input.addEventListener('input', ac_calculateProfit);
});
// 监听开始炼金按钮
ac_getElement('startBtn').addEventListener('click', ac_simulateAlchemy);
ac_getElement('startBtnEQ').addEventListener('click', ac_simulateRecursiveAlchemy);
}
// 初始化计算器
function ac_initCalculator() {
ac_initEventListeners();
ac_calculateSingleCost(); // 初始计算
ac_getElement('restart').addEventListener('click', ac_resetResults);
}
function ac_resetResults() {
// 重置所有结果框
document.querySelectorAll('.result-box .result-value').forEach(el => {
el.textContent = '0';
el.className = 'result-value'; // 移除所有颜色类
});
// 重置风险等级显示
const riskElement = ac_getElement('Risk');
riskElement.textContent = '0';
riskElement.className = 'result-value';
// 重置产出表格
document.querySelectorAll('.output-allquantity, .output-total').forEach(input => {
input.value = '0';
});
// 重置统计计数(可选)
totalButtonClicks = 0;
positiveProfitClicks = 0;
console.log('所有结果已重置');
}
// 当DOM加载完成后初始化
document.addEventListener('DOMContentLoaded', ac_initCalculator);
// 暴露必要的函数到全局
window.alchemyCalculator = {
simulateAlchemy: ac_simulateAlchemy,
simulateUntilTarget: ac_simulateUntilTarget,
calculateProfit: ac_calculateProfit,
calculateSingleCost: ac_calculateSingleCost,
formatTime: ac_formatTime,
simulateRecursiveAlchemy: ac_simulateRecursiveAlchemy,
resetResults: ac_resetResults
};
})();