准备战斗了吗? - 招募你的士兵

在上一课中,我们介绍了金库的概念。目前,在游戏设计中,金库的唯一用途是招募士兵。

士兵的作用如下:

额外的经济实力。 额外的攻击力。 额外的防御力。 根据游戏机制,城堡可以容纳士兵的数量上限取决于其大小。在 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;