UNPKG

koishi-plugin-interactive

Version:

多功能互动型QQ机器人插件,支持猜数字、每日签到、幸运抽奖、积分商店、排行榜、成就系统、个人资料、随机互动、将军系统、修仙系统、每日提醒等功能

672 lines (670 loc) 32.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GENERAL_RANKS = void 0; exports.getUserRank = getUserRank; exports.getSalary = getSalary; exports.randomInt = randomInt; exports.randomFloat = randomFloat; exports.roundNumber = roundNumber; exports.generateEnemyId = generateEnemyId; exports.calculatePower = calculatePower; exports.applyGeneralSystem = applyGeneralSystem; // 将军系统职位配置 exports.GENERAL_RANKS = [ { name: '组长', baseSoldiers: 3, maxGroups: 3 }, { name: '班长', baseSoldiers: 10, maxGroups: 4 }, { name: '排长', baseSoldiers: 40, maxGroups: 4 }, { name: '连长', baseSoldiers: 160, maxGroups: 4 }, { name: '营长', baseSoldiers: 640, maxGroups: 4 }, { name: '团长', baseSoldiers: 2560, maxGroups: 4 }, { name: '旅长', baseSoldiers: 10240, maxGroups: 4 }, { name: '师长', baseSoldiers: 40960, maxGroups: 4 }, { name: '军长', baseSoldiers: 163840, maxGroups: 4 }, { name: '司令', baseSoldiers: 655360, maxGroups: 9 }, { name: '统帅', baseSoldiers: 6553660, maxGroups: 10 } ]; // 获取用户当前职位和组数 function getUserRank(soldiers) { for (let i = exports.GENERAL_RANKS.length - 1; i >= 0; i--) { const rank = exports.GENERAL_RANKS[i]; if (soldiers >= rank.baseSoldiers) { const group = Math.min(Math.floor(soldiers / rank.baseSoldiers), rank.maxGroups); return { name: `${group}${rank.name.charAt(0)}`, index: i, group }; } } return { name: '无', index: -1, group: 0 }; } // 获取下一职位信息 function getNextRankInfo(currentIndex, currentGroup) { if (currentIndex >= exports.GENERAL_RANKS.length - 1) { return { name: '最高职位', soldiersRequired: 0 }; } const currentRank = exports.GENERAL_RANKS[currentIndex]; const nextRank = exports.GENERAL_RANKS[currentIndex + 1]; // 如果当前组数未达到最大组数,则下一职位是当前职位的下一组 if (currentGroup < currentRank.maxGroups) { const nextGroup = currentGroup + 1; const soldiersRequired = nextGroup * currentRank.baseSoldiers; return { name: `${nextGroup}${currentRank.name.charAt(0)}`, soldiersRequired }; } // 如果当前组数已达到最大组数,则下一职位是下一等级的第一组 return { name: `1${nextRank.name.charAt(0)}`, soldiersRequired: nextRank.baseSoldiers }; } // 生成等级范围显示格式的辅助函数 function generateRankRangeDisplay(rankIndex) { const rank = exports.GENERAL_RANKS[rankIndex]; // 随机选择相邻的两个组数 const group1 = randomInt(1, rank.maxGroups - 1); const group2 = group1 + 1; return `${group1}-${group2}`; } // 根据组数范围计算士兵数量范围 function calculateSoldierRange(rankIndex, groupRange) { const rank = exports.GENERAL_RANKS[rankIndex]; const [minGroup, maxGroup] = groupRange.split('-').map(Number); return { min: minGroup * rank.baseSoldiers, max: maxGroup * rank.baseSoldiers }; } // 获取俸禄数量 function getSalary(rankIndex) { const salaries = [30, 100, 300, 1000, 3000, 10000, 30000, 100000, 300000, 1000000, 3000000]; return rankIndex >= 0 && rankIndex < salaries.length ? salaries[rankIndex] : 0; } // 生成随机数 function randomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } // 生成随机浮点数 function randomFloat(min, max) { return Math.random() * (max - min) + min; } // 根据用户等级生成敌人等级,提高遇到相近等级敌人的概率 function generateEnemyRankIndex(userRankIndex, minPossibleRank, maxPossibleRank) { // 确保范围在允许的最小和最大等级之间 const effectiveMin = Math.max(minPossibleRank, 0); const effectiveMax = Math.min(maxPossibleRank, exports.GENERAL_RANKS.length - 1); // 如果用户等级不在允许范围内,直接随机生成 if (userRankIndex < effectiveMin || userRankIndex > effectiveMax) { return randomInt(effectiveMin, effectiveMax); } // 生成随机数决定使用哪种概率分布 const rand = Math.random(); if (rand < 0.5) { // 50%的概率生成与用户等级相同的敌人 return userRankIndex; } else if (rand < 0.8) { // 30%的概率生成与用户等级相邻的敌人(上下一级) const offset = randomInt(0, 1) * 2 - 1; // 生成-1或1 const adjacentRank = userRankIndex + offset; // 确保在允许范围内 if (adjacentRank >= effectiveMin && adjacentRank <= effectiveMax) { return adjacentRank; } // 如果越界,则使用用户等级 return userRankIndex; } else { // 20%的概率完全随机 return randomInt(effectiveMin, effectiveMax); } } // 取整函数 function roundNumber(num) { return Math.floor(num); } // 生成敌人ID function generateEnemyId(length = 6) { const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; let result = ''; for (let i = 0; i < length; i++) { result += chars.charAt(Math.floor(Math.random() * chars.length)); } return result; } // 计算战力值 function calculatePower(soldiers, weapons, supplies) { // 限制武器数量不超过士兵数量 const effectiveWeapons = Math.min(weapons, soldiers); const weaponsContribution = Math.floor(effectiveWeapons * 0.5); // 限制物资数量不超过士兵数量的10倍 const effectiveSupplies = Math.min(supplies, soldiers * 10); const suppliesContribution = Math.floor(effectiveSupplies * 0.01); return Math.floor(soldiers + weaponsContribution + suppliesContribution); } // 检查用户是否初始化了将军系统 function checkGeneralSystemInitialized(user) { return !!user.generalSystem; } // 确保用户已初始化将军系统,如果未初始化则返回错误消息 function ensureGeneralSystemInitialized(user) { if (!checkGeneralSystemInitialized(user)) { return '您尚未初始化将军系统'; } return null; } // 应用将军系统 function applyGeneralSystem(ctx) { // 获取用户数据 async function getUserData(session) { const userId = session.userId; const platform = session.platform; if (!userId || !platform) throw new Error('无法获取用户信息'); const [user] = await ctx.database.get('interactive_users', { id: userId, platform }); if (user) return user; throw new Error('用户数据不存在'); } // 更新用户数据 async function updateUserData(user) { const { id, platform, ...updateData } = user; await ctx.database.set('interactive_users', { id: user.id, platform: user.platform }, updateData); } // 获取今天日期字符串 function getToday() { const now = new Date(); return `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`; } // 解析数量参数 function parseAmount(param) { const amount = parseInt(param); return isNaN(amount) ? null : amount; } // 检查冷却时间和每日限制 async function checkCommandLimits(session) { const user = await getUserData(session); const now = Date.now(); const today = getToday(); // 检查是否被监禁 if (user.jailedUntil > now) { const remaining = Math.ceil((user.jailedUntil - now) / 1000 / 60); session.send(`⛔ 你正在小黑屋中,${remaining}分钟后才能重获自由!`); return false; } // 重置每日计数器 if (user.lastCommandDate !== today) { user.dailyCommandCount = 0; user.lastCommandDate = today; } // 检查每日限制 if (user.dailyCommandCount >= 50) { session.send(`今日使用次数已达上限(50次),请明天再来吧!`); return false; } // 检查冷却时间 if (now - user.lastCommandTime < 5000) { const remaining = Math.ceil((5000 - (now - user.lastCommandTime)) / 1000); session.send(`操作太频繁啦,请 ${remaining} 秒后再试~`); return false; } // 更新计数器 user.dailyCommandCount += 1; user.lastCommandTime = now; await updateUserData(user); return true; } // 统一的战斗处理函数 async function handleBattle(session, user, enemyId, enemyType) { const error = ensureGeneralSystemInitialized(user); if (error) return error; const enemy = user.generalSystem.enemies[enemyId]; if (!enemy || enemy.type !== enemyType) { return '未找到指定的敌人,可能已经过期或不存在'; } // 计算双方战力 const userPower = calculatePower(user.generalSystem.soldiers, user.generalSystem.weapons, user.generalSystem.supplies); const enemyPower = calculatePower(enemy.soldiers, enemy.weapons, enemy.supplies); // 计算战力差值百分比 const powerDifference = Math.abs(userPower - enemyPower); const powerRatio = Math.min(userPower, enemyPower) / Math.max(userPower, enemyPower); // 战斗结果 let result = `⚔️ 与${enemyType === 'bandit' ? '土匪' : '敌军'}的战斗 ⚔️\n\n`; result += `敌方情报:\n`; result += `${enemyType === 'bandit' ? '土匪' : '敌军'}等级: ${enemy.groupRange}${enemy.rank.charAt(0)}\n`; result += `${enemyType === 'bandit' ? '土匪' : '敌军'}人数: ${enemy.minSoldiers}-${enemy.maxSoldiers}\n`; result += `武器数量: ${enemy.weapons}\n`; result += `物资数量: ${enemy.supplies}\n\n`; // 判断胜负 if (userPower > enemyPower) { // 计算战斗损失和战利品(确保胜利时盈利) const deadSoldiers = randomInt(1, Math.max(1, Math.floor(user.generalSystem.soldiers * 0.05))); const woundedSoldiers = randomInt(0, Math.max(1, Math.floor(user.generalSystem.soldiers * 0.1))); const prisonersCaptured = randomInt(1, Math.max(1, Math.floor(enemy.soldiers * 0.2))); const suppliesGained = randomInt(Math.floor(enemy.supplies * 0.1), Math.floor(enemy.supplies * 0.3)); const weaponsGained = randomInt(Math.floor(enemy.weapons * 0.1), Math.floor(enemy.weapons * 0.3)); const weaponsLost = randomInt(0, Math.max(1, Math.floor(user.generalSystem.weapons * 0.05))); const suppliesLost = randomInt(0, Math.max(1, Math.floor(user.generalSystem.supplies * 0.05))); // 计算奖励积分(战力差值越小,奖励越高) const basePoints = enemyType === 'bandit' ? Math.floor(Math.floor(enemy.soldiers / 5) + Math.floor(enemy.weapons / 3) + Math.floor(enemy.supplies / 10)) : Math.floor(Math.floor(enemy.soldiers / 3) + Math.floor(enemy.weapons / 1.5) + Math.floor(enemy.supplies / 5)); // 战力差值越小,奖励越高(最高2.5倍,最低1倍) const pointsMultiplier = Math.floor((1 + (1.5 - powerRatio * 1.5)) * 100) / 100; const pointsReward = Math.floor(basePoints * pointsMultiplier); // 更新用户数据 user.generalSystem.soldiers -= deadSoldiers; user.generalSystem.wounded += woundedSoldiers; user.generalSystem.prisoners += prisonersCaptured; user.generalSystem.supplies = Math.max(0, user.generalSystem.supplies - suppliesLost + suppliesGained); user.generalSystem.weapons = Math.max(0, user.generalSystem.weapons - weaponsLost + weaponsGained); user.points += pointsReward; // 移除敌人 delete user.generalSystem.enemies[enemyId]; await updateUserData(user); result += `🎉 战斗胜利!\n\n`; result += `战斗损失:\n`; result += `阵亡士兵: ${deadSoldiers}\n`; result += `受伤士兵: ${woundedSoldiers}\n\n`; result += `武器损失: ${weaponsLost}\n`; result += `物资损失: ${suppliesLost}\n\n`; result += `战利品:\n`; result += `俘虏: ${prisonersCaptured}\n`; result += `缴获武器: ${weaponsGained}\n`; result += `缴获物资: ${suppliesGained}\n`; result += `获得积分: ${pointsReward}\n\n`; result += `当前状态:\n`; result += `士兵: ${user.generalSystem.soldiers}\n`; result += `伤员: ${user.generalSystem.wounded}\n`; result += `俘虏: ${user.generalSystem.prisoners}\n`; result += `武器: ${user.generalSystem.weapons}\n`; result += `物资: ${user.generalSystem.supplies}\n`; result += `积分: ${user.points}`; } else { // 失败损失 const deadSoldiers = randomInt(Math.max(1, Math.floor(user.generalSystem.soldiers * 0.1)), Math.max(1, Math.floor(user.generalSystem.soldiers * 0.3))); const woundedSoldiers = randomInt(Math.max(1, Math.floor(user.generalSystem.soldiers * 0.1)), Math.max(1, Math.floor(user.generalSystem.soldiers * 0.2))); const suppliesLost = randomInt(0, Math.max(1, Math.floor(user.generalSystem.supplies * 0.2))); const weaponsLost = randomInt(0, Math.max(1, Math.floor(user.generalSystem.weapons * 0.2))); // 更新用户数据 user.generalSystem.soldiers -= deadSoldiers; user.generalSystem.wounded += woundedSoldiers; user.generalSystem.supplies = Math.max(0, user.generalSystem.supplies - suppliesLost); user.generalSystem.weapons = Math.max(0, user.generalSystem.weapons - weaponsLost); // 移除敌人 delete user.generalSystem.enemies[enemyId]; await updateUserData(user); result += `❌ 战斗失败!\n\n`; result += `战斗损失:\n`; result += `阵亡士兵: ${deadSoldiers}\n`; result += `受伤士兵: ${woundedSoldiers}\n`; result += `武器损失: ${weaponsLost}\n`; result += `物资损失: ${suppliesLost}\n\n`; result += `当前状态:\n`; result += `士兵: ${user.generalSystem.soldiers}\n`; result += `伤员: ${user.generalSystem.wounded}\n`; result += `武器: ${user.generalSystem.weapons}\n`; result += `物资: ${user.generalSystem.supplies}`; } return result; } // 将军系统主命令 ctx.command('将军 <action:string> [param:string]', '将军系统') .usage('招兵: 将军 招兵 数量\n训练: 将军 训练新兵 数量\n购买: 将军 购买武器/物资 数量\n战斗: 将军 找土匪/敌军\n攻打: 将军 攻打土匪/敌军 代码\n俸禄: 将军 领取俸禄') .action(async ({ session }, action, param) => { if (!session) return '会话异常'; if (!session.userId) return '无法获取用户ID'; if (!action) { return `🎖️ 将军系统 🎖️ 可用命令: - 将军 招兵 <数量> - 招募新兵 (10积分/人) - 将军 训练新兵 <数量> - 训练新兵成为士兵 (消耗武器和物资) - 将军 购买武器 <数量> - 购买武器 (1积分/个) - 将军 购买物资 <数量> - 购买物资 (1积分/个) - 将军 训练俘虏 <数量> - 将俘虏训练为士兵 - 将军 治疗伤员 <数量> - 治疗伤员恢复为士兵 - 将军 找土匪 - 寻找土匪 - 将军 攻打土匪 <代码> - 攻打指定土匪 - 将军 找敌军 - 寻找敌军 - 将军 攻打敌军 <代码> - 攻打指定敌军 - 将军 领取俸禄 - 领取每日俸禄(可获得积分、士兵、武器和物资) - 将军 状态 - 查看军队状态`; } if (!await checkCommandLimits(session)) return; const user = await getUserData(session); // 处理带数量的命令 const amountCommands = ['招兵', '训练新兵', '购买武器', '购买物资', '训练俘虏', '治疗伤员']; let amount; if (amountCommands.includes(action)) { const parsedAmount = parseAmount(param); if (parsedAmount === null || parsedAmount <= 0) { return `请输入正确的${action}数量`; } amount = parsedAmount; } // 初始化将军系统数据 if (!user.generalSystem) { user.generalSystem = { soldiers: 0, newRecruits: 0, weapons: 0, supplies: 0, prisoners: 0, wounded: 0, lastSalaryDate: '', enemies: {} }; } // 查看状态 if (action === '状态') { const error = ensureGeneralSystemInitialized(user); if (error) return error; const rank = getUserRank(user.generalSystem.soldiers); const nextRankInfo = getNextRankInfo(rank.index, rank.group); let statusInfo = `🎖️ 军队状态 🎖️\n\n`; statusInfo += `当前职位: ${rank.name}\n`; statusInfo += `下一职位: ${nextRankInfo.name} (需要${nextRankInfo.soldiersRequired}士兵)\n`; statusInfo += `士兵数量: ${user.generalSystem.soldiers}\n`; statusInfo += `新兵数量: ${user.generalSystem.newRecruits}\n`; statusInfo += `武器数量: ${user.generalSystem.weapons}\n`; statusInfo += `物资数量: ${user.generalSystem.supplies}\n`; statusInfo += `俘虏数量: ${user.generalSystem.prisoners}\n`; statusInfo += `伤员数量: ${user.generalSystem.wounded}\n`; statusInfo += `战力值: ${calculatePower(user.generalSystem.soldiers, user.generalSystem.weapons, user.generalSystem.supplies)}\n`; statusInfo += `每日俸禄: ${getSalary(rank.index)} 积分,${Math.floor(getSalary(rank.index) * 0.01)} 士兵,${Math.floor(getSalary(rank.index) * 0.03)} 武器,${Math.floor(getSalary(rank.index) * 0.1)} 物资\n`; statusInfo += `俸禄状态: ${user.generalSystem.lastSalaryDate === getToday() ? '已领取' : '可领取'}`; return statusInfo; } // 招兵 if (action === '招兵') { const error = ensureGeneralSystemInitialized(user); if (error) return error; const cost = amount * 10; if (user.points < cost) { return `积分不足!招募${amount}名新兵需要${cost}积分,你只有${user.points}积分`; } if (user.generalSystem.newRecruits > 100000) { return `新兵数量不能超过10万,当前新兵数量: ${user.generalSystem.newRecruits}`; } user.points -= cost; user.generalSystem.newRecruits += amount; await updateUserData(user); return `✅ 成功招募${amount}名新兵!\n` + `当前新兵数量: ${user.generalSystem.newRecruits}\n` + `剩余积分: ${user.points}`; } // 训练新兵 if (action === '训练新兵') { const error = ensureGeneralSystemInitialized(user); if (error) return error; if (user.generalSystem.newRecruits < amount) { return `新兵不足!你只有${user.generalSystem.newRecruits}名新兵`; } const weaponsNeeded = amount; const suppliesNeeded = amount * 10; if (user.generalSystem.weapons < weaponsNeeded) { return `武器不足!训练${amount}名士兵需要${weaponsNeeded}个武器,你只有${user.generalSystem.weapons}个武器`; } if (user.generalSystem.supplies < suppliesNeeded) { return `物资不足!训练${amount}名士兵需要${suppliesNeeded}个物资,你只有${user.generalSystem.supplies}个物资`; } user.generalSystem.newRecruits -= amount; user.generalSystem.weapons -= weaponsNeeded; user.generalSystem.supplies -= suppliesNeeded; user.generalSystem.soldiers += amount; // 检查是否升职 const oldRank = getUserRank(user.generalSystem.soldiers - amount); const newRank = getUserRank(user.generalSystem.soldiers); await updateUserData(user); let result = `✅ 成功训练${amount}名新兵成为士兵!\n` + `当前士兵数量: ${user.generalSystem.soldiers}\n` + `剩余新兵数量: ${user.generalSystem.newRecruits}\n` + `剩余武器数量: ${user.generalSystem.weapons}\n` + `剩余物资数量: ${user.generalSystem.supplies}`; if (newRank.index > oldRank.index || (newRank.index === oldRank.index && newRank.group > oldRank.group)) { result += `\n\n🎉 恭喜晋升为${newRank.name}!`; } return result; } // 购买武器 if (action === '购买武器') { const error = ensureGeneralSystemInitialized(user); if (error) return error; const cost = amount; if (user.points < cost) { return `积分不足!购买${amount}个武器需要${cost}积分,你只有${user.points}积分`; } user.points -= cost; user.generalSystem.weapons += amount; await updateUserData(user); return `✅ 成功购买${amount}个武器!\n` + `当前武器数量: ${user.generalSystem.weapons}\n` + `剩余积分: ${user.points}`; } // 购买物资 if (action === '购买物资') { const error = ensureGeneralSystemInitialized(user); if (error) return error; const cost = amount; if (user.points < cost) { return `积分不足!购买${amount}个物资需要${cost}积分,你只有${user.points}积分`; } user.points -= cost; user.generalSystem.supplies += amount; await updateUserData(user); return `✅ 成功购买${amount}个物资!\n` + `当前物资数量: ${user.generalSystem.supplies}\n` + `剩余积分: ${user.points}`; } // 训练俘虏 if (action === '训练俘虏') { const error = ensureGeneralSystemInitialized(user); if (error) return error; if (user.generalSystem.prisoners < amount) { return `俘虏不足!你只有${user.generalSystem.prisoners}名俘虏`; } // 训练俘虏消耗的物资 const weaponsNeeded = amount; const suppliesNeeded = amount * 10; if (user.generalSystem.weapons < weaponsNeeded) { return `武器不足!训练${amount}名俘虏需要${weaponsNeeded}个武器,你只有${user.generalSystem.weapons}个武器`; } if (user.generalSystem.supplies < suppliesNeeded) { return `物资不足!训练${amount}名俘虏需要${suppliesNeeded}个物资,你只有${user.generalSystem.supplies}个物资`; } user.generalSystem.prisoners -= amount; user.generalSystem.supplies -= suppliesNeeded; user.generalSystem.soldiers += amount; // 检查是否升职 const oldRank = getUserRank(user.generalSystem.soldiers - amount); const newRank = getUserRank(user.generalSystem.soldiers); await updateUserData(user); let result = `✅ 成功训练${amount}名俘虏成为士兵!\n` + `当前士兵数量: ${user.generalSystem.soldiers}\n` + `剩余俘虏数量: ${user.generalSystem.prisoners}\n` + `剩余物资数量: ${user.generalSystem.supplies}`; if (newRank.index > oldRank.index || (newRank.index === oldRank.index && newRank.group > oldRank.group)) { result += `\n\n🎉 恭喜晋升为${newRank.name}!`; } return result; } // 治疗伤员 if (action === '治疗伤员') { const error = ensureGeneralSystemInitialized(user); if (error) return error; if (user.generalSystem.wounded < amount) { return `伤员不足!你只有${user.generalSystem.wounded}名伤员`; } // 治疗伤员消耗的物资 const suppliesNeeded = amount * 10; if (user.generalSystem.supplies < suppliesNeeded) { return `物资不足!治疗${amount}名伤员需要${suppliesNeeded}个物资,你只有${user.generalSystem.supplies}个物资`; } user.generalSystem.wounded -= amount; user.generalSystem.supplies -= suppliesNeeded; user.generalSystem.soldiers += amount; await updateUserData(user); return `✅ 成功治疗${amount}名伤员!\n` + `当前士兵数量: ${user.generalSystem.soldiers}\n` + `剩余伤员数量: ${user.generalSystem.wounded}\n` + `剩余物资数量: ${user.generalSystem.supplies}`; } // 找土匪 if (action === '找土匪') { const error = ensureGeneralSystemInitialized(user); if (error) return error; // 清除所有敌人信息,重新开始 user.generalSystem.enemies = {}; const now = Date.now(); // 获取用户当前等级 const userRank = getUserRank(user.generalSystem.soldiers); // 生成土匪等级(师长及以下,避免生成军长) const maxRankIndex = 7; // 师长 // 使用新函数生成土匪等级,提高遇到相近等级的概率 const banditRankIndex = generateEnemyRankIndex(userRank.index, 0, maxRankIndex); const banditRank = exports.GENERAL_RANKS[banditRankIndex]; // 生成组数范围(相邻的两个组数) const groupRange = generateRankRangeDisplay(banditRankIndex); // 计算士兵数量范围 const soldierRange = calculateSoldierRange(banditRankIndex, groupRange); const soldiers = randomInt(soldierRange.min, soldierRange.max); // 生成武器和物资 const weapons = Math.floor(soldiers * Math.floor(randomFloat(0.5, 1.5) * 100) / 100); const supplies = Math.floor(soldiers * Math.floor(randomFloat(5, 15) * 100) / 100); // 生成唯一ID const banditId = generateEnemyId(); // 保存土匪信息(1小时有效) user.generalSystem.enemies[banditId] = { id: banditId, type: 'bandit', soldiers, weapons, supplies, minSoldiers: soldierRange.min, maxSoldiers: soldierRange.max, rank: banditRank.name, rankIndex: banditRankIndex, groupRange: groupRange, expireTime: now + 3600000 // 1小时后过期 }; await updateUserData(user); return `🔍 发现一群土匪!\n\n` + `土匪等级: ${groupRange}${banditRank.name.charAt(0)}\n` + `预估人数: ${soldierRange.min}-${soldierRange.max}\n` + `武器数量: 不详\n` + `物资数量: 不详\n\n` + `土匪代码: ${banditId}\n` + `使用 "将军 攻打土匪 ${banditId}" 来发起进攻`; } // 找敌军 if (action === '找敌军') { const error = ensureGeneralSystemInitialized(user); if (error) return error; // 清除所有敌人信息,重新开始 user.generalSystem.enemies = {}; const now = Date.now(); // 获取用户当前等级 const userRank = getUserRank(user.generalSystem.soldiers); // 生成敌军等级(军长及以上,统帅以下) const minRankIndex = 8; // 军长 const maxRankIndex = 10; // 统帅 // 使用新函数生成敌军等级,提高遇到相近等级的概率 const enemyRankIndex = generateEnemyRankIndex(userRank.index, minRankIndex, maxRankIndex); const enemyRank = exports.GENERAL_RANKS[enemyRankIndex]; // 生成组数范围(相邻的两个组数) const groupRange = generateRankRangeDisplay(enemyRankIndex); // 计算士兵数量范围 const soldierRange = calculateSoldierRange(enemyRankIndex, groupRange); const soldiers = randomInt(soldierRange.min, soldierRange.max); // 生成武器和物资 const weapons = Math.floor(soldiers * Math.floor(randomFloat(0.8, 1.2) * 100) / 100); const supplies = Math.floor(soldiers * Math.floor(randomFloat(10, 20) * 100) / 100); // 生成唯一ID const enemyId = generateEnemyId(); // 保存敌军信息(1小时有效) user.generalSystem.enemies[enemyId] = { id: enemyId, type: 'enemy', soldiers, weapons, supplies, minSoldiers: soldierRange.min, maxSoldiers: soldierRange.max, rank: enemyRank.name, rankIndex: enemyRankIndex, groupRange: groupRange, expireTime: now + 3600000 // 1小时后过期 }; await updateUserData(user); return `🔍 发现一支敌军!\n\n` + `敌军等级: ${groupRange}${enemyRank.name.charAt(0)}\n` + `预估人数: ${soldierRange.min}-${soldierRange.max}\n` + `武器数量: 不详\n` + `物资数量: 不详\n\n` + `敌军代码: ${enemyId}\n` + `使用 "将军 攻打敌军 ${enemyId}" 来发起进攻`; } // 攻打土匪 if (action === '攻打土匪' && param) { return handleBattle(session, user, param, 'bandit'); } // 攻打敌军 if (action === '攻打敌军' && param) { return handleBattle(session, user, param, 'enemy'); } // 领取俸禄 if (action === '领取俸禄') { const error = ensureGeneralSystemInitialized(user); if (error) return error; const today = getToday(); if (user.generalSystem.lastSalaryDate === today) { return '今天已经领取过俸禄了,明天再来吧!'; } const rank = getUserRank(user.generalSystem.soldiers); const salary = getSalary(rank.index); const soldiers = Math.floor(salary * 0.01); // 获得士兵数量为俸禄的1% const weapons = Math.floor(salary * 0.01); // 获得武器数量为俸禄的1% const supplies = Math.floor(salary * 0.1); // 获得物资数量为俸禄的10% user.points += salary; user.generalSystem.soldiers += soldiers; user.generalSystem.weapons += weapons; user.generalSystem.supplies += supplies; user.generalSystem.lastSalaryDate = today; await updateUserData(user); return `✅ 成功领取今日俸禄!\n\n` + `当前职位: ${rank.name}\n` + `获得积分: ${salary}\n` + `获得士兵: ${soldiers}\n` + `获得武器: ${weapons}\n` + `获得物资: ${supplies}\n\n` + `当前状态:\n` + `积分: ${user.points}\n` + `士兵: ${user.generalSystem.soldiers}\n` + `武器: ${user.generalSystem.weapons}\n` + `物资: ${user.generalSystem.supplies}`; } }); }