1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
| // service/enhance_service.cxx
enum class EnhanceResult
{
Success, MaxLevel, InsufficientGold, Failed, Error
};
// 强化费用表
static const uint64_t enhanceCostTable[] = {
100, 200, 400, 800, 1600, 3200, 6400, 12800,
25600, 51200, 100000, 200000, 400000, 800000, 1600000
};
// 强化成功率表(万分比)
static const int enhanceRateTable[] = {
10000, 9500, 9000, 8000, 7000, 6000, 5000,
4000, 3000, 2000, 1500, 1000, 500, 300, 100
};
EnhanceResult enhanceEquipment(odb::database& db, uint64_t playerId,
uint64_t equipmentId)
{
try
{
odb::session s;
odb::transaction t(db.begin());
auto player = db.load<Player>(playerId);
auto equip = db.load<Equipment>(equipmentId);
// 验证装备属于该玩家
if (equip->wearer().object_id<Player>() != playerId)
return EnhanceResult::Error;
int currentLevel = equip->enhanceLevel();
// 已满级
if (currentLevel >= equip->maxEnhance())
return EnhanceResult::MaxLevel;
// 检查金币
uint64_t cost = enhanceCostTable[currentLevel];
if (player->gold() < cost)
return EnhanceResult::InsufficientGold;
// 扣金币
player->deductGold(cost);
db.update(*player);
// 判断是否成功(伪随机)
int rate = enhanceRateTable[currentLevel];
bool success = (rand() % 10000) < rate;
if (success)
{
equip->setEnhanceLevel(currentLevel + 1);
equip->addAttack(10 + currentLevel * 5);
equip->addDefense(5 + currentLevel * 3);
db.update(*equip);
}
// 失败不降级,只扣金币
// 记录日志
TradeLog log(playerId, TradeAction::Enhance,
equip->templateId(), 1, cost,
success ? "强化成功" : "强化失败");
db.persist(log);
t.commit();
return success ? EnhanceResult::Success : EnhanceResult::Failed;
}
catch (const odb::exception& e)
{
LOG_ERROR("装备强化异常: {}", e.what());
return EnhanceResult::Error;
}
}
|