16个版本 (4个重大更新)

0.5.0 2023年10月14日
0.4.12 2023年5月28日
0.4.5 2023年4月25日
0.4.4 2023年3月12日
0.1.0 2023年2月9日

#183 in 测试

Download history 21/week @ 2024-07-04 67/week @ 2024-07-25

每月88次下载

MIT 许可证

1MB
24K SLoC

SAPTest

CI codecov

Super Auto Pets的数据库和测试框架。

游戏信息从Super Auto Pets维基页面查询并存储在SQLite数据库中。


用法

使用cargo将其添加到项目中。

cargo add saptest

团队

构建一个Team并在它们之间模拟战斗。

然后在.dot格式中可视化结果!

use saptest::{
    Pet, PetName, Food, FoodName,
    Team, TeamCombat, Position, create_battle_digraph
};
// Create a team.
let mut team = Team::new(
    &vec![Some(Pet::try_from(PetName::Ant).unwrap()); 5],
    5
).unwrap();
let mut enemy_team = team.clone();

// Set a seed for a team.
team.set_seed(Some(25));

// Give food to pets.
team.set_item(&Position::First, Food::try_from(FoodName::Garlic).ok()).unwrap();
enemy_team.set_item(&Position::First, Food::try_from(FoodName::Garlic).ok()).unwrap();

// And fight!
team.fight(&mut enemy_team).unwrap();

// Create a graph of the fight.
println!("{}", create_battle_digraph(&team, false));
digraph {
    rankdir=LR
    node [shape=box, style="rounded, filled", fontname="Arial"]
    edge [fontname="Arial"]
    0 [ label = "Ant_0 - The Fragile Truckers_copy" ]
    1 [ label = "Ant_0 - The Fragile Truckers", fillcolor = "yellow" ]
    2 [ label = "Ant_3 - The Fragile Truckers", fillcolor = "yellow" ]
    3 [ label = "Ant_4 - The Fragile Truckers_copy" ]
    0 -> 1 [ label = "(Attack, Damage (0, 2), Phase: 1)" ]
    1 -> 0 [ label = "(Attack, Damage (0, 2), Phase: 1)" ]
    1 -> 2 [ label = "(Faint, Add (1, 1), Phase: 1)" ]
    0 -> 3 [ label = "(Faint, Add (1, 1), Phase: 1)" ]
}

图表可以像上面的例子一样简单...或者极其复杂。

使用Graphviz Online

商店

Team添加商店功能,掷骰子、冻结、购买/出售宠物和食物。

use saptest::{
    Shop, ShopItem, TeamShopping, Team,
    Position, Entity, EntityName, Food, FoodName,
    db::pack::Pack
};

// All teams are constructed with a shop at tier 1.
let mut team = Team::default();

// All shop functionality is supported.
team.set_shop_seed(Some(1212))
    .set_shop_packs(&[Pack::Turtle])
    .open_shop().unwrap()
    .buy(
        &Position::First, // From first.
        &Entity::Pet, // Pet
        &Position::First // To first position, merging if possible.
    ).unwrap()
    .move_pets(
        &Position::First, // First pet.
        &Position::Relative(-2), // To pet 2 slots behind. Otherwise, ignore.
        true // And merge them if possible.
    ).unwrap()
    .sell(&Position::First).unwrap()
    .freeze_shop(&Position::Last, &Entity::Pet).unwrap()
    .roll_shop().unwrap()
    .close_shop().unwrap();

// Shops can be built separately and can replace a team's shop.
let mut tier_5_shop = Shop::new(3, Some(42)).unwrap();
let weakness = ShopItem::new(
    Food::try_from(FoodName::Weak).unwrap()
);
tier_5_shop.add_item(weakness).unwrap();
team.replace_shop(tier_5_shop).unwrap();

宠物

构建自定义PetEffect

use saptest::{
    Pet, PetName, PetCombat,
    Food, FoodName,
    Entity, Position, Effect, Statistics,
    effects::{
        trigger::TRIGGER_START_BATTLE,
        actions::GainType,
        state::Target,
        actions::Action
    }
};
// Create known pets.
let mut pet = Pet::try_from(PetName::Ant).unwrap();

// Or custom pets and effects.
let custom_effect = Effect::new(
    TRIGGER_START_BATTLE, // Effect trigger
    Target::Friend, // Target
    Position::Adjacent, // Positions
    Action::Gain(GainType::DefaultItem(FoodName::Melon)), // Action
    Some(1), // Number of uses.
    false, // Is temporary.
);
let mut custom_pet = Pet::custom(
    "MelonBear",
    Statistics::new(50, 50).unwrap(),
    &[custom_effect],
);

// Fight two pets individually as well.
// Note: Effects don't activate here.
pet.attack(&mut custom_pet);

日志记录

使用类似simple_logger的crate启用日志记录。

配置

要配置全局SapDB的启动,在项目的根目录中创建一个.saptest.toml文件。

  • 指定要查询的宠物、食物和令牌的页面版本。
  • 在启动时切换重复更新的选项。
  • 设置数据库文件名。
[database]
# https://superautopets.wiki.gg/index.php?title=Pets&oldid=4634
pets_version = 4634
filename = "./sap.db"
update_on_startup = false

[general]中使用build_graph禁用图形构建。

[general]
build_graph = false

基准测试

saptest的基准测试位于benches/battle_benchmarks.rs中,并使用criterion crate运行。

  • sapai相比,这是一个用Python编写的Super Auto Pets测试框架。
  • 两个测试都在AMD Ryzen 5 5600 6核处理器 @ 3.50 GHz上运行。
# saptest
git clone [email protected]:koisland/SuperAutoTest.git --depth 1
cargo add cargo-tarpaulin
cargo bench && open target/criterion/sapai_example/report/index.html
# sapai
cd benches/
git clone https://github.com/manny405/sapai.git && cd sapai
python setup.py install
# Then run `battle_benchmarks_sapai.ipynb`.

saptest(无图形)

  • 待办事项

saptest(图形)

  • 待办事项

sapai

  • 每次循环4.29 ms ± 51.8 µs(7次运行的平均值 ± 标准差,每次100个循环)

待办事项

  • 添加随机生成队伍的特性。
  • 添加遍历记录字段/字段名的方法,并构建宏来构建SQL语句。
    • 手动添加字段既繁琐又容易出错。
  • 构建解析原始效果文本到Effect结构的词法分析器。
  • 为每个包添加功能标志。
  • 改进界面。
    • 具有类似于AsRefInto/TryInto的函数参数。例如:Shop.add_item
    • 使用Shop<Open/Close>的类型状态模式

来源

依赖项

~37MB
~629K SLoC