On today’s agenda was the job of getting the scripts for the verb “Goodbye” operational. When one actor says goodbye to the other actor, the first actor must leave the stage and the second actor must decide whether to remain or move elsewhere.
Option lists
Their options were:
Subject: go home, go see
DirObject: meditate; hide; go see; depart for
I immediately realized that this set of options, assembled bit by bit as I created new verbs, is crap. ‘Go home’ and ‘go see’ are completely unnecessary because ‘depart for’ can accomplish exactly the same thing they do. So I deleted those two verbs and added ‘depart for’ to the Subject’s options list, resulting in this:
Subject: depart for
DirObject: meditate; hide; depart for
Need To See actor trait
The verb ‘goodbye’ takes as consequences the resetting of the ‘need to see’ actor trait. This is a boolean flage set for each pair of actors that keeps track of whether Actor A has some business to attend to with Actor B. Now I’m wondering whether this is really necessary. The engine automatically handles this through its plan evaluation. I tried to recall why I set up this capability in the first place, and couldn’t figure it out. So, as part of my Grand Simplification Rule, I stripped this out, too.
Subject’s decision as to where to move
The Subject has only the single option to depart for some location. The only real decision is where to go. The Subject would have three considerations:
1. go home. This would be the case if the Subject wants some time alone. The value of this would be to meditate.
2. go to see a particular person. The primary purpose of this would be to permit the player to seek out somebody.
3. go to a random location. This is the default condition.
A secondary issue just arose: I realize that actors have an expectation of privacy at their homes, but there’s nothing in the scripting asserting this. I checked the State Editor and discovered, to my surprise, that I had already made provision for this by setting the Unwelcoming_Homey values for the actor’s homes to 1 for the homeowner and -1 for everybody else. This means that the engine will never send one actor to another’s home, but I need to incorporate that into the scripting for the stage choice in ‘depart for’. [ rustle, rustle ]. Done. Here are the resulting Acceptable and Desirable scripts for the choice of stage:
The acceptable script says that a stage is acceptable if, first, it is not the current location, and second, the stage is not an off-limits stage (Unwelcoming_Homey less than -0.9). The desirable script uses a blend to put most of the weight on the Unwelcoming_Homey value that the ReactingActor holds for the CandidateStage, but throws in a small amount of randomness to provide some variety.
The DirObject has a trickier problem: he must choose between meditating, hiding, and going elsewhere. This will have to be handled with the option desirable scripts.
The problems of meditation
Why should an actor meditate? When I created the verb, I thought that it would be useful for recovering an actor’s perceptiveness. In other words, if you meditate, you’re better able to see through another actor’s lies. But since I have removed lies for the time being, meditation can’t help. Once again I hit the delete key.
Hold on! That will create a problem: most conversations last about ten minutes. If conversation is the only thing that actors can do, then during the course of the day, they’ll be forced to have dozens and dozens of conversations; this would be boring. In the original game, there was a verb ‘kill time’ (represented by a gun pointing at a clock). In Siboot, the only way to kill time is to meditate. I need to give the player the opportunity to benefit from meditating.
So I must come up with a scheme by which an actor benefits through meditation. Meditation should somehow increase some mental trait that is desirable. It can’t be a trait whose value lies in the perceptions of others; this would have no effect on the player. It must therefore directly improve some aspect of the player’s perceptive abilities. Perhaps this would express itself in the actor’s ability to perceive P2 or P3 values, or perhaps aura counts.
We should associate meditation with Siboot beads. They provide the same benefit that meditation does, but their effect is permanent, while meditation’s benefit wears off. This wearing-off, however, would have to be implemented as a mood. I could recruit the Tired_Energetic mood to accomplish this, but I would need to add something that I’ve always wanted to add: different mood volatilities. It’s wrong to insist that an actor’s anger abates at exactly the same rate that his sadness abates. I examined the mood abatement code, and inserting a new actor trait there would be a mess. First, I’d have to introduce four new actor traits, representing the volatility of each of the actors in each of the moods. Then I’d have to write some sort of dumb SWITCH statement handling each mood separately.
If I’m going to do all this work, this feature had damn well better be worth the trouble.
[Pace, pace, pace]
Perhaps we could use it to enhance an actor’s knowledge of an interlocutor’s aura counts. We could in turn reflect this visually for the player by means of an animation showing the interlocutor’s aura counts as shifting colors in a halo around his head. The prominence of each color would reflect its aura count. However, there would be enough randomness thrown in to prevent the player from forming his own personal opinion of the aura counts; instead, it shows up in the values shown in the side screen. This has the benefit of adding another visual effect to the display.
OK, I’ll run with this idea — for now. I’ll recruit the mood Tired_Energetic, add the separate volatilities for the moods, and alter the engine accordingly. This is going to be an ugly hack.
Later: Well, that didn’t work out well; the hack turned out to be so ugly that I threw up my hands and gave up. Instead, I’ll use a daily refresh: your Tired_Energetic value starts the day at a value set by your Siboot beads, and then grows as you meditate. It is reset first thing in the morning. I can do that in an Emotional Reactions script. The adjustment approach might not be appropriate; I may have to make a Set_Tired_Energetic operator to accomplish this.
So I have a plan: execution of the meditate verb entails as an emotional reaction an increment in the actor’s Tired_Energetic value. I put the increment at 0.05. One more detail: you can only meditate at home. That requires this acceptable script for the option meditate:
This may look odd, but the PickBestStage is the easiest way to select an actor’s home stage. It always has the highest value of Unwelcoming_Homey.
But another problem rears its head: I must add a consequence to each and every conversational event that adjusts all three aura counts based on the listener’s Tired_Energetic value. Will this be too burdensome? Too powerful?
Done with that; move on.
Hiding
So now the DirObject has only to decide between hiding and going somewhere else. What would motivate an actor to hide? After all, he can’t meditate while hiding; the only thing he can do is witness another event.
[ mull, mull, mull ]
What is the value of witnessing another event? You see two players conversing — so what? What can you learn? Well, you could learn some P3 values; that’s useful. You could learn about deals — that might be very useful for dream combat. Yes, I think this is worthwhile. However, it will require me to add a new Role to every conversational verb: Hider. And I have to make the hider invisible to all others. That’s going to conflict with my rule that only two actors can be present in a stage at a time — unless I alter that count to take hiding into account.
Oops! Never mind. It seems that I have already taken care of that issue. The current scripts work perfectly. I did have to change the engine code to permit a hidden actor to react to events. Fortunately, this will not require special roles for hiding actors in all cases; in most cases, they won’t fit any role definitions and will simply have nothing to do. So I need add roles for hidden actors in those cases in which the hidden actor can use the information.
I have some other tasks to take to, so I’ll take a break for a few hours.
Later…
Well, I started implementing the Hidden Spy role and immediately hit a stupid block. The Hidden Spy should react to one of the gossip verbs by altering his corresponding P3 value. However, the only place that I can set a corresponding P3 value is in the consequences menu — which is executed before roles are figured. So I must figure out if I can get it working using consequences menus. But now I run into an even nastier problem: I have to decide whether or not somebody is hiding, and the PickBestActor operator poisons the entire verb if it comes up empty-handed. I need a way to determine who is in hiding without risking poisoning the verb.
Damn, this is an example of how Sappho can be so frustrating! A normal programming language could do this with only trivial effort, but I have to come up with something really clever.
This is a larger problem; I need to take a break and consider a general solution. Tomorrow is another day.