准备战斗了吗? - 招募你的士兵
在上一课中,我们介绍了金库的概念。目前,在游戏设计中,金库的唯一用途是招募士兵。
士兵的作用如下:
额外的经济实力。
额外的攻击力。
额外的防御力。
根据游戏机制,城堡可以容纳士兵的数量上限取决于其大小。在 core.move
中:
/// 每个城堡的最大士兵数 - 小城堡
const MAX_SOLDIERS_SMALL_CASTLE : u64 = 500;
/// 每个城堡的最大士兵数 - 中城堡
const MAX_SOLDIERS_MIDDLE_CASTLE : u64 = 1000;
/// 每个城堡的最大士兵数 - 大城堡
const MAX_SOLDIERS_BIG_CASTLE : u64 = 2000;
添加一个函数以便更方便地获取限制:
/// 根据城堡大小获取士兵限制
fun get_castle_soldier_limit(size: u64) : u64 {
let soldier_limit;
if (size == CASTLE_SIZE_SMALL) {
soldier_limit = MAX_SOLDIERS_SMALL_CASTLE;
} else if (size == CASTLE_SIZE_MIDDLE) {
soldier_limit = MAX_SOLDIERS_MIDDLE_CASTLE;
} else if (size == CASTLE_SIZE_BIG) {
soldier_limit = MAX_SOLDIERS_BIG_CASTLE;
} else {
abort 0
};
soldier_limit
}
在 core.move
中创建 recruit_soldiers
函数:
/// 城堡使用金库招募士兵
public(package) fun recruit_soldiers (id: ID, count: u64, clock: &Clock, game_store: &mut GameStore) {
}
并在 castle.move
中添加调用入口:
/// 城堡使用金库招募士兵
entry fun recruit_soldiers(castle: &Castle, count: u64, clock: &Clock, game_store: &mut GameStore) {
core::recruit_soldiers(object::id(castle), count, clock, game_store);
}
首先需要从游戏存储中获取城堡数据:
// 1. 借用城堡数据
let castle_data = dynamic_field::borrow_mut<ID, CastleData>(&mut game_store.id, id);
然后检查士兵数量限制:
// 2. 检查数量限制
let final_soldiers = castle_data.millitary.soldiers + count;
assert!(final_soldiers <= get_castle_soldier_limit(castle_data.size), 0);
并检查金库是否充足:
/// 每个士兵的价格
const SOLDIER_PRICE : u64 = 100;
// 3. 检查金库是否充足
let total_soldier_price = SOLDIER_PRICE * count;
assert!(castle_data.economy.treasury >= total_soldier_price, 0);
不要忘记在更新士兵之前结算经济。
// 4. 结算经济
settle_castle_economy_inner(clock, castle_data);
然后更新金库和士兵:
// 5. 更新金库和士兵
castle_data.economy.treasury = castle_data.economy.treasury - total_soldier_price;
castle_data.millitary.soldiers = final_soldiers;
最后更新士兵增益:
// 6. 更新士兵经济实力增益
castle_data.economy.soldier_buff.power = SOLDIER_ECONOMIC_POWER * final_soldiers;
castle_data.economy.soldier_buff.start = clock::timestamp_ms(clock);
因此,完整的函数应为:
/// 城堡使用金库招募士兵
public(package) fun recruit_soldiers (id: ID, count: u64, clock: &Clock, game_store: &mut GameStore) {
// 1. 借用城堡数据
let castle_data = dynamic_field::borrow_mut<ID, CastleData>(&mut game_store.id, id);
// 2. 检查数量限制
let final_soldiers = castle_data.millitary.soldiers + count;
assert!(final_soldiers <= get_castle_soldier_limit(castle_data.size), 0);
// 3. 检查金库是否充足
let total_soldier_price = SOLDIER_PRICE * count;
assert!(castle_data.economy.treasury >= total_soldier_price, 0);
// 4. 结算经济
settle_castle_economy_inner(clock, castle_data);
// 5. 更新金库和士兵
castle_data.economy.treasury = castle_data.economy.treasury - total_soldier_price;
castle_data.millitary.soldiers = final_soldiers;
// 6. 更新士兵经济实力增益
castle_data.economy.soldier_buff.power = SOLDIER_ECONOMIC_POWER * final_soldiers;
castle_data.economy.soldier_buff.start = clock::timestamp_ms(clock);
}
/// 每个士兵的价格
const SOLDIER_PRICE : u64 = 100;