aboutsummaryrefslogtreecommitdiff
path: root/pixel-client/src/game.rs
diff options
context:
space:
mode:
Diffstat (limited to 'pixel-client/src/game.rs')
-rw-r--r--pixel-client/src/game.rs72
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)
+ }
}
}
}