嵌套结构体 - 城堡数据结构体

在上一课中,我们学会了如何创建一个结构体并创建了表示城堡对象的 "Castle" 结构体。 在 Move Castle 游戏中,城堡配备了特定的游戏数据。本课中,我们将深入创建一个单独的城堡数据结构体,并探讨嵌套结构体的概念。

为了在 Sui 的 Move 中方便地使用嵌套结构体,一种常见做法是“包装”。在这种方法中,定义了外层的“包装”结构体 CastleData。 以下是在 sources/ 下创建 core.move 模块,其中介绍了 CastleData 结构体,并填充了基本的游戏属性:

module move_castle::core {
    use sui::object::{Self, UID, ID};

    public struct CastleData has store {
        id: ID,
        size: u64,
        race: u64,
        level: u64,
        experience_pool: u64,
    }
}

与我们在 Castle 结构体中使用的 UID 不同,ID 不是全局唯一的,您可以从 UID 创建 ID,并且 ID 可以被复制和丢弃。有关详细信息,请查看 sui-frameworkobject.move 的源代码。

Move 2024.beta 版自动包含 sui::object 模块的别名。这意味着您可以从代码中删除 use sui::object::{Self, UID, ID}; 这一行。

在游戏机制中,城堡的核心属性包括尺寸、种族、等级和升级所需的经验池。

还有两个核心方面:经济和战斗机制。

让我们创建 Economy 结构体:

public struct Economy has store {
    treasury: u64,
    base_power: u64,
    settle_time: u64
}

economy 字段集成到现有的 CastleData 结构体中:

public struct CastleData has store {
    id: ID,
    size: u64,
    race: u64,
    level: u64,
    experience_pool: u64,
    economy: Economy,
}

现在,将 CastleData 结构体扩展以包括用于战斗机制的 Millitary 结构体:

public struct CastleData has store {
    id: ID,
    size: u64,
    race: u64,
    level: u64,
    experience_pool: u64,
    economy: Economy,
    millitary: Millitary,
}

public struct Millitary has store {
    attack_power: u64,
    defense_power: u64,
    total_attack_power: u64,
    total_defense_power: u64,
    soldiers: u64,
    battle_cooldown: u64,
}

对于更复杂的情况,您可以更深入地嵌套结构体。向 Economy 结构体添加两个额外字段:

use std::vector;

public struct Economy has store {
    treasury: u64,
    base_power: u64,
    settle_time: u64,
    soldier_buff: EconomicBuff,
}

public struct EconomicBuff has copy, store, drop {
    debuff: bool,
    power: u64,
    start: u64,
    end: u64,
}

您是否注意到这里引入了一个 vector?这是 Move 语言提供的集合支持。我们将在下一课中深入探讨其用法。顺便提一下,std::vector 模块也是默认提供的。