diff --git a/src/ship/items/manager.rs b/src/ship/items/manager.rs index 025e85f..27ab699 100644 --- a/src/ship/items/manager.rs +++ b/src/ship/items/manager.rs @@ -38,6 +38,7 @@ pub enum ItemManagerError { InventoryItemConsumeError(#[from] InventoryItemConsumeError), BankFull, WrongItemType(ClientItemId), + UseItemError(#[from] use_tool::UseItemError), } pub struct ItemManager { @@ -673,7 +674,76 @@ impl ItemManager { use_tool::tp_material(entity_gateway, character).await; }, ToolType::CellOfMag502 => { - use_tool::cell_of_mag_502(entity_gateway, &used_item, inventory).await; + use_tool::cell_of_mag_502(entity_gateway, &used_item, inventory).await?; + }, + ToolType::CellOfMag213 => { + use_tool::cell_of_mag_213(entity_gateway, &used_item, inventory).await?; + }, + ToolType::PartsOfRobochao => { + use_tool::parts_of_robochao(entity_gateway, &used_item, inventory).await?; + }, + ToolType::HeartOfOpaOpa => { + use_tool::heart_of_opaopa(entity_gateway, &used_item, inventory).await?; + }, + ToolType::HeartOfPian => { + use_tool::heart_of_pian(entity_gateway, &used_item, inventory).await?; + }, + ToolType::HeartOfChao=> { + use_tool::heart_of_chao(entity_gateway, &used_item, inventory).await?; + }, + ToolType::HeartOfAngel => { + use_tool::heart_of_angel(entity_gateway, &used_item, inventory).await?; + }, + ToolType::KitOfHamburger => { + use_tool::kit_of_hamburger(entity_gateway, &used_item, inventory).await?; + }, + ToolType::PanthersSpirit => { + use_tool::panthers_spirit(entity_gateway, &used_item, inventory).await?; + }, + ToolType::KitOfMark3 => { + use_tool::kit_of_mark3(entity_gateway, &used_item, inventory).await?; + }, + ToolType::KitOfMasterSystem=> { + use_tool::kit_of_master_system(entity_gateway, &used_item, inventory).await?; + }, + ToolType::KitOfGenesis => { + use_tool::kit_of_genesis(entity_gateway, &used_item, inventory).await?; + }, + ToolType::KitOfSegaSaturn => { + use_tool::kit_of_sega_saturn(entity_gateway, &used_item, inventory).await?; + }, + ToolType::KitOfDreamcast => { + use_tool::kit_of_dreamcast(entity_gateway, &used_item, inventory).await?; + }, + ToolType::Tablet => { + use_tool::tablet(entity_gateway, &used_item, inventory).await?; + }, + ToolType::DragonScale => { + use_tool::dragon_scale(entity_gateway, &used_item, inventory).await?; + }, + ToolType::HeavenStrikerCoat => { + use_tool::heaven_striker_coat(entity_gateway, &used_item, inventory).await?; + }, + ToolType::PioneerParts => { + use_tool::pioneer_parts(entity_gateway, &used_item, inventory).await?; + }, + ToolType::AmitiesMemo => { + use_tool::amities_memo(entity_gateway, &used_item, inventory).await?; + }, + ToolType::HeartOfMorolian => { + use_tool::heart_of_morolian(entity_gateway, &used_item, inventory).await?; + }, + ToolType::RappysBeak => { + use_tool::rappys_beak(entity_gateway, &used_item, inventory).await?; + }, + ToolType::YahoosEngine => { + use_tool::yahoos_engine(entity_gateway, &used_item, inventory).await?; + }, + ToolType::DPhotonCore => { + use_tool::d_photon_core(entity_gateway, &used_item, inventory).await?; + }, + ToolType::LibertaKit => { + use_tool::liberta_kit(entity_gateway, &used_item, inventory).await?; }, _ => {} } diff --git a/src/ship/items/use_tool.rs b/src/ship/items/use_tool.rs index b2812af..a3afa10 100644 --- a/src/ship/items/use_tool.rs +++ b/src/ship/items/use_tool.rs @@ -59,10 +59,6 @@ pub async fn tp_material(entity_gateway: &mut EG, character: entity_gateway.save_character(character).await; } - - - - async fn mag_cell(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory, mag_cell_type: MagCell) -> Result<(), UseItemError> { let mut mag_handle = inventory.get_equipped_mag_handle().ok_or(UseItemError::ItemNotEquipped)?; let mag_item = mag_handle.item_mut() @@ -82,8 +78,98 @@ async fn mag_cell(entity_gateway: &mut EG, used_cell: &Consum Ok(()) } - pub async fn cell_of_mag_502(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { - println!("used a 502!"); mag_cell(entity_gateway, used_cell, inventory, MagCell::CellOfMag502).await } + +pub async fn cell_of_mag_213(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::CellOfMag213).await +} + +pub async fn parts_of_robochao(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::PartsOfRobochao).await +} + +pub async fn heart_of_opaopa(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::HeartOfOpaOpa).await +} + +pub async fn heart_of_pian(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::HeartOfPian).await +} + +pub async fn heart_of_chao(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::HeartOfChao).await +} + +pub async fn heart_of_angel(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::HeartOfAngel).await +} + +pub async fn kit_of_hamburger(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::KitOfHamburger).await +} + +pub async fn panthers_spirit(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::PanthersSpirit).await +} + +pub async fn kit_of_mark3(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::KitOfMark3).await +} + +pub async fn kit_of_master_system(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::KitOfMasterSystem).await +} + +pub async fn kit_of_genesis(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::KitOfGenesis).await +} + +pub async fn kit_of_sega_saturn(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::KitOfSegaSaturn).await +} + +pub async fn kit_of_dreamcast(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::KitOfDreamcast).await +} + +pub async fn tablet(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::Tablet).await +} + +pub async fn dragon_scale(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::DragonScale).await +} + +pub async fn heaven_striker_coat(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::HeavenStrikerCoat).await +} + +pub async fn pioneer_parts(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::PioneerParts).await +} + +pub async fn amities_memo(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::AmitiesMemo).await +} + +pub async fn heart_of_morolian(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::HeartOfMorolian).await +} + +pub async fn rappys_beak(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::RappysBeak).await +} + +pub async fn yahoos_engine(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::YahoosEngine).await +} + +pub async fn d_photon_core(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::DPhotonCore).await +} + +pub async fn liberta_kit(entity_gateway: &mut EG, used_cell: &ConsumedItem, inventory: &mut CharacterInventory) -> Result<(), UseItemError> { + mag_cell(entity_gateway, used_cell, inventory, MagCell::LibertaKit).await +} diff --git a/tests/test_mags.rs b/tests/test_mags.rs index 099455a..aa2e299 100644 --- a/tests/test_mags.rs +++ b/tests/test_mags.rs @@ -138,3 +138,73 @@ async fn test_mag_change_owner() { _ => panic!() } } + + +#[async_std::test] +async fn test_mag_cell() { + let mut entity_gateway = InMemoryGateway::new(); + + let (_user1, char1) = new_user_character(&mut entity_gateway, "a1", "a").await; + + let mag = entity_gateway.create_item( + item::NewItemEntity { + item: item::ItemDetail::Mag( + item::mag::Mag::baby_mag(0) + ), + location: item::ItemLocation::Inventory { + character_id: char1.id, + slot: 0, + equipped: true, + } + }).await.unwrap(); + + for _ in 0..1000 { + let fed_tool = entity_gateway.create_item( + item::NewItemEntity { + item: item::ItemDetail::Tool ( + item::tool::Tool { + tool: item::tool::ToolType::Monomate, + } + ), + location: item::ItemLocation::FedToMag { + mag: mag.id, + } + }).await.unwrap(); + entity_gateway.feed_mag(&mag.id, &fed_tool.id).await; + } + entity_gateway.create_item( + item::NewItemEntity { + item: item::ItemDetail::Tool( + item::tool::Tool { + tool: item::tool::ToolType::CellOfMag502, + } + ), + location: item::ItemLocation::Inventory { + character_id: char1.id, + slot: 1, + equipped: false, + } + }).await; + + let mut ship = ShipServerState::builder() + .gateway(entity_gateway.clone()) + .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; + + ship.handle(ClientId(1), &RecvShipPacket::Message(Message::new(GameMessage::PlayerUseItem(PlayerUseItem { + client: 0, + target: 0, + item_id: 0x10001, + })))).await.unwrap().for_each(drop); + + let p1_items = entity_gateway.get_items_by_character(&char1).await; + let mag = p1_items.get(0).unwrap(); + match &mag.item { + item::ItemDetail::Mag(mag) => { + assert!(mag.mag == item::mag::MagType::Soniti); + } + _ => panic!() + } +}