Browse Source

mag cells

pbs
jake 4 years ago
parent
commit
d567c50216
  1. 4
      src/entity/gateway/entitygateway.rs
  2. 16
      src/entity/gateway/inmemory.rs
  3. 117
      src/entity/item/mag.rs
  4. 29
      src/ship/items/inventory.rs
  5. 12
      src/ship/items/manager.rs
  6. 35
      src/ship/items/use_tool.rs

4
src/entity/gateway/entitygateway.rs

@ -68,6 +68,10 @@ pub trait EntityGateway: Send + Sync + Clone {
unimplemented!(); unimplemented!();
} }
async fn use_mag_cell(&mut self, _mag_item_id: &ItemEntityId, _mag_cell_id: &ItemEntityId) {
unimplemented!();
}
async fn get_items_by_character(&self, _char: &CharacterEntity) -> Vec<ItemEntity> { async fn get_items_by_character(&self, _char: &CharacterEntity) -> Vec<ItemEntity> {
unimplemented!(); unimplemented!();
} }

16
src/entity/gateway/inmemory.rs

@ -1,4 +1,5 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::convert::TryInto;
use crate::entity::account::*; use crate::entity::account::*;
use crate::entity::character::*; use crate::entity::character::*;
@ -183,6 +184,13 @@ impl EntityGateway for InMemoryGateway {
.push(mag::MagModifier::OwnerChange(character.char_class, character.section_id)); .push(mag::MagModifier::OwnerChange(character.char_class, character.section_id));
} }
async fn use_mag_cell(&mut self, mag_item_id: &ItemEntityId, mag_cell_id: &ItemEntityId) {
self.mag_modifiers.lock().unwrap()
.entry(*mag_item_id)
.or_insert(Vec::new())
.push(mag::MagModifier::MagCell(mag_cell_id.clone()));
}
async fn get_items_by_character(&self, character: &CharacterEntity) -> Vec<ItemEntity> { async fn get_items_by_character(&self, character: &CharacterEntity) -> Vec<ItemEntity> {
let items = self.items.lock().unwrap(); let items = self.items.lock().unwrap();
items items
@ -214,6 +222,14 @@ impl EntityGateway for InMemoryGateway {
mag::MagModifier::OwnerChange(class, section_id) => { mag::MagModifier::OwnerChange(class, section_id) => {
mag.change_owner(*class, *section_id) mag.change_owner(*class, *section_id)
}, },
mag::MagModifier::MagCell(mag_cell_id) => {
items.get(&mag_cell_id).map(|mag_cell| {
match mag_cell.item {
ItemDetail::Tool(mag_cell) => mag.apply_mag_cell(mag_cell.tool.try_into().unwrap()),
_ => {}
}
});
},
_ => {} _ => {}
} }
} }

117
src/entity/item/mag.rs

