Files
BuYuHouDuan/AdminSrc/AdminHost/wwwroot/admin/dist/views/gameconfig/boss.html
T
2026-10-12 16:22:04 +08:00

2238 lines
104 KiB
HTML

<title>Boss配置</title>
<script src="/admin/layui/xm-select.js"></script>
<style>
.boss-form .layui-form-label { width: 140px; }
.boss-form legend { font-size: 14px; font-weight: normal; }
.boss-form .layui-form-mid { font-size: 12px; color: #999; }
.boss-form .layui-elem-field { border-color: #666; }
.boss-form .layui-input-block { min-height: 36px; }
.probability-section, .death-config-section { margin-top: 10px; }
.probability-item, .death-config-item, .luck-wheel-item { border: 1px solid #ddd; padding: 15px; margin: 15px 0; border-radius: 4px; background: #fafafa; }
.probability-item .fish-select-wrap, .death-config-item .fish-select-wrap { margin-bottom: 15px; }
.probability-item .fish-select-wrap label, .death-config-item .fish-select-wrap label { display: block; margin-bottom: 5px; font-weight: bold; }
.probability-item table, .death-config-item table { width: 100%; border-collapse: collapse; margin-top: 10px; }
.probability-item table th, .probability-item table td, .death-config-item table th, .death-config-item table td { border: 1px solid #ddd; padding: 8px; text-align: center; }
.probability-item table th, .death-config-item table th { background: #e6e6e6; font-weight: bold; }
.probability-item .param-row input, .death-config-item .param-row input { width: 100px; text-align: center; }
.probability-item .item-header, .death-config-item .item-header, .luck-wheel-item .item-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
.probability-item .item-header .item-title, .death-config-item .item-header .item-title, .luck-wheel-item .item-header .item-title { font-weight: bold; font-size: 14px; }
.fish-xmselect .xm-select-label { max-height: 80px; overflow-y: auto; }
.luck-wheel-list { margin-top: 10px; }
.luck-wheel-item { position: relative; padding-top: 35px; }
.luck-wheel-item .remove-wheel { position: absolute; top: 10px; right: 10px; }
.fish-name-tag { display: inline-block; background: #5fb878; color: #fff; padding: 2px 8px; border-radius: 3px; margin: 2px; font-size: 12px; }
.probability-list { }
.probability-card { border: 1px solid #e6e6e6; padding: 15px; margin-bottom: 10px; border-radius: 4px; background: #fafafa; cursor: pointer; transition: all 0.3s; }
.probability-card:hover { border-color: #009688; background: #f0f9f7; box-shadow: 0 2px 8px rgba(0,0,0,0.1); }
.probability-card .card-header { font-weight: bold; margin-bottom: 8px; display: flex; justify-content: space-between; }
.probability-card .card-fish { color: #666; font-size: 13px; }
.probability-card .card-params { color: #999; font-size: 12px; margin-top: 5px; }
.probability-card .empty-hint { color: #999; font-size: 13px; }
.death-params-container .layui-elem-field { margin-top: 15px; }
</style>
<div class="layui-card layadmin-header">
<div class="layui-breadcrumb" lay-filter="breadcrumb">
<a lay-href="">主页</a>
<a><cite>游戏管理</cite></a>
<a><cite>Boss配置</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-boss"><i class="layui-icon layui-icon-refresh"></i> 初始化配置</button>
<button class="layui-btn layui-btn-sm" lay-filter="save-boss"><i class="layui-icon layui-icon-ok"></i> 保存配置</button>
<button class="layui-btn layui-btn-sm layui-btn-warm" lay-filter="reload-boss"><i class="layui-icon layui-icon-refresh"></i> 刷新</button>
<button class="layui-btn layui-btn-sm layui-btn-normal" onclick="saveSection('BossConfigs')"><i class="layui-icon layui-icon-export"></i> 保存到初始化文件</button>
</div>
<div style="float: right; margin-top: 2px;">
<span style="font-size: 12px; color: #666; margin-right: 5px;">场景筛选:</span>
<div id="scene-filter" style="width: 220px; display: inline-block; vertical-align: middle;"></div>
</div>
</div>
<div class="layui-card-body">
<div class="layui-tab layui-tab-brief" lay-filter="bossTab">
<ul class="layui-tab-title">
<li class="layui-this" lay-id="luckWheel">幸运轮盘</li>
<li lay-id="luckPoker">小丑扑克</li>
<li lay-id="luckFlyDisk">幸运飞碟</li>
<li lay-id="fullScreen">全屏秒怪</li>
<li lay-id="range">范围秒怪</li>
<li lay-id="interstellarCruise">星际巡航</li>
<li lay-id="flameStorm">烈焰风暴</li>
<li lay-id="bomb">破坏球</li>
<li lay-id="scorpion">机械蝎</li>
<li lay-id="luckDragon">神龙转盘</li>
<li lay-id="probability">概率击杀</li>
</ul>
<div class="layui-tab-content">
<!-- 幸运轮盘 -->
<div class="layui-tab-item layui-show">
<div class="layui-btn-container" style="margin-bottom: 10px;">
<button type="button" class="layui-btn layui-btn-sm" id="add-luckWheel-item"><i class="layui-icon layui-icon-add-1"></i> 添加幸运轮盘配置</button>
</div>
<div id="luckWheel-list" class="luck-wheel-list"></div>
</div>
<!-- 小丑扑克 -->
<div class="layui-tab-item">
<fieldset class="layui-elem-field">
<legend>基础配置</legend>
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block fish-xmselect">
<div id="luckPoker_fishNumber" name="luckPoker_fishNumber"></div>
</div>
</div>
</fieldset>
<fieldset class="layui-elem-field">
<legend>选项列表</legend>
<div class="layui-form-item">
<button class="layui-btn layui-btn-sm" id="add-luckPoker-option">添加选项</button>
</div>
<table id="table-luckPoker-option" lay-filter="table-luckPoker-option"></table>
</fieldset>
</div>
<!-- 幸运飞碟 -->
<div class="layui-tab-item">
<div class="layui-btn-container" style="margin-bottom: 10px;">
<button type="button" class="layui-btn layui-btn-sm" id="add-luckFlyDisk-item"><i class="layui-icon layui-icon-add-1"></i> 添加幸运飞碟配置</button>
</div>
<div id="luckFlyDisk-list" class="luck-wheel-list"></div>
</div>
<!-- 全屏秒怪 -->
<div class="layui-tab-item">
<fieldset class="layui-elem-field">
<legend>基础配置</legend>
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block fish-xmselect">
<div id="fullScreen_fishNumber" name="fullScreen_fishNumber"></div>
</div>
</div>
</fieldset>
</div>
<!-- 范围秒怪 -->
<div class="layui-tab-item">
<fieldset class="layui-elem-field">
<legend>基础配置</legend>
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block fish-xmselect">
<div id="range_fishNumber" name="range_fishNumber"></div>
</div>
</div>
</fieldset>
</div>
<!-- 星际巡航 -->
<div class="layui-tab-item">
<fieldset class="layui-elem-field">
<legend>基础配置</legend>
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block fish-xmselect">
<div id="interstellarCruise_fishNumber" name="interstellarCruise_fishNumber"></div>
</div>
</div>
</fieldset>
<div id="interstellarCruise-death-configs" class="death-config-section"></div>
</div>
<!-- 烈焰风暴 -->
<div class="layui-tab-item">
<fieldset class="layui-elem-field">
<legend>基础配置</legend>
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block fish-xmselect">
<div id="flameStorm_fishNumber" name="flameStorm_fishNumber"></div>
</div>
</div>
</fieldset>
<div id="flameStorm-death-configs" class="death-config-section"></div>
</div>
<!-- 破坏球 -->
<div class="layui-tab-item">
<fieldset class="layui-elem-field">
<legend>基础配置</legend>
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block fish-xmselect">
<div id="bomb_fishNumber" name="bomb_fishNumber"></div>
</div>
</div>
</fieldset>
<div id="bomb-death-configs" class="death-config-section"></div>
</div>
<!-- 机械蝎 -->
<div class="layui-tab-item">
<fieldset class="layui-elem-field">
<legend>基础配置</legend>
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block fish-xmselect">
<div id="scorpion_fishNumber" name="scorpion_fishNumber"></div>
</div>
</div>
</fieldset>
<div id="scorpion-death-configs" class="death-config-section"></div>
</div>
<!-- 神龙转盘 -->
<div class="layui-tab-item">
<div class="layui-btn-container" style="margin-bottom: 10px;">
<button type="button" class="layui-btn layui-btn-sm" id="add-luckDragon-item"><i class="layui-icon layui-icon-add-1"></i> 添加神龙转盘配置</button>
</div>
<div id="luckDragon-list" class="luck-wheel-list"></div>
</div>
<!-- 概率击杀 -->
<div class="layui-tab-item">
<div class="probability-section">
<div class="layui-btn-container" style="margin-bottom: 10px;">
<button type="button" class="layui-btn layui-btn-sm" id="add-probability-item"><i class="layui-icon layui-icon-add-1"></i> 添加概率配置</button>
</div>
<div id="probability-list" class="probability-list"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- 概率击杀弹窗模板 -->
<div id="probability-modal" style="display:none; padding: 15px; width: 600px;">
<div class="layui-form" lay-filter="probability-form" id="probability-form">
<input type="hidden" name="editIndex" value="-1">
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block">
<div id="prob-fish-select"></div>
</div>
</div>
<fieldset class="layui-elem-field">
<legend>参数配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="prob-add-param"><i class="layui-icon layui-icon-add-1"></i> 添加参数</button>
<button type="button" class="layui-btn layui-btn-sm layui-btn-danger" id="prob-batch-del"><i class="layui-icon layui-icon-delete"></i> 批量删除</button>
</div>
<table id="table-prob-params" lay-filter="table-prob-params"></table>
</fieldset>
<div class="layui-form-item" style="margin-top:15px; text-align:center;">
<button type="button" class="layui-btn" id="prob-save">保存</button>
<button type="button" class="layui-btn layui-btn-primary" id="prob-cancel">取消</button>
<button type="button" class="layui-btn layui-btn-danger" onclick="probDeleteItem()" style="float:right;">删除</button>
</div>
</div>
</div>
<!-- 幸运轮盘弹窗模板 -->
<div id="luckWheel-modal" style="display:none; padding: 15px;">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block">
<div id="lw-fish-select"></div>
</div>
</div>
<fieldset class="layui-elem-field">
<legend>选项列表</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="lw-add-option"><i class="layui-icon layui-icon-add-1"></i> 添加选项</button>
</div>
<table id="table-lw-option" lay-filter="table-lw-option"></table>
</fieldset>
<fieldset class="layui-elem-field">
<legend>数量列表</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="lw-add-count"><i class="layui-icon layui-icon-add-1"></i> 添加数量</button>
</div>
<table id="table-lw-count" lay-filter="table-lw-count"></table>
</fieldset>
<div class="layui-form-item" style="margin-top:15px; text-align:center;">
<button type="button" class="layui-btn" id="lw-save">保存</button>
<button type="button" class="layui-btn layui-btn-primary" id="lw-cancel">取消</button>
<button type="button" class="layui-btn layui-btn-danger" id="lw-delete" style="float:right;">删除</button>
</div>
</div>
</div>
<!-- 死亡配置弹窗模板 -->
<div id="deathConfig-modal" style="display:none; padding: 15px;">
<div class="layui-form">
<fieldset class="layui-elem-field">
<legend>死亡次数配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="dc-add-count"><i class="layui-icon layui-icon-add-1"></i> 添加死亡次数</button>
</div>
<table id="table-death-count" lay-filter="table-death-count"></table>
</fieldset>
<div id="death-params-container" class="death-params-container"></div>
<div class="layui-form-item" style="margin-top:15px; text-align:center;">
<button type="button" class="layui-btn" id="dc-save">保存</button>
<button type="button" class="layui-btn layui-btn-primary" id="dc-cancel">取消</button>
</div>
</div>
</div>
<!-- 机械蝎弹窗模板 -->
<div id="scorpion-modal" style="display:none; padding: 15px;">
<div class="layui-form">
<fieldset class="layui-elem-field">
<legend>道具数量配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="sc-add-count"><i class="layui-icon layui-icon-add-1"></i> 添加道具数量</button>
</div>
<table id="table-sc-count" lay-filter="table-sc-count"></table>
</fieldset>
<fieldset class="layui-elem-field">
<legend>道具配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="sc-add-item"><i class="layui-icon layui-icon-add-1"></i> 添加道具</button>
</div>
<table id="table-sc-item" lay-filter="table-sc-item"></table>
</fieldset>
<fieldset class="layui-elem-field">
<legend>金币倍数配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="sc-add-gold"><i class="layui-icon layui-icon-add-1"></i> 添加金币倍数</button>
</div>
<table id="table-sc-gold" lay-filter="table-sc-gold"></table>
</fieldset>
<fieldset class="layui-elem-field">
<legend>综合目标(仅展示)</legend>
<div class="layui-form-item" style="margin:10px;">
<label class="layui-form-label">综合倍数</label>
<div class="layui-input-inline" style="width:120px;">
<input type="text" id="sc-composite-multiplier" class="layui-input" placeholder="650">
</div>
</div>
</fieldset>
<div class="layui-form-item" style="margin-top:15px; text-align:center;">
<button type="button" class="layui-btn" id="sc-save">保存</button>
<button type="button" class="layui-btn layui-btn-primary" id="sc-cancel">取消</button>
</div>
</div>
</div>
<!-- 神龙转盘弹窗模板 -->
<div id="luckDragon-modal" style="display:none; padding: 15px;">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block">
<div id="ld-fish-select"></div>
</div>
</div>
<fieldset class="layui-elem-field">
<legend>外圈配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="ld-add-outer"><i class="layui-icon layui-icon-add-1"></i> 添加外圈配置</button>
</div>
<table id="table-ld-outer" lay-filter="table-ld-outer"></table>
</fieldset>
<fieldset class="layui-elem-field">
<legend>中圈配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="ld-add-middle"><i class="layui-icon layui-icon-add-1"></i> 添加中圈配置</button>
</div>
<table id="table-ld-middle" lay-filter="table-ld-middle"></table>
</fieldset>
<fieldset class="layui-elem-field">
<legend>内圈配置</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="ld-add-inner"><i class="layui-icon layui-icon-add-1"></i> 添加内圈配置</button>
</div>
<table id="table-ld-inner" lay-filter="table-ld-inner"></table>
</fieldset>
<div class="layui-form-item" style="margin-top:15px; text-align:center;">
<button type="button" class="layui-btn" id="ld-save">保存</button>
<button type="button" class="layui-btn layui-btn-primary" id="ld-cancel">取消</button>
<button type="button" class="layui-btn layui-btn-danger" id="ld-delete" style="float:right;">删除</button>
</div>
</div>
</div>
<!-- 幸运飞碟弹窗模板 -->
<div id="luckFlyDisk-modal" style="display:none; padding: 15px;">
<div class="layui-form">
<div class="layui-form-item">
<label class="layui-form-label">鱼编号列表</label>
<div class="layui-input-block">
<div id="lfd-fish-select"></div>
</div>
</div>
<fieldset class="layui-elem-field">
<legend>内层选项列表</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="lfd-add-inner"><i class="layui-icon layui-icon-add-1"></i> 添加内层选项</button>
</div>
<table id="table-lfd-inner" lay-filter="table-lfd-inner"></table>
</fieldset>
<fieldset class="layui-elem-field">
<legend>外层选项列表</legend>
<div class="layui-form-item">
<button type="button" class="layui-btn layui-btn-sm" id="lfd-add-outer"><i class="layui-icon layui-icon-add-1"></i> 添加外层选项</button>
</div>
<table id="table-lfd-outer" lay-filter="table-lfd-outer"></table>
</fieldset>
<div class="layui-form-item" style="margin-top:15px; text-align:center;">
<button type="button" class="layui-btn" id="lfd-save">保存</button>
<button type="button" class="layui-btn layui-btn-primary" id="lfd-cancel">取消</button>
<button type="button" class="layui-btn layui-btn-danger" id="lfd-delete" style="float:right;">删除</button>
</div>
</div>
</div>
<script type="text/html" id="option-toolbar">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="batchdel">批量删除</button>
</div>
</script>
<script type="text/html" id="option-bar">
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a>
</script>
<script type="text/html" id="prob-toolbar">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="batchdel">批量删除</button>
</div>
</script>
<script>
layui.use(['admin', 'table', 'form', 'element', 'layer'], function () {
if (window._bossInitialized) return;
window._bossInitialized = true;
var $ = layui.$,
admin = layui.admin,
table = layui.table,
form = layui.form,
element = layui.element,
layer = layui.layer,
setter = layui.setter;
var gameConfig = null;
var fishTypeList = [];
var fullFishTypeList = [];
var fishSelects = {};
var tableDataCache = {
luckPokerOption: [],
luckFlyDiskInner: [],
luckFlyDiskOuter: [],
interstellarCruiseCount: [],
flameStormCount: [],
bombCount: []
};
var luckWheelItemsCache = [];
var probabilityItemsCache = [];
var probParamsCache = [];
var deathConfigCaches = {
interstellarCruise: { oneDeath: [], twoDeath: [], threeDeath: [] },
flameStorm: { oneDeath: [], twoDeath: [] },
bomb: { oneDeath: [], twoDeath: [] }
};
var currentProbEditIndex = -1;
var probFishSelect = null;
var currentLuckWheelIndex = -1;
var luckWheelFishSelect = null;
var luckWheelOptionCache = [];
var luckWheelCountCache = [];
var luckDragonItemsCache = [];
var currentLuckDragonIndex = -1;
var luckDragonFishSelect = null;
var luckDragonOuterCache = [];
var luckDragonMiddleCache = [];
var luckDragonInnerCache = [];
var luckFlyDiskItemsCache = [];
var currentLuckFlyDiskIndex = -1;
var luckFlyDiskFishSelect = null;
var luckFlyDiskInnerCache = [];
var luckFlyDiskOuterCache = [];
var currentDeathConfigType = '';
var deathCountCache = [];
setTimeout(function() {
if (window.parent && window.parent.$ && window.parent.layer) {
window.parent.$('.layui-layer-shade').remove();
window.parent.layer.closeAll();
}
$('.layui-layer-shade').remove();
layer.closeAll();
}, 100);
function getFishScene(fishNum) {
var num = parseInt(fishNum);
if (num >= 11000 && num < 12000 || num >= 32000 && num < 33000) return '风雷之渊';
if (num >= 12000 && num < 13000 || num >= 30000 && num < 31000) return '星际迷航';
if (num >= 13000 && num < 14000 || num >= 31000 && num < 32000) return '黑神话悟空';
if (num >= 15000 && num < 16000) return '永夜尸城';
return '其他';
}
function getFishDisplayNames(fishNumbers) {
return fishNumbers.map(function(f) {
var ft = fullFishTypeList.find(function(t) { return t.value === f; })
|| fishTypeList.find(function(t) { return t.value === f; });
return ft ? ft.name : f;
}).join(', ');
}
function buildFishTypeList() {
var configs = gameConfig.FishTypeConfigs || gameConfig.fishTypeConfigs || [];
if (configs.length > 0) {
var all = configs
.filter(function(item) {
var fishType = item.FishType || item.fishType || 0;
return fishType === 2 || fishType === 4 || fishType === 5;
})
.map(function(item) {
var fishNum = item.FishNumber || item.fishNumber || '';
var fishName = item.FishName || item.fishName || '';
return { name: fishName + ' (' + fishNum + ')', value: fishNum, scene: getFishScene(fishNum) };
});
fullFishTypeList = all;
fishTypeList = all.slice();
}
}
function initFishSelects() {
var selectNames = [
'luckPoker_fishNumber',
'fullScreen_fishNumber', 'range_fishNumber',
'interstellarCruise_fishNumber', 'flameStorm_fishNumber', 'bomb_fishNumber', 'scorpion_fishNumber'
];
selectNames.forEach(function(name) {
if (fishSelects[name]) {
fishSelects[name].update({ data: fishTypeList });
} else {
fishSelects[name] = xmSelect.render({
el: '#' + name,
name: name,
toolbar: { show: true, confirm: true },
data: fishTypeList,
empty: '无数据',
filterable: true,
pageEmptyShow: false
});
}
});
}
function setFishSelectValue(name, values) {
if (fishSelects[name]) {
fishSelects[name].setValue(values || []);
}
}
function getFishSelectValue(name) {
if (fishSelects[name]) {
return fishSelects[name].getValue('value');
}
return [];
}
function initSceneFilter() {
var scenes = [...new Set(fullFishTypeList.map(function(item) { return item.scene; }))];
var sceneData = scenes.map(function(s) { return { name: s, value: s }; });
sceneFilterSelect = xmSelect.render({
el: '#scene-filter',
name: 'scene-filter',
toolbar: { show: true, confirm: true },
data: sceneData,
empty: '无数据',
filterable: true,
pageEmptyShow: false,
on: {
change: function() {
applySceneFilter();
}
}
});
}
function applySceneFilter() {
var selectedScenes = sceneFilterSelect ? sceneFilterSelect.getValue('value') : [];
fishTypeList = selectedScenes.length === 0
? fullFishTypeList.slice()
: fullFishTypeList.filter(function(item) {
return selectedScenes.indexOf(item.scene) > -1;
});
var selectNames = [
'luckPoker_fishNumber',
'fullScreen_fishNumber', 'range_fishNumber',
'interstellarCruise_fishNumber', 'flameStorm_fishNumber', 'bomb_fishNumber', 'scorpion_fishNumber'
];
selectNames.forEach(function(name) {
if (fishSelects[name]) {
fishSelects[name].update({ data: fishTypeList });
}
});
if (probFishSelect) probFishSelect.update({ data: fishTypeList });
if (luckWheelFishSelect) luckWheelFishSelect.update({ data: fishTypeList });
if (luckDragonFishSelect) luckDragonFishSelect.update({ data: fishTypeList });
if (luckFlyDiskFishSelect) luckFlyDiskFishSelect.update({ data: fishTypeList });
}
function getFieldValue(obj, fieldName) {
if (!obj) return null;
var camelCase = fieldName.charAt(0).toLowerCase() + fieldName.slice(1);
var pascalCase = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
var lower = fieldName.toLowerCase();
return obj[pascalCase] || obj[camelCase] || obj[fieldName] || obj[lower] || obj[lower.replace(/list$/, 'List')] || obj[lower.replace(/list$/, 'List').replace(/^([a-z])/, function(m) { return m.toUpperCase(); })];
}
function loadConfig() {
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig",
done: function (res) {
if (res.code === 0 && res.data) {
gameConfig = res.data;
buildFishTypeList();
initFishSelects();
initSceneFilter();
fillForms();
renderTables();
renderLuckWheelList();
renderLuckDragonList();
renderLuckFlyDiskList();
renderDeathConfigs();
initProbabilityCache();
renderProbabilityList();
}
}
});
}
function fillForms() {
var b = gameConfig.bossConfigs || {};
// 小丑扑克
if (b.luckPoker) {
setFishSelectValue('luckPoker_fishNumber', getFieldValue(b.luckPoker, 'fishNumber'));
}
// 幸运飞碟 - 已改为列表模式,不再需要设置单鱼编号
// 全屏秒怪
if (b.fullScreen) {
setFishSelectValue('fullScreen_fishNumber', getFieldValue(b.fullScreen, 'fishNumber'));
}
// 范围秒怪
if (b.range) {
setFishSelectValue('range_fishNumber', getFieldValue(b.range, 'fishNumber'));
}
// 星际巡航
if (b.interstellarCruise) {
setFishSelectValue('interstellarCruise_fishNumber', getFieldValue(b.interstellarCruise, 'fishNumber'));
}
// 烈焰风暴
if (b.flameStorm) {
setFishSelectValue('flameStorm_fishNumber', getFieldValue(b.flameStorm, 'fishNumber'));
}
// 破坏球
if (b.bomb) {
setFishSelectValue('bomb_fishNumber', getFieldValue(b.bomb, 'fishNumber'));
}
// 机械蝎
if (b.scorpion) {
setFishSelectValue('scorpion_fishNumber', getFieldValue(b.scorpion, 'fishNumber'));
}
}
function renderTables() {
var b = gameConfig.bossConfigs || {};
var luckPoker = getFieldValue(b, 'LuckPoker');
tableDataCache.luckPokerOption = getFieldValue(luckPoker, 'OptionList') || [];
// 幸运飞碟 - 已改为列表模式,不再需要设置单鱼编号
// 渲染表格
renderOptionTable('table-luckPoker-option', tableDataCache.luckPokerOption);
}
function renderOptionTable(elemId, data) {
table.render({
elem: '#' + elemId,
data: data,
cols: [[
{ type: 'checkbox' },
{ field: "optionId", title: "选项编号", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ field: "score", title: "分值", width: 150, edit: 'text' },
{ title: "操作", width: 80, fixed: 'right', toolbar: '#option-bar' }
]],
toolbar: '#option-toolbar',
page: false
});
}
function renderCountTable(elemId, data) {
table.render({
elem: '#' + elemId,
data: data,
cols: [[
{ type: 'checkbox' },
{ field: "count", title: "死亡次数", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ field: "killRate", title: "击杀权重", width: 150, edit: 'text' },
{ title: "操作", width: 80, fixed: 'right', toolbar: '#option-bar' }
]],
toolbar: '#option-toolbar',
page: false
});
}
// ============ 幸运轮盘列表 ============
function renderLuckWheelList() {
var container = $('#luckWheel-list');
container.empty();
var b = gameConfig.bossConfigs || {};
luckWheelItemsCache = getFieldValue(b, 'luckWheel') || [];
if (luckWheelItemsCache.length === 0) {
container.html('<div style="text-align: center; color: #999; padding: 20px;">暂无幸运轮盘配置,点击上方按钮添加</div>');
return;
}
luckWheelItemsCache.forEach(function(item, index) {
renderLuckWheelItem(item, index);
});
}
function renderLuckWheelItem(item, index) {
var container = $('#luckWheel-list');
var fishNumbers = getFieldValue(item, 'fishNumber') || [];
var optionList = getFieldValue(item, 'optionList') || [];
var countList = getFieldValue(item, 'countList') || [];
var fishName = '未选择鱼';
if (fishNumbers.length > 0) {
var ft = fishTypeList.find(function(t) { return t.value === fishNumbers[0]; });
fishName = ft ? ft.name : fishNumbers[0];
}
var fishHtml = fishNumbers.length > 0
? fishNumbers.map(function(f) {
var ft = fishTypeList.find(function(t) { return t.value === f; });
return '<span class="fish-name-tag">' + (ft ? ft.name : f) + '</span>';
}).join(' ')
: '<span class="empty-hint">未选择鱼</span>';
var html = '<div class="probability-card" data-index="' + index + '">';
html += '<div class="card-header">';
html += '<span>幸运轮盘 - ' + fishName + '</span>';
html += '<span style="color: #009688; font-size: 12px;">点击查看详情</span>';
html += '</div>';
html += '<div class="card-fish"><strong>鱼编号:</strong> ' + (fishNumbers.length > 0 ? getFishDisplayNames(fishNumbers) : '<span class="empty-hint">未选择</span>') + '</div>';
html += '<div class="card-params">选项: ' + optionList.length + ' 条 | 数量: ' + countList.length + ' 条</div>';
html += '</div>';
container.append(html);
}
$(document).on('click', '#add-luckWheel-item', function() {
openLuckWheelModal(-1);
});
$(document).on('click', '#luckWheel-list .probability-card', function(e) {
if ($(e.target).closest('button').length > 0) return;
var index = parseInt($(this).data('index'));
openLuckWheelModal(index);
});
function openLuckWheelModal(index) {
currentLuckWheelIndex = index;
var isEdit = index >= 0;
var data;
if (isEdit) {
data = luckWheelItemsCache[index];
if (!data) {
layer.msg('数据不存在');
return;
}
} else {
data = { fishNumber: [], optionList: [], countList: [] };
}
var fishNumbers = getFieldValue(data, 'fishNumber') || [];
luckWheelOptionCache = JSON.parse(JSON.stringify(getFieldValue(data, 'optionList') || []));
luckWheelCountCache = JSON.parse(JSON.stringify(getFieldValue(data, 'countList') || []));
var modalHtml = $('#luckWheel-modal').html();
layer.open({
type: 1,
title: isEdit ? '编辑幸运轮盘配置' : '添加幸运轮盘配置',
area: ['900px', '700px'],
content: modalHtml,
success: function(layero, idx) {
setTimeout(function() {
luckWheelFishSelect = xmSelect.render({
el: layero.find('#lw-fish-select')[0],
data: fishTypeList,
empty: '无数据',
filterable: true,
pageEmptyShow: false
});
if (fishNumbers.length > 0) {
luckWheelFishSelect.setValue(fishNumbers);
}
renderLuckWheelOptionTable(layero);
renderLuckWheelCountTable(layero);
}, 100);
}
});
}
function renderLuckWheelOptionTable(layero) {
var $elem = layero.find('#table-lw-option');
$elem.attr('lay-filter', 'table-lw-option');
console.log('[幸运轮盘-选项] rendering table, lay-filter:', $elem.attr('lay-filter'));
table.render({
elem: $elem[0],
id: 'table-lw-option',
data: luckWheelOptionCache,
cols: [[
{ type: 'checkbox' },
{ field: "optionId", title: "选项编号", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ field: "score", title: "分值", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
function renderLuckWheelCountTable(layero) {
var $elem = layero.find('#table-lw-count');
$elem.attr('lay-filter', 'table-lw-count');
console.log('[幸运轮盘-数量] rendering table, lay-filter:', $elem.attr('lay-filter'));
table.render({
elem: $elem[0],
id: 'table-lw-count',
data: luckWheelCountCache,
cols: [[
{ type: 'checkbox' },
{ field: "optionId", title: "选项编号", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ field: "score", title: "分值", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
// 幸运轮盘弹窗事件
$(document).on('click', '#lw-add-option', function() {
luckWheelOptionCache.push({ optionId: luckWheelOptionCache.length + 1, triggerRate: 10, score: 0 });
var layero = $('.layui-layer-page');
renderLuckWheelOptionTable(layero);
});
$(document).on('click', '#lw-add-count', function() {
luckWheelCountCache.push({ optionId: luckWheelCountCache.length + 1, triggerRate: 10, score: 0 });
var layero = $('.layui-layer-page');
renderLuckWheelCountTable(layero);
});
$(document).on('click', '#lw-cancel', function() {
layer.closeAll('page');
});
$(document).on('click', '#lw-delete', function() {
if (currentLuckWheelIndex >= 0) {
layer.confirm('确定要删除此幸运轮盘配置吗?', function(idx) {
luckWheelItemsCache.splice(currentLuckWheelIndex, 1);
layer.closeAll('page');
renderLuckWheelList();
layer.msg('删除成功');
layer.close(idx);
});
}
});
$(document).on('click', '#lw-save', function() {
var fishNumbers = luckWheelFishSelect ? luckWheelFishSelect.getValue('value') : [];
var newData = {
fishNumber: fishNumbers,
optionList: luckWheelOptionCache,
countList: luckWheelCountCache
};
if (currentLuckWheelIndex >= 0) {
luckWheelItemsCache[currentLuckWheelIndex] = newData;
} else {
luckWheelItemsCache.push(newData);
}
layer.closeAll('page');
renderLuckWheelList();
layer.msg('保存成功');
});
table.on('edit(table-lw-option)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-lw-option)', function(obj) {
console.log('[幸运轮盘-选项] tool event triggered:', obj.event, obj.data);
if (obj.event === 'del') {
console.log('[幸运轮盘-选项] deleting item:', obj.data);
console.log('[幸运轮盘-选项] cache before:', JSON.stringify(luckWheelOptionCache));
var targetId = obj.data.optionId;
var i = luckWheelOptionCache.findIndex(function(item) {
console.log('[幸运轮盘-选项] comparing:', item.optionId, 'vs', targetId);
return item.optionId === targetId;
});
console.log('[幸运轮盘-选项] findIndex result:', i);
if (i !== -1) {
luckWheelOptionCache.splice(i, 1);
console.log('[幸运轮盘-选项] deleted, remaining:', luckWheelOptionCache.length);
var layero = $('.layui-layer-page');
renderLuckWheelOptionTable(layero);
} else {
console.log('[幸运轮盘-选项] item not found in cache!');
}
}
});
table.on('edit(table-lw-count)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-lw-count)', function(obj) {
console.log('[幸运轮盘-数量] tool event triggered:', obj.event, obj.data);
if (obj.event === 'del') {
console.log('[幸运轮盘-数量] deleting item:', obj.data);
var i = luckWheelCountCache.findIndex(function(item) { return item.optionId === obj.data.optionId; });
if (i !== -1) {
luckWheelCountCache.splice(i, 1);
console.log('[幸运轮盘-数量] deleted, remaining:', luckWheelCountCache.length);
var layero = $('.layui-layer-page');
renderLuckWheelCountTable(layero);
}
}
});
// ============ 神龙转盘列表 ============
function renderLuckDragonList() {
var container = $('#luckDragon-list');
container.empty();
var b = gameConfig.bossConfigs || {};
var raw = getFieldValue(b, 'luckDragon');
luckDragonItemsCache = Array.isArray(raw) ? raw : [];
if (luckDragonItemsCache.length === 0) {
container.html('<div style="text-align: center; color: #999; padding: 20px;">暂无神龙转盘配置,点击上方按钮添加</div>');
return;
}
luckDragonItemsCache.forEach(function(item, index) {
renderLuckDragonItem(item, index);
});
}
function renderLuckDragonItem(item, index) {
var container = $('#luckDragon-list');
var fishNumbers = getFieldValue(item, 'fishNumber') || [];
var outerConfig = getFieldValue(item, 'outerConfig') || [];
var middleConfig = getFieldValue(item, 'middleConfig') || [];
var innerConfig = getFieldValue(item, 'innerConfig') || [];
var fishName = '未选择鱼';
if (fishNumbers.length > 0) {
var ft = fishTypeList.find(function(t) { return t.value === fishNumbers[0]; });
fishName = ft ? ft.name : fishNumbers[0];
}
var html = '<div class="probability-card" data-index="' + index + '">';
html += '<div class="card-header">';
html += '<span>神龙转盘 - ' + fishName + '</span>';
html += '<span style="color: #009688; font-size: 12px;">点击查看详情</span>';
html += '</div>';
html += '<div class="card-fish"><strong>鱼编号:</strong> ' + (fishNumbers.length > 0 ? getFishDisplayNames(fishNumbers) : '<span class="empty-hint">未选择</span>') + '</div>';
html += '<div class="card-params">外圈: ' + outerConfig.length + ' 条 | 中圈: ' + middleConfig.length + ' 条 | 内圈: ' + innerConfig.length + ' 条</div>';
html += '</div>';
container.append(html);
}
$(document).on('click', '#add-luckDragon-item', function() {
openLuckDragonModal(-1);
});
$(document).on('click', '#luckDragon-list .probability-card', function(e) {
if ($(e.target).closest('button').length > 0) return;
var index = parseInt($(this).data('index'));
openLuckDragonModal(index);
});
function openLuckDragonModal(index) {
currentLuckDragonIndex = index;
var isEdit = index >= 0;
var data;
console.log('[神龙转盘] 打开弹窗, index:', index, 'isEdit:', isEdit);
if (isEdit) {
data = luckDragonItemsCache[index];
if (!data) {
layer.msg('数据不存在');
return;
}
} else {
data = { fishNumber: [], outerConfig: [], middleConfig: [], innerConfig: [] };
}
var fishNumbers = getFieldValue(data, 'fishNumber') || [];
luckDragonOuterCache = JSON.parse(JSON.stringify(getFieldValue(data, 'outerConfig') || []));
luckDragonMiddleCache = JSON.parse(JSON.stringify(getFieldValue(data, 'middleConfig') || []));
luckDragonInnerCache = JSON.parse(JSON.stringify(getFieldValue(data, 'innerConfig') || []));
console.log('[神龙转盘] 数据加载完成:', {
fishNumbers: fishNumbers,
outerConfig: luckDragonOuterCache,
middleConfig: luckDragonMiddleCache,
innerConfig: luckDragonInnerCache
});
var modalHtml = $('#luckDragon-modal').html();
layer.open({
type: 1,
title: isEdit ? '编辑神龙转盘配置' : '添加神龙转盘配置',
area: ['900px', '700px'],
content: modalHtml,
success: function(layero, idx) {
setTimeout(function() {
luckDragonFishSelect = xmSelect.render({
el: layero.find('#ld-fish-select')[0],
data: fishTypeList,
empty: '无数据',
filterable: true,
pageEmptyShow: false
});
if (fishNumbers.length > 0) {
luckDragonFishSelect.setValue(fishNumbers);
}
console.log('[神龙转盘] 开始渲染表格');
renderLuckDragonOuterTable(layero);
renderLuckDragonMiddleTable(layero);
renderLuckDragonInnerTable(layero);
}, 100);
}
});
}
function renderLuckDragonOuterTable(layero) {
var $elem = layero.find('#table-ld-outer');
$elem.attr('lay-filter', 'table-ld-outer');
console.log('[神龙转盘-外圈] 渲染表格, elem:', $elem.length, 'data:', luckDragonOuterCache);
table.render({
elem: $elem[0],
id: 'table-ld-outer',
data: luckDragonOuterCache,
cols: [[
{ type: 'checkbox' },
{ field: "min", title: "最小值", width: 150, edit: 'text' },
{ field: "max", title: "最大值", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false,
done: function(res) {
console.log('[神龙转盘-外圈] 表格渲染完成:', res);
}
});
}
function renderLuckDragonMiddleTable(layero) {
var $elem = layero.find('#table-ld-middle');
$elem.attr('lay-filter', 'table-ld-middle');
console.log('[神龙转盘-中圈] 渲染表格, elem:', $elem.length, 'data:', luckDragonMiddleCache);
table.render({
elem: $elem[0],
id: 'table-ld-middle',
data: luckDragonMiddleCache,
cols: [[
{ type: 'checkbox' },
{ field: "min", title: "最小值", width: 150, edit: 'text' },
{ field: "max", title: "最大值", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false,
done: function(res) {
console.log('[神龙转盘-中圈] 表格渲染完成:', res);
}
});
}
function renderLuckDragonInnerTable(layero) {
var $elem = layero.find('#table-ld-inner');
$elem.attr('lay-filter', 'table-ld-inner');
console.log('[神龙转盘-内圈] 渲染表格, elem:', $elem.length, 'data:', luckDragonInnerCache);
table.render({
elem: $elem[0],
id: 'table-ld-inner',
data: luckDragonInnerCache,
cols: [[
{ type: 'checkbox' },
{ field: "min", title: "最小值", width: 150, edit: 'text' },
{ field: "max", title: "最大值", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false,
done: function(res) {
console.log('[神龙转盘-内圈] 表格渲染完成:', res);
}
});
}
$(document).on('click', '#ld-add-outer', function() {
luckDragonOuterCache.push({ min: 0, max: 0, triggerRate: 10 });
var layero = $('.layui-layer-page');
renderLuckDragonOuterTable(layero);
});
$(document).on('click', '#ld-add-middle', function() {
luckDragonMiddleCache.push({ min: 0, max: 0, triggerRate: 10 });
var layero = $('.layui-layer-page');
renderLuckDragonMiddleTable(layero);
});
$(document).on('click', '#ld-add-inner', function() {
luckDragonInnerCache.push({ min: 0, max: 0, triggerRate: 10 });
var layero = $('.layui-layer-page');
renderLuckDragonInnerTable(layero);
});
$(document).on('click', '#ld-cancel', function() {
layer.closeAll('page');
});
$(document).on('click', '#ld-delete', function() {
if (currentLuckDragonIndex >= 0) {
layer.confirm('确定要删除此神龙转盘配置吗?', function(idx) {
luckDragonItemsCache.splice(currentLuckDragonIndex, 1);
layer.closeAll('page');
renderLuckDragonList();
layer.msg('删除成功');
layer.close(idx);
});
}
});
$(document).on('click', '#ld-save', function() {
var fishNumbers = luckDragonFishSelect ? luckDragonFishSelect.getValue('value') : [];
var newData = {
fishNumber: fishNumbers,
outerConfig: luckDragonOuterCache,
middleConfig: luckDragonMiddleCache,
innerConfig: luckDragonInnerCache
};
if (currentLuckDragonIndex >= 0) {
luckDragonItemsCache[currentLuckDragonIndex] = newData;
} else {
luckDragonItemsCache.push(newData);
}
layer.closeAll('page');
renderLuckDragonList();
layer.msg('保存成功');
});
// 神龙转盘三层表格编辑和删除事件
table.on('edit(table-ld-outer)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-ld-outer)', function(obj) {
if (obj.event === 'del') {
var i = luckDragonOuterCache.indexOf(obj.data);
if (i !== -1) {
luckDragonOuterCache.splice(i, 1);
var layero = $('.layui-layer-page');
renderLuckDragonOuterTable(layero);
}
}
});
table.on('edit(table-ld-middle)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-ld-middle)', function(obj) {
if (obj.event === 'del') {
var i = luckDragonMiddleCache.indexOf(obj.data);
if (i !== -1) {
luckDragonMiddleCache.splice(i, 1);
var layero = $('.layui-layer-page');
renderLuckDragonMiddleTable(layero);
}
}
});
table.on('edit(table-ld-inner)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-ld-inner)', function(obj) {
if (obj.event === 'del') {
var i = luckDragonInnerCache.indexOf(obj.data);
if (i !== -1) {
luckDragonInnerCache.splice(i, 1);
var layero = $('.layui-layer-page');
renderLuckDragonInnerTable(layero);
}
}
});
// ============ 幸运飞碟列表 ============
function renderLuckFlyDiskList() {
var container = $('#luckFlyDisk-list');
container.empty();
var b = gameConfig.bossConfigs || {};
luckFlyDiskItemsCache = getFieldValue(b, 'luckFlyDisk') || [];
if (luckFlyDiskItemsCache.length === 0) {
container.html('<div style="text-align: center; color: #999; padding: 20px;">暂无幸运飞碟配置,点击上方按钮添加</div>');
return;
}
luckFlyDiskItemsCache.forEach(function(item, index) {
renderLuckFlyDiskItem(item, index);
});
}
function renderLuckFlyDiskItem(item, index) {
var container = $('#luckFlyDisk-list');
var fishNumbers = getFieldValue(item, 'fishNumber') || [];
var innerList = getFieldValue(item, 'innerOptionList') || [];
var outerList = getFieldValue(item, 'outerOptionList') || [];
var fishName = '未选择鱼';
if (fishNumbers.length > 0) {
var ft = fishTypeList.find(function(t) { return t.value === fishNumbers[0]; });
fishName = ft ? ft.name : fishNumbers[0];
}
var html = '<div class="probability-card" data-index="' + index + '">';
html += '<div class="card-header">';
html += '<span>幸运飞碟 - ' + fishName + '</span>';
html += '<span style="color: #009688; font-size: 12px;">点击查看详情</span>';
html += '</div>';
html += '<div class="card-fish"><strong>鱼编号:</strong> ' + (fishNumbers.length > 0 ? getFishDisplayNames(fishNumbers) : '<span class="empty-hint">未选择</span>') + '</div>';
html += '<div class="card-params">内层: ' + innerList.length + ' 条 | 外层: ' + outerList.length + ' 条</div>';
html += '</div>';
container.append(html);
}
$(document).on('click', '#add-luckFlyDisk-item', function() {
openLuckFlyDiskModal(-1);
});
$(document).on('click', '#luckFlyDisk-list .probability-card', function(e) {
if ($(e.target).closest('button').length > 0) return;
var index = parseInt($(this).data('index'));
openLuckFlyDiskModal(index);
});
function openLuckFlyDiskModal(index) {
currentLuckFlyDiskIndex = index;
var isEdit = index >= 0;
var data;
if (isEdit) {
data = luckFlyDiskItemsCache[index];
if (!data) {
layer.msg('数据不存在');
return;
}
} else {
data = { fishNumber: [], innerOptionList: [], outerOptionList: [] };
}
var fishNumbers = getFieldValue(data, 'fishNumber') || [];
luckFlyDiskInnerCache = JSON.parse(JSON.stringify(getFieldValue(data, 'innerOptionList') || []));
luckFlyDiskOuterCache = JSON.parse(JSON.stringify(getFieldValue(data, 'outerOptionList') || []));
var modalHtml = $('#luckFlyDisk-modal').html();
layer.open({
type: 1,
title: isEdit ? '编辑幸运飞碟配置' : '添加幸运飞碟配置',
area: ['900px', '700px'],
content: modalHtml,
success: function(layero, idx) {
setTimeout(function() {
luckFlyDiskFishSelect = xmSelect.render({
el: layero.find('#lfd-fish-select')[0],
data: fishTypeList,
empty: '无数据',
filterable: true,
pageEmptyShow: false
});
if (fishNumbers.length > 0) {
luckFlyDiskFishSelect.setValue(fishNumbers);
}
renderLuckFlyDiskInnerTable(layero);
renderLuckFlyDiskOuterTable(layero);
}, 100);
}
});
}
function renderLuckFlyDiskInnerTable(layero) {
var $elem = layero.find('#table-lfd-inner');
$elem.attr('lay-filter', 'table-lfd-inner');
console.log('[幸运飞碟-内层] rendering table, lay-filter:', $elem.attr('lay-filter'));
table.render({
elem: $elem[0],
id: 'table-lfd-inner',
data: luckFlyDiskInnerCache,
cols: [[
{ type: 'checkbox' },
{ field: "optionId", title: "选项编号", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ field: "score", title: "分值", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
function renderLuckFlyDiskOuterTable(layero) {
var $elem = layero.find('#table-lfd-outer');
$elem.attr('lay-filter', 'table-lfd-outer');
console.log('[幸运飞碟-外层] rendering table, lay-filter:', $elem.attr('lay-filter'));
table.render({
elem: $elem[0],
id: 'table-lfd-outer',
data: luckFlyDiskOuterCache,
cols: [[
{ type: 'checkbox' },
{ field: "optionId", title: "选项编号", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ field: "score", title: "分值", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
$(document).on('click', '#lfd-add-inner', function() {
luckFlyDiskInnerCache.push({ optionId: luckFlyDiskInnerCache.length + 1, triggerRate: 10, score: 0 });
var layero = $('.layui-layer-page');
renderLuckFlyDiskInnerTable(layero);
});
$(document).on('click', '#lfd-add-outer', function() {
luckFlyDiskOuterCache.push({ optionId: luckFlyDiskOuterCache.length + 1, triggerRate: 10, score: 0 });
var layero = $('.layui-layer-page');
renderLuckFlyDiskOuterTable(layero);
});
$(document).on('click', '#lfd-cancel', function() {
layer.closeAll('page');
});
$(document).on('click', '#lfd-delete', function() {
if (currentLuckFlyDiskIndex >= 0) {
layer.confirm('确定要删除此幸运飞碟配置吗?', function(idx) {
luckFlyDiskItemsCache.splice(currentLuckFlyDiskIndex, 1);
layer.closeAll('page');
renderLuckFlyDiskList();
layer.msg('删除成功');
layer.close(idx);
});
}
});
$(document).on('click', '#lfd-save', function() {
var fishNumbers = luckFlyDiskFishSelect ? luckFlyDiskFishSelect.getValue('value') : [];
var newData = {
fishNumber: fishNumbers,
innerOptionList: luckFlyDiskInnerCache,
outerOptionList: luckFlyDiskOuterCache
};
if (currentLuckFlyDiskIndex >= 0) {
luckFlyDiskItemsCache[currentLuckFlyDiskIndex] = newData;
} else {
luckFlyDiskItemsCache.push(newData);
}
layer.closeAll('page');
renderLuckFlyDiskList();
layer.msg('保存成功');
});
table.on('edit(table-lfd-inner)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-lfd-inner)', function(obj) {
console.log('[幸运飞碟-内层] tool event triggered:', obj.event, obj.data);
if (obj.event === 'del') {
console.log('[幸运飞碟-内层] deleting item:', obj.data);
var i = luckFlyDiskInnerCache.indexOf(obj.data);
if (i !== -1) {
luckFlyDiskInnerCache.splice(i, 1);
console.log('[幸运飞碟-内层] deleted, remaining:', luckFlyDiskInnerCache.length);
var layero = $('.layui-layer-page');
renderLuckFlyDiskInnerTable(layero);
}
}
});
table.on('edit(table-lfd-outer)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-lfd-outer)', function(obj) {
console.log('[幸运飞碟-外层] tool event triggered:', obj.event, obj.data);
if (obj.event === 'del') {
console.log('[幸运飞碟-外层] deleting item:', obj.data);
var i = luckFlyDiskOuterCache.indexOf(obj.data);
if (i !== -1) {
luckFlyDiskOuterCache.splice(i, 1);
console.log('[幸运飞碟-外层] deleted, remaining:', luckFlyDiskOuterCache.length);
var layero = $('.layui-layer-page');
renderLuckFlyDiskOuterTable(layero);
}
}
});
// ============ 死亡配置渲染 - 列表+弹窗 ============
function renderDeathConfigs() {
renderDeathConfig('interstellarCruise');
renderDeathConfig('flameStorm');
renderDeathConfig('bomb');
renderScorpionConfig();
}
function renderDeathConfig(type) {
var container = $('#' + type + '-death-configs');
container.empty();
var typeName = { interstellarCruise: '星际巡航', flameStorm: '烈焰风暴', bomb: '破坏球' }[type] || type;
var typeData = getFieldValue(gameConfig.bossConfigs || gameConfig.BossConfigs || {}, type) || {};
var countConfig = getFieldValue(typeData, 'countConfig') || [];
var deathConfigs = getFieldValue(typeData, 'deathConfigs') || [];
if (type === 'bomb' && deathConfigs.length === 0) {
deathConfigs = [
getFieldValue(typeData, 'oneDeathConfig') || getFieldValue(typeData, 'oneDeath') || [],
getFieldValue(typeData, 'twoDeathConfig') || getFieldValue(typeData, 'twoDeath') || []
];
}
var html = '<div class="death-config-wrapper">';
html += '<div class="probability-card death-config-card" data-type="' + type + '">';
html += '<div class="card-header">';
html += '<span>' + typeName + ' - 死亡配置</span>';
html += '<span style="color: #009688; font-size: 12px;">点击编辑</span>';
html += '</div>';
html += '<div class="card-fish"><strong>死亡次数配置:</strong> ' + countConfig.length + ' 条</div>';
html += '<div class="card-params">';
deathConfigs.forEach(function(dc, i) {
html += (i > 0 ? ' | ' : '') + '第' + (i + 1) + '次: ' + dc.length + '条';
});
html += '</div>';
html += '</div>';
html += '</div>';
container.html(html);
}
$(document).on('click', '.death-config-card', function(e) {
e.stopPropagation();
var type = $(this).data('type');
if (type === 'scorpion') return;
openDeathConfigModal(type);
});
function getDeathTitle(deathNum) {
switch(deathNum) {
case 1: return '第一次死亡配置';
case 2: return '第二次死亡配置';
case 3: return '第三次死亡配置';
default: return '第' + deathNum + '次死亡配置';
}
}
function openDeathConfigModal(type) {
currentDeathConfigType = type;
var typeName = { interstellarCruise: '星际巡航', flameStorm: '烈焰风暴', bomb: '破坏球' }[type] || type;
var typeData = getFieldValue(gameConfig.bossConfigs || gameConfig.BossConfigs || {}, type) || {};
var countConfig = getFieldValue(typeData, 'countConfig') || [];
var deathConfigs = getFieldValue(typeData, 'deathConfigs') || [];
// 破坏球后端仍为 OneDeathConfig/TwoDeathConfig 固定字段,组装成数组以便统一渲染
if (type === 'bomb' && deathConfigs.length === 0) {
deathConfigs = [
getFieldValue(typeData, 'oneDeathConfig') || getFieldValue(typeData, 'oneDeath') || [],
getFieldValue(typeData, 'twoDeathConfig') || getFieldValue(typeData, 'twoDeath') || []
];
}
deathCountCache = {
countConfig: JSON.parse(JSON.stringify(countConfig)),
deathConfigs: JSON.parse(JSON.stringify(deathConfigs))
};
var modalHtml = $('#deathConfig-modal').html();
layer.open({
type: 1,
title: '编辑' + typeName + '死亡配置',
area: ['900px', '700px'],
content: modalHtml,
success: function(layero, idx) {
setTimeout(function() {
renderDeathCountTableInModal(layero);
renderDeathParamsTableInModal(layero);
}, 100);
}
});
}
function renderDeathCountTableInModal(layero) {
var $elem = layero.find('#table-death-count');
$elem.attr('lay-filter', 'table-death-count');
console.log('[死亡配置-次数] rendering table, lay-filter:', $elem.attr('lay-filter'));
table.render({
elem: $elem[0],
id: 'table-death-count',
data: deathCountCache.countConfig || [],
cols: [[
{ type: 'checkbox' },
{ field: "count", title: "死亡次数", width: 150, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 150, edit: 'text' },
{ field: "killRate", title: "击杀权重", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
function renderDeathParamsTableInModal(layero) {
var type = currentDeathConfigType;
var container = layero.find('#death-params-container')[0];
var html = '';
var deathConfigs = deathCountCache.deathConfigs || [];
var count = deathConfigs.length;
for (var i = 1; i <= count; i++) {
var title = getDeathTitle(i);
var data = deathConfigs[i - 1] || [];
html += '<fieldset class="layui-elem-field">';
html += '<legend>' + title + ' (' + data.length + '条)</legend>';
html += '<div class="layui-form-item">';
html += '<button type="button" class="layui-btn layui-btn-sm dc-add-param" data-death="' + i + '"><i class="layui-icon layui-icon-add-1"></i> 添加</button>';
html += '</div>';
html += '<table id="table-death-' + i + '"></table>';
html += '</fieldset>';
}
container.innerHTML = html;
for (var i = 1; i <= count; i++) {
var data = deathConfigs[i - 1] || [];
var $elem = layero.find('#table-death-' + i);
$elem.attr('lay-filter', 'table-death-' + i);
table.render({
elem: $elem[0],
id: 'table-death-' + i,
data: data,
cols: [[
{ type: 'checkbox' },
{ field: "min", title: "最小值", width: 120, edit: 'text' },
{ field: "max", title: "最大值", width: 120, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 120, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
}
// 死亡配置弹窗事件
$(document).on('click', '#dc-add-count', function() {
deathCountCache.countConfig = deathCountCache.countConfig || [];
deathCountCache.countConfig.push({ count: deathCountCache.countConfig.length + 1, triggerRate: 10, killRate: 10 });
deathCountCache.deathConfigs = deathCountCache.deathConfigs || [];
deathCountCache.deathConfigs.push([]);
var layero = $('.layui-layer-page');
renderDeathCountTableInModal(layero);
renderDeathParamsTableInModal(layero);
});
$(document).on('click', '.dc-add-param', function() {
var deathNum = parseInt($(this).data('death'));
deathCountCache.deathConfigs = deathCountCache.deathConfigs || [];
if (!deathCountCache.deathConfigs[deathNum - 1]) deathCountCache.deathConfigs[deathNum - 1] = [];
deathCountCache.deathConfigs[deathNum - 1].push({ min: 0, max: 0, triggerRate: 0 });
var layero = $('.layui-layer-page');
renderDeathParamsTableInModal(layero);
});
$(document).on('click', '#dc-cancel', function() {
layer.closeAll('page');
});
$(document).on('click', '#dc-save', function() {
var type = currentDeathConfigType;
var typeData = getFieldValue(gameConfig.bossConfigs || {}, type) || {};
typeData.countConfig = deathCountCache.countConfig || [];
// 破坏球后端仍为 OneDeathConfig/TwoDeathConfig 固定字段,拆开保存
if (type === 'bomb') {
var dc = deathCountCache.deathConfigs || [];
typeData.oneDeathConfig = dc[0] || [];
typeData.twoDeathConfig = dc[1] || [];
} else {
typeData.deathConfigs = deathCountCache.deathConfigs || [];
}
if (!gameConfig.bossConfigs) gameConfig.bossConfigs = {};
gameConfig.bossConfigs[type] = typeData;
layer.closeAll('page');
renderDeathConfigs();
layer.msg('保存成功');
});
table.on('edit(table-death-count)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-death-count)', function(obj) {
if (obj.event === 'del') {
var idx = obj.tr.data('index');
if (idx !== undefined && deathCountCache.countConfig && idx < deathCountCache.countConfig.length) {
deathCountCache.countConfig.splice(idx, 1);
if (deathCountCache.deathConfigs && idx < deathCountCache.deathConfigs.length)
deathCountCache.deathConfigs.splice(idx, 1);
} else {
var byValue = (deathCountCache.countConfig || []).findIndex(function(it) { return it === obj.data; });
if (byValue !== -1) deathCountCache.countConfig.splice(byValue, 1);
if (byValue !== -1 && deathCountCache.deathConfigs && byValue < deathCountCache.deathConfigs.length)
deathCountCache.deathConfigs.splice(byValue, 1);
}
var layero = $('.layui-layer-page');
renderDeathCountTableInModal(layero);
renderDeathParamsTableInModal(layero);
}
});
for (var i = 1; i <= 3; i++) {
(function(deathNum) {
table.on('edit(table-death-' + deathNum + ')', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-death-' + deathNum + ')', function(obj) {
if (obj.event === 'del') {
var dc = (deathCountCache.deathConfigs || [])[deathNum - 1];
if (dc) {
var idx = obj.tr.data('index');
if (idx !== undefined && idx < dc.length) {
dc.splice(idx, 1);
} else {
var byValue = dc.findIndex(function(it) { return it === obj.data; });
if (byValue !== -1) dc.splice(byValue, 1);
}
}
var layero = $('.layui-layer-page');
renderDeathParamsTableInModal(layero);
}
});
})(i);
}
// ============ 机械蝎配置 - 卡片+弹窗 ============
var scorpionCountCache = [];
var scorpionItemCache = [];
var scorpionGoldCache = [];
function renderScorpionConfig() {
var container = $('#scorpion-death-configs');
container.empty();
var typeData = getFieldValue(gameConfig.bossConfigs || gameConfig.BossConfigs || {}, 'scorpion') || {};
var countConfig = getFieldValue(typeData, 'itemCountConfig') || getFieldValue(typeData, 'ItemCountConfig') || [];
var itemConfig = getFieldValue(typeData, 'itemConfig') || getFieldValue(typeData, 'ItemConfig') || [];
var goldConfig = getFieldValue(typeData, 'goldConfig') || getFieldValue(typeData, 'GoldConfig') || [];
var composite = getFieldValue(typeData, 'compositeMultiplier') || getFieldValue(typeData, 'CompositeMultiplier') || 0;
var html = '<div class="death-config-wrapper">';
html += '<div class="probability-card death-config-card" data-type="scorpion">';
html += '<div class="card-header">';
html += '<span>机械蝎 - 死亡配置</span>';
html += '<span style="color: #009688; font-size: 12px;">点击编辑</span>';
html += '</div>';
html += '<div class="card-fish"><strong>道具数量:</strong> ' + countConfig.length + ' 条</div>';
html += '<div class="card-params">';
html += '道具: ' + itemConfig.length + '条 | 金币: ' + goldConfig.length + '条';
if (composite > 0) {
html += ' | 综合倍数: ' + composite;
}
html += '</div>';
html += '</div>';
html += '</div>';
container.html(html);
}
function openScorpionModal() {
var typeData = getFieldValue(gameConfig.bossConfigs || gameConfig.BossConfigs || {}, 'scorpion') || {};
scorpionCountCache = JSON.parse(JSON.stringify(getFieldValue(typeData, 'itemCountConfig') || getFieldValue(typeData, 'ItemCountConfig') || []));
scorpionItemCache = JSON.parse(JSON.stringify(getFieldValue(typeData, 'itemConfig') || getFieldValue(typeData, 'ItemConfig') || []));
scorpionGoldCache = JSON.parse(JSON.stringify(getFieldValue(typeData, 'goldConfig') || getFieldValue(typeData, 'GoldConfig') || []));
var composite = getFieldValue(typeData, 'compositeMultiplier') || getFieldValue(typeData, 'CompositeMultiplier') || 0;
var modalHtml = $('#scorpion-modal').html();
layer.open({
type: 1,
title: '编辑机械蝎死亡配置',
area: ['950px', '760px'],
content: modalHtml,
success: function(layero, idx) {
setTimeout(function() {
$('#sc-composite-multiplier').val(composite || '');
renderScorpionCountTableInModal(layero);
renderScorpionItemTableInModal(layero);
renderScorpionGoldTableInModal(layero);
}, 100);
}
});
}
function renderScorpionCountTableInModal(layero) {
var $elem = layero.find('#table-sc-count');
$elem.attr('lay-filter', 'table-sc-count');
table.render({
elem: $elem[0],
id: 'table-sc-count',
data: scorpionCountCache,
cols: [[
{ type: 'checkbox' },
{ field: "count", title: "道具数量", width: 150, edit: 'text' },
{ field: "weight", title: "权重", width: 150, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
function renderScorpionItemTableInModal(layero) {
var $elem = layero.find('#table-sc-item');
$elem.attr('lay-filter', 'table-sc-item');
table.render({
elem: $elem[0],
id: 'table-sc-item',
data: scorpionItemCache,
cols: [[
{ type: 'checkbox' },
{ field: "propNumber", title: "道具编号", width: 120, edit: 'text' },
{ field: "count", title: "数量", width: 120, edit: 'text' },
{ field: "weight", title: "权重", width: 120, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
function renderScorpionGoldTableInModal(layero) {
var $elem = layero.find('#table-sc-gold');
$elem.attr('lay-filter', 'table-sc-gold');
table.render({
elem: $elem[0],
id: 'table-sc-gold',
data: scorpionGoldCache,
cols: [[
{ type: 'checkbox' },
{ field: "min", title: "最小倍数", width: 120, edit: 'text' },
{ field: "max", title: "最大倍数", width: 120, edit: 'text' },
{ field: "triggerRate", title: "权重", width: 120, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
$(document).on('click', '.death-config-card[data-type="scorpion"]', function(e) {
e.stopPropagation();
openScorpionModal();
});
$(document).on('click', '#sc-add-count', function() {
scorpionCountCache.push({ count: 0, weight: 0 });
var layero = $('.layui-layer-page');
renderScorpionCountTableInModal(layero);
});
$(document).on('click', '#sc-add-item', function() {
scorpionItemCache.push({ propNumber: '', count: 0, weight: 0 });
var layero = $('.layui-layer-page');
renderScorpionItemTableInModal(layero);
});
$(document).on('click', '#sc-add-gold', function() {
scorpionGoldCache.push({ min: 0, max: 0, triggerRate: 0 });
var layero = $('.layui-layer-page');
renderScorpionGoldTableInModal(layero);
});
$(document).on('click', '#sc-cancel', function() {
layer.closeAll('page');
});
$(document).on('click', '#sc-save', function() {
var typeData = getFieldValue(gameConfig.bossConfigs || gameConfig.BossConfigs || {}, 'scorpion') || {};
typeData.itemCountConfig = scorpionCountCache;
typeData.itemConfig = scorpionItemCache;
typeData.goldConfig = scorpionGoldCache;
typeData.compositeMultiplier = parseFloat($('#sc-composite-multiplier').val()) || 0;
if (!gameConfig.bossConfigs) gameConfig.bossConfigs = {};
gameConfig.bossConfigs.scorpion = typeData;
layer.closeAll('page');
renderScorpionConfig();
layer.msg('保存成功');
});
table.on('edit(table-sc-count)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-sc-count)', function(obj) {
if (obj.event === 'del') {
var idx = scorpionCountCache.indexOf(obj.data);
if (idx !== -1) {
scorpionCountCache.splice(idx, 1);
var layero = $('.layui-layer-page');
renderScorpionCountTableInModal(layero);
}
}
});
table.on('edit(table-sc-item)', function(obj) {
if (obj.field === 'propNumber') {
obj.data[obj.field] = obj.value;
return;
}
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-sc-item)', function(obj) {
if (obj.event === 'del') {
var idx = scorpionItemCache.indexOf(obj.data);
if (idx !== -1) {
scorpionItemCache.splice(idx, 1);
var layero = $('.layui-layer-page');
renderScorpionItemTableInModal(layero);
}
}
});
table.on('edit(table-sc-gold)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-sc-gold)', function(obj) {
if (obj.event === 'del') {
var idx = scorpionGoldCache.indexOf(obj.data);
if (idx !== -1) {
scorpionGoldCache.splice(idx, 1);
var layero = $('.layui-layer-page');
renderScorpionGoldTableInModal(layero);
}
}
});
// ============ 概率击杀配置 - 卡片列表+弹窗 ============
function renderProbabilityList() {
var container = $('#probability-list');
container.empty();
if (probabilityItemsCache.length === 0) {
container.html('<div style="text-align: center; color: #999; padding: 40px; font-size: 14px;">暂无概率配置,点击上方按钮添加</div>');
return;
}
probabilityItemsCache.forEach(function(item, index) {
var fishNumbers = getFieldValue(item, 'fishNumber') || [];
var params = getFieldValue(item, 'configParams') || [];
var fishName = '未选择鱼';
if (fishNumbers.length > 0) {
var ft = fishTypeList.find(function(t) { return t.value === fishNumbers[0]; });
fishName = ft ? ft.name : fishNumbers[0];
}
var paramsSummary = params.length > 0
? '参数: ' + params.length + ' 条'
: '<span class="empty-hint">无参数</span>';
var html = '<div class="probability-card" data-index="' + index + '">';
html += '<div class="card-header">';
html += '<span>' + fishName + ' 配置</span>';
html += '<span style="color: #009688; font-size: 12px;">点击查看详情</span>';
html += '</div>';
html += '<div class="card-fish"><strong>鱼编号:</strong> ' + (fishNumbers.length > 0 ? getFishDisplayNames(fishNumbers) : '<span class="empty-hint">未选择</span>') + '</div>';
html += '<div class="card-params">' + paramsSummary + '</div>';
html += '</div>';
container.append(html);
});
}
// 概率配置卡片点击
$(document).on('click', '#probability-list .probability-card', function(e) {
if ($(e.target).closest('button').length > 0) return;
var index = parseInt($(this).data('index'));
openProbabilityModal(index);
});
// 添加按钮
$(document).on('click', '#add-probability-item', function() {
openProbabilityModal(-1);
});
function openProbabilityModal(index) {
currentProbEditIndex = index;
var modalHtml = $('#probability-modal').html();
var isEdit = index >= 0;
if (isEdit) {
var data = probabilityItemsCache[index];
if (!data) {
layer.msg('数据不存在');
return;
}
var fishNumbers = getFieldValue(data, 'fishNumber') || [];
probParamsCache = JSON.parse(JSON.stringify(getFieldValue(data, 'configParams') || []));
layer.open({
type: 1,
title: '编辑概率配置',
area: ['850px', '650px'],
content: modalHtml,
success: function(layero, index) {
setTimeout(function() {
probFishSelect = xmSelect.render({
el: layero.find('#prob-fish-select')[0],
data: fishTypeList,
empty: '无数据',
filterable: true,
pageEmptyShow: false
});
if (fishNumbers.length > 0) {
probFishSelect.setValue(fishNumbers);
}
renderProbParamsTableInModal(layero);
}, 100);
}
});
} else {
probParamsCache = [];
layer.open({
type: 1,
title: '添加概率配置',
area: ['850px', '650px'],
content: modalHtml,
success: function(layero, index) {
setTimeout(function() {
probFishSelect = xmSelect.render({
el: layero.find('#prob-fish-select')[0],
data: fishTypeList,
empty: '无数据',
filterable: true,
pageEmptyShow: false
});
renderProbParamsTableInModal(layero);
}, 100);
}
});
}
}
function renderProbParamsTableInModal(layero) {
var $elem = layero.find('#table-prob-params');
$elem.attr('lay-filter', 'table-prob-params-modal');
console.log('[概率击杀] rendering table, lay-filter:', $elem.attr('lay-filter'));
table.render({
elem: $elem[0],
id: 'table-prob-params-modal',
data: probParamsCache,
cols: [[
{ type: 'checkbox' },
{ field: "min", title: "最小值", width: 100, edit: 'text' },
{ field: "max", title: "最大值", width: 100, edit: 'text' },
{ field: "triggerRate", title: "触发权重", width: 100, edit: 'text' },
{ title: "操作", width: 80, toolbar: '#option-bar' }
]],
page: false
});
}
// 弹窗内事件
$(document).on('click', '#prob-add-param', function() {
probParamsCache.push({ min: 0, max: 0, triggerRate: 0 });
var layero = $('.layui-layer-page');
renderProbParamsTableInModal(layero);
});
$(document).on('click', '#prob-batch-del', function() {
var checkStatus = table.checkStatus('table-prob-params-modal');
var data = checkStatus.data;
if (data.length === 0) {
return layer.msg('请选择要删除的参数');
}
var ids = data.map(function(item) { return probParamsCache.indexOf(item); });
ids.sort(function(a, b) { return b - a; });
ids.forEach(function(i) { probParamsCache.splice(i, 1); });
var layero = $('.layui-layer-page');
renderProbParamsTableInModal(layero);
});
$(document).on('click', '#prob-cancel', function() {
layer.closeAll('page');
});
window.probDeleteItem = function() {
if (currentProbEditIndex < 0) return;
console.log('[probDelete] deleting index:', currentProbEditIndex);
layer.confirm('确定要删除此概率配置吗?', function(idx) {
probabilityItemsCache.splice(currentProbEditIndex, 1);
currentProbEditIndex = -1;
layer.closeAll('page');
renderProbabilityList();
layer.msg('删除成功');
layer.close(idx);
});
}
$(document).on('click', '#prob-save', function() {
var fishNumbers = probFishSelect ? probFishSelect.getValue('value') : [];
var newData = {
fishNumber: fishNumbers,
configParams: probParamsCache
};
if (currentProbEditIndex >= 0) {
probabilityItemsCache[currentProbEditIndex] = newData;
} else {
probabilityItemsCache.push(newData);
}
layer.closeAll('page');
renderProbabilityList();
layer.msg('保存成功');
});
table.on('edit(table-prob-params-modal)', function(obj) {
if (!isNaN(obj.value) && obj.value !== '') obj.data[obj.field] = parseFloat(obj.value);
else obj.data[obj.field] = obj.value;
});
table.on('tool(table-prob-params-modal)', function(obj) {
console.log('[概率击杀] tool event triggered:', obj.event, obj.data);
if (obj.event === 'del') {
console.log('[概率击杀] deleting item:', obj.data);
var i = probParamsCache.indexOf(obj.data);
if (i !== -1) {
probParamsCache.splice(i, 1);
console.log('[概率击杀] deleted, remaining:', probParamsCache.length);
var layero = $('.layui-layer-page');
renderProbParamsTableInModal(layero);
}
}
});
table.on('tool(table-prob-params-modal)', function(obj) {
if (obj.event === 'del') {
var index = probParamsCache.indexOf(obj.data);
if (index !== -1) {
probParamsCache.splice(index, 1);
var layero = $('.layui-layer-page');
renderProbParamsTableInModal(layero);
}
}
});
// ============ 添加按钮事件 ============
$('#add-luckPoker-option').on('click', function() {
tableDataCache.luckPokerOption.push({ OptionId: tableDataCache.luckPokerOption.length + 1, TriggerRate: 10, Score: 0 });
renderOptionTable('table-luckPoker-option', tableDataCache.luckPokerOption);
});
$('#add-luckFlyDisk-inner').on('click', function() {
tableDataCache.luckFlyDiskInner.push({ OptionId: tableDataCache.luckFlyDiskInner.length + 1, TriggerRate: 10, Score: 0 });
renderOptionTable('table-luckFlyDisk-inner', tableDataCache.luckFlyDiskInner);
});
$('#add-luckFlyDisk-outer').on('click', function() {
tableDataCache.luckFlyDiskOuter.push({ OptionId: tableDataCache.luckFlyDiskOuter.length + 1, TriggerRate: 10, Score: 0 });
renderOptionTable('table-luckFlyDisk-outer', tableDataCache.luckFlyDiskOuter);
});
// ============ 表格编辑和删除事件 ============
function setupTableEvents(tableId, dataCache) {
table.on('edit(' + tableId + ')', function(obj) {
var value = obj.value;
if (!isNaN(value) && value !== '') {
obj.data[obj.field] = parseFloat(value);
} else {
obj.data[obj.field] = value;
}
});
table.on('tool(' + tableId + ')', function(obj) {
if (obj.event === 'del') {
var idx = obj.tr.data('index');
if (idx === undefined || idx >= dataCache.length) {
idx = dataCache.findIndex(function(it) { return it === obj.data; });
}
if (idx !== undefined && idx !== -1) dataCache.splice(idx, 1);
obj.del();
}
});
table.on('toolbar(' + tableId + ')', function(obj) {
if (obj.event === 'batchdel') {
var checkStatus = table.checkStatus(tableId);
var data = checkStatus.data;
if (data.length === 0) {
return layer.msg('请选择要删除的数据');
}
layer.confirm('确定删除选中的 ' + data.length + ' 条数据吗?', function(idx) {
var ids = data.map(function(item) { return dataCache.indexOf(item); });
ids.sort(function(a, b) { return b - a; });
ids.forEach(function(i) { if (i !== -1) dataCache.splice(i, 1); });
renderOptionTable(tableId, dataCache);
layer.close(idx);
});
}
});
}
setupTableEvents('table-luckPoker-option', tableDataCache.luckPokerOption);
setupTableEvents('table-luckFlyDisk-inner', tableDataCache.luckFlyDiskInner);
setupTableEvents('table-luckFlyDisk-outer', tableDataCache.luckFlyDiskOuter);
// ============ 初始化和保存 ============
function initConfig() {
layer.confirm('确定要初始化全部配置数据吗?此操作将清空现有数据!', function(idx) {
layer.close(idx);
admin.req({
method: "get",
url: setter.baseurl + "adminapi/GameConfig/InitSection/BossConfigs",
done: function (res) {
if (res.code === 0 || res.code === 200) {
layer.msg('初始化成功');
loadConfig();
} else {
layer.msg(res.info || '初始化失败');
}
},
fail: function(res) {
layer.msg(res.info || '初始化失败');
}
});
});
}
$(document).on('click', '[lay-filter="init-boss"]', function() {
if (window.parent && window.parent.$ && window.parent.layer) {
window.parent.$('.layui-layer-shade').remove();
window.parent.layer.closeAll();
}
initConfig();
});
$(document).on('click', '[lay-filter="reload-boss"]', function() {
loadConfig();
layer.msg('刷新成功');
});
$(document).on('click', '[lay-filter="save-boss"]', function() {
if (window.parent && window.parent.$ && window.parent.layer) {
window.parent.$('.layui-layer-shade').remove();
window.parent.layer.closeAll();
}
var b = gameConfig.bossConfigs || {};
// 小丑扑克
b.luckPoker = b.luckPoker || {};
b.luckPoker.fishNumber = getFishSelectValue('luckPoker_fishNumber');
b.luckPoker.optionList = tableDataCache.luckPokerOption || [];
// 幸运飞碟
b.luckFlyDisk = b.luckFlyDisk || {};
b.luckFlyDisk.fishNumber = getFishSelectValue('luckFlyDisk_fishNumber');
b.luckFlyDisk.innerOptionList = tableDataCache.luckFlyDiskInner || [];
b.luckFlyDisk.outerOptionList = tableDataCache.luckFlyDiskOuter || [];
// 全屏秒怪
b.fullScreen = b.fullScreen || {};
b.fullScreen.fishNumber = getFishSelectValue('fullScreen_fishNumber');
// 范围秒怪
b.range = b.range || {};
b.range.fishNumber = getFishSelectValue('range_fishNumber');
// 星际巡航 - 死亡配置已通过弹窗直接保存到gameConfig,只需更新鱼编号
var icConfig = b.interstellarCruise || {};
icConfig.fishNumber = getFishSelectValue('interstellarCruise_fishNumber');
b.interstellarCruise = icConfig;
// 烈焰风暴 - 死亡配置已通过弹窗直接保存到gameConfig,只需更新鱼编号
var fsConfig = b.flameStorm || {};
fsConfig.fishNumber = getFishSelectValue('flameStorm_fishNumber');
b.flameStorm = fsConfig;
// 破坏球 - 死亡配置已通过弹窗直接保存到gameConfig,只需更新鱼编号
var bombConfig = b.bomb || {};
bombConfig.fishNumber = getFishSelectValue('bomb_fishNumber');
b.bomb = bombConfig;
// 机械蝎 - 死亡配置已通过弹窗直接保存到gameConfig,只需更新鱼编号
var scorpionConfig = b.scorpion || {};
scorpionConfig.fishNumber = getFishSelectValue('scorpion_fishNumber');
b.scorpion = scorpionConfig;
// 幸运轮盘
b.luckWheel = luckWheelItemsCache || [];
// 神龙转盘 - 已在上方的 death-config 弹窗中保存
// 幸运飞碟 - 已在上方的弹窗中保存
// 概率击杀
b.probability = probabilityItemsCache || [];
gameConfig.bossConfigs = b;
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 || '保存失败');
}
}
});
});
// 从 gameConfig 初始化 cache(仅首次加载时调用)
function initProbabilityCache() {
var b = gameConfig.bossConfigs || {};
probabilityItemsCache = JSON.parse(JSON.stringify(getFieldValue(b, 'Probability') || []));
}
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?'保存成功':'保存失败'))}})}
loadConfig();
});
</script>