From 8bf625aa31310294182d432a20f684feccce2112 Mon Sep 17 00:00:00 2001 From: Dmytro Lysai Date: Mon, 1 Jun 2020 10:56:21 +0300 Subject: [PATCH] [game] Call Use for other obj types --- src/asset/proto.rs | 3 +++ src/game/state.rs | 53 ++++++++++++++++++++++++++++++++++++++++------ src/macros.rs | 9 ++++++++ 3 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/asset/proto.rs b/src/asset/proto.rs index 784a85c..f1315ae 100644 --- a/src/asset/proto.rs +++ b/src/asset/proto.rs @@ -18,6 +18,9 @@ use crate::util::{enum_iter, EnumIter}; /// "The doorway seems to be blocked." pub const MSG_DOORWAY_SEEMS_TO_BE_BLOCKED: MessageId = 597; +/// "You see: %s." +pub const MSG_YOU_SEE_X: MessageId = 480; + #[derive(Debug)] pub struct Proto { id: ProtoId, diff --git a/src/game/state.rs b/src/game/state.rs index 6d7a023..961ab7f 100644 --- a/src/game/state.rs +++ b/src/game/state.rs @@ -688,20 +688,59 @@ impl GameState { // return 0; // } - let used_kind = { + let (used_kind, script) = { let world = self.world.borrow(); let usedo = world.objects().get(used); - if let Some(ExactEntityKind::Scenery(v)) = usedo.proto().map(|p| p.kind()) { - v - } else { - return; - } + let used_kind = unwrap_or_return!( + usedo.proto().map(|p| p.kind()), + Some(ExactEntityKind::Scenery(v)) => v); + (used_kind, usedo.script) }; if used_kind == SceneryKind::Door { self.use_door(user, used, ui); } else { - // TODO + let world = &mut self.world.borrow_mut(); + + let script_overrides = if let Some((sid, _)) = script { + self.scripts.execute_predefined_proc(sid, PredefinedProc::Use, + &mut script::Context { + world, + sequencer: &mut self.sequencer, + dialog: &mut self.dialog, + ui, + message_panel: self.message_panel, + map_id: self.map_id.unwrap(), + source_obj: Some(user), + target_obj: Some(used), + }).unwrap().assert_no_suspend().script_overrides + } else { + false + }; + let script_overrides = if !script_overrides { + match used_kind { + SceneryKind::Door => unreachable!(), + // TODO + | SceneryKind::Stairs + | SceneryKind::Elevator + | SceneryKind::LadderDown + | SceneryKind::LadderUp + => { + warn!("{:?} use is not implemented", used_kind); + false + } + SceneryKind::Misc => false, + } + } else { + false + }; + if !script_overrides && user == world.dude_obj().unwrap() { + if let Some(obj_name) = world.object_name(used) { + let msg = &self.proto_db.messages().get(MSG_YOU_SEE_X).unwrap().text; + let msg = sprintf(msg, &[&obj_name]); + self.push_message(&msg, ui); + } + } } } diff --git a/src/macros.rs b/src/macros.rs index b70a7de..c00ef63 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -3,4 +3,13 @@ macro_rules! enum_len { ($ty:ty) => {{ <$ty as ::enum_map::Enum<()>>::POSSIBLE_VALUES }}; +} + +macro_rules! unwrap_or_return { + ($expression:expr, $pattern:pat => $res:expr) => { + match $expression { + $pattern => $res, + _ => return, + } + } } \ No newline at end of file