@ -390,6 +390,78 @@ impl MagType {
} }
} }
pub enum MagCell {
CellOfMag502,
CellOfMag213,
PartsOfRobochao,
HeartOfOpaOpa,
HeartOfPian,
HeartOfChao,
HeartOfAngel,
HeartOfDevil,
KitOfHamburger,
PanthersSpirit,
KitOfMark3,
KitOfMasterSystem,
KitOfGenesis,
KitOfSegaSaturn,
KitOfDreamcast,
Tablet,
DragonScale,
HeavenStrikerCoat,
PioneerParts,
AmitiesMemo,
HeartOfMorolian,
RappysBeak,
YahoosEngine,
DPhotonCore,
LibertaKit,
CellOfMag0503,
CellOfMag0504,
CellOfMag0505,
CellOfMag0506,
CellOfMag0507,
}
impl std::convert::TryFrom<ToolType> for MagCell {
type Error = ();
fn try_from(tool: ToolType) -> Result<MagCell, ()> {
match tool {
ToolType::CellOfMag502 => Ok(MagCell::CellOfMag502),
ToolType::CellOfMag213 => Ok(MagCell::CellOfMag213),
ToolType::PartsOfRobochao => Ok(MagCell::PartsOfRobochao),
ToolType::HeartOfOpaOpa => Ok(MagCell::HeartOfOpaOpa),
ToolType::HeartOfPian => Ok(MagCell::HeartOfPian),
ToolType::HeartOfChao => Ok(MagCell::HeartOfChao),
ToolType::HeartOfAngel => Ok(MagCell::HeartOfAngel),
ToolType::HeartOfDevil => Ok(MagCell::HeartOfDevil),
ToolType::KitOfHamburger => Ok(MagCell::KitOfHamburger),
ToolType::PanthersSpirit => Ok(MagCell::PanthersSpirit),
ToolType::KitOfMark3 => Ok(MagCell::KitOfMark3),
ToolType::KitOfMasterSystem => Ok(MagCell::KitOfMasterSystem),
ToolType::KitOfGenesis => Ok(MagCell::KitOfGenesis),
ToolType::KitOfSegaSaturn => Ok(MagCell::KitOfSegaSaturn),
ToolType::KitOfDreamcast => Ok(MagCell::KitOfDreamcast),
ToolType::Tablet => Ok(MagCell::Tablet),
ToolType::DragonScale => Ok(MagCell::DragonScale),
ToolType::HeavenStrikerCoat => Ok(MagCell::HeavenStrikerCoat),
ToolType::PioneerParts => Ok(MagCell::PioneerParts),
ToolType::AmitiesMemo => Ok(MagCell::AmitiesMemo),
ToolType::HeartOfMorolian => Ok(MagCell::HeartOfMorolian),
ToolType::RappysBeak => Ok(MagCell::RappysBeak),
ToolType::YahoosEngine => Ok(MagCell::YahoosEngine),
ToolType::DPhotonCore => Ok(MagCell::DPhotonCore),
ToolType::LibertaKit => Ok(MagCell::LibertaKit),
ToolType::CellOfMag0503 => Ok(MagCell::CellOfMag0503),
ToolType::CellOfMag0504 => Ok(MagCell::CellOfMag0504),
ToolType::CellOfMag0505 => Ok(MagCell::CellOfMag0505),
ToolType::CellOfMag0506 => Ok(MagCell::CellOfMag0506),
ToolType::CellOfMag0507 => Ok(MagCell::CellOfMag0507),
_ => Err(()),
}
}
}
enum MagAttribute { enum MagAttribute {
//Def, //Def,
@ -981,6 +1053,51 @@ impl Mag {
pub fn bank(&mut self) { pub fn bank(&mut self) {
// what is the truncation logic anyway // what is the truncation logic anyway
} }
pub fn apply_mag_cell(&mut self, mag_cell: MagCell) {
self.mag = match mag_cell {
MagCell::CellOfMag502 => {
match self.id {
SectionID::Viridia | SectionID::Skyly | SectionID::Purplenum | SectionID::Redria | SectionID::Yellowboze => {
MagType::Soniti
},
SectionID::Greenill | SectionID::Bluefull | SectionID::Pinkal | SectionID::Oran | SectionID::Whitill => {
MagType::Pitri
}
}
}
//MagCell::CellOfMag213 => ,
MagCell::PartsOfRobochao => MagType::Robochao,
//MagCell::HeartOfOpaOpa => ,
//MagCell::HeartOfPian => ,
//MagCell::HeartOfChao => ,
//MagCell::HeartOfAngel => ,
//MagCell::HeartOfDevil => ,
//MagCell::KitOfHamburger => ,
//MagCell::PanthersSpirit => ,
//MagCell::KitOfMark3 => ,
//MagCell::KitOfMasterSystem => ,
//MagCell::KitOfGenesis => ,
//MagCell::KitOfSegaSaturn => ,
//MagCell::KitOfDreamcast => ,
//MagCell::Tablet => ,
//MagCell::DragonScale => ,
//MagCell::HeavenStrikerCoat => ,
//MagCell::PioneerParts => ,
//MagCell::AmitiesMemo => ,
//MagCell::HeartOfMorolian => ,
//MagCell::RappysBeak => ,
//MagCell::YahoosEngine => ,
//MagCell::DPhotonCore => ,
//MagCell::LibertaKit => ,
//MagCell::CellOfMag0503 => ,
//MagCell::CellOfMag0504 => ,
//MagCell::CellOfMag0505 => ,
//MagCell::CellOfMag0506 => ,
//MagCell::CellOfMag0507 => ,
_ => panic!()
}
}
} }

29
src/ship/items/inventory.rs

@ -74,6 +74,17 @@ pub enum InventoryItemAddToError {
} }
impl InventoryItem { impl InventoryItem {
pub fn entity_ids(&self) -> Vec<ItemEntityId> {
match self {
InventoryItem::Individual(individual_inventory_item) => {
vec![individual_inventory_item.entity_id]
},
InventoryItem::Stacked(stacked_inventory_item) => {
stacked_inventory_item.entity_ids.clone()
}
}
}
pub fn item_id(&self) -> ClientItemId { pub fn item_id(&self) -> ClientItemId {
match self { match self {
InventoryItem::Individual(individual_inventory_item) => { InventoryItem::Individual(individual_inventory_item) => {
@ -388,6 +399,24 @@ impl CharacterInventory {
}) })
} }
pub fn get_equipped_mag_handle<'a>(&'a mut self) -> Option<InventoryItemHandle<'a>> {
let (slot, _) = self.items.iter()
.enumerate()
.filter(|(_, item)| {
if let InventoryItem::Individual(individual_inventory_item) = item {
if let ItemDetail::Mag(_) = &individual_inventory_item.item {
return individual_inventory_item.equipped
}
}
false
})
.nth(0)?;
Some(InventoryItemHandle {
inventory: self,
slot: slot,
})
}
pub fn get_item_by_id(&self, item_id: ClientItemId) -> Option<&InventoryItem> { pub fn get_item_by_id(&self, item_id: ClientItemId) -> Option<&InventoryItem> {
self.items.iter() self.items.iter()
.filter(|item| { .filter(|item| {

12
src/ship/items/manager.rs

@ -513,7 +513,7 @@ impl ItemManager {
character: &CharacterEntity, character: &CharacterEntity,
item_id: ClientItemId, item_id: ClientItemId,
amount: usize) amount: usize)
-> Result<ItemDetail, ItemManagerError> {
-> Result<ConsumedItem, ItemManagerError> {
let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?; let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?;
let used_item = inventory.get_item_handle_by_id(item_id).ok_or(ItemManagerError::NoSuchItemId(item_id))?; let used_item = inventory.get_item_handle_by_id(item_id).ok_or(ItemManagerError::NoSuchItemId(item_id))?;
let consumed_item = used_item.consume(amount)?; let consumed_item = used_item.consume(amount)?;
@ -523,7 +523,7 @@ impl ItemManager {
ItemLocation::Consumed).await; ItemLocation::Consumed).await;
} }
Ok(consumed_item.item())
Ok(consumed_item)
} }
pub async fn player_deposits_item<EG: EntityGateway>(&mut self, pub async fn player_deposits_item<EG: EntityGateway>(&mut self,
@ -640,10 +640,11 @@ impl ItemManager {
pub async fn use_item<EG: EntityGateway>(&mut self, pub async fn use_item<EG: EntityGateway>(&mut self,
used_item: ItemDetail,
used_item: ConsumedItem,
entity_gateway: &mut EG, entity_gateway: &mut EG,
character: &mut CharacterEntity) -> Result<(), ItemManagerError> { character: &mut CharacterEntity) -> Result<(), ItemManagerError> {
match used_item {
let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?;
match &used_item.item() {
ItemDetail::Weapon(_w) => { ItemDetail::Weapon(_w) => {
// something like when items are used to combine/transform them? // something like when items are used to combine/transform them?
//_ => {} //_ => {}
@ -671,6 +672,9 @@ impl ItemManager {
ToolType::TpMaterial => { ToolType::TpMaterial => {
use_tool::tp_material(entity_gateway, character).await; use_tool::tp_material(entity_gateway, character).await;
}, },
ToolType::CellOfMag502 => {
use_tool::cell_of_mag_502(entity_gateway, &used_item, inventory).await;
},
_ => {} _ => {}
} }
} }

35
src/ship/items/use_tool.rs

@ -1,8 +1,10 @@
use thiserror::Error; use thiserror::Error;
use crate::entity::gateway::EntityGateway; use crate::entity::gateway::EntityGateway;
use crate::entity::character::CharacterEntity; use crate::entity::character::CharacterEntity;
use crate::entity::item::ItemDetail;
use crate::entity::item::{ItemEntityId, ItemDetail};
use crate::entity::item::tool::ToolType; use crate::entity::item::tool::ToolType;
use crate::entity::item::mag::MagCell;
use crate::ship::items::{ItemManager, ClientItemId, CharacterInventory, ConsumedItem};
@ -12,6 +14,8 @@ use crate::entity::item::tool::ToolType;
#[error("")] #[error("")]
pub enum UseItemError { pub enum UseItemError {
NoCharacter, NoCharacter,
ItemNotEquipped,
InvalidItem,
} }
@ -54,3 +58,32 @@ pub async fn tp_material<EG: EntityGateway>(entity_gateway: &mut EG, character:
character.materials.tp += 1; character.materials.tp += 1;
entity_gateway.save_character(character).await; entity_gateway.save_character(character).await;
} }
async fn mag_cell<EG: EntityGateway>(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()
.ok_or(UseItemError::InvalidItem)?;
let actual_mag = mag_item
.individual()
.ok_or(UseItemError::InvalidItem)?
.mag_mut()
.ok_or(UseItemError::InvalidItem)?;
actual_mag.apply_mag_cell(mag_cell_type);
for mag_entity_id in mag_item.entity_ids() {
for cell_entity_id in used_cell.entity_ids() {
entity_gateway.use_mag_cell(&mag_entity_id, &cell_entity_id).await;
}
}
Ok(())
}
pub async fn cell_of_mag_502<EG: EntityGateway>(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
}
Loading…
Cancel
Save