修改冒险装备掉落物逻辑

This commit is contained in:
2025-11-14 19:35:50 +08:00
parent 5d17172a23
commit fa5d49e465
2 changed files with 239 additions and 27 deletions

View File

@@ -941,7 +941,7 @@ class CombatService:
}
# 根据阶段决定掉落数量
num_drops = min(1 + stage // 3, 3) # 1-3件物品
num_drops = max(0, random.randint(0, stage) + random.randint(-3,3))
rewards["items"] = []
for _ in range(num_drops):
@@ -956,6 +956,41 @@ class CombatService:
return rewards
def _get_tier_weights_by_stage(self, stage: int) -> Dict[BackpackItemTier, int]:
"""
根据阶段计算品质权重
Args:
stage: 当前冒险阶段
Returns:
品质权重字典 {BackpackItemTier: weight}
"""
weights = {}
# COMMON: 阶段1+,权重随阶段下降
weights[BackpackItemTier.COMMON] = max(100 - stage * 3, 20)
# RARE: 阶段3+,权重随阶段上升
if stage >= 3:
weights[BackpackItemTier.RARE] = min(30 + stage * 4, 80)
else:
weights[BackpackItemTier.RARE] = 0
# EPIC: 阶段6+,权重随阶段上升
if stage >= 6:
weights[BackpackItemTier.EPIC] = min(15 + stage * 3, 60)
else:
weights[BackpackItemTier.EPIC] = 0
# LEGENDARY: 阶段10+,权重随阶段上升
if stage >= 10:
weights[BackpackItemTier.LEGENDARY] = min(5 + stage * 2, 40)
else:
weights[BackpackItemTier.LEGENDARY] = 0
return weights
def _generate_loot_item(self, loot_type: str, stage: int) -> Optional[Dict[str, Any]]:
"""生成单个掉落物品"""
from .combat_models import (
@@ -967,16 +1002,18 @@ class CombatService:
)
if loot_type == "equipment":
# 根据阶段提升装备品质概率
tier_weights = {
BackpackItemTier.COMMON: max(50 - stage * 5, 10),
BackpackItemTier.RARE: 30 + stage * 3,
BackpackItemTier.EPIC: 15 + stage * 2,
BackpackItemTier.LEGENDARY: min(5 + stage, 20),
}
# 根据阶段获取品质权重
tier_weights = self._get_tier_weights_by_stage(stage)
# 过滤掉权重为0的品质
available_tiers = {t: w for t, w in tier_weights.items() if w > 0}
if not available_tiers:
return None
tier = random.choices(
list(tier_weights.keys()),
weights=list(tier_weights.values())
list(available_tiers.keys()),
weights=list(available_tiers.values())
)[0]
# 筛选该品质的装备
@@ -986,29 +1023,117 @@ class CombatService:
return {"type": "equipment", "item_id": equipment.item_id, "quantity": 1}
elif loot_type == "material":
# 材料品质也随阶段提升
materials = list(ADVENTURE_MATERIALS.items())
# 高阶段有更高概率掉稀有材料
idx = min(stage // 2, len(materials) - 1)
item_id, (_, tier, _) = random.choice(materials[max(0, idx-1):])
quantity = random.randint(1, 3)
return {"type": "material", "item_id": item_id, "quantity": quantity}
# 根据阶段获取品质权重
tier_weights = self._get_tier_weights_by_stage(stage)
# 过滤掉权重为0的品质
available_tiers = {t: w for t, w in tier_weights.items() if w > 0}
if not available_tiers:
return None
# 按品质筛选材料
materials_by_tier = {}
for item_id, (name, tier, desc) in ADVENTURE_MATERIALS.items():
if tier not in materials_by_tier:
materials_by_tier[tier] = []
materials_by_tier[tier].append((item_id, (name, tier, desc)))
# 选择品质
tier = random.choices(
list(available_tiers.keys()),
weights=list(available_tiers.values())
)[0]
# 从该品质的材料中随机选择
if tier in materials_by_tier:
item_id, (_, _, _) = random.choice(materials_by_tier[tier])
quantity = random.randint(1, 3)
return {"type": "material", "item_id": item_id, "quantity": quantity}
elif loot_type == "souvenir":
souvenirs = list(ADVENTURE_SOUVENIRS.keys())
item_id = random.choice(souvenirs)
return {"type": "souvenir", "item_id": item_id, "quantity": 1}
# 根据阶段获取品质权重
tier_weights = self._get_tier_weights_by_stage(stage)
# 过滤掉权重为0的品质
available_tiers = {t: w for t, w in tier_weights.items() if w > 0}
if not available_tiers:
return None
# 按品质筛选纪念品
souvenirs_by_tier = {}
for item_id, (name, tier, sell_price, desc) in ADVENTURE_SOUVENIRS.items():
if tier not in souvenirs_by_tier:
souvenirs_by_tier[tier] = []
souvenirs_by_tier[tier].append(item_id)
# 选择品质
tier = random.choices(
list(available_tiers.keys()),
weights=list(available_tiers.values())
)[0]
# 从该品质的纪念品中随机选择
if tier in souvenirs_by_tier:
item_id = random.choice(souvenirs_by_tier[tier])
return {"type": "souvenir", "item_id": item_id, "quantity": 1}
elif loot_type == "potion":
potions = list(COMBAT_POTIONS.keys())
item_id = random.choice(potions)
quantity = random.randint(1, 2)
return {"type": "potion", "item_id": item_id, "quantity": quantity}
# 根据阶段获取品质权重
tier_weights = self._get_tier_weights_by_stage(stage)
# 过滤掉权重为0的品质
available_tiers = {t: w for t, w in tier_weights.items() if w > 0}
if not available_tiers:
return None
# 按品质筛选药剂
potions_by_tier = {}
for item_id, (name, tier, desc) in COMBAT_POTIONS.items():
if tier not in potions_by_tier:
potions_by_tier[tier] = []
potions_by_tier[tier].append(item_id)
# 选择品质
tier = random.choices(
list(available_tiers.keys()),
weights=list(available_tiers.values())
)[0]
# 从该品质的药剂中随机选择
if tier in potions_by_tier:
item_id = random.choice(potions_by_tier[tier])
quantity = random.randint(1, 2)
return {"type": "potion", "item_id": item_id, "quantity": quantity}
elif loot_type == "seed":
if stage >= 5: # 高阶段才掉落稀有种子
seeds = list(ADVENTURE_SEEDS.keys())
item_id = random.choice(seeds)
# 根据阶段获取品质权重
tier_weights = self._get_tier_weights_by_stage(stage)
# 过滤掉权重为0的品质
available_tiers = {t: w for t, w in tier_weights.items() if w > 0}
if not available_tiers:
return None
# 按品质筛选种子
seeds_by_tier = {}
for item_id, (name, tier, desc) in ADVENTURE_SEEDS.items():
if tier not in seeds_by_tier:
seeds_by_tier[tier] = []
seeds_by_tier[tier].append(item_id)
# 选择品质
tier = random.choices(
list(available_tiers.keys()),
weights=list(available_tiers.values())
)[0]
# 从该品质的种子中随机选择
if tier in seeds_by_tier:
item_id = random.choice(seeds_by_tier[tier])
return {"type": "seed", "item_id": item_id, "quantity": 1}
return None