加入了新的丹药

This commit is contained in:
liuwei
2025-11-21 15:03:12 +08:00
parent ac7e983d19
commit d461198be5
2 changed files with 128 additions and 10 deletions

View File

@@ -3,7 +3,7 @@
[Xiuxian] [Xiuxian]
enable = true enable = true
# 指令集合(无需前缀),按核心/经济/信息/社交/门派分类 # 指令集合(无需前缀),按核心/经济/信息/社交/门派分类
command = ["修仙帮助", "积分购石", "积分换灵石", "注册修仙", "我的状态", "闭关", "出关", "聚灵", "排行榜", "修仙签到", "坊市", "购买", "乾坤袋", "突破", "强行突破", "劫掠", "赠与", "赠送", "创建门派", "加入门派", "退出门派"] command = ["修仙帮助", "积分购石", "积分换灵石", "注册修仙", "我的状态", "闭关", "出关", "聚灵", "排行榜", "修仙签到", "坊市", "购买", "乾坤袋", "使用", "服用", "突破", "强行突破", "劫掠", "赠与", "赠送", "创建门派", "加入门派", "退出门派"]
# 用法提示:命令格式错误时的反馈文本 # 用法提示:命令格式错误时的反馈文本
command-format = """ command-format = """
📜修仙指令: 📜修仙指令:
@@ -17,6 +17,8 @@ command-format = """
坊市 坊市
购买 购买
乾坤袋 乾坤袋
使用 物品名
服用 回气丹
突破 - 需要丹药 突破 - 需要丹药
强行突破 - 不需要丹药 强行突破 - 不需要丹药
劫掠 - 抢劫其他门派弟子 劫掠 - 抢劫其他门派弟子
@@ -60,7 +62,17 @@ spirit_roots = [
# 坊市商品:名称:类型:价格(价格单位为灵石)。类型用于展示与分类,不影响逻辑。 # 坊市商品:名称:类型:价格(价格单位为灵石)。类型用于展示与分类,不影响逻辑。
[Xiuxian.shop] [Xiuxian.shop]
items = [ items = [
"筑基丹:丹药:500", "筑基丹:丹药:200",
"金元丹:丹药:1000",
"结婴丹:丹药:10000",
"化神丹:丹药:40000",
"合体丹:丹药:200000",
"大乘丹:丹药:1000000",
"渡劫丹:丹药:2000000",
"飞升丹:丹药:10000000",
"洗髓丹:丹药:2000",
"改灵丹:丹药:20000",
"天灵露:丹药:200000",
"回气丹:丹药:200", "回气丹:丹药:200",
"聚灵符:材料:100" "聚灵符:材料:100"
] ]

View File

@@ -496,6 +496,8 @@ class XiuxianPlugin(MessagePluginInterface):
return await self._cmd_buy(bot, sender, roomid, content) return await self._cmd_buy(bot, sender, roomid, content)
if cmd == "乾坤袋": if cmd == "乾坤袋":
return await self._cmd_bag(bot, sender, roomid) return await self._cmd_bag(bot, sender, roomid)
if cmd in ("使用", "服用"):
return await self._cmd_use(bot, sender, roomid, content)
if cmd == "突破": if cmd == "突破":
return await self._cmd_breakthrough(bot, sender, roomid) return await self._cmd_breakthrough(bot, sender, roomid)
if cmd == "强行突破": if cmd == "强行突破":
@@ -546,7 +548,7 @@ class XiuxianPlugin(MessagePluginInterface):
# if self.revoke: # if self.revoke:
# self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) # self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
return False, "命令格式错误" return False, "命令格式错误"
player = self.redis_db.get_player(sender, roomid or "") player = self._get_player_with_cache(sender, roomid or "")
if player: if player:
# client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 已注册,无需重复注册", sender) # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "⚠️ 已注册,无需重复注册", sender)
# if self.revoke: # if self.revoke:
@@ -591,6 +593,8 @@ class XiuxianPlugin(MessagePluginInterface):
lines.append("注册修仙 道号") lines.append("注册修仙 道号")
lines.append("聚灵 数量") lines.append("聚灵 数量")
lines.append("购买 物品 数量") lines.append("购买 物品 数量")
lines.append("使用 物品名")
lines.append("服用 回气丹")
lines.append("赠与 目标wxid 数量") lines.append("赠与 目标wxid 数量")
lines.append("赠送 目标wxid 物品 数量") lines.append("赠送 目标wxid 物品 数量")
lines.append("劫掠 目标wxid") lines.append("劫掠 目标wxid")
@@ -652,7 +656,7 @@ class XiuxianPlugin(MessagePluginInterface):
return True, "积分购石" return True, "积分购石"
async def _cmd_status(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: async def _cmd_status(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
player = self.redis_db.get_player(sender, roomid or "") player = self._get_player_with_cache(sender, roomid or "")
if not player: if not player:
# client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
# if self.revoke: # if self.revoke:
@@ -679,7 +683,7 @@ class XiuxianPlugin(MessagePluginInterface):
return True, "状态展示" return True, "状态展示"
async def _cmd_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: async def _cmd_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
player = self.redis_db.get_player(sender, roomid or "") player = self._get_player_with_cache(sender, roomid or "")
if not player: if not player:
# client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
# if self.revoke: # if self.revoke:
@@ -713,7 +717,7 @@ class XiuxianPlugin(MessagePluginInterface):
return True, "闭关成功" return True, "闭关成功"
async def _cmd_finish_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: async def _cmd_finish_cultivate(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
player = self.redis_db.get_player(sender, roomid or "") player = self._get_player_with_cache(sender, roomid or "")
if not player: if not player:
# client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
# if self.revoke: # if self.revoke:
@@ -753,7 +757,7 @@ class XiuxianPlugin(MessagePluginInterface):
return True, "出关结算" return True, "出关结算"
async def _cmd_gather(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]: async def _cmd_gather(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
player = self.redis_db.get_player(sender, roomid or "") player = self._get_player_with_cache(sender, roomid or "")
if not player: if not player:
# client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender) # client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "未注册,请先发送:注册修仙 道号", sender)
# if self.revoke: # if self.revoke:
@@ -774,13 +778,18 @@ class XiuxianPlugin(MessagePluginInterface):
# self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5) # self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 5)
return False, "灵石不足" return False, "灵石不足"
player["spirit_stone"] = stones - qty player["spirit_stone"] = stones - qty
player["cultivation_points"] = int(player.get("cultivation_points", 0)) + qty * 10 base_gain = qty * 10
bonus = float(player.get("gather_bonus", 0.0))
gain = int(base_gain * (1.0 + bonus))
player["cultivation_points"] = int(player.get("cultivation_points", 0)) + gain
if bonus > 0:
player["gather_bonus"] = 0.0
self._save_player(player) self._save_player(player)
# 自动层级提升(不跨瓶颈) # 自动层级提升(不跨瓶颈)
self._auto_layer_up(sender, player) self._auto_layer_up(sender, player)
self.redis_db.leaderboard_add(sender, float(player["cultivation_points"])) self.redis_db.leaderboard_add(sender, float(player["cultivation_points"]))
self._rate_set(sender, roomid or "", "聚灵") self._rate_set(sender, roomid or "", "聚灵")
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 聚灵成功,消耗灵石{qty},获得修为{qty * 10}", sender) client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), f"✅ 聚灵成功,消耗灵石{qty},获得修为{gain}", sender)
if self.revoke: if self.revoke:
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10) self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
return True, "聚灵成功" return True, "聚灵成功"
@@ -790,8 +799,11 @@ class XiuxianPlugin(MessagePluginInterface):
lines = ["🏆 修为排行榜 Top10"] lines = ["🏆 修为排行榜 Top10"]
rank = 1 rank = 1
for uid, score in top: for uid, score in top:
player = self._get_player_with_cache(uid, roomid or "")
cp = int(player.get("cultivation_points", int(score))) if player else int(score)
nick = (player.get("dao_name") if player else None) or uid
mark = "" if uid == sender else "" mark = "" if uid == sender else ""
lines.append(f"{rank}. {uid} - {int(score)} {mark}") lines.append(f"{rank}. {nick} - 修为 {cp} {mark}")
rank += 1 rank += 1
client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "\n".join(lines), sender) client_msg_id, create_time, new_msg_id = await bot.send_text_message((roomid if roomid else sender), "\n".join(lines), sender)
if self.revoke: if self.revoke:
@@ -1011,6 +1023,100 @@ class XiuxianPlugin(MessagePluginInterface):
self._rate_set(sender, roomid or "", "背包") self._rate_set(sender, roomid or "", "背包")
return True, "背包" return True, "背包"
async def _cmd_use(self, bot: WechatAPIClient, sender: str, roomid: str, content: str) -> Tuple[bool, str]:
item_name = content.strip()
if not item_name:
return False, "命令格式错误"
player = self._get_player(sender, roomid or "")
if not player:
return False, "未注册"
player = self._check_status_update(player)
inv = player.get("inventory") or {}
qty = int(inv.get(item_name, 0))
if qty <= 0:
return False, "物品不足"
if item_name == "聚灵符":
inv[item_name] = qty - 1
player["inventory"] = inv
player["gather_bonus"] = float(player.get("gather_bonus", 0.0)) + 0.2
if self.xdb:
try:
self.xdb.remove_item(sender, item_name, 1)
except Exception:
pass
self._save_player(player)
self._rate_set(sender, roomid or "", "使用")
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 已使用聚灵符,本次聚灵收益提升", sender)
if self.revoke:
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
return True, "使用聚灵符"
if item_name == "回气丹":
status = player.get("status", "Idle")
if status not in ("Unstable_Qi", "Injured"):
return False, "当前状态无需服用"
inv[item_name] = qty - 1
player["inventory"] = inv
player["status"] = "Idle"
player["status_until"] = None
if self.xdb:
try:
self.xdb.remove_item(sender, item_name, 1)
except Exception:
pass
self._save_player(player)
self._rate_set(sender, roomid or "", "使用")
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, "✅ 已服用回气丹,状态已恢复为空闲", sender)
if self.revoke:
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
return True, "服用回气丹"
# 灵根提升丹药
upgrade_map = {
"洗髓丹": {"from": "废灵根", "to": "凡灵根", "rate": 0.6, "injured_min": 30},
"改灵丹": {"from": "凡灵根", "to": "地灵根", "rate": 0.3, "injured_min": 60},
"天灵露": {"from": "地灵根", "to": "天灵根", "rate": 0.1, "injured_min": 120},
}
if item_name in upgrade_map:
cur_root = player.get("spirit_root", "凡灵根")
rule = upgrade_map[item_name]
if cur_root != rule["from"]:
return False, "当前灵根不适用"
# 扣减丹药
inv[item_name] = qty - 1
player["inventory"] = inv
if self.xdb:
try:
self.xdb.remove_item(sender, item_name, 1)
except Exception:
pass
roll = random.random()
if roll < rule["rate"]:
# 成功,更新灵根与倍率
target = rule["to"]
player["spirit_root"] = target
mult = 1.0
for name, m in self.spirit_roots:
if name == target:
mult = m
break
player["spirit_root_mult"] = mult
self._save_player(player)
self._rate_set(sender, roomid or "", "使用")
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"✅ 灵根提升成功,当前灵根:{target}", sender)
if self.revoke:
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
return True, "灵根提升成功"
else:
# 失败,受伤保护
player["status"] = "Injured"
player["status_until"] = (datetime.now(timezone.utc) + timedelta(minutes=rule["injured_min"])) .isoformat()
self._save_player(player)
self._rate_set(sender, roomid or "", "使用")
client_msg_id, create_time, new_msg_id = await bot.send_text_message(roomid or sender, f"❌ 灵根提升失败,灵气反噬,受伤{rule['injured_min']}分钟", sender)
if self.revoke:
self.revoke.add_message_to_revoke((roomid if roomid else sender), client_msg_id, create_time, new_msg_id, 10)
return False, "灵根提升失败"
return False, "不可使用的物品"
async def _cmd_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]: async def _cmd_breakthrough(self, bot: WechatAPIClient, sender: str, roomid: str) -> Tuple[bool, str]:
player = self._get_player(sender, roomid or "") player = self._get_player(sender, roomid or "")
if not player: if not player: