是时候变得更强了——升级你的城堡
在战斗之后,假设获胜者现在有足够的经验点数进行升级。城堡的等级设计从1到10,每个等级需要不同的升级经验点数。
在core.move中添加所需的经验点常量:
/// 等级2-10所需的经验点数
const REQUIRED_EXP_LEVELS : vector<u64> = vector[100, 150, 225, 338, 507, 760, 1140, 1709, 2563];
在core.move中创建一个upgrade_castle函数并获取城堡数据:
/// 消耗经验池中的经验点来升级城堡
public(package) fun upgrade_castle(id: ID, game_store: &mut GameStore) {
// 1. 获取城堡数据
let castle_data = dynamic_field::borrow_mut<ID, CastleData>(&mut game_store.id, id);
}
消耗经验点并进行升级,重复这一过程直到达到最大等级,或经验点不足为止:
// 2. 如果经验足够,持续升级
let mut initial_level = castle_data.level;
let mut exp_level_map = REQUIRED_EXP_LEVELS;
while (castle_data.level < MAX_CASTLE_LEVEL) {
let exp_required_at_current_level = *vector::borrow(&exp_level_map, castle_data.level - 1);
if(castle_data.experience_pool < exp_required_at_current_level) {
break
};
castle_data.experience_pool = castle_data.experience_pool - exp_required_at_current_level;
castle_data.level = castle_data.level + 1;
};
/// 最大城堡等级
const MAX_CASTLE_LEVEL : u64 = 10;
如果城堡升级了,更新其基础经济力量、基础攻击和防御力量。需要重新计算它们。
基础经济力量通过其初始力量计算,每升一级增加20%。在core.move中:
/// 计算城堡的基础经济力量
fun calculate_castle_base_economic_power(castle_data: &CastleData): u64 {
let initial_base_power = get_initial_economic_power(castle_data.size);
let level = castle_data.level;
math::divide_and_round_up(initial_base_power * 12 * math::pow(10, ((level - 1) as u8)), 10)
}
对于基础攻击力和基础防御力,除了每级增加20%,还有一个大小系数需要乘以。在 core.move
中:
/// 获取城堡大小系数
fun get_castle_size_factor(castle_size: u64): u64 {
let factor;
if (castle_size == CASTLE_SIZE_SMALL) {
factor = CASTLE_SIZE_FACTOR_SMALL;
} else if (castle_size == CASTLE_SIZE_MIDDLE) {
factor = CASTLE_SIZE_FACTOR_MIDDLE;
} else if (castle_size == CASTLE_SIZE_BIG) {
factor = CASTLE_SIZE_FACTOR_BIG;
} else {
abort 0
};
factor
}
/// 城堡大小系数 - 小
const CASTLE_SIZE_FACTOR_SMALL : u64 = 2;
/// 城堡大小系数 - 中
const CASTLE_SIZE_FACTOR_MIDDLE : u64 = 3;
/// 城堡大小系数 - 大
const CASTLE_SIZE_FACTOR_BIG : u64 = 5;
然后计算攻击力/防御力:
/// 根据等级计算城堡的基础攻击力和基础防御力
/// 基础攻击力 = (城堡大小系数 * 初始攻击力 * (1.2 ^ (等级 - 1)))
/// 基础防御力 = (城堡大小系数 * 初始防御力 * (1.2 ^ (等级 - 1)))
fun calculate_castle_base_attack_defense_power(castle_data: &CastleData): (u64, u64) {
let castle_size_factor = get_castle_size_factor(castle_data.size);
let (initial_attack, initial_defense) = get_initial_attack_defense_power(castle_data.race);
let attack_power = math::divide_and_round_up(castle_size_factor * initial_attack * 12 * math::pow(10, ((castle_data.level - 1) as u8)), 10);
let defense_power = math::divide_and_round_up(castle_size_factor * initial_defense * 12 * math::pow(10, ((castle_data.level - 1) as u8)), 10);
(attack_power, defense_power)
}
回到 upgrade_castle
函数:
// 3. 如果升级了,更新力量
if (castle_data.level > initial_level) {
let base_economic_power = calculate_castle_base_economic_power(freeze(castle_data));
castle_data.economy.base_power = base_economic_power;
let (attack_power, defense_power) = calculate_castle_base_attack_defense_power(freeze(castle_data));
castle_data.millitary.attack_power = attack_power;
castle_data.millitary.defense_power = defense_power;
}
还记得freeze吗?如果需要,请查看“参数传递”一课。
检查完整的升级城堡函数:
/// 消耗经验池中的经验点来升级城堡
public(package) fun upgrade_castle(id: ID, game_store: &mut GameStore) {
// 1. 获取城堡数据
let castle_data = dynamic_field::borrow_mut<ID, CastleData>(&mut game_store.id, id);
// 2. 如果经验足够,持续升级
let initial_level = castle_data.level;
let exp_level_map = REQUIRED_EXP_LEVELS;
while (castle_data.level < MAX_CASTLE_LEVEL) {
let exp_required_at_current_level = *vector::borrow(&exp_level_map, castle_data.level - 1);
if(castle_data.experience_pool < exp_required_at_current_level) {
break
};
castle_data.experience_pool = castle_data.experience_pool - exp_required_at_current_level;
castle_data.level = castle_data.level + 1;
};
// 3. 如果升级了,更新力量
if (castle_data.level > initial_level) {
let base_economic_power = calculate_castle_base_economic_power(freeze(castle_data));
castle_data.economy.base_power = base_economic_power;
let (attack_power, defense_power) = calculate_castle_base_attack_defense_power(freeze(castle_data));
castle_data.millitary.attack_power = attack_power;
castle_data.millitary.defense_power = defense_power;
}
}
最后,在 castle.move
中添加一个入口:
/// 升级城堡
entry fun upgrade_castle(castle: &Castle, game_store: &mut GameStore) {
core::upgrade_castle(object::id(castle), game_store);
}