add nullable item shops for faster test runtimes
This commit is contained in:
parent
ffd431cd3b
commit
76fd7e82f6
@ -8,6 +8,10 @@ maps = { workspace = true }
|
||||
stats = { workspace = true }
|
||||
entity = { workspace = true }
|
||||
|
||||
async-std = { workspace = true }
|
||||
async-trait = { workspace = true }
|
||||
futures = { workspace = true }
|
||||
rand = { workspace = true }
|
||||
rand_chacha = { workspace = true }
|
||||
toml = { workspace = true }
|
||||
serde = { workspace = true }
|
@ -2,7 +2,16 @@ mod weapon;
|
||||
mod tool;
|
||||
mod armor;
|
||||
|
||||
use async_std::sync::{Arc, Mutex};
|
||||
use futures::future::OptionFuture;
|
||||
use std::collections::HashMap;
|
||||
use entity::item::ItemDetail;
|
||||
use maps::room::Difficulty;
|
||||
use entity::character::SectionID;
|
||||
|
||||
pub use weapon::{WeaponShop, WeaponShopItem};
|
||||
pub use tool::{ToolShop, ToolShopItem};
|
||||
pub use armor::{ArmorShop, ArmorShopItem};
|
||||
|
||||
pub trait ShopItem {
|
||||
fn price(&self) -> usize;
|
||||
@ -10,12 +19,77 @@ pub trait ShopItem {
|
||||
fn as_item(&self) -> ItemDetail;
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
pub trait ItemShops {
|
||||
async fn generate_weapon_list(&self, difficulty: Difficulty, section_id: SectionID, char_level: usize) -> Option<Vec<WeaponShopItem>>;
|
||||
async fn generate_tool_list(&self, char_level: usize) -> Vec<ToolShopItem>;
|
||||
async fn generate_armor_list(&self, char_level: usize) -> Vec<ArmorShopItem>;
|
||||
}
|
||||
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct StandardItemShops {
|
||||
weapon_shop: HashMap<(Difficulty, SectionID), Arc<Mutex<WeaponShop<rand_chacha::ChaCha20Rng>>>>,
|
||||
tool_shop: Arc<Mutex<ToolShop<rand_chacha::ChaCha20Rng>>>,
|
||||
armor_shop: Arc<Mutex<ArmorShop<rand_chacha::ChaCha20Rng>>>,
|
||||
}
|
||||
|
||||
impl Default for StandardItemShops {
|
||||
fn default() -> StandardItemShops {
|
||||
let difficulty = [Difficulty::Normal, Difficulty::Hard, Difficulty::VeryHard, Difficulty::Ultimate];
|
||||
let section_id = [SectionID::Viridia, SectionID::Greenill, SectionID::Skyly, SectionID::Bluefull, SectionID::Purplenum,
|
||||
SectionID::Pinkal, SectionID::Redria, SectionID::Oran, SectionID::Yellowboze, SectionID::Whitill];
|
||||
|
||||
let mut weapon_shop = HashMap::new();
|
||||
for d in difficulty.iter() {
|
||||
for id in section_id.iter() {
|
||||
weapon_shop.insert((*d, *id), Arc::new(Mutex::new(WeaponShop::new(*d, *id))));
|
||||
}
|
||||
}
|
||||
|
||||
StandardItemShops {
|
||||
weapon_shop,
|
||||
tool_shop: Arc::new(Mutex::new(ToolShop::default())),
|
||||
armor_shop: Arc::new(Mutex::new(ArmorShop::default())),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl ItemShops for StandardItemShops {
|
||||
async fn generate_weapon_list(&self, difficulty: Difficulty, section_id: SectionID, char_level: usize) -> Option<Vec<WeaponShopItem>> {
|
||||
OptionFuture::from(
|
||||
self.weapon_shop
|
||||
.get(&(difficulty, section_id))
|
||||
.map(|shop| async {
|
||||
shop
|
||||
.lock()
|
||||
.await
|
||||
.generate_weapon_list(char_level)
|
||||
})).await
|
||||
}
|
||||
|
||||
async fn generate_tool_list(&self, char_level: usize) -> Vec<ToolShopItem> {
|
||||
self.tool_shop
|
||||
.lock()
|
||||
.await
|
||||
.generate_tool_list(char_level)
|
||||
}
|
||||
|
||||
async fn generate_armor_list(&self, char_level: usize) -> Vec<ArmorShopItem> {
|
||||
self.armor_shop
|
||||
.lock()
|
||||
.await
|
||||
.generate_armor_list(char_level)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
pub enum ShopType {
|
||||
Weapon,
|
||||
Tool,
|
||||
Armor
|
||||
}
|
||||
|
||||
pub use weapon::{WeaponShop, WeaponShopItem};
|
||||
pub use tool::{ToolShop, ToolShopItem};
|
||||
pub use armor::{ArmorShop, ArmorShopItem};
|
||||
|
@ -1,11 +1,12 @@
|
||||
use log::warn;
|
||||
use async_std::sync::Arc;
|
||||
use rand::Rng;
|
||||
use rand::seq::SliceRandom;
|
||||
use libpso::packet::ship::*;
|
||||
use libpso::packet::messages::*;
|
||||
use stats::leveltable::LEVEL_TABLE;
|
||||
use networking::serverstate::ClientId;
|
||||
use crate::ship::ship::{SendShipPacket, ShipError, Clients, ItemShops};
|
||||
use crate::ship::ship::{SendShipPacket, ShipError, Clients};
|
||||
use location::ClientLocation;
|
||||
use drops::ItemDrop;
|
||||
use room::Rooms;
|
||||
@ -14,7 +15,7 @@ use entity::gateway::EntityGateway;
|
||||
use entity::item;
|
||||
use libpso::utf8_to_utf16_array;
|
||||
use pktbuilder as builder;
|
||||
use shops::{ShopItem, ToolShopItem, ArmorShopItem};
|
||||
use shops::{ItemShops, ShopItem, ToolShopItem, ArmorShopItem};
|
||||
use items::state::{ItemState, ItemStateError};
|
||||
use items::floor::{FloorType, FloorItemDetail};
|
||||
use items::actions::TriggerCreateItem;
|
||||
@ -320,45 +321,30 @@ pub async fn shop_request(id: ClientId,
|
||||
client_location: &ClientLocation,
|
||||
clients: &Clients,
|
||||
rooms: &Rooms,
|
||||
shops: &ItemShops)
|
||||
shops: &Arc<Box<dyn ItemShops + Send + Sync>>)
|
||||
-> Result<Vec<(ClientId, SendShipPacket)>, anyhow::Error>
|
||||
{
|
||||
//let client = clients.get_mut(&id).ok_or(ShipError::ClientNotFound(id))?;
|
||||
let room_id = client_location.get_room(id).await?;
|
||||
/*
|
||||
let room = rooms.get(room_id.0)
|
||||
.ok_or(ShipError::InvalidRoom(room_id.0 as u32))?
|
||||
.as_ref()
|
||||
.ok_or(ShipError::InvalidRoom(room_id.0 as u32))?;
|
||||
*/
|
||||
let difficulty = rooms.with(room_id, |room| Box::pin(async move {
|
||||
room.mode.difficulty()
|
||||
})).await?;
|
||||
let shop_list = clients.with_mut(id, |client| {
|
||||
let mut shops = shops.clone();
|
||||
let shops = shops.clone();
|
||||
Box::pin(async move {
|
||||
let level = LEVEL_TABLE.get_level_from_exp(client.character.char_class, client.character.exp) as usize;
|
||||
match shop_request.shop_type {
|
||||
SHOP_OPTION_WEAPON => {
|
||||
client.weapon_shop = shops.weapon_shop.get_mut(&(difficulty, client.character.section_id))
|
||||
.ok_or(ShipError::ShopError)?
|
||||
.lock()
|
||||
client.weapon_shop = shops.generate_weapon_list(difficulty, client.character.section_id, level)
|
||||
.await
|
||||
.generate_weapon_list(level);
|
||||
.ok_or(ShipError::ShopError)?;
|
||||
Ok(builder::message::shop_list(shop_request.shop_type, &client.weapon_shop))
|
||||
},
|
||||
SHOP_OPTION_TOOL => {
|
||||
client.tool_shop = shops.tool_shop
|
||||
.lock()
|
||||
.await
|
||||
.generate_tool_list(level);
|
||||
client.tool_shop = shops.generate_tool_list(level).await;
|
||||
Ok(builder::message::shop_list(shop_request.shop_type, &client.tool_shop))
|
||||
},
|
||||
SHOP_OPTION_ARMOR => {
|
||||
client.armor_shop = shops.armor_shop
|
||||
.lock()
|
||||
.await
|
||||
.generate_armor_list(level);
|
||||
client.armor_shop = shops.generate_armor_list(level).await;
|
||||
Ok(builder::message::shop_list(shop_request.shop_type, &client.armor_shop))
|
||||
},
|
||||
_ => {
|
||||
|
@ -1,9 +1,8 @@
|
||||
#![allow(dead_code, unused_must_use)]
|
||||
use std::net::Ipv4Addr;
|
||||
use std::collections::HashMap;
|
||||
|
||||
use async_std::channel;
|
||||
use async_std::sync::{Arc, Mutex, RwLock};
|
||||
use async_std::sync::{Arc, RwLock};
|
||||
use rand::Rng;
|
||||
use thiserror::Error;
|
||||
|
||||
@ -32,7 +31,7 @@ use maps::Holiday;
|
||||
use maps::area::MapAreaError;
|
||||
use maps::maps::{Maps, MapsError, generate_free_roam_maps};
|
||||
use crate::ship::packet::handler;
|
||||
use shops::{WeaponShop, ToolShop, ArmorShop};
|
||||
use shops::{ItemShops, StandardItemShops};
|
||||
use trade::TradeState;
|
||||
use crate::ship::chatcommand;
|
||||
use pktbuilder::quest::{QUEST_CATEGORY_MENU_ID, QUEST_SELECT_MENU_ID};
|
||||
@ -296,34 +295,6 @@ impl SendServerPacket for SendShipPacket {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct ItemShops {
|
||||
pub weapon_shop: HashMap<(Difficulty, SectionID), Arc<Mutex<WeaponShop<rand_chacha::ChaCha20Rng>>>>,
|
||||
pub tool_shop: Arc<Mutex<ToolShop<rand_chacha::ChaCha20Rng>>>,
|
||||
pub armor_shop: Arc<Mutex<ArmorShop<rand_chacha::ChaCha20Rng>>>,
|
||||
}
|
||||
|
||||
impl Default for ItemShops {
|
||||
fn default() -> ItemShops {
|
||||
let difficulty = [Difficulty::Normal, Difficulty::Hard, Difficulty::VeryHard, Difficulty::Ultimate];
|
||||
let section_id = [SectionID::Viridia, SectionID::Greenill, SectionID::Skyly, SectionID::Bluefull, SectionID::Purplenum,
|
||||
SectionID::Pinkal, SectionID::Redria, SectionID::Oran, SectionID::Yellowboze, SectionID::Whitill];
|
||||
|
||||
let mut weapon_shop = HashMap::new();
|
||||
for d in difficulty.iter() {
|
||||
for id in section_id.iter() {
|
||||
weapon_shop.insert((*d, *id), Arc::new(Mutex::new(WeaponShop::new(*d, *id))));
|
||||
}
|
||||
}
|
||||
|
||||
ItemShops {
|
||||
weapon_shop,
|
||||
tool_shop: Arc::new(Mutex::new(ToolShop::default())),
|
||||
armor_shop: Arc::new(Mutex::new(ArmorShop::default())),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
pub struct ShipServerStateBuilder<EG: EntityGateway + Clone + 'static> {
|
||||
entity_gateway: Option<EG>,
|
||||
@ -332,6 +303,7 @@ pub struct ShipServerStateBuilder<EG: EntityGateway + Clone + 'static> {
|
||||
port: Option<u16>,
|
||||
auth_token: Option<AuthToken>,
|
||||
event: Option<Holiday>,
|
||||
shops: Option<Box<dyn ItemShops + Send + Sync>>,
|
||||
map_builder: Option<Box<dyn Fn(RoomMode, Holiday) -> Maps + Send + Sync>>,
|
||||
drop_table_builder: Option<Box<dyn Fn(Episode, Difficulty, SectionID) -> Box<dyn DropTable + Send + Sync> + Send + Sync>>,
|
||||
standard_quest_builder: Option<Box<dyn Fn(RoomMode) -> Result<quests::QuestList, QuestLoadError> + Send + Sync>>,
|
||||
@ -348,6 +320,7 @@ impl<EG: EntityGateway + Clone + 'static> Default for ShipServerStateBuilder<EG>
|
||||
port: None,
|
||||
auth_token: None,
|
||||
event: None,
|
||||
shops: None,
|
||||
map_builder: None,
|
||||
drop_table_builder: None,
|
||||
standard_quest_builder: None,
|
||||
@ -418,6 +391,12 @@ impl<EG: EntityGateway + Clone + 'static> ShipServerStateBuilder<EG> {
|
||||
self
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn item_shops(mut self, item_shops: impl ItemShops + Send + Sync + 'static) -> ShipServerStateBuilder<EG> {
|
||||
self.shops = Some(Box::new(item_shops));
|
||||
self
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn blocks(mut self, num_blocks: usize) -> ShipServerStateBuilder<EG> {
|
||||
self.num_blocks = num_blocks;
|
||||
@ -433,7 +412,8 @@ impl<EG: EntityGateway + Clone + 'static> ShipServerStateBuilder<EG> {
|
||||
item_state: items::state::ItemState::default(),
|
||||
ip: self.ip.unwrap_or_else(|| Ipv4Addr::new(127,0,0,1)),
|
||||
port: self.port.unwrap_or(SHIP_PORT),
|
||||
shops: ItemShops::default(),
|
||||
#[allow(clippy::box_default)] // this lint leads to another which just doesn't work
|
||||
shops: Arc::new(self.shops.unwrap_or(Box::new(StandardItemShops::default()))),
|
||||
blocks: Blocks(blocks),
|
||||
event: self.event.unwrap_or(Holiday::None),
|
||||
map_builder: Arc::new(self.map_builder.unwrap_or(Box::new(generate_free_roam_maps))),
|
||||
@ -476,7 +456,7 @@ pub struct ShipServerState<EG: EntityGateway + Clone + 'static> {
|
||||
pub clients: Clients,
|
||||
name: String,
|
||||
pub(crate) item_state: items::state::ItemState,
|
||||
shops: ItemShops,
|
||||
shops: Arc<Box<dyn ItemShops + Send + Sync>>,
|
||||
pub blocks: Blocks,
|
||||
event: Holiday,
|
||||
|
||||
|
@ -13,6 +13,7 @@ use maps::object::MapObject;
|
||||
use maps::monster::MonsterType;
|
||||
use quests::{QuestList, QuestLoadError};
|
||||
use drops::{DropTable, ItemDropType};
|
||||
use shops::{ItemShops, WeaponShopItem, ToolShopItem, ArmorShopItem};
|
||||
|
||||
use entity::item;
|
||||
|
||||
@ -35,6 +36,23 @@ impl DropTable for NullDropTable {
|
||||
}
|
||||
}
|
||||
|
||||
struct NullItemShops;
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl ItemShops for NullItemShops {
|
||||
async fn generate_weapon_list(&self, _difficulty: Difficulty, _section_id: SectionID, _char_level: usize) -> Option<Vec<WeaponShopItem>> {
|
||||
Some(Vec::new())
|
||||
}
|
||||
async fn generate_tool_list(&self, _char_level: usize) -> Vec<ToolShopItem> {
|
||||
Vec::new()
|
||||
}
|
||||
async fn generate_armor_list(&self, _char_level: usize) -> Vec<ArmorShopItem> {
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
pub fn null_drop_table_builder(_episode: Episode, _difficult: Difficulty, _section_id: SectionID) -> Box<dyn DropTable + Send + Sync> {
|
||||
Box::new(NullDropTable)
|
||||
}
|
||||
@ -46,6 +64,7 @@ pub fn standard_ship_buildable<EG: EntityGateway + Clone>(gateway: EG) -> ShipS
|
||||
.government_quest_builder(Box::new(null_quest_builder))
|
||||
.drop_table_builder(Box::new(null_drop_table_builder))
|
||||
.map_builder(Box::new(null_free_roam_maps))
|
||||
.item_shops(NullItemShops)
|
||||
}
|
||||
|
||||
pub fn standard_ship<EG: EntityGateway + Clone>(gateway: EG) -> ShipServerState<EG> {
|
||||
@ -55,6 +74,7 @@ pub fn standard_ship<EG: EntityGateway + Clone>(gateway: EG) -> ShipServerState
|
||||
.government_quest_builder(Box::new(null_quest_builder))
|
||||
.drop_table_builder(Box::new(null_drop_table_builder))
|
||||
.map_builder(Box::new(null_free_roam_maps))
|
||||
.item_shops(NullItemShops)
|
||||
.build()
|
||||
}
|
||||
|
||||
|
@ -3,6 +3,7 @@ use networking::serverstate::{ClientId, ServerState};
|
||||
use entity::gateway::{EntityGateway, InMemoryGateway};
|
||||
use entity::item;
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket, SendShipPacket};
|
||||
use shops::StandardItemShops;
|
||||
|
||||
use libpso::packet::ship::*;
|
||||
use libpso::packet::messages::*;
|
||||
@ -1538,7 +1539,9 @@ async fn test_withdraw_meseta_and_buy_a_few_monomates_with_it() {
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(100)).await.unwrap();
|
||||
entity_gateway.set_bank_meseta(&char1.id, &item::BankIdentifier::Character, item::Meseta(300)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room(&mut ship, ClientId(1), "room", "").await;
|
||||
|
@ -4,6 +4,7 @@ use entity::item;
|
||||
use elseware::ship::ship::{ShipServerState, RecvShipPacket, SendShipPacket};
|
||||
use maps::room::Difficulty;
|
||||
use items::state::ItemStateError;
|
||||
use shops::StandardItemShops;
|
||||
|
||||
use libpso::packet::ship::*;
|
||||
use libpso::packet::messages::*;
|
||||
@ -20,7 +21,9 @@ async fn test_player_opens_weapon_shop() {
|
||||
char1.exp = 80000000;
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -48,7 +51,9 @@ async fn test_player_opens_tool_shop() {
|
||||
char1.exp = 80000000;
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -76,7 +81,9 @@ async fn test_player_opens_armor_shop() {
|
||||
char1.exp = 80000000;
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -105,7 +112,9 @@ async fn test_player_buys_from_weapon_shop() {
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -141,7 +150,9 @@ async fn test_player_buys_from_tool_shop() {
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -176,7 +187,9 @@ async fn test_player_buys_multiple_from_tool_shop() {
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -215,7 +228,9 @@ async fn test_player_buys_from_armor_shop() {
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -293,7 +308,9 @@ async fn test_other_clients_see_purchase() {
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
log_in_char(&mut ship, ClientId(2), "a2", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
@ -342,7 +359,9 @@ async fn test_other_clients_see_stacked_purchase() {
|
||||
),
|
||||
}).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
log_in_char(&mut ship, ClientId(2), "a2", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
@ -415,7 +434,9 @@ async fn test_player_double_buys_from_tool_shop() {
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -478,7 +499,9 @@ async fn test_techs_disappear_from_shop_when_bought() {
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
@ -538,7 +561,9 @@ async fn test_units_disappear_from_shop_when_bought() {
|
||||
entity_gateway.save_character(&char1).await.unwrap();
|
||||
entity_gateway.set_character_meseta(&char1.id, item::Meseta(999999)).await.unwrap();
|
||||
|
||||
let mut ship = standard_ship(entity_gateway.clone());
|
||||
let mut ship = standard_ship_buildable(entity_gateway.clone())
|
||||
.item_shops(StandardItemShops::default())
|
||||
.build();
|
||||
log_in_char(&mut ship, ClientId(1), "a1", "a").await;
|
||||
join_lobby(&mut ship, ClientId(1)).await;
|
||||
create_room_with_difficulty(&mut ship, ClientId(1), "room", "", Difficulty::Ultimate).await;
|
||||
|
Loading…
x
Reference in New Issue
Block a user