Database and testing framework for Super Auto Pets.
Game information is queried from the Super Auto Pets Fandom wiki page and stored in a SQLite
database.
Build a Team
and simulate battles between them.
```rust
use saptest::{
Pet, PetName, Food, FoodName,
Team, TeamCombat, Position
};
// Create a team.
let mut team = Team::new(
&vec![Some(Pet::tryfrom(PetName::Ant).unwrap()); 5],
5
).unwrap();
let mut enemyteam = team.clone();
// Set a seed for a team. team.set_seed(Some(25));
// Give food to pets. team.setitem(Position::First, Food::tryfrom(FoodName::Garlic).ok()); enemyteam.setitem(Position::First, Food::try_from(FoodName::Garlic).ok());
// And fight! team.fight(&mut enemy_team); ```
Add shop functionality to a Team
and roll, freeze, buy/sell pets and foods.
```rust
use saptest::{
Shop, ShopItem, TeamShopping, Team,
Position, Entity, EntityName, FoodName
};
// All teams are constructed with a shop at tier 1. let mut team = Team::default();
// All shop functionality is supported. team.setshopseed(Some(1212)) .setshoppacks(&[Pack::Turtle]) .openshop().unwrap() .buy( &Position::First, // From first. &Entity::Pet, // Pet &Position::First // To first position, merging if possible. ).unwrap() .movepets( &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() .freezeshop(&Position::Last, &Entity::Pet).unwrap() .rollshop().unwrap() .close_shop().unwrap();
// Shops can be built separately and can replace a team's shop. let mut tier5shop = Shop::new(3, Some(42)).unwrap(); let weakness = ShopItem::new( EntityName::Food(FoodName::Weak), 5 ).unwrap(); tier5shop.additem(weakness).unwrap(); team.replaceshop(tier5shop).unwrap(); ```
Build custom Pet
s and Effect
s.
```rust
use saptest::{
Pet, PetName, PetCombat,
Food, FoodName,
Entity, Position, Effect, Statistics,
effects::{
trigger::TRIGGERSTARTBATTLE,
actions::GainType,
state::Target,
actions::Action
}
};
// Create known pets.
let mut pet = Pet::try_from(PetName::Ant).unwrap();
// Or custom pets and effects. let customeffect = Effect::new( Entity::Pet, TRIGGERSTARTBATTLE, // 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 custompet = Pet::custom( "MelonBear", Some("melonbear1".tostring()), Statistics::new(50, 50).unwrap(), &[custom_effect], );
// Fight two pets individually as well. // Note: Effects don't activate here. pet.attack(&mut custom_pet); ```
Enable logging with log4rs
with build_log_config
to view battle logic.
```rust
use saptest::logging::buildlogconfig;
let config = buildlogconfig(); log4rs::init_config(config).unwrap();
// Code below. ... ```
To configure the global SapDB
's startup, create a .saptest.toml
file in the root of your project.
* Specify page versions for pets, foods, and tokens to query.
* Toggle recurring updates on startup.
* Set database filename.
```toml [database]
petsversion = 4883 filename = "./sap.db" updateon_startup = false ```
Benchmarks for saptest
are located in benches/battle_benchmarks.rs
and run using the criterion
crate.
* Compared against sapai
, a Super Auto Pets testing framework written in Python.
* Both tests were run on an AMD Ryzen 5 5600 6-Core Processor @ 3.50 GHz.
```bash
cargo bench && open target/criterion/sapai_example/report/index.html ```
```bash
cd benches/ git clone https://github.com/manny405/sapai.git && cd sapai python setup.py install
battle_benchmarks_sapai.ipynb
.```