394 lines
32 KiB
HTML
394 lines
32 KiB
HTML
|
||
<title>机器人AI配置</title>
|
||
|
||
<style>
|
||
.layui-form-label { width: 200px; }
|
||
.bot-row { display: flex; flex-wrap: wrap; gap: 8px; }
|
||
.bot-row .layui-form-item { display: flex; align-items: center; margin: 0; white-space: nowrap; flex: 1; min-width: 300px; }
|
||
.bot-row .layui-form-label { width: auto; text-align: right; padding-right: 6px; font-size: 13px; }
|
||
.bot-row .layui-input-inline { width: 70px; }
|
||
.bot-row .layui-form-mid { font-size: 11px; color: #999; margin-left: 4px; }
|
||
</style>
|
||
|
||
<div class="layui-card layadmin-header">
|
||
<div class="layui-breadcrumb" lay-filter="breadcrumb">
|
||
<a lay-href="">主页</a>
|
||
<a><cite>游戏管理</cite></a>
|
||
<a><cite>机器人AI配置</cite></a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="layui-fluid">
|
||
<div class="layui-card">
|
||
<div class="layui-card-header">
|
||
<div class="layui-btn-container">
|
||
<button class="layui-btn layui-btn-sm layui-btn-normal" lay-filter="init-botai"><i class="layui-icon layui-icon-refresh"></i> 初始化配置</button>
|
||
<button class="layui-btn layui-btn-sm" lay-filter="save-botai"><i class="layui-icon layui-icon-ok"></i> 保存配置</button>
|
||
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="reload-botai"><i class="layui-icon layui-icon-refresh"></i> 刷新</button>
|
||
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="saveSection('BotConfig')"><i class="layui-icon layui-icon-export"></i> 保存到初始化文件</button>
|
||
</div>
|
||
</div>
|
||
<div class="layui-card-body">
|
||
<form class="layui-form" id="form-botai" style="padding: 20px;">
|
||
|
||
<fieldset class="layui-elem-field"><legend>全局设置</legend>
|
||
<div class="layui-field-box">
|
||
<div class="layui-form-item"><label class="layui-form-label">总开关</label><div class="layui-input-inline"><input type="checkbox" name="enabled" lay-skin="switch" lay-text="开启|关闭"></div><div class="layui-form-mid">机器人总开关</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">AI状态</label><div class="layui-input-inline"><input type="text" name="aiState" class="layui-input" style="width:120px;"></div><div class="layui-form-mid">active=正常 | idle=待机 | aggressive=激进</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">爆率因子</label><div class="layui-input-inline"><input type="number" name="luckFactor" class="layui-input" step="0.1"></div><div class="layui-form-mid">1.0=正常, >1容易杀, <1难杀</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">状态刷新间隔(秒)</label><div class="layui-input-inline"><input type="number" name="stateRefreshInterval" class="layui-input" step="0.1"></div><div class="layui-form-mid">0=不自动刷新</div></div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<fieldset class="layui-elem-field"><legend>技能配置</legend>
|
||
<div class="layui-field-box">
|
||
<div class="layui-form-item"><label class="layui-form-label">技能刷新间隔(秒)</label><div class="layui-input-inline"><input type="number" name="skillRefreshInterval" class="layui-input" step="0.1"></div><div class="layui-form-mid">每隔多少秒重新掷骰子决定技能组合</div></div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">锁定概率</label><div class="layui-input-inline"><input type="number" name="lockProb" class="layui-input" step="0.01"></div><div class="layui-form-mid">自动瞄准最近鱼</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">锁定Min</label><div class="layui-input-inline"><input type="number" name="lockMinTime" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">锁定Max</label><div class="layui-input-inline"><input type="number" name="lockMaxTime" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">狂暴概率</label><div class="layui-input-inline"><input type="number" name="frenzyProb" class="layui-input" step="0.01"></div><div class="layui-form-mid">开火速度翻倍</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">狂暴Min</label><div class="layui-input-inline"><input type="number" name="frenzyMinTime" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">狂暴Max</label><div class="layui-input-inline"><input type="number" name="frenzyMaxTime" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">三发散弹概率</label><div class="layui-input-inline"><input type="number" name="tripleProb" class="layui-input" step="0.01"></div><div class="layui-form-mid">一次3发</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">三发Min</label><div class="layui-input-inline"><input type="number" name="tripleMinTime" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">三发Max</label><div class="layui-input-inline"><input type="number" name="tripleMaxTime" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">双倍炮概率</label><div class="layui-input-inline"><input type="number" name="doubleProb" class="layui-input" step="0.01"></div><div class="layui-form-mid">消耗翻倍</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">双倍Min</label><div class="layui-input-inline"><input type="number" name="doubleMinTime" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">双倍Max</label><div class="layui-input-inline"><input type="number" name="doubleMaxTime" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<!-- 行为模板 -->
|
||
<!-- 三个行为模式共用同一套字段,使用前缀区分 -->
|
||
<fieldset class="layui-elem-field"><legend>Active 行为参数</legend>
|
||
<div class="layui-field-box">
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">开火间隔Min(秒)</label><div class="layui-input-inline"><input type="number" name="activeFireIntervalMin" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">开火间隔Max(秒)</label><div class="layui-input-inline"><input type="number" name="activeFireIntervalMax" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">开火概率</label><div class="layui-input-inline"><input type="number" name="activeFireProb" class="layui-input" step="0.01"></div><div class="layui-form-mid">0.9=经常开火偶尔停顿</div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">旋转速度(度/秒)</label><div class="layui-input-inline"><input type="number" name="activeRotateSpeed" class="layui-input" step="1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">目标保持Min(秒)</label><div class="layui-input-inline"><input type="number" name="activeTargetHoldTimeMin" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">目标保持Max(秒)</label><div class="layui-input-inline"><input type="number" name="activeTargetHoldTimeMax" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">切换目标概率</label><div class="layui-input-inline"><input type="number" name="activeTargetSwitchChance" class="layui-input" step="0.01"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">高分偏好</label><div class="layui-input-inline"><input type="number" name="activeTargetPreferHighScore" class="layui-input" step="0.1"></div><div class="layui-form-mid">0=纯距离, 1=纯分数</div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">允许打Boss</label><div class="layui-input-inline"><input type="checkbox" name="activeCanTargetBoss" lay-skin="switch" lay-text="是|否"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">允许打特殊鱼</label><div class="layui-input-inline"><input type="checkbox" name="activeCanTargetSpecial" lay-skin="switch" lay-text="是|否"></div></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<fieldset class="layui-elem-field"><legend>Idle 行为参数</legend>
|
||
<div class="layui-field-box">
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">开火间隔Min(秒)</label><div class="layui-input-inline"><input type="number" name="idleFireIntervalMin" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">开火间隔Max(秒)</label><div class="layui-input-inline"><input type="number" name="idleFireIntervalMax" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">开火概率</label><div class="layui-input-inline"><input type="number" name="idleFireProb" class="layui-input" step="0.01"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">旋转速度(度/秒)</label><div class="layui-input-inline"><input type="number" name="idleRotateSpeed" class="layui-input" step="1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">目标保持Min(秒)</label><div class="layui-input-inline"><input type="number" name="idleTargetHoldTimeMin" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">目标保持Max(秒)</label><div class="layui-input-inline"><input type="number" name="idleTargetHoldTimeMax" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">切换目标概率</label><div class="layui-input-inline"><input type="number" name="idleTargetSwitchChance" class="layui-input" step="0.01"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">高分偏好</label><div class="layui-input-inline"><input type="number" name="idleTargetPreferHighScore" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">允许打Boss</label><div class="layui-input-inline"><input type="checkbox" name="idleCanTargetBoss" lay-skin="switch" lay-text="是|否"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">允许打特殊鱼</label><div class="layui-input-inline"><input type="checkbox" name="idleCanTargetSpecial" lay-skin="switch" lay-text="是|否"></div></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<fieldset class="layui-elem-field"><legend>Aggressive 行为参数</legend>
|
||
<div class="layui-field-box">
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">开火间隔Min(秒)</label><div class="layui-input-inline"><input type="number" name="aggFireIntervalMin" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">开火间隔Max(秒)</label><div class="layui-input-inline"><input type="number" name="aggFireIntervalMax" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">开火概率</label><div class="layui-input-inline"><input type="number" name="aggFireProb" class="layui-input" step="0.01"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">旋转速度(度/秒)</label><div class="layui-input-inline"><input type="number" name="aggRotateSpeed" class="layui-input" step="1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">目标保持Min(秒)</label><div class="layui-input-inline"><input type="number" name="aggTargetHoldTimeMin" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">目标保持Max(秒)</label><div class="layui-input-inline"><input type="number" name="aggTargetHoldTimeMax" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">切换目标概率</label><div class="layui-input-inline"><input type="number" name="aggTargetSwitchChance" class="layui-input" step="0.01"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">高分偏好</label><div class="layui-input-inline"><input type="number" name="aggTargetPreferHighScore" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">允许打Boss</label><div class="layui-input-inline"><input type="checkbox" name="aggCanTargetBoss" lay-skin="switch" lay-text="是|否"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">允许打特殊鱼</label><div class="layui-input-inline"><input type="checkbox" name="aggCanTargetSpecial" lay-skin="switch" lay-text="是|否"></div></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<fieldset class="layui-elem-field"><legend>倍数策略</legend>
|
||
<div class="layui-field-box">
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">初始档位索引</label><div class="layui-input-inline"><input type="number" name="multiplierInitialLevelIndex" class="layui-input"></div><div class="layui-form-mid">对应炮倍列表下标,0=最低档</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">降档阈值</label><div class="layui-input-inline"><input type="number" name="multiplierDecreaseThreshold" class="layui-input" step="0.1"></div><div class="layui-form-mid">当前金币/进场金币 < 此值</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">升档阈值</label><div class="layui-input-inline"><input type="number" name="multiplierIncreaseThreshold" class="layui-input" step="0.1"></div><div class="layui-form-mid">当前金币/进场金币 > 此值</div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">调整档位步数</label><div class="layui-input-inline"><input type="number" name="multiplierStep" class="layui-input"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">检查间隔(秒)</label><div class="layui-input-inline"><input type="number" name="multiplierCheckInterval" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">最低档位</label><div class="layui-input-inline"><input type="number" name="multiplierMinLevelIndex" class="layui-input"></div><div class="layui-form-mid">不会降到低于此值</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">最高档位(-1不限)</label><div class="layui-input-inline"><input type="number" name="multiplierMaxLevelIndex" class="layui-input"></div></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<fieldset class="layui-elem-field"><legend>Boss策略</legend>
|
||
<div class="layui-field-box">
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">Boss鱼类型</label><div class="layui-input-inline"><input type="text" name="bossFishTypes" class="layui-input" style="width:120px;" placeholder="2,5"></div><div class="layui-form-mid">FishTypeEnum 的 int 值,逗号分隔</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">无Boss散射</label><div class="layui-input-inline"><input type="checkbox" name="scatterWhenNoBoss" lay-skin="switch" lay-text="开启|关闭"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">三发概率</label><div class="layui-input-inline"><input type="number" name="tripleShotProb" class="layui-input" step="0.01"></div><div class="layui-form-mid">无Boss时定点三发概率</div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">优先最大倍率Boss</label><div class="layui-input-inline"><input type="checkbox" name="preferMaxMultiplierBoss" lay-skin="switch" lay-text="是|否"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">散射阈值</label><div class="layui-input-inline"><input type="number" name="scatterModeThreshold" class="layui-input"></div><div class="layui-form-mid">Boss数 > 此值开启散射</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">狂暴概率</label><div class="layui-input-inline"><input type="number" name="bossFrenzyProb" class="layui-input" step="0.01"></div><div class="layui-form-mid">Boss数 ≤ 散射阈值时的概率</div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">狂暴Min</label><div class="layui-input-inline"><input type="number" name="bossFrenzyMinTime" class="layui-input" step="0.1"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">狂暴Max</label><div class="layui-input-inline"><input type="number" name="bossFrenzyMaxTime" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
<fieldset class="layui-elem-field"><legend>退出条件</legend>
|
||
<div class="layui-field-box">
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">盈利退出(金币)</label><div class="layui-input-inline"><input type="number" name="exitWhenGoldAbove" class="layui-input"></div><div class="layui-form-mid">超过此值时退出(盈利离场),0=不检测</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">亏损退出(金币)</label><div class="layui-input-inline"><input type="number" name="exitWhenGoldBelow" class="layui-input"></div><div class="layui-form-mid">低于此值时退出(输完离场)</div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">检查间隔(秒)</label><div class="layui-input-inline"><input type="number" name="exitCheckInterval" class="layui-input" step="0.1"></div></div>
|
||
</div>
|
||
<div class="bot-row">
|
||
<div class="layui-form-item"><label class="layui-form-label">发送离房消息</label><div class="layui-input-inline"><input type="checkbox" name="sendLeaveRoom" lay-skin="switch" lay-text="是|否"></div></div>
|
||
<div class="layui-form-item"><label class="layui-form-label">退出后显示等待</label><div class="layui-input-inline"><input type="checkbox" name="showWaitingAfterExit" lay-skin="switch" lay-text="是|否"></div></div>
|
||
</div>
|
||
</div>
|
||
</fieldset>
|
||
|
||
</form>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
window.saveSection=function(n){layui.admin.req({method:'get',url:(layui.setter.baseurl||'/')+'adminapi/GameConfig/SaveSection/'+n,done:function(r){layui.layer.msg(r.info||(r.code===0?'保存成功':'保存失败'))}})};
|
||
</script>
|
||
<script>
|
||
layui.use(['admin', 'form', 'layer'], function () {
|
||
var $ = layui.$,
|
||
admin = layui.admin,
|
||
form = layui.form,
|
||
layer = layui.layer,
|
||
setter = layui.setter;
|
||
|
||
var gameConfig = null;
|
||
setTimeout(function() { $('.layui-layer-shade').remove(); layer.closeAll(); }, 100);
|
||
|
||
function loadConfig() {
|
||
admin.req({
|
||
method: "get",
|
||
url: setter.baseurl + "adminapi/GameConfig",
|
||
done: function (res) {
|
||
if (res.code === 0 && res.data) { gameConfig = res.data; fillForm(); }
|
||
}
|
||
});
|
||
}
|
||
|
||
function bc() { if (!gameConfig.botConfig) gameConfig.botConfig = {}; return gameConfig.botConfig; }
|
||
|
||
function val(name, def) { var v = $('#form-botai input[name="'+name+'"]').val(); return v !== undefined && v !== '' ? v : def; }
|
||
function chk(name) { return $('#form-botai input[name="'+name+'"]').prop('checked'); }
|
||
function num(name, def) { return parseFloat(val(name, def)) || def; }
|
||
function intv(name, def) { return parseInt(val(name, def)) || def; }
|
||
|
||
function fillBehavior(prefix, data) {
|
||
if (!data) return;
|
||
$('#form-botai input[name="'+prefix+'FireIntervalMin"]').val(data.fireIntervalMin ?? 0.3);
|
||
$('#form-botai input[name="'+prefix+'FireIntervalMax"]').val(data.fireIntervalMax ?? 1.2);
|
||
$('#form-botai input[name="'+prefix+'FireProb"]').val(data.fireProb ?? 0.9);
|
||
$('#form-botai input[name="'+prefix+'RotateSpeed"]').val(data.rotateSpeed ?? 80);
|
||
$('#form-botai input[name="'+prefix+'TargetHoldTimeMin"]').val(data.targetHoldTimeMin ?? 2);
|
||
$('#form-botai input[name="'+prefix+'TargetHoldTimeMax"]').val(data.targetHoldTimeMax ?? 5);
|
||
$('#form-botai input[name="'+prefix+'TargetSwitchChance"]').val(data.targetSwitchChance ?? 0.7);
|
||
$('#form-botai input[name="'+prefix+'TargetPreferHighScore"]').val(data.targetPreferHighScore ?? 0);
|
||
$('#form-botai input[name="'+prefix+'CanTargetBoss"]').prop('checked', data.canTargetBoss !== false);
|
||
$('#form-botai input[name="'+prefix+'CanTargetSpecial"]').prop('checked', data.canTargetSpecial !== false);
|
||
}
|
||
|
||
function readBehavior(prefix) {
|
||
return {
|
||
fireIntervalMin: num(prefix+'FireIntervalMin', 0.3),
|
||
fireIntervalMax: num(prefix+'FireIntervalMax', 1.2),
|
||
fireProb: num(prefix+'FireProb', 0.9),
|
||
rotateSpeed: num(prefix+'RotateSpeed', 80),
|
||
targetHoldTimeMin: num(prefix+'TargetHoldTimeMin', 2),
|
||
targetHoldTimeMax: num(prefix+'TargetHoldTimeMax', 5),
|
||
targetSwitchChance: num(prefix+'TargetSwitchChance', 0.7),
|
||
targetPreferHighScore: num(prefix+'TargetPreferHighScore', 0),
|
||
canTargetBoss: chk(prefix+'CanTargetBoss'),
|
||
canTargetSpecial: chk(prefix+'CanTargetSpecial')
|
||
};
|
||
}
|
||
|
||
function fillForm() {
|
||
var c = bc();
|
||
$('#form-botai input[name="enabled"]').prop('checked', c.enabled !== false);
|
||
$('#form-botai input[name="aiState"]').val(c.aiState || 'active');
|
||
$('#form-botai input[name="luckFactor"]').val(c.luckFactor ?? 1);
|
||
$('#form-botai input[name="stateRefreshInterval"]').val(c.stateRefreshInterval ?? 0);
|
||
|
||
var sk = c.skills || {};
|
||
$('#form-botai input[name="skillRefreshInterval"]').val(sk.skillRefreshInterval ?? 10);
|
||
$('#form-botai input[name="lockProb"]').val(sk.lockProb ?? 0);
|
||
$('#form-botai input[name="lockMinTime"]').val(sk.lockMinTime ?? 5);
|
||
$('#form-botai input[name="lockMaxTime"]').val(sk.lockMaxTime ?? 20);
|
||
$('#form-botai input[name="frenzyProb"]').val(sk.frenzyProb ?? 0.3);
|
||
$('#form-botai input[name="frenzyMinTime"]').val(sk.frenzyMinTime ?? 3);
|
||
$('#form-botai input[name="frenzyMaxTime"]').val(sk.frenzyMaxTime ?? 8);
|
||
$('#form-botai input[name="tripleProb"]').val(sk.tripleProb ?? 0.5);
|
||
$('#form-botai input[name="tripleMinTime"]').val(sk.tripleMinTime ?? 4);
|
||
$('#form-botai input[name="tripleMaxTime"]').val(sk.tripleMaxTime ?? 12);
|
||
$('#form-botai input[name="doubleProb"]').val(sk.doubleProb ?? 0);
|
||
$('#form-botai input[name="doubleMinTime"]').val(sk.doubleMinTime ?? 3);
|
||
$('#form-botai input[name="doubleMaxTime"]').val(sk.doubleMaxTime ?? 6);
|
||
|
||
var mp = c.multiplier || {};
|
||
$('#form-botai input[name="multiplierInitialLevelIndex"]').val(mp.initialLevelIndex ?? 0);
|
||
$('#form-botai input[name="multiplierDecreaseThreshold"]').val(mp.decreaseThreshold ?? 0.5);
|
||
$('#form-botai input[name="multiplierIncreaseThreshold"]').val(mp.increaseThreshold ?? 1.5);
|
||
$('#form-botai input[name="multiplierStep"]').val(mp.step ?? 1);
|
||
$('#form-botai input[name="multiplierCheckInterval"]').val(mp.checkInterval ?? 3);
|
||
$('#form-botai input[name="multiplierMinLevelIndex"]').val(mp.minLevelIndex ?? 0);
|
||
$('#form-botai input[name="multiplierMaxLevelIndex"]').val(mp.maxLevelIndex ?? -1);
|
||
|
||
var bs = c.bossStrategy || {};
|
||
$('#form-botai input[name="bossFishTypes"]').val((bs.bossFishTypes || [2,5]).join(','));
|
||
$('#form-botai input[name="scatterWhenNoBoss"]').prop('checked', bs.scatterWhenNoBoss !== false);
|
||
$('#form-botai input[name="tripleShotProb"]').val(bs.tripleShotProb ?? 0.5);
|
||
$('#form-botai input[name="preferMaxMultiplierBoss"]').prop('checked', bs.preferMaxMultiplierBoss !== false);
|
||
$('#form-botai input[name="scatterModeThreshold"]').val(bs.scatterModeThreshold ?? 3);
|
||
$('#form-botai input[name="bossFrenzyProb"]').val(bs.frenzyProb ?? 0.6);
|
||
$('#form-botai input[name="bossFrenzyMinTime"]').val(bs.frenzyMinTime ?? 3);
|
||
$('#form-botai input[name="bossFrenzyMaxTime"]').val(bs.frenzyMaxTime ?? 8);
|
||
|
||
var ex = c.exitCondition || {};
|
||
$('#form-botai input[name="exitWhenGoldAbove"]').val(ex.exitWhenGoldAbove ?? 0);
|
||
$('#form-botai input[name="exitWhenGoldBelow"]').val(ex.exitWhenGoldBelow ?? 100);
|
||
$('#form-botai input[name="exitCheckInterval"]').val(ex.checkInterval ?? 5);
|
||
$('#form-botai input[name="sendLeaveRoom"]').prop('checked', ex.sendLeaveRoom !== false);
|
||
$('#form-botai input[name="showWaitingAfterExit"]').prop('checked', ex.showWaitingAfterExit !== false);
|
||
|
||
fillBehavior('active', c.activeBehavior);
|
||
fillBehavior('idle', c.idleBehavior);
|
||
fillBehavior('agg', c.aggressiveBehavior);
|
||
|
||
form.render();
|
||
}
|
||
|
||
function collectConfig() {
|
||
var c = bc();
|
||
c.enabled = chk('enabled');
|
||
c.aiState = val('aiState', 'active');
|
||
c.luckFactor = num('luckFactor', 1);
|
||
c.stateRefreshInterval = num('stateRefreshInterval', 0);
|
||
|
||
c.skills = {
|
||
skillRefreshInterval: num('skillRefreshInterval', 10),
|
||
lockProb: num('lockProb', 0), lockMinTime: num('lockMinTime', 5), lockMaxTime: num('lockMaxTime', 20),
|
||
frenzyProb: num('frenzyProb', 0.3), frenzyMinTime: num('frenzyMinTime', 3), frenzyMaxTime: num('frenzyMaxTime', 8),
|
||
tripleProb: num('tripleProb', 0.5), tripleMinTime: num('tripleMinTime', 4), tripleMaxTime: num('tripleMaxTime', 12),
|
||
doubleProb: num('doubleProb', 0), doubleMinTime: num('doubleMinTime', 3), doubleMaxTime: num('doubleMaxTime', 6)
|
||
};
|
||
|
||
c.multiplier = {
|
||
initialLevelIndex: intv('multiplierInitialLevelIndex', 0),
|
||
decreaseThreshold: num('multiplierDecreaseThreshold', 0.5),
|
||
increaseThreshold: num('multiplierIncreaseThreshold', 1.5),
|
||
step: intv('multiplierStep', 1),
|
||
checkInterval: num('multiplierCheckInterval', 3),
|
||
minLevelIndex: intv('multiplierMinLevelIndex', 0),
|
||
maxLevelIndex: intv('multiplierMaxLevelIndex', -1)
|
||
};
|
||
|
||
var bft = val('bossFishTypes', '2,5').split(',').map(function(s) { return parseInt(s.trim()) || 2; }).filter(function(n) { return n > 0; });
|
||
c.bossStrategy = {
|
||
bossFishTypes: bft.length > 0 ? bft : [2, 5],
|
||
scatterWhenNoBoss: chk('scatterWhenNoBoss'),
|
||
tripleShotProb: num('tripleShotProb', 0.5),
|
||
preferMaxMultiplierBoss: chk('preferMaxMultiplierBoss'),
|
||
scatterModeThreshold: intv('scatterModeThreshold', 3),
|
||
frenzyProb: num('bossFrenzyProb', 0.6),
|
||
frenzyMinTime: num('bossFrenzyMinTime', 3),
|
||
frenzyMaxTime: num('bossFrenzyMaxTime', 8)
|
||
};
|
||
|
||
c.exitCondition = {
|
||
exitWhenGoldAbove: intv('exitWhenGoldAbove', 0),
|
||
exitWhenGoldBelow: intv('exitWhenGoldBelow', 100),
|
||
checkInterval: num('exitCheckInterval', 5),
|
||
sendLeaveRoom: chk('sendLeaveRoom'),
|
||
showWaitingAfterExit: chk('showWaitingAfterExit')
|
||
};
|
||
|
||
c.activeBehavior = readBehavior('active');
|
||
c.idleBehavior = readBehavior('idle');
|
||
c.aggressiveBehavior = readBehavior('agg');
|
||
|
||
return c;
|
||
}
|
||
|
||
$(document).on('click', '[lay-filter="init-botai"]', function () {
|
||
layer.confirm('确定要初始化机器人AI配置吗?此操作将覆盖现有数据!', function(idx) {
|
||
layer.close(idx);
|
||
admin.req({
|
||
method: "get",
|
||
url: setter.baseurl + "adminapi/GameConfig/InitSection/BotConfig",
|
||
done: function (res) {
|
||
layer.msg(res.info || (res.code === 0 ? '初始化成功' : '初始化失败'));
|
||
if (res.code === 0 || res.code === 200) loadConfig();
|
||
}
|
||
});
|
||
});
|
||
});
|
||
|
||
$(document).on('click', '[lay-filter="reload-botai"]', function () { loadConfig(); layer.msg('刷新成功'); });
|
||
|
||
$(document).on('click', '[lay-filter="save-botai"]', function () {
|
||
collectConfig();
|
||
admin.req({
|
||
method: "post",
|
||
contentType: "application/json;charset=UTF-8",
|
||
url: setter.baseurl + "adminapi/GameConfig/Update",
|
||
data: JSON.stringify(gameConfig),
|
||
done: function (res) {
|
||
if (res.code === 0 || res.code === 200) { layer.msg('保存成功'); loadConfig(); }
|
||
else { layer.msg(res.info || '保存失败'); }
|
||
}
|
||
});
|
||
});
|
||
|
||
loadConfig();
|
||
});
|
||
</script>
|