diff options
Diffstat (limited to 'pixel-client/src')
-rw-r--r-- | pixel-client/src/game.rs | 72 |
1 files changed, 48 insertions, 24 deletions
diff --git a/pixel-client/src/game.rs b/pixel-client/src/game.rs index e7754366..cbcc62d5 100644 --- a/pixel-client/src/game.rs +++ b/pixel-client/src/game.rs @@ -30,8 +30,8 @@ use hurrycurry_client_lib::{network::sync::Network, spatial_index::SpatialIndex, use hurrycurry_protocol::{ glam::{IVec2, Vec2}, movement::MovementBase, - Gamedata, ItemIndex, ItemLocation, Message, MessageTimeout, PacketC, PacketS, PlayerClass, - PlayerID, RecipeIndex, Score, TileIndex, + Gamedata, Hand, ItemIndex, ItemLocation, Message, MessageTimeout, PacketC, PacketS, + PlayerClass, PlayerID, RecipeIndex, Score, TileIndex, }; use log::{info, warn}; use sdl2::{ @@ -67,7 +67,7 @@ pub struct Tile { pub struct Player { movement: MovementBase, - item: Option<Item>, + items: [Option<Item>; 2], message_persist: Option<(Message, MessageTimeout)>, _name: String, _character: i32, @@ -156,11 +156,13 @@ impl Game { self.network.queue_out.push_back(PacketS::Interact { player: self.my_id, pos: Some(self.players[&self.my_id].movement.get_interact_target()), + hand: Hand(0), }); } else { self.network.queue_out.push_back(PacketS::Interact { player: self.my_id, pos: None, + hand: Hand(0), }); } self.interacting = interact; @@ -209,9 +211,11 @@ impl Game { }); for player in self.players.values_mut() { - if let Some(item) = &mut player.item { - item.parent_position = player.movement.position; - item.tick(1., dt); + for item in &mut player.items { + if let Some(item) = item { + item.parent_position = player.movement.position; + item.tick(1., dt); + } } } for tile in self.tiles.values_mut() { @@ -292,7 +296,7 @@ impl Game { _character: character, _name: name, message_persist: None, - item: None, + items: [const { None }; 2], movement: MovementBase { position, input_direction: Vec2::ZERO, @@ -327,17 +331,23 @@ impl Game { } } PacketC::MoveItem { from, to } => { - let mut item = self.get_item(from).take(); + let mut item = self.get_item(from).unwrap().take(); if let Some(item) = &mut item { item.parent_position = self.get_location_position(to); } - *self.get_item(to) = item; + *self.get_item(to).unwrap() = item; } PacketC::SetItem { location, item } => { let position = self.get_location_position(location); let slot = match location { ItemLocation::Tile(pos) => &mut self.tiles.get_mut(&pos).unwrap().item, - ItemLocation::Player(pid) => &mut self.players.get_mut(&pid).unwrap().item, + ItemLocation::Player(pid, hand) => self + .players + .get_mut(&pid) + .unwrap() + .items + .get_mut(hand.0) + .unwrap(), }; self.items_removed.extend(slot.take()); *slot = item.map(|kind| Item { @@ -348,7 +358,13 @@ impl Game { active: None, }) } - PacketC::ClearProgress { item } => self.get_item(item).as_mut().unwrap().active = None, + PacketC::ClearProgress { item } => { + if let Some(slot) = self.get_item(item) { + if let Some(item) = slot { + item.active = None; + } + } + } PacketC::SetProgress { item, position, @@ -356,13 +372,17 @@ impl Game { player, warn, } => { - self.get_item(item).as_mut().unwrap().active = Some(Involvement { - position, - speed, - player, - warn, - recipe: RecipeIndex(0), - }); + if let Some(slot) = self.get_item(item) { + if let Some(item) = slot { + item.active = Some(Involvement { + position, + speed, + player, + warn, + recipe: RecipeIndex(0), + }); + } + } } PacketC::ServerMessage { .. } => { // TODO @@ -386,16 +406,18 @@ impl Game { } } - pub fn get_item(&mut self, location: ItemLocation) -> &mut Option<Item> { + pub fn get_item(&mut self, location: ItemLocation) -> Option<&mut Option<Item>> { match location { - ItemLocation::Tile(pos) => &mut self.tiles.get_mut(&pos).unwrap().item, - ItemLocation::Player(pid) => &mut self.players.get_mut(&pid).unwrap().item, + ItemLocation::Tile(pos) => Some(&mut self.tiles.get_mut(&pos)?.item), + ItemLocation::Player(pid, hand) => { + Some(self.players.get_mut(&pid)?.items.get_mut(hand.0)?) + } } } pub fn get_location_position(&self, location: ItemLocation) -> Vec2 { match location { ItemLocation::Tile(pos) => pos.as_vec2() + 0.5, - ItemLocation::Player(p) => self.players[&p].movement.position, + ItemLocation::Player(p, _) => self.players[&p].movement.position, } } @@ -494,8 +516,10 @@ impl Player { _ => (), } } - if let Some(item) = &self.item { - item.draw(ctx, item_sprites) + for item in &self.items { + if let Some(item) = item { + item.draw(ctx, item_sprites) + } } } } |