Skip to content

Commit abd0fa7

Browse files
Dmytro Lysaipingw33n
authored andcommitted
game,obj: Fix transferring dude inventory during map switch
1 parent 3d9a7ef commit abd0fa7

File tree

2 files changed

+61
-9
lines changed

2 files changed

+61
-9
lines changed

src/game/object.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,11 @@ impl Object {
822822
}
823823
}
824824

825+
pub struct ObjectGraph {
826+
pub root: Handle,
827+
pub objects: SecondaryMap<Handle, Object>,
828+
}
829+
825830
pub struct Objects {
826831
tile_grid: TileGrid,
827832
frm_db: Rc<FrameDb>,
@@ -1046,7 +1051,35 @@ impl Objects {
10461051
r
10471052
}
10481053

1054+
pub fn insert_graph(&mut self, graph: ObjectGraph) -> Handle {
1055+
let mut handle_map = SecondaryMap::new();
1056+
1057+
for (h, o) in graph.objects {
1058+
let o = self.insert(o);
1059+
assert!(handle_map.insert(h, o).is_none());
1060+
}
1061+
1062+
let root = handle_map[graph.root];
1063+
self.fix_handles(root, &|h| handle_map[h]);
1064+
1065+
root
1066+
}
1067+
1068+
fn fix_handles(&self, obj: Handle, map: &impl Fn(Handle) -> Handle) {
1069+
let mut obj = self.get_mut(obj);
1070+
for item in &mut obj.inventory.items {
1071+
item.object = map(item.object);
1072+
self.fix_handles(item.object, map);
1073+
}
1074+
}
1075+
10491076
pub fn remove(&mut self, obj: Handle) -> Object {
1077+
let r = self.remove0(obj);
1078+
assert!(r.inventory.items.is_empty(), "use remove_deep()");
1079+
r
1080+
}
1081+
1082+
fn remove0(&mut self, obj: Handle) -> Object {
10501083
if self.dude == Some(obj) {
10511084
self.dude = None;
10521085
}
@@ -1058,6 +1091,23 @@ impl Objects {
10581091
r
10591092
}
10601093

1094+
pub fn remove_deep(&mut self, root: Handle) -> ObjectGraph {
1095+
let mut objects = SecondaryMap::new();
1096+
self.remove_deep0(root, &mut objects);
1097+
ObjectGraph {
1098+
root,
1099+
objects,
1100+
}
1101+
}
1102+
1103+
fn remove_deep0(&mut self, objh: Handle, objs: &mut SecondaryMap<Handle, Object>) {
1104+
let obj = self.remove0(objh);
1105+
for item in &obj.inventory.items {
1106+
self.remove_deep0(item.object, objs);
1107+
}
1108+
assert!(objs.insert(objh, obj).is_none());
1109+
}
1110+
10611111
pub fn at(&self, pos: EPoint) -> &Vec<Handle> {
10621112
self.by_pos[pos.elevation as usize]
10631113
.get(pos.point.x as usize, pos.point.y as usize)

src/game/state.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -228,8 +228,7 @@ impl GameState {
228228
let mut dude_obj = {
229229
let mut world = self.world.borrow_mut();
230230
let dude_obj = world.objects().dude();
231-
let mut dude_obj = world.objects_mut().remove(dude_obj);
232-
dude_obj.inventory.items.clear();
231+
let dude_obj = world.objects_mut().remove_deep(dude_obj);
233232
world.clear();
234233
dude_obj
235234
};
@@ -282,13 +281,16 @@ impl GameState {
282281

283282
world.set_sqr_tiles(map.sqr_tiles);
284283

285-
dude_obj.direction = map.entrance_direction;
286-
dude_obj.set_light_emitter(LightEmitter {
287-
intensity: 0x10000,
288-
radius: 4,
289-
});
290-
dude_obj.set_pos(Some(map.entrance));
291-
let dude_obj = world.objects_mut().insert(dude_obj);
284+
{
285+
let mut dude_obj = dude_obj.objects.get_mut(dude_obj.root).unwrap();
286+
dude_obj.direction = map.entrance_direction;
287+
dude_obj.set_light_emitter(LightEmitter {
288+
intensity: 0x10000,
289+
radius: 4,
290+
});
291+
dude_obj.set_pos(Some(map.entrance));
292+
}
293+
let dude_obj = world.objects_mut().insert_graph(dude_obj);
292294

293295
world.objects_mut().make_standing(dude_obj);
294296

0 commit comments

Comments
 (0)