add kill counters to units (limiter)
This commit is contained in:
		
							parent
							
								
									9025458ee8
								
							
						
					
					
						commit
						527cf50b9d
					
				| @ -116,7 +116,7 @@ fn main() { | ||||
|                                     Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 30}), | ||||
|                                     None,], | ||||
|                             tekked: true, | ||||
|                             kills: Some(22995), | ||||
|                             kills: Some(22998), | ||||
|                         } | ||||
|                     ), | ||||
|                 }).await.unwrap(); | ||||
| @ -124,8 +124,8 @@ fn main() { | ||||
|                 NewItemEntity { | ||||
|                     item: ItemDetail::Weapon( | ||||
|                         item::weapon::Weapon { | ||||
|                             weapon: item::weapon::WeaponType::Handgun, | ||||
|                             grind: 5, | ||||
|                             weapon: item::weapon::WeaponType::Club, | ||||
|                             grind: 10, | ||||
|                             special: Some(item::weapon::WeaponSpecial::Charge), | ||||
|                             attrs: [Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Hit, value: 40}), | ||||
|                                     Some(item::weapon::WeaponAttribute{attr: item::weapon::Attribute::Dark, value: 30}), | ||||
| @ -203,7 +203,7 @@ fn main() { | ||||
|                 item::NewItemEntity { | ||||
|                     item: ItemDetail::Tool ( | ||||
|                         item::tool::Tool { | ||||
|                             tool: item::tool::ToolType::CellOfMag502, | ||||
|                             tool: item::tool::ToolType::MagicRockMoola, | ||||
|                         } | ||||
|                     ), | ||||
|                 }).await.unwrap(); | ||||
| @ -261,6 +261,7 @@ fn main() { | ||||
|                         item::unit::Unit { | ||||
|                             unit: item::unit::UnitType::Limiter, | ||||
|                             modifier: None, | ||||
|                             kills: Some(19999), | ||||
|                         } | ||||
|                     ), | ||||
|                 } | ||||
| @ -270,7 +271,8 @@ fn main() { | ||||
|                     item: ItemDetail::Unit( | ||||
|                         item::unit::Unit { | ||||
|                             unit: item::unit::UnitType::PriestMind, | ||||
|                             modifier: Some(item::unit::UnitModifier::Plus), | ||||
|                             modifier: Some(item::unit::UnitModifier::Minus), | ||||
|                             kills: None, | ||||
|                         } | ||||
|                     ), | ||||
|                 } | ||||
| @ -281,6 +283,7 @@ fn main() { | ||||
|                         item::unit::Unit { | ||||
|                             unit: item::unit::UnitType::PriestMind, | ||||
|                             modifier: Some(item::unit::UnitModifier::Minus), | ||||
|                             kills: None, | ||||
|                         } | ||||
|                     ), | ||||
|                 } | ||||
| @ -291,6 +294,7 @@ fn main() { | ||||
|                         item::unit::Unit { | ||||
|                             unit: item::unit::UnitType::PriestMind, | ||||
|                             modifier: Some(item::unit::UnitModifier::MinusMinus), | ||||
|                             kills: None, | ||||
|                         } | ||||
|                     ), | ||||
|                 } | ||||
|  | ||||
| @ -395,6 +395,7 @@ impl From<PgShield> for shield::Shield { | ||||
| pub struct PgUnit { | ||||
|     unit: unit::UnitType, | ||||
|     modifier: Option<unit::UnitModifier>, | ||||
|     kills: Option<u16>, | ||||
| } | ||||
| 
 | ||||
| impl From<unit::Unit> for PgUnit { | ||||
| @ -402,6 +403,7 @@ impl From<unit::Unit> for PgUnit { | ||||
|         PgUnit { | ||||
|             unit: other.unit, | ||||
|             modifier: other.modifier, | ||||
|             kills: other.kills, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -411,6 +413,7 @@ impl From<PgUnit> for unit::Unit { | ||||
|         unit::Unit { | ||||
|             unit: other.unit, | ||||
|             modifier: other.modifier, | ||||
|             kills: other.kills, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -184,6 +184,7 @@ impl ItemDetail { | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     // TODO: delete this
 | ||||
|     pub fn increment_kill_counter(&self) { | ||||
|         match self { | ||||
|             ItemDetail::Weapon(w) => {}, | ||||
|  | ||||
| @ -321,6 +321,10 @@ impl UnitType { | ||||
|             _ => Err(ItemParseError::InvalidUnitType), | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn has_counter(&self) -> bool { | ||||
|         matches!(self, UnitType::Limiter) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Copy, Clone, PartialEq, Serialize, Deserialize)] | ||||
| @ -335,6 +339,7 @@ pub enum UnitModifier { | ||||
| pub struct Unit { | ||||
|     pub unit: UnitType, | ||||
|     pub modifier: Option<UnitModifier>, | ||||
|     pub kills: Option<u16>, | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -361,11 +366,16 @@ impl Unit { | ||||
|                 }, | ||||
|             } | ||||
|         } | ||||
|         if self.unit.has_counter() { | ||||
|             result[10..12].copy_from_slice(&self.kills.unwrap_or(0u16).to_be_bytes()); | ||||
|             result[10] += 0x80; | ||||
|         } | ||||
|         result | ||||
|     } | ||||
| 
 | ||||
|     pub fn from_bytes(data: [u8; 16]) -> Result<Unit, ItemParseError> { | ||||
|         let u = UnitType::parse_type([data[0], data[1], data[2]]); 
 | ||||
|         let u = UnitType::parse_type([data[0], data[1], data[2]]); | ||||
|         let mut k = None; | ||||
|         if let Ok(u) = u { | ||||
|             let m = match u16::from_le_bytes([data[6], data[7]]) { | ||||
|                 0x02 => Some(UnitModifier::PlusPlus), | ||||
| @ -375,9 +385,14 @@ impl Unit { | ||||
|                 _ => None, | ||||
|             }; | ||||
| 
 | ||||
|             if data[10] & 0x80 == 0x80 { | ||||
|                 k = Some(u16::from_be_bytes([data[10] - 0x80, data[11]])); | ||||
|             } | ||||
| 
 | ||||
|             Ok(Unit{ | ||||
|                 unit: u, | ||||
|                 modifier: m, | ||||
|                 kills: k, | ||||
|             }) | ||||
|         } | ||||
|         else { | ||||
| @ -456,4 +471,10 @@ impl Unit { | ||||
|             _ => 0, | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn increment_kill_counter(&mut self) { | ||||
|         if let Some(kills) = self.kills { | ||||
|             self.kills = Some(kills + 1); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -1541,7 +1541,8 @@ impl Weapon { | ||||
|         if self.weapon.has_counter() { | ||||
|             result[10..12].copy_from_slice(&self.kills.unwrap_or(0u16).to_be_bytes()); | ||||
|             result[10] += 0x80; | ||||
|             
 | ||||
|             // TODO: what to do with the 3rd attr?
 | ||||
|             // self.attrs[2] = None;
 | ||||
|         } else { | ||||
|             result[10..12].copy_from_slice(&self.attrs[2].map(|s| s.value()).unwrap_or([0,0])); | ||||
|         } | ||||
| @ -1588,9 +1589,9 @@ impl Weapon { | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if data[10] >= 0x80 { | ||||
|             if data[10] & 0x80 == 0x80 { | ||||
|                 attrs[2] = None; | ||||
|                 kills = Some(u16::from_be_bytes([data[10], data[11]])); | ||||
|                 kills = Some(u16::from_be_bytes([data[10] - 0x80, data[11]])); | ||||
|             } | ||||
| 
 | ||||
|             Ok(Weapon { | ||||
|  | ||||
| @ -89,6 +89,7 @@ impl GenericUnitTable { | ||||
|             ItemDropType::Unit(Unit { | ||||
|                 unit: unit_type, | ||||
|                 modifier: unit_modifier, | ||||
|                 kills: None, | ||||
|             }) | ||||
|         }) | ||||
|     } | ||||
| @ -116,6 +117,7 @@ mod test { | ||||
|             assert!(gut.get_drop(&area, &mut rng) == Some(ItemDropType::Unit(Unit { | ||||
|                 unit: unit, | ||||
|                 modifier: umod, | ||||
|                 kills: None, | ||||
|             }))); | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @ -126,6 +126,7 @@ impl RareDropTable { | ||||
|                 ItemDropType::Unit(Unit { | ||||
|                     unit, | ||||
|                     modifier: None, | ||||
|                     kills: None, | ||||
|                 }) | ||||
|             }, | ||||
|             RareDropItem::Tool(tool) => { | ||||
|  | ||||
| @ -7,6 +7,7 @@ use crate::entity::item::tool::{Tool, ToolType}; | ||||
| use crate::entity::item::mag::Mag; | ||||
| use crate::entity::item::weapon::Weapon; | ||||
| use crate::ship::items::{ClientItemId, BankItem, BankItemHandle, ItemManagerError}; | ||||
| use crate::entity::item::unit::Unit; | ||||
| use crate::ship::items::floor::{IndividualFloorItem, StackedFloorItem}; | ||||
| use crate::ship::shops::{ShopItem, ArmorShopItem, ToolShopItem, WeaponShopItem}; | ||||
| 
 | ||||
| @ -52,6 +53,13 @@ impl IndividualInventoryItem { | ||||
|             _ => None | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn unit_mut(&mut self) -> Option<&mut Unit> { | ||||
|         match self.item { | ||||
|             ItemDetail::Unit(ref mut unit) => Some(unit), | ||||
|             _ => None | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
|  | ||||
| @ -83,6 +83,8 @@ pub enum ItemManagerError { | ||||
|     #[error("invalid trade")] | ||||
|     InvalidTrade, | ||||
|     EntityIdNotInInventory(ItemEntityId), | ||||
|     WeaponCannotCombine, | ||||
|     NotEnoughKills(u16), | ||||
| } | ||||
| 
 | ||||
| impl<E> std::convert::From<TransactionError<E>> for ItemManagerError | ||||
| @ -696,7 +698,6 @@ impl ItemManager { | ||||
|         match &used_item.item() { | ||||
|             ItemDetail::Weapon(_w) => { | ||||
|                 // something like when items are used to combine/transform them?
 | ||||
|                 //_ => {}
 | ||||
|             }, | ||||
|             ItemDetail::Tool(t) => { | ||||
|                 match t.tool { | ||||
| @ -793,7 +794,7 @@ impl ItemManager { | ||||
|                     ToolType::LibertaKit => { | ||||
|                         use_tool::liberta_kit(entity_gateway, &used_item, inventory).await?; | ||||
|                     }, | ||||
|                     _ => {} | ||||
|                     _ => {}, | ||||
|                 } | ||||
|             } | ||||
|             _ => {} | ||||
| @ -1382,33 +1383,39 @@ impl<EG: EntityGateway> ItemAction<EG> for TradeMeseta { | ||||
|                                                             equipped_items: &EquippedEntity) | ||||
|                                                             -> Result<(), anyhow::Error> { | ||||
|         let inventory = self.character_inventory.get_mut(&character.id).ok_or(ItemManagerError::NoCharacter(character.id))?; | ||||
|         // weapon
 | ||||
|         if let Some(weapon_entity) = equipped_items.weapon { | ||||
|             println!("updating weapon kill counter for weapon {:?}", weapon_entity); | ||||
|             // weapon_entity = &InventoryItem
 | ||||
| 
 | ||||
|             // let weapon_id = weapon_entity.item_id();
 | ||||
|             let weapon_id = inventory.get_item_by_entity_id(weapon_entity).ok_or(ItemManagerError::EntityIdNotInInventory(weapon_entity))?.item_id(); | ||||
|             let mut weapon_handle = inventory.get_item_handle_by_id(weapon_id).ok_or(ItemManagerError::NoSuchItemId(weapon_id))?; | ||||
|             // weapon_handle = InventoryItemHandle
 | ||||
|             let individual_item = weapon_handle.item_mut() | ||||
|             let individual_item_w = weapon_handle.item_mut() | ||||
|                 .ok_or(ItemManagerError::NoSuchItemId(weapon_id))? | ||||
|                 .individual_mut() | ||||
|                 .ok_or(ItemManagerError::WrongItemType(weapon_id))?; | ||||
|             let weapon = individual_item | ||||
|             let weapon = individual_item_w | ||||
|                 .weapon_mut() | ||||
|                 .ok_or(ItemManagerError::WrongItemType(weapon_id))?; | ||||
| 
 | ||||
|             weapon.increment_kill_counter(); | ||||
|             entity_gateway.increment_kill_counter(&weapon_entity).await?; | ||||
|             entity_gateway.set_character_inventory(&character.id, &inventory.as_inventory_entity(&character.id)).await?; | ||||
|         } | ||||
|         // for units in equipped_items.unit {
 | ||||
|         //     if let Some(unit_id) = units {
 | ||||
|         //         println!("UNIMPLEMENTED - updating unit kill counter for unit {:?}", unit_id);
 | ||||
|         //         // entity_gateway.increase_kill_counter(&unit_id).await?;
 | ||||
|         //         // let unit = inventory.get_item_by_entity_id(&unit_id)
 | ||||
|         //     }
 | ||||
|         // }
 | ||||
|         // limiter
 | ||||
|         for units in equipped_items.unit { | ||||
|             if let Some(unit_entity) = units { | ||||
|                 let unit_id = inventory.get_item_by_entity_id(unit_entity).ok_or(ItemManagerError::EntityIdNotInInventory(unit_entity))?.item_id(); | ||||
|                 let mut unit_handle = inventory.get_item_handle_by_id(unit_id).ok_or(ItemManagerError::NoSuchItemId(unit_id))?; | ||||
|                 let individual_item_u = unit_handle.item_mut() | ||||
|                     .ok_or(ItemManagerError::NoSuchItemId(unit_id))? | ||||
|                     .individual_mut() | ||||
|                     .ok_or(ItemManagerError::WrongItemType(unit_id))?; | ||||
|                 let unit = individual_item_u | ||||
|                     .unit_mut() | ||||
|                     .ok_or(ItemManagerError::WrongItemType(unit_id))?; | ||||
| 
 | ||||
|                 unit.increment_kill_counter(); | ||||
|                 entity_gateway.increment_kill_counter(&unit_entity).await?; | ||||
|             } | ||||
|         } | ||||
|         entity_gateway.set_character_inventory(&character.id, &inventory.as_inventory_entity(&character.id)).await?; | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,7 @@ pub mod inventory; | ||||
| pub mod manager; | ||||
| pub mod transaction; | ||||
| pub mod use_tool; | ||||
| // pub mod use_weapon;
 | ||||
| use serde::{Serialize, Deserialize}; | ||||
| 
 | ||||
| #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Serialize, Deserialize, derive_more::Display)] | ||||
|  | ||||
| @ -399,7 +399,7 @@ where | ||||
| } | ||||
| 
 | ||||
| pub async fn player_killed_monster<EG>( id: ClientId, | ||||
|                                         pkt: &KillMonster, | ||||
|                                         _pkt: &KillMonster, // use this later for turbo logging?
 | ||||
|                                         entity_gateway: &mut EG, | ||||
|                                         clients: &Clients, | ||||
|                                         item_manager: &mut ItemManager) | ||||
|  | ||||
| @ -92,6 +92,7 @@ impl ShopItem for ArmorShopItem { | ||||
|                 ItemDetail::Unit(Unit { | ||||
|                     unit: unit.unit, | ||||
|                     modifier: None, | ||||
|                     kills: None, | ||||
|                 }) | ||||
|             }, | ||||
|         } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user