LarryG on 22/6/2015 at 19:05
I am planning a servant bell system for my mansion.
You know, there's a bell pull in every major room of the mansion, and when the bell pull is pulled, a bell rings in the butler's pantry indicating which room had the bell pull pulled. The butler then stops cleaning the silver, turns off the bell, and runs <cite class="_Rm">lickety-split</cite> to the indicated room to find out what the master wants done. After a brief conversation the butler goes off and fetches the special vintage wine bottle (or whatever), gives it to the master, and goes back to polishing the silver in the pantry.
So far, this is pretty straightforward, I think. Maybe. Maybe I can use AIWatchObj links from each bell to the butler to trigger the actions specific to each room, and I think I can have triggers to get the master to pull the bell pull at a certain point in the game play from whatever room he happens to be in (the master will be a bit of a wanderer, so no telling exactly where he might be). In any event, I think I can get all that to happen nicely ... if Garrett doesn't pull any bell pulls. If Garrett does, then I want the butler to behave as though the master pulled it, but if the master isn't in the room when the butler arrives, I want the butler to (figuratively) shrug and go back to the polishing. Similarly, if Garrett turns off a ringing bell before the butler can get to shut it off, I want the butler to (again) shrug and go back to the polishing.
These last bits I'm not certain how to script. Is there a way to skip steps in a conversation based on event triggers?
I'm also not certain what would happen if both Garrett and the master summon the butler. Ideally, the butler shouldn't "hear" the bell if he is out and about answering another summons. He should only hear the bell if he is in hearing distance. I'm not certain how to implement this with a distance measure on the bells.
Assuming you can figure out from the above the sort of bell pull system I'm contemplating, your thoughts on how to accomplish it would be very welcome.
Yandros on 22/6/2015 at 19:38
I'll have to give this some serious thought, but will respond eventually when I've had time to process it. Of course the copout solution is to make the pulls not frobbable by the player... but that's probably not what you want, nor is it nearly as fun for the player.
LarryG on 22/6/2015 at 19:45
Exactly. I want the bell pulling to be a bit of game play to get the butler out of the way for a while. If the player doesn't cotton on to this first, then the master will summon the butler and get him out of the way for the player.
I'm thinking that I can use one of the room intrusion scripts to only have the AI hear the bell if he is in a room where the bell is audible to the player. I think I can manage that.
I'm currently a bit of a novice on conversations, but if I pull this off, I expect I can claim intermediate status.
Edit:
[ATTACH=CONFIG]2156[/ATTACH]
R Soul on 23/6/2015 at 23:14
You talk about the butler being withing earshot, but until he sees the light and bell, he won't know where to go.
I've had a think about this and I have a rough idea of how it can be done, but only if there is just one light on at a time (so the bell pull turns on it's light, and turns off all the others). When I say 'light' I mean 'light and ringing bell'.
Here's a setup for a single bell pull (I'll use the library as an example) and light: The bell pull should be a button (or it should only send TurnOn). It should be linked to a RelayTrap, which is linked to the light. The RelayTrap should be CD linked to a RequireAllTrap. The butler needs the TrigRoomObject script, and also a CD link to the RAT.
So when a request has been made, and the butler is in the pantry, the RAT sends TurnOn to something. It should also send TurnOff back to the RelayTrap.
The butler's response should clearly be to go to the library, but I don't think you should use a conv for that. If 'goto object' takes a long time, there's a good chance players will save and reload during this step (as a part of normal gameplay) and convs can get broken by that sort of thing. You need to set the butler on to a normal patrol route using as many or as few TrolPts as required.
Add an AICurrentPatrol link from the butler to the first TrolPt, then add M-DoesPatrol. You can use a conv or genie for that, or you can use NVScript with a suitable delay on the metaprop. The link needs to be added first.
The advantage of setting a patrol route, other than save/reload not breaking it, is that you can be sure the butler doesn't take any inappropriate shortcuts.
You'll notice that not much 'conversation' has been done yet.
The things that happen at the end of the patrol depend on what the master is doing. If there are some rooms that are guaranteed to be master-free, you can use an AIWatchObj link to trigger some 'shrug shoulders' actions. You'll need to remove M-DoesPatrol. At the end he'll automatically go back to the pantry, or you can add another AICurrentPatrol link and set up some TrolPts back to the pantry. If you do the latter, remember to remove M-DoesPatrol using the butler's TrigRoomObject script.
For patrol routes that could lead to the master or an empty room, have the butler frob a button, which is linked to a 'shrug shoulders' conv. If the master enters a room, he should trigger something that changes the CD link from the button so it goes to a 'you rang?' conv. The last step should be to frob another button CD linked to a 'no I didn't' conv.
If the master does frob the bell pull, the CD link from this button should be changed to trigger another conv where he give the butler his instructions.
So the convs themselves are quite simple. By swapping around CD links you can change which convs are triggered. You can be even more fancy if you want. If the master is only ever in the library, and the butler is summoned elsewhere, instead of returning to the pantry he could go to the library and double check. Not fancy enough? For each false alarm the conv could increment a FalseAlarm qvar. All the 'response' convs (triggered when the butler is in the pantry) could include a step that frombs a button which is not linked to anything. When the qvar goes above a certain value, the button could be given a CD link to something that adds M-RunnyGuard to the butler to make it look as if he's trying to catch whoever is messing with the system.
And bear in mind that many players will just knock the butler out unless there's a good reason to forbid it.
LarryG on 24/6/2015 at 00:45
Thanks. Your approach sounds well worth thinking about. The within hearing distance thing is for the butler to go to the bell wall, see which bell is ringing and shut it off before answering the summons.
Edit: Oh, and the bellpull to bell light / off switch and on to the bell, is already working. That was the easy part. It's the AI responses to it and any player shenanigans that I was mulling on about.
LarryG on 30/12/2016 at 22:50
I'm beginning to think this all is way too complex to implement. I've got 10 bellpulls and two AIs (butler and housekeeper) to respond to them. Unless someone has a brilliant idea for simplifying the setups, I may just go with a more normal patrolling path for the butler and housekeeper, making their daily rounds, and have them just shut off any ringing bells in the kitchen whenever they get back there, before continuing on. The Lady of the house isn't paying for the best of servants anyway.
john9818a on 5/1/2017 at 21:08
One of the things I learned while making missions... Unless the player is forced to watch something clever happen it's probably going to take more effort than its worth. :p I did something somewhat similar but I think most people just ko the female servant early in the game and the player had no foresight to not ko her out.
LarryG on 5/1/2017 at 21:10
Yeah. I'm getting to that conclusion. Unless there is an objective forcing it, most will just bull on through.