Jump to content

Recommended Posts

When Good Ideas Go Bad: An Example of Dropping Material (Or Sending It To Be Chopped Up And Recycled)

 

This one has been sitting around for awhile, gathering dust, since October 2008. Today's project was to see what could be salvaged, get the tutorial section on manipulating globals that was already written posted (though I am pretty sure this is already covered in other threads), and see where we are after over a year of periodically tweaking and puzzling through it.

 

One of the advantages of having a trustworthy, discreet modder friend is that they are able to tell you when you are about to spend massive amounts of work on an idea that just doesn't cut it - and can even point you to ideas that you might be able to use. In this case, an early lovetalk had PC and Aran doing the friend thing where the guy and the girl are both out on the prowl for companionship, but have not really figured out that they might be compatible. As initially sketched, there was something compelling about it, but subsequent revisits showed more and more weaknesses with the talk.

 

The Talk Topic SidebarThis "talk about the possibilities" is the Gold Standard™ trope from literature, TV, movies, and games - Taylor Swift 's "You Belong With Me" is one of the latest songs that play with this idea, but this one is as old as the hills themselves. Sometimes it works out, sometimes it doesn't, of course, which means it can be a friendtalk or a lovetalk, or for any gender. After all, there does not need to be mutual attraction to have the discussion. It is a staple of human communication - "window shopping" and looking for potential interests for yourself or your friend or both. And usually in literature it is a pair of good friends who are too stupid/shortsighted/whatever to realize that the dude or dudette that has been a best friend is actually a perfect match romantically.

 

Most of the other posts around here have tagged on this, and certainly used this, but let's run down ways we can tailor reactions to player choice in-game. All of this involves manipulating a particular kind of switch, a variable that in the i.e. engine is labels a "global", whether it is actually checked by the engine all the time across operating files ("GLOBAL"), only checked in reference to the active actor's script ("LOCALS"), or only checked when a particular area's script is running ("AREA").

 

Using Globals: Setting Options for Players

 

Playing with Globals to Open Pathways

 

within reply states

The standard way to make sure a dialog takes note of outside circumstances is to set a global somewhere else and then refer to it. For example,

 

IF ~Global("Aran_Likes_Imoen","GLOBAL",1)~ THEN REPLY ~[ARAN] So, Imoen. Want to go play hide an' seek?~ + newstate

 

The idea here is that something has already set the global variable to 1, so the dialog can recognize that this decision has already been made elsewhere. BioWare™ has a small number of these set up that only reference a single variable being set without advancement, meaning that

 

SetGlobal("Aran_Likes_Imoen","GLOBAL",1)

 

in either a dialog state transition or a script block is the only reference point. This single global variable basically toggles the question "Does Aran Like Imoen?" to "yes". Then it can be referenced in other ways. It does not advance to another value, the way we like to code friendtalks and lovetalks, because there is no sequence - one question, quest, or path taken, one answer, all available to any script or dialog played ingame from that point on.

 

You can set the line to play if a global is not set, too:

 

Variables Can Create Or Reference a Decision for the PC or NPC

IF ~Global("Aran_Likes_Imoen","GLOBAL",0)~ THEN REPLY ~[PC] So, Imoen. I hear Aran likes you alot. Want to go play hide an' seek with him?~ DO ~SetGlobal("Aran_Likes_Imoen","GLOBAL",1)~ + newstate

 

sets up the question to be asked only if Aran has not expressed an opinion about Imoen. Following that pathway sets the variable to 1 (yes) and then we can reference the value for the rest of the mod, for any actor who wants to know. We could also make it only available to Aran, for his own use - all we have to do is change "GLOBAL" to "LOCALS" and then the global is "local'in scope, meaning only Aran can really reference it. We can't have Imoen get something set up on it, because she can't see it. And you thought only grade schoolers hid their feelings from eachother :D

 

 

Variables Can Advance a Reference Point for the NPC

Another way to play with this is to advance the variable for different stages of discussion:

 

Dialog Variable Advancement

IF ~Global("Aran_Likes_Imoen","GLOBAL",0)~ GOTO z100
IF ~Global("Aran_Likes_Imoen","GLOBAL",1)~ GOTO z101
IF ~Global("Aran_Likes_Imoen","GLOBAL",2)~ GOTO z102

//

IF ~~ z100 SAY ~[ARAN] So, Imoen. Want to go play hide an' seek?~ DO ~SetGlobal("Aran_Likes_Imoen","GLOBAL",1)~ + cool_beans
IF ~~ z101 SAY ~[ARAN] That was fun, Imoen. Want to go play checkers?~ DO ~SetGlobal("Aran_Likes_Imoen","GLOBAL",2)~ + its_your_money
IF ~~ z102 SAY ~[ARAN] Imoen, that tight leather does some right wonderful things, it does. How about I buy you a drink?~ DO ~SetGlobal("Aran_Likes_Imoen","GLOBAL",3)~ + I_Like_Gavin_More_Plus_He_Needs_Me

 

For an existing example of this in action, one source is BG1NPC's "Bardic Reputation" component and berelinde's work doing the same thing for BG2, designed to have different options based on how many times the bard has had the conversation, as well as using reputation and bglobls to determine cost and amount of adjustment available.

 

This kind of dialog advancement can make it easy to simulate a long running debate or theme across several different (and even unrelated) conversations.

 

Globals are usually set in a dialog or through a script block, and are referenced on a later dialog and block. Almost all tutorials out there talk about this, but for the most advanced extension of the ways to manipulate, redirect, and randomize pathways, I suggest a look at Zyraen's mods - he has some very involved treatments of dialog states that allow a player to have a new experience for multiple playthroughs.

 

randomizing using scripts

For scripts, the following is completely possible:

 

Script Variable Randomization

IF
Global("Aran_Likes_Imoen","GLOBAL",0)
THEN RESPONSE #20
SetGlobal("Aran_Likes_Imoen","GLOBAL",1)
StartDialogNoSet(Player1)
THEN RESPONSE #20
SetGlobal("Aran_Likes_Imoen","GLOBAL",2)
StartDialogNoSet(Player1)
THEN RESPONSE #20
SetGlobal("Aran_Likes_Imoen","GLOBAL",3)
StartDialogNoSet(Player1)
THEN RESPONSE #20
SetGlobal("Aran_Likes_Imoen","GLOBAL",4)
StartDialogNoSet(Player1)
THEN RESPONSE #20
SetGlobal("Aran_Likes_Imoen","GLOBAL",5)
StartDialogNoSet(Player1)
END

which means that for one script block, five different and separate dialogs could take place, with the corresponding global in the dialog states called:

IF ~Global("Aran_Likes_Imoen","GLOBAL",1)~ THEN BEGIN AranLikesImoen1
 SAY ~[ARAN] So, Imoen. Want to go play hide an' seek?~
 IF ~~ THEN EXIT
END

IF ~Global("Aran_Likes_Imoen","GLOBAL",2)~ THEN BEGIN AranLikesImoen2
 SAY ~[ARAN] That was fun, Imoen. Want to go play checkers?~
 IF ~~ THEN EXIT
END

IF ~Global("Aran_Likes_Imoen","GLOBAL",3)~ THEN BEGIN AranLikesImoen3
 SAY ~[ARAN] Imoen, that tight leather does some right wonderful things, it does. How about I buy you a drink?~
 IF ~~ THEN EXIT
END

IF ~Global("Aran_Likes_Imoen","GLOBAL",4)~ THEN BEGIN AranLikesImoen4
 SAY ~[ARAN] You know, I never asked how things were back in Candlekeep. Did you have to wear a French Maid costume while cleaning up?~
 IF ~~ THEN EXIT
END

IF ~Global("Aran_Likes_Imoen","GLOBAL",5)~ THEN BEGIN AranLikesImoen5
 SAY ~[ARAN] OK, how about a little game of "how long can you hold your breath". Close your eyes, hold your breath, pucker your lips, and we can time how long it takes me to kiss you.~
 IF ~~ THEN EXIT
END

In each of the above, the dialog plays once. In the sequential global of BG1NPC's "Bardic Reputation" component, future visits will recognize the global being advanced, and give new responses in place of the old, topping out at the third. In the second example, with a script block initiating one of five different possible responses, the script block only plays once, with the variable advanced to either 1, 2, 3, 4, or 5 - thus leaving a global setting for other dialogs or script blocks to call on, refining choices later. For example, if we wanted to pick up on what Aran said in a later banter, a quick check lets us tailor the content:

CHAIN
== ~IMOEN2~ IF ~Global("Aran_Likes_Imoen","GLOBAL",1)~ THEN ~[iMOEN] Hah! I taught you not to mess with me, Aran.  Remember that game of hide and seek? You couldn't find me for two hours!~
== ~IMOEN2~ IF ~Global("Aran_Likes_Imoen","GLOBAL",2)~ THEN ~[iMOEN] I suppose you want another game of checkers. But this time, none of that "I get a kiss every time you king me"...~
== ~IMOEN2~ IF ~Global("Aran_Likes_Imoen","GLOBAL",3)~ THEN ~[iMOEN] No way, Aran. I still remember that tired old pickup line you used on me. 'That tight leather does some right wonderful things, it does'? You need to do better if you are going to attract my sister's attention!~
== ~IMOEN2~ IF ~Global("Aran_Likes_Imoen","GLOBAL",4)~ THEN ~[iMOEN] Go away, Aran. I am still mad about that French Maid outfit crack. And you never did explain about this mythical "France", as you called it.~
== ~IMOEN2~ IF ~Global("Aran_Likes_Imoen","GLOBAL",5)~ THEN ~[iMOEN] I thought the last time you tried some kind of silliness on me, I slapped you but good. Back for more?~

 

The equivalent in the dialog state is the use of RandomNum(#,#). Here, only one reply will show upon any given run through the dialog, pulled from the three available states:

 

IF ~RandomNum(3,1)~ THEN GOTO z100
IF ~RandomNum(3,2)~  THEN GOTO z101
IF ~RandomNum(3,3)~  THEN GOTO z102

IF ~~ z100 THEN BEGIN z100state SAY ~[ARAN] So, Imoen. Want to go play hide an' seek?~
IF ~~ z100 THEN BEGIN z101state SAY ~[ARAN] That was fun, Imoen. Want to go play checkers?~
IF ~~ z100 THEN BEGIN z102state SAY ~[ARAN] Imoen, that tight leather does some right wonderful things, it does. How about I buy you a drink?~
END

 

Layering this can get you into intricacies that can be incredibly tightly tailored to situation, player choices, and even in-game variables like chapter or quest conclusion. I think the most comprehensive existing model is Jastey's Ajantis PID in BG1NPC and her BG2 Ajantis mod, tied with Domi's SharTeel and Coran PIDs in the same project, followed by berelinde's Gavin. Domi's Kivan for BG2 makes similar use of the model, and is a good place to compare and contrast across each of these modder's implementations.

Of course, it also introduces lots of difficulty in troubleshooting, which is why if you can you should probably build a variable map before you get very far into playing this, so you don't forget. I do a bad job of this - berelinde does a very good job of this. Do, or do not, it is a choice you make, but if you have the patience for it I bet you will save yourself lots of troubleshooting time if you do. I keep having to go bakc and review choices because my map is scattered.

 

Narrowing the Choices

 

So far, each of the above code expands pathways and makes information on player choices available to other talks later on. But what about within the same talk? How do we make sure a pathway taken can influence later choices?

Most situations do not need such tight attention. A talk that has different replies simply creates the branch pathways, and that is the end of it:

 

example 3

/* Dialog Initiated */
IF ~Global("c-aranbg2rom","GLOBAL",5)~ THEN BEGIN c-aranbg2rom3
SAY ~[ARAN] Hey, <CHARNAME>, you are a girl...~
IF ~~ THEN REPLY ~[PC] Actually, I am a woman. Usually everyone stops calling us "girls" after we leave apprenticeship age behind, unless you are a dwarf. But you were saying?~ DO ~<<set_timers_and_advance_global>>~ + girls
IF ~~ THEN REPLY ~[PC] Someone inform the Sages of Candlekeep - Aran has discovered the difference between boys and girls!~ DO ~<<set_timers_and_advance_global>>~ + sages
IF ~~ THEN REPLY ~[PC] Is this the start of a personal discussion? I am not in the mood for smalltalk.~ DO ~<<set_timers_and_advance_global>>~ + forgetit
END

/* Pathway 1: Offended PC */
IF ~~ girls
SAY ~[ARAN] Sometimes that seems like th' best picture o' all, <CHARNAME>. At least the sparkin' - not so much the squallin' babes what result.~
IF ~~ THEN GOTO pathway1
END

/* Pathway 2: Joking */
IF ~~ sages
SAY ~[ARAN] Well, come to think o' it, I did notice a mite bit o' difference...~
IF ~~ THEN GOTO pathway2
END

/* Pathway 3: Go Away, Sellsword */
IF ~~ forgetit
SAY ~[ARAN] Right, then. Sorry to bother you.~
IF ~~ THEN GOTO pathway3
END

 

There are some situations, though, where building the dialog manually through pathways becomes a tangled web. In regular conversation, something like

[CMORGAN] So, what do you want for lunch?

[JASTEY] cmorgan, I am in Germany and you are in the US.

[CMORGAN] This is just for fun, Jastey.

[JASTEY] Well, in that case, what do you think would be good?

[CMORGAN] I like hamburgers.

[JASTEY] They are awfully messy in a three year old's hands. Is there another choice?

[CMORGAN] Spaghetti?

[JASTEY] You don't have children, do you. Is there another choice?

[CMORGAN] What about a nice spinach and arugula salad, with raspberry vinnigrette and toasted hazelnuts.

[JASTEY] *ahem*. Children... spinach... I do not even want to think of the projectile spitting of arugula across the room when they taste that. Is there another choice?

[CMORGAN] I suppose Squid Ink Ice Cream with Brandied Jalapeno White Chocolate is out of the question...

[JASTEY] Yes. Is there another choice?

[CMORGAN] Macaroni and cheese.

[JASTEY] Now that is a great idea!

 

For this, since you are basically looping back to the same question over and over again until the player chooses a choice that advances the dialog, it would be great to do this:

 

[CMORGAN] So, what do you want for lunch?

[JASTEY] cmorgan, I am in Germany and you are in the US.

[CMORGAN] This is just for fun, Jastey.

[JASTEY] Well, in that case, what do think would be good?

[CMORGAN] I like hamburgers.

[JASTEY] They are awfully messy in a three year old's hands. GOTO looping_block

 

looping_block

[JASTEY] Is there another choice?

[CMORGAN] Spaghetti? GOTO spaghetti_block

[CMORGAN] What about a nice spinach and arugula salad, with raspberry vinnagrette and toasted hazelnuts? GOTO arugula_block

[CMORGAN] I suppose Squid Ink Icecream with Brandied Jalapeno White Chocolate is out of the question... GOTO cmorgan_is_crazy

[CMORGAN] Macaroni and cheese. GOTO exit_block

 

spaghetti_block

[JASTEY] You don't have children, do you. GOTO looping_block

 

arugula_block

[JASTEY] *ahem*. Children... spinach... I do not even want to think of the projectile spitting of arugula across the room when they taste that. GOTO looping_block

 

cmorgan_is_crazy

[JASTEY] Yes. GOTO looping_block

 

exit_block

[JASTEY] Now that is a great idea! EXIT

 

Coded like this, the state looping_block will always look the same. All three choices will remain. So using a global within the talk, like example 1, looks like a good way to screen out pathways that the player has already taken. It sounds logical - set the variable, and then let the next state rely on that variable.

 

The problem is, it doesn't work exactly like that.

 

Setting a "GLOBAL", "LOCAL", or "AREA" global all takes time to be able to be registered with the game and referenced in the same dialog. If you set a variable in one dialog state, you need at least one and one half (which means really two states - the reply state, and an additional intermediate state) to allow time for the global to set and be recognized by the talk it is in.

 

So, what does this look like in code?

 

Why don't we play with a talk designed to allow players to explore various romantic possibilities in-party for an NPC, Aran. The loop is entered through c-aranbg2rom3frequenting for dialog purposes, because we have to lead into the coversation differently that you would come back to the same idea:

 

A.

IF ~~ c-aranbg2rom3frequenting
SAY ~[ARAN] So probably my best best don't rely on frequentin' inns along the way. The best bet might be look at th' ladies I see every day, an' perhaps there's somethin' more than just straight comradeship.~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

 

B.

The entry block des not need a filter block, because the first time through the dialog. But here is the filter block, to be passed through on the way back to c-aranbg2rom3someoneelse:

IF ~~ c-aranbg2rom3challenging1
SAY ~[ARAN] That makes it a mite o' a challenge, eh?~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

 

C.

Here is the workhorse, allowing dialog to reflect the potential matches within the party. The player can reject all choices by selecting reply 0 or reply 1, advancing the dialog. She is also given the opportunity to roleplay the evaluations, just to see what Aran thinks - a common enogh friendly conversation.

A quick reminder: with PC and Aran, there is a maximum possible number of possible party-joined NPCs to discuss of 4. If they are all female distributed NPCs, there are 6 conversational choices facing Player1. It is much more likely there will be two or only one - in a canonical "good" party, for example, there will probably only be Aerie and Jaheira.

IF ~~ c-aranbg2rom3someoneelse
 SAY ~[ARAN] Perhaps there might be someone around here, right under my nose...~
 IF ~~ THEN REPLY ~[PC] I really do not think so, Aran.~ + c-aranbg2rom3remembered
 IF ~~ THEN REPLY ~[PC] She might be. Perhaps even about to put this nice cold water right down your back, to wake you up... ~ + c-aranbg2rom3remembered
 IF ~InParty("JAHEIRA") Global("c-jaheiramatch","LOCALS",0)~ THEN REPLY ~[PC] Jaheira? I thought you liked younger women.~ DO ~SetGlobal("c-jaheiramatch","LOCALS",1)~ + c-jaheiramatch1
 IF ~InParty("AERIE") Global("c-aeriematch","LOCALS",0)~ THEN REPLY ~[PC] Who, Aerie?~ DO ~SetGlobal("c-aeriematch","LOCALS",1)~ + c-aeriematch1
 IF ~InParty("IMOEN2") Global("c-imoenmatch","LOCALS",0)~ THEN REPLY ~[PC] Leave Imoen alone, Aran.~ DO ~SetGlobal("c-imoenmatch","LOCALS",1)~ + c-imoenmatch1
 IF ~InParty("MAZZY") Global("c-mazzymatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Mazzy?~ DO ~SetGlobal("c-mazzymatch","LOCALS",1)~ + c-mazzymatch1
 IF ~InParty("NALIA") Global("c-naliamatch","LOCALS",0)~ THEN REPLY ~[PC] Do you really think Nalia would be interested in you?~ DO ~SetGlobal("c-naliamatch","LOCALS",1)~ + c-naliamatch1
 IF ~InParty("VICONIA") Global("c-viconiamatch","LOCALS",0)~ THEN REPLY ~[PC] The drowess. Riiiight. Tell me you are not considering Viconia, Aran.~ DO ~SetGlobal("c-viconiamatch","LOCALS",1)~ + c-viconiamatch1
 IF ~InParty("R#ALLIS") Global("c-allisonmatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Allison?~ DO ~SetGlobal("c-allisonmatch","LOCALS",1)~ + c-allisonmatch1
 IF ~InParty("CMALORA") Global("c-aloramatch","LOCALS",0)~ THEN REPLY ~[PC] Alora?? You are joking, right...~ DO ~SetGlobal("c-aloramatch","LOCALS",1)~ + c-aloramatch1
 IF ~InParty("Anishai") Global("c-anishaimatch","LOCALS",0)~ THEN REPLY ~[PC] Anishai is not to be trusted with the silver, let alone your heart. Unless you enjoy pain.~ DO ~SetGlobal("c-anishaimatch","LOCALS",1)~ + c-anishaimatch1
 IF ~InParty("MWAriena") Global("c-arienamatch","LOCALS",0)~ THEN REPLY ~[PC] Ariena?~ DO ~SetGlobal("c-arienamatch","LOCALS",0)~ + c-arienamatch1
 IF ~InParty("M#AMBER") Global("c-ambermatch","LOCALS",0)~ THEN REPLY ~[PC] Amber? You look at her often, but I figured that it was because you did not trust her.~ DO ~SetGlobal("c-ambermatch","LOCALS",1)~ + c-ambermatch1
 IF ~InParty("K#Auren") Global("c-aurenmatch","LOCALS",0)~ THEN REPLY ~[PC] You are not thinking of Auren, right...~ DO ~SetGlobal("c-aurenmatch","LOCALS",1)~ + c-aurenmatch1
 IF ~InParty("WLBRAN") Global("c-branwen1match","LOCALS",0)~ THEN REPLY ~[PC] Branwen is just a bit intense for you, isn't she?~ DO ~SetGlobal("c-branwen1match","LOCALS",1)~ + c-branwen1match1
 IF ~InParty("Britt") Global("c-brittmatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Britt?~ DO ~SetGlobal("c-brittmatch","LOCALS",1)~ + c-brittmatch1
 IF ~InParty("CALLISTO") Global("c-callistomatch","LOCALS",0)~ THEN REPLY ~[PC] Callisto? I don't know...~ DO ~SetGlobal("c-callistomatch","LOCALS",1)~ + c-callistomatch1
 IF ~InParty("Chloe") Global("c-chloematch","LOCALS",0)~ THEN REPLY ~[PC] You. Chloe. You and Chloe. Aran, let me smell your breath. I want to see exactly how drunk you are right now.~ DO ~SetGlobal("c-chloematch","LOCALS",1)~ + c-chloematch1
 IF ~InParty("E3Fade") Global("c-fadematch","LOCALS",0)~ THEN REPLY ~[PC] Fade really does not seem to talk to you at all, Aran.~ DO ~SetGlobal("c-fadematch","LOCALS",1)~ + c-fadematch1
 IF ~InParty("Keto") Global("c-ketomatch","LOCALS",0)~ THEN REPLY ~[PC] This should be fun. You think Keto might be a good match for you. By all means, tell me why.~ DO ~SetGlobal("c-ketomatch","LOCALS",1)~ + c-ketomatch1
 IF ~InParty("R#Kitanya") Global("c-kitanyamatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Kitanya?~ DO ~SetGlobal("c-kitanyamatch","LOCALS",1)~ + c-kitanyamatch
 IF ~InParty("SAERILETH") Global("c-saerimatch","LOCALS",0)~ THEN REPLY ~[PC] I know you like younger women, Aran, but a Paladin of Tyr is a bit out of your league...~ DO ~SetGlobal("c-saerimatch","LOCALS",1)~ + c-saerimatch1
 IF ~InParty("CMNIKITA") Global("c-nikimatch","LOCALS",0)~ THEN REPLY ~[PC] Nikita? Do you have a death wish?~ DO ~SetGlobal("c-nikimatch","LOCALS",1)~ + c-nikimatch1
 IF ~InParty("CMNINAF") Global("c-ninamatch","LOCALS",0)~ THEN REPLY ~[PC] Ninafer really does not seem like your type.~ DO ~SetGlobal("c-ninamatch","LOCALS",1)~ + c-ninamatch1
 IF ~InParty("DL#BWN") Global("c-branwen2match","LOCALS",0)~ THEN REPLY ~[PC] Branwen?~ DO ~SetGlobal("c-branwen2match","LOCALS",1)~ + c-branwen2match1
 IF ~InParty("K#Sarah") Global("c-sarahmatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Sarah? Aran, have you ever really talked to her?~ DO ~SetGlobal("c-sarahmatch","LOCALS",1)~ + c-sarahmatch1
 IF ~InParty("TASHIA") Global("c-tashiamatch","LOCALS",0)~ THEN REPLY ~[PC] Tashia? I did not think you found her interesting.~ DO ~SetGlobal("c-tashiamatch","LOCALS",1)~ + c-tashiamatch1
 IF ~InParty("YASRAENA") Global("c-yasraenamatch","LOCALS",0)~ THEN REPLY ~[PC] You are not seriously considering Yasraena...~ DO ~SetGlobal("c-yasraenamatch","LOCALS",1)~ + c-yasraenamatch1
 IF ~InParty("D#SILVER") Global("c-silvermatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Silverstar?~ DO ~SetGlobal("c-silvermatch","LOCALS",1)~ + c-silvermatch1
END

D.

And each one of the replies leads back to the filtering state:

IF ~~ c-aranbg2rom3challenging
SAY ~[ARAN] Now, then. I do take chances. But perhaps Tymora's Coin won't spin on that one.~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

 

So, let's fill out the full lovetalk, using the technique.

 

The Full Talk

 

The repeating block is #18, c-aranbg2rom3someoneelse

The entry state is c-aranbg2rom3frequenting

and the filtering states for setting the globals are c-aranbg2rom3challenging1, 2, 3, 4, 5, so that there is a reply block and the filter block.

 

/* Queen: Somebody To Love */
/* BG2 LoveTalk 3, c-aranbg2rom = 5 c-aranromtimer,C-ARAN_ROM */

IF ~Global("c-aranbg2rom","GLOBAL",5)~ THEN BEGIN c-aranbg2rom3
SAY ~[ARAN] Hey, <CHARNAME>, you are a girl...~
IF ~~ THEN REPLY ~[PC] Actually, I am a woman. Usually everyone stops calling us "girls" after we leave apprenticeship age behind, unless you are a dwarf. But you were saying?~ + c-aranbg2rom3noticed
IF ~~ THEN REPLY ~[PC] Someone inform the Sages of Candlekeep - Aran has discovered the difference between boys and girls!~ + c-aranbg2rom3inn
IF ~~ THEN REPLY ~[PC] Is this the start of a personal discussion? I am not in the mood for smalltalk.~ + c-aranbg2rom3inn
 IF ~~ THEN REPLY ~[PC] Your powers of observation are astounding.~ + c-aranbg2rom3inn
 IF ~~ THEN REPLY ~[PC] I am glad you noticed, Aran.~ + c-aranbg2rom3inn
END

IF ~~ c-aranbg2rom3noticed
SAY ~[ARAN] (grins) Now, come to think o' it, you are right. But then again, I'd say you're still a bit wet behind the ears too. An' I don't mean on account o' washin' your face. Anyways...
IF ~~ THEN GOTO c-aranbg2rom3inn
END

IF ~~ c-aranbg2rom3inn
SAY ~[ARAN] At the last Inn we stayed. Blonde, beautiful blue eyes, great smile - she seemed to sparkle right pretty, she did. She came over, an' we talked for a bit, an' she seemed right interested. But I don't know. I couldn't tell if she was interested in just a dance an' some entertainment upstairs, or if she thought I was marriage material, like.
IF ~~ THEN REPLY ~[PC] I didn't notice.~ + c-aranbg2rom3serious
IF ~~ THEN REPLY ~[PC] That is not really my concern, Aran.~ + c-aranbg2rom3serious
IF ~~ THEN REPLY ~[PC] Why yes, I noticed you making a fool of yourself.~ + c-aranbg2rom3really
IF ~~ THEN REPLY ~[PC] I definitely noticed her, Aran. I thought she was just right for you.~ + c-aranbg2rom3really
<<STANDARD EXIT BLOCK>>
END

IF ~~ c-aranbg2rom3really
SAY ~[ARAN] Really?
IF ~~ THEN REPLY ~[PC] Why, yes indeed. She would make you a wonderful wife. You should ask her out next time we pass through that way.~ + c-aranbg2rom3doit
IF ~~ THEN REPLY ~[PC] Absolutely. Sparkly eyes and cute hair, never been more than three feet from her front door, no education... she will believe every story you tell her. You can be a fat, happy, contented chef at an inn, and she can bear you five or six children.~ + c-aranbg2rom3nicepic
 IF ~~ THEN REPLY ~[PC] Who else would be naive enough to believe your tall tales, and put up with your snoring.~ + c-aranbg2rom3snore
 IF ~~ THEN REPLY ~[PC] No, Aran, I was joking. It is not often you meet someone randomly and get that serious that quickly.~ + c-aranbg2rom3serious
END

IF ~~ c-aranbg2rom3doit
SAY ~[ARAN] Well, I might just do that, if you think it might be taken in th' right way.~
IF ~~ THEN GOTO c-aranbg2rom3serious
END

IF ~~ c-aranbg2rom3nicepic
SAY ~[ARAN] Sometimes that seems like th' best picture o' all, <CHARNAME>. At least the sparkin' - not so much the squallin' babes what result.~
IF ~~ THEN GOTO c-aranbg2rom3serious
END

IF ~~ c-aranbg2rom3snore
SAY ~[ARAN] I snore? Well, bugger all Chauntea's haystacks - I didn't know that. I'd better lose a bit o weight, or somethin'. But really, now...~
IF ~~ THEN GOTO c-aranbg2rom3serious
END

IF ~~ c-aranbg2rom3serious
SAY ~[ARAN] Do you think she was serious, or just out for some fun?~
IF ~~ THEN REPLY ~[PC] In general, Aran, if you meet someone at a bar only once, I think it is unlikely she was looking for a serious committment. But I could be wrong.~ + c-aranbg2rom3experience
IF ~~ THEN REPLY ~[PC] It takes longer than a single evening to fall in love, Aran.~ + c-aranbg2rom3experience
IF ~~ THEN REPLY ~[PC] Well, I believe there is such a thing as love at first sight. But I have heard it is usually found with the people close to you for a longer period of time.~ + c-aranbg2rom3experience
<<STANDARD EXIT BLOCK>>
END

IF ~~ c-aranbg2rom3experience
SAY ~[ARAN] So , you have experience at that? The fallin' in love, I mean?~
IF ~~ THEN REPLY ~[PC] That is for me to know and you to find out.~ + c-aranbg2rom3lostlove
IF ~~ THEN REPLY ~[PC] That is a bit personal, and painful, Aran. I don't want to talk about it.~ + c-aranbg2rom3lostlove
IF ~~ THEN REPLY ~[PC] Perhaps. Have you had any experience yourself?~ + c-aranbg2rom3lostlove
IF ~~ THEN REPLY ~[PC] Love, or lust? There is a difference, you know.~ + c-aranbg2rom3hear
END

IF ~~ c-aranbg2rom3hear
SAY ~[ARAN] I did hear there was. I'm not so sure, m'self. But then again, as far as I know, I only have had th' second.~
IF ~~ THEN GOTO c-aranbg2rom3frequenting
END

IF ~~ c-aranbg2rom3lostlov
SAY ~[ARAN] Well, I don't know. I did think I had a friend once what was interested. She was a rare one, she was. Sun Elf father, human mother, long hair like polished brass, an' a body what made... *ahem*... well, that's another story. Unfortunately she ran off with some Cyric - blighted bard, all dark, broodin' an' "I just lost the love o' me life" type. I learned my lesson well, I did. Women seem to want danger, bad boys, an' damaged goods.~
IF ~~ THEN REPLY ~[PC] Three for three - you are all set, Aran. Pity you don't have the other requirement. You need to be just a little more handsome, and you might have a fighting chance with a real woman.~ + c-aranbg2rom3frequenting
IF ~~ THEN REPLY ~[PC] Not all women like the same thing, Aran. You might try listening to them for awhile, or even asking them.~ + c-aranbg2rom3frequenting
IF ~~ THEN REPLY ~[PC] Well, if you met her in an inn...~ + c-aranbg2rom3frequenting
END

IF ~~ c-aranbg2rom3frequenting
SAY ~[ARAN] So probably my best best don't rely on frequentin' inns along the way. The best bet might be look at th' ladies I see every day, an' perhaps there's somethin' more than just straight comradeship.~
IF ~~ THEN GOTO c-aranbg2rom3challenging1
END

IF ~~ c-aranbg2rom3challenging1
SAY ~[ARAN] That makes it a mite o' a challenge, eh?~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

IF ~~ c-aranbg2rom3challenging2
SAY ~[ARAN] Well, there might be somethin' to what you say.~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

IF ~~ c-aranbg2rom3challenging3
SAY ~[ARAN] Right. You have a point there, you do.~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

IF ~~ c-aranbg2rom3challenging4
SAY ~[ARAN] I like a challenge. But I don't know if that be a challenge or a lost cause.~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

IF ~~ c-aranbg2rom3challenging5
SAY ~[ARAN] Now, then. I do take chances. But perhaps Tymora's Coin won't spin on that one.~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

IF ~~ c-aranbg2rom3challenging6
SAY ~[ARAN] It could happen, right? It might be possible.~
IF ~~ THEN GOTO c-aranbg2rom3someoneelse
END

IF ~~ c-aranbg2rom3someoneelse
 SAY ~[ARAN] Perhaps there might be someone around here, right under my nose...~
 IF ~~ THEN REPLY ~[PC] I really do not think so, Aran.~ + c-aranbg2rom3remembered
 IF ~~ THEN REPLY ~[PC] She might be. Perhaps even about to put this nice cold water right down your back, to wake you up... ~ + c-aranbg2rom3remembered
 IF ~InParty("JAHEIRA") Global("c-jaheiramatch","LOCALS",0)~ THEN REPLY ~[PC] Jaheira? I thought you liked younger women.~ DO ~SetGlobal("c-jaheiramatch","LOCALS",1)~ + c-jaheiramatch1
 IF ~InParty("AERIE") Global("c-aeriematch","LOCALS",0)~ THEN REPLY ~[PC] Who, Aerie?~ DO ~SetGlobal("c-aeriematch","LOCALS",1)~ + c-aeriematch1
 IF ~InParty("IMOEN2") Global("c-imoenmatch","LOCALS",0)~ THEN REPLY ~[PC] Leave Imoen alone, Aran.~ DO ~SetGlobal("c-imoenmatch","LOCALS",1)~ + c-imoenmatch1
 IF ~InParty("MAZZY") Global("c-mazzymatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Mazzy?~ DO ~SetGlobal("c-mazzymatch","LOCALS",1)~ + c-mazzymatch1
 IF ~InParty("NALIA") Global("c-naliamatch","LOCALS",0)~ THEN REPLY ~[PC] Do you really think Nalia would be interested in you?~ DO ~SetGlobal("c-naliamatch","LOCALS",1)~ + c-naliamatch1
 IF ~InParty("VICONIA") Global("c-viconiamatch","LOCALS",0)~ THEN REPLY ~[PC] The drowess. Riiiight. Tell me you are not considering Viconia, Aran.~ DO ~SetGlobal("c-viconiamatch","LOCALS",1)~ + c-viconiamatch1
 IF ~InParty("R#ALLIS") Global("c-allisonmatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Allison?~ DO ~SetGlobal("c-allisonmatch","LOCALS",1)~ + c-allisonmatch1
 IF ~InParty("CMALORA") Global("c-aloramatch","LOCALS",0)~ THEN REPLY ~[PC] Alora?? You are joking, right...~ DO ~SetGlobal("c-aloramatch","LOCALS",1)~ + c-aloramatch1
 IF ~InParty("Anishai") Global("c-anishaimatch","LOCALS",0)~ THEN REPLY ~[PC] Anishai is not to be trusted with the silver, let alone your heart. Unless you enjoy pain.~ DO ~SetGlobal("c-anishaimatch","LOCALS",1)~ + c-anishaimatch1
 IF ~InParty("MWAriena") Global("c-arienamatch","LOCALS",0)~ THEN REPLY ~[PC] Ariena?~ DO ~SetGlobal("c-arienamatch","LOCALS",0)~ + c-arienamatch1
 IF ~InParty("M#AMBER") Global("c-ambermatch","LOCALS",0)~ THEN REPLY ~[PC] Amber? You look at her often, but I figured that it was because you did not trust her.~ DO ~SetGlobal("c-ambermatch","LOCALS",1)~ + c-ambermatch1
 IF ~InParty("K#Auren") Global("c-aurenmatch","LOCALS",0)~ THEN REPLY ~[PC] You are not thinking of Auren, right...~ DO ~SetGlobal("c-aurenmatch","LOCALS",1)~ + c-aurenmatch1
 IF ~InParty("WLBRAN") Global("c-branwen1match","LOCALS",0)~ THEN REPLY ~[PC] Branwen is just a bit intense for you, isn't she?~ DO ~SetGlobal("c-branwen1match","LOCALS",1)~ + c-branwen1match1
 IF ~InParty("Britt") Global("c-brittmatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Britt?~ DO ~SetGlobal("c-brittmatch","LOCALS",1)~ + c-brittmatch1
 IF ~InParty("CALLISTO") Global("c-callistomatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Callisto?~ DO ~SetGlobal("c-callistomatch","LOCALS",1)~ + c-callistomatch1
 IF ~InParty("Chloe") Global("c-chloematch","LOCALS",0)~ THEN REPLY ~[PC] You Chloe. Aran, let me smell your breath. I want to see exactly how drunk you are right now.~ DO ~SetGlobal("c-chloematch","LOCALS",1)~ + c-chloematch1
 IF ~InParty("E3Fade") Global("c-fadematch","LOCALS",0)~ THEN REPLY ~[PC] Fade really does not seem to talk to you at all, Aran.~ DO ~SetGlobal("c-fadematch","LOCALS",1)~ + c-fadematch1
 IF ~InParty("Keto") Global("c-ketomatch","LOCALS",0)~ THEN REPLY ~[PC] This should be fun. You think Ketop might be a good match for you. By all means, tell me why.~ DO ~SetGlobal("c-ketomatch","LOCALS",1)~ + c-ketomatch1
 IF ~InParty("R#Kitanya") Global("c-kitanyamatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Kitanya?~ DO ~SetGlobal("c-kitanyamatch","LOCALS",1)~ + c-kitanyamatch
 IF ~InParty("SAERILETH") Global("c-saerimatch","LOCALS",0)~ THEN REPLY ~[PC] I know you like younger women, Aran, but a Paladin of Tyr is a bit out of your league...~ DO ~SetGlobal("c-saerimatch","LOCALS",1)~ + c-saerimatch1
 IF ~InParty("CMNIKITA") Global("c-nikimatch","LOCALS",0)~ THEN REPLY ~[PC] Nikita? Do you have a death wish?~ DO ~SetGlobal("c-nikimatch","LOCALS",1)~ + c-nikimatch1
 IF ~InParty("CMNINAF") Global("c-ninamatch","LOCALS",0)~ THEN REPLY ~[PC] Ninafer really does not seem like your type.~ DO ~SetGlobal("c-ninamatch","LOCALS",1)~ + c-ninamatch1
 IF ~InParty("DL#BWN") Global("c-branwen2match","LOCALS",0)~ THEN REPLY ~[PC] Branwen?~ DO ~SetGlobal("c-branwen2match","LOCALS",1)~ + c-branwen2match1
 IF ~InParty("K#Sarah") Global("c-sarahmatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Sarah? Aran, have you ever realy talked to her?~ DO ~SetGlobal("c-sarahmatch","LOCALS",1)~ + c-sarahmatch1
 IF ~InParty("TASHIA") Global("c-tashiamatch","LOCALS",0)~ THEN REPLY ~[PC] Tashia? I did not think you found her interesting.~ DO ~SetGlobal("c-tashiamatch","LOCALS",1)~ + c-tashiamatch1
 IF ~InParty("YASRAENA") Global("c-yasraenamatch","LOCALS",0)~ THEN REPLY ~[PC] You are not seriously considering Yasraena...~ DO ~SetGlobal("c-yasraenamatch","LOCALS",1)~ + c-yasraenamatch1
 IF ~InParty("D#SILVER") Global("c-silvermatch","LOCALS",0)~ THEN REPLY ~[PC] Who, Silverstar?~ DO ~SetGlobal("c-silvermatch","LOCALS",1)~ + c-silvermatch1
END

// The Competition

IF ~~ c-jaheiramatch1
SAY ~[ARAN] There's Jaheira. Well, now she is a right fine woman. She's smart, a bit bossy, an' she can partner right quick in th' cookin' area. She's a bit motherin', but then again, she's an older woman in real years, if not in th' equivalent. She might take a shine to me.~
IF ~~ THEN REPLY ~[PC] Leave her alone, Aran. She has lost the love of her life, and is in a great deal of pain. She does not need you distracting her and bothering her.~
IF ~~ THEN REPLY ~[PC] I think that is a great idea. You can go worship trees together.~ + c-aranbg2rom3challenging 1 2 3 4 5 6
IF ~~ THEN REPLY ~[PC]  <<TEXT>> ~ + c-aranbg2rom3challenging 1 2 3 4 5 6
END

IF ~~ c-aeriematch1
SAY ~[ARAN] Aerie is a fine girl. She just reaches out wi' those eyes, an' tugs at your heartstrings. It might be the Aavariel, but then again, it might just be she looks like she needs a right stong man to protect her an' look out for her. It's nice to be needed.~
IF ~~ THEN REPLY ~[PC] A great way to establish a relationship, Aran. Choose the frail, self-consious waif who has image problems and has suffered traumatic abuse. A truly equal relationship.~ + c-aranbg2rom3challenging 1 2 3 4 5 6
IF ~~ THEN REPLY ~[PC] She has been hurt rather badly, Aran. I would be careful of offering her more than you intend. Breaking her heart woud be easy to do, and a disaster for this party as well as for her.~ + c-aranbg2rom3challenging 1 2 3 4 5 6
IF ~~ THEN REPLY ~[PC] What is it with men and elves?~ + c-aranbg2rom3challenging 1 2 3 4 5 6
END

IF ~~ c-imoenmatch1
SAY ~[ARAN] <<_TEXT_>> ~
IF ~~ THEN REPLY ~[PC] <<_TEXT_>> ~ + c-aranbg2rom3challenging 1 2 3 4 5 6
IF ~~ THEN REPLY ~[PC] <<_TEXT_>> ~ + c-aranbg2rom3challenging 1 2 3 4 5 6
END

IF ~~ c-mazzymatch1
SAY ~[ARAN] Mazzy is right pretty, in her own way. I don't know, though. She is a mighty riteous Han. She might not take kindly to me flirtin', an' all. Besides, most o' the Halfling folk seem tied up wi' bonds o' family an' obligation. I never heard o' a halfling an' a human fallin' for eachother.
IF ~~ THEN REPLY ~[PC] <<_TEXT_>> ~ + c-aranbg2rom3challenging 1 2 3 4 5 6
IF ~~ THEN REPLY ~[PC] <<_TEXT_>> ~ + c-aranbg2rom3challenging 1 2 3 4 5 6
END

// snip
END

//

IF ~~ c-aranbg2rom3remembered
SAY ~[ARAN] Hey, I just remembered. I met you in an Inn, right?~
IF ~~ THEN REPLY ~[PC] Have you noticed you keep describing all these women's physical attributes?~ + c-aranbg2rom3harm
IF ~~ THEN REPLY ~[PC] I was slumming. If I remember correctly, you approached me about some employment, or something. I do not seem remember candlelight and roses.~ + c-aranbg2rom3slumming
IF ~~ THEN REPLY ~[PC] You meet all sorts of people in taverns. I keep a watchful eye on most of the crowd.~ + c-aranbg2rom3slumming
END

IF ~~ c-aranbg2rom3harm
SAY ~[ARAN]I don't mean no harm. I guess that's just the way menfolk think.~
IF ~~ THEN REPLY ~[PC] I don't believe that. I think that is the way boys think. A real man would see people, not objects.~ + c-aranbg2rom3slumming
IF ~~ THEN REPLY ~[PC] Women think that way sometimes too, you know.~ + c-aranbg2rom3slumming
IF ~~ THEN REPLY ~[PC] Men think?~ + c-aranbg2rom3slumming
END

IF ~~c-aranbg2rom3slumming
SAY ~[ARAN] Well, now, you might be right there. I suspect we boys do more'n occasionally run to the shallow side o' life at times. I'd say women, too, based on where I see your eyes lingerin' sometimes. Then again, I see your eyes linger on some folks a mite more than a casual one over, yourself.~
IF ~~ THEN REPLY ~[PC] That might not mean anything. After all, I am looking at you right now.~ + c-aranbg2rom3boss
IF ~~ THEN REPLY ~[PC] So many choices, so little time...~ + c-aranbg2rom3boss
IF ~~ THEN REPLY ~[PC] That is different.~ + c-aranbg2rom3boss
IF ~~ THEN REPLY ~[PC] That sounds like you might be a little jealous.~ + c-aranbg2rom3boss
IF ~~ THEN REPLY ~[PC] So, how would you describe me, Aran?~ + c-aranbg2rom3game
END

IF ~~ c-aranbg2rom3boss
SAY ~[ARAN] If you say so, <CHARNAME>. If you say so.~
IF ~~ THEN EXIT
END


IF ~~ c-aranbg2rom3game
SAY ~[ARAN] Oh, I'm not fallin' for that, <CHARNAME>. I know that game too well. I'd say "<CHARNAME>. You know, the one what's in charge o' this here party". I get to describin' you, an' I'm likely to dig a hole an' have you kickin' the dirt over my head right quick!~
IF ~~ THEN EXIT
END

 

So, Why Did This Talk Not Work Out? Why Is It On The Recycling Or Disposal Pile?

 

Well, the idea is sound, and it does a good job of showing off some ways of variable manipulation - even more fun would be the "undo state", where we DE-advance the variable -

 

+ ~Global("c-silvermatch","LOCALS",1)~ + ~[PC] Are you sure SilverSatr is not that attractive to you? Do you want to think about her again?~ DO ~SetGlobal("c-silvermatch","LOCALS",0)~

 

but the devil is in the details. Looking through this, there are some problems to be worked on. Number one, the project has moved on, and we have code example in play that already show these kinds of usages (though I want to go back and put a randomizing script block in there, because it is just way cool).

 

Second problem - effort vs. playability. The way this is created, I either have to assume PC is straight to build a corresponding set of choices - otherwise it will be over a month of writing to get specific reactions for all available NPCs. Even using Aran's straightness to get specifics down to female NPCs, there is alot there. So unless inspiration hits, this one is a tough one to write. We can keep it positive, and search for good reasons for a match, aviding disrespect for other NPCs, but then we get a way too cheery, upbeat, unrealistic view, but that is not so cool. The real life conversation would be a bit harsher - "You would go out with *her*? I mean, that voice just cuts like a kife, man. Plus, she seems so needy. And the scars on her back... yuck. Drop the damaged elf-chick, and go for a real woman."

 

Third Problem - psychology. It works as a friend setting up Aran, but there is no opportunity for him to follow through, unless the player is doing something with Amber and being careful about how it is all set up. So each way I try to rewrite it, starting as a lovetalk means that PC is trying to foist him off on others, or having to listen to him go "hey, perhaps she would like me". Perhaps a bit too realistic and annoying, having Aran talk about why others might be preferable to PC - and completely a waste of her time if she just wants to be friends. And with a guy PC, things get even more difficult to work through without it being odd. Aran is not going to mind talking openly about how a two male or two female pairings might work out, being an open-minded dude in FR, where open-mindedness includes romances that cross species as well as gender. But the PC, well, not so easy to guage reaction and account for pathways.

 

[ARAN] So, how about you an' Edwin? You would make a great pair, eh?

[PC] You have known me for half a game, and I am in a committed romance with a female NPC who was written after you were. Do you know how many ways that last suggestion was just plain wrong? Or insulting?

[ARAN] Oh, dammit - my code just was not robust enough to keep me relevant. Sorry?

[PC] Too late. You are history. Next time, i am going for the All Female Multi-Romance Party, and you can sit on the sidelines and wish you were me.

 

But most of all, #4, the big question - how much is this advancing the relationship, versus how much is this just fluff? Can we have a similar kind of discussion to foster that sense of "good friendship developing that might become more"? Given the number of talks already in place, is this getting us anywhere exploring either Aran's personality or the Player's roleplaying personality in a way not covered by other talks?

 

So, some salvage work...

 

A way around some of the challenges is to adjust the level of detail. We might be able to salvge some of the reactions, by making them more generic:

 

IF ~InParty(Player2) Gender(Player2,FEMALE) !HasItemEquiped("belt05",Player2) !Name(Player2,"c-aran")~ + ~[PC] What about <PLAYER2>? She might be just what you want.~ + newstate
IF ~InParty(Player3) Gender(Player3,FEMALE) !HasItemEquiped("belt05",Player2) !Name(Player3,"c-aran")~ + ~[PC] What about <PLAYER3>? She might be just what you want.~ + newstate
IF ~InParty(Player4) Gender(Player4,FEMALE) !HasItemEquiped("belt05",Player2) !Name(Player4,"c-aran")~ + ~[PC] What about <PLAYER4>? She might be just what you want.~ + newstate
IF ~InParty(Player5) Gender(Player5,FEMALE) !HasItemEquiped("belt05",Player2) !Name(Player5,"c-aran")~ + ~[PC] What about <PLAYER5>? She might be just what you want.~ + newstate
IF ~InParty(Player6) Gender(Player6,FEMALE) !HasItemEquiped("belt05",Player2) !Name(Player6,"c-aran")~ + ~[PC] What about <PLAYER6>? She might be just what you want.~ + newstate

 

IF ~InParty(Player2) !HasItemEquiped("belt05",Player2) !Name(Player2,"c-aran")~ THEN BEGIN z100 SAY ~[ARAN] What about <PLAYER2>? You know, <HESHE> might be just what you want.~ + newstate
IF ~InParty(Player3) !HasItemEquiped("belt05",Player3) !Name(Player3,"c-aran")~ THEN BEGIN z101 SAY ~[ARAN] What about <PLAYER3>? You know, <HESHE> might be just what you want.~ + newstate
IF ~InParty(Player4) !HasItemEquiped("belt05",Player4) !Name(Player4,"c-aran")~ THEN BEGIN z102 SAY ~[ARAN] What about <PLAYER4>? You know, <HESHE> might be just what you want.~ + newstate
IF ~InParty(Player5) !HasItemEquiped("belt05",Player5) !Name(Player5,"c-aran")~ THEN BEGIN z103 SAY ~[ARAN] What about <PLAYER5>? You know, <HESHE> might be just what you want.~ + newstate
IF ~InParty(Player6) !HasItemEquiped("belt05",Player6) !Name(Player6,"c-aran")~ THEN BEGIN z104 SAY ~[ARAN] What about <PLAYER6>? You know, <HESHE> might be just what you want.~ + newstate

 

Of course, we run into the difficulty of scripting PC response to potential cross-gender suggestions - which is fine for me to present with Aran. but tougher for scripting PC responses to. Plus, it leaves little "punch" to the dialog, wheras saying things

Note I wimped out on the Girdle of gender Change, too ( !HasItemEquiped("belt05",Player2) ) . Too hard to come up with a way of filtering out whether or not Aran would react well, or the PC, for that matter, to romancing Edwina with the belt on. Great ground for lots of stuff, but way too hard to anticipate player intent and keep things non-jarring.

 

So, this one has lingered since October of 2008, waiting for inspiration to strike, or parts to be salvaged. Workrooms at many hosting sites, closed or open in forums, are littered with materials like this, so if you have some of these tossed in a file somewhere, you are not alone. Perhaps the ideas will make their way out, or perhaps they will be tossed out with the next crash of your hard drive, but either way, thinking through the reasons why it might or not make it is a useful exercise in making choices about your mod. Sometimes, for whatever reason, several months of work need to be scrapped. At least we are not pro writers, who may have to dump draft after draft!

Edited by cmorgan

Share this post


Link to post

Variable tracking in dialogues is pretty cool, but there's one thing to keep in mind. It takes 2 states to set a variable.

 

 

This won't work.

IF ~True()~ THEN BEGIN state0 
SAY ~I'm going to the store for ice cream. What flavor should I buy?~ 
++ ~Chocolate.~ DO ~SetGlobal("c-chocolate","LOCALS",1)~ + nomood 
++ ~Vanilla.~ DO ~SetGlobal("c-vanilla","LOCALS",1)~ + boring 
++ ~Green Tea.~ DO ~SetGlobal("c-greentea","LOCALS",1)~ + weird 
++ ~Peach.~ DO ~SetGlobal("c-peach","LOCALS",1)~ + nomood 
++ ~Butter Pecan.~ DO ~SetGlobal("c-butterpecan","LOCALS",1)~ + boring 
++ ~Burnt orange caramel.~ DO ~SetGlobal("c-burntorange","LOCALS",1)~ + weird 
++ ~Strawberry.~ DO ~SetGlobal("c-strawberry","LOCALS",1)~ + nomood 
++ ~Sweet cream.~ DO ~SetGlobal("c-sweetcream","LOCALS",1)~ + boring 
++ ~Pistachio.~ DO ~SetGlobal("c-pistachio","LOCALS",1)~ + weird 
++ ~Coffee.~ DO ~SetGlobal("c-coffee","LOCALS",1)~ + nomood 
++ ~Cookies 'n' cream.~ DO ~SetGlobal("c-cookies","LOCALS",1)~ + boring 
++ ~Rose Petal.~ DO ~SetGlobal("c-rose","LOCALS",1)~ + weird 
++ ~Moose Tracks.~ DO ~SetGlobal("c-moose","LOCALS",1)~ + nomood 
++ ~Fudge Ripple.~ DO ~SetGlobal("c-fudge","LOCALS",1)~ + boring 
++ ~Liccorice.~ DO ~SetGlobal("c-liccorice","LOCALS",1)~ + weird 
++ ~Mint chip.~ + winner 
END 

IF ~~ nomood 
SAY ~No, I'm not in the mood for that today.~ 
IF ~~ THEN + tryagain 
END 

IF ~~ boring 
SAY ~Too boring.~ 
IF ~~ THEN + tryagain 
END 

IF ~~ weird 
SAY ~Too exotic.~ 
IF ~~ THEN + tryagain 
END 

IF ~~ winner 
SAY ~We have a winner. Back in a bit.~ 
IF ~~ THEN EXIT 
END 

IF ~~ tryagain 
SAY ~What else?~ 
+ ~!Global("c-chocolate","LOCALS",1)~ + ~Chocolate.~ DO ~SetGlobal("c-chocolate","LOCALS",1)~ + nomood 
+ ~!Global("c-vanilla","LOCALS",1)~ + ~Vanilla.~ DO ~SetGlobal("c-vanilla","LOCALS",1)~ + boring 
+ ~!Global("c-greentea","LOCALS",1)~ + ~Green Tea.~ DO ~SetGlobal("c-greentea","LOCALS",1)~ + weird 
+ ~!Global("c-peach","LOCALS",1)~ + ~Peach.~ DO ~SetGlobal("c-peach","LOCALS",1)~ + nomood 
+ ~!Global("c-butterpecan","LOCALS",1)~ + ~Butter Pecan.~ DO ~SetGlobal("c-butterpecan","LOCALS",1)~ + boring 
+ ~!Global("c-burntorange","LOCALS",1)~ + ~Burnt orange caramel.~ DO ~SetGlobal("c-burntorange","LOCALS",1)~ + weird 
+ ~!Global("c-strawberry","LOCALS",1)~ + ~Strawberry.~ DO ~SetGlobal("c-strawberry","LOCALS",1)~ + nomood 
+ ~!Global("c-sweetcream","LOCALS",1)~ + ~Sweet cream.~ DO ~SetGlobal("c-sweetcream","LOCALS",1)~ + boring 
+ ~!Global("c-pistachio","LOCALS",1)~ + ~Pistachio.~ DO ~SetGlobal("c-pistachio","LOCALS",1)~ + weird 
+ ~!Global("c-coffee","LOCALS",1)~ + ~Coffee.~ DO ~SetGlobal("c-coffee","LOCALS",1)~ + nomood 
+ ~!Global("c-cookies","LOCALS",1)~ + ~Cookies 'n' cream.~ DO ~SetGlobal("c-cookies","LOCALS",1)~ + boring 
+ ~!Global("c-rose","LOCALS",1)~ + ~Rose Petal.~ DO ~SetGlobal("c-rose","LOCALS",1)~ + weird 
+ ~!Global("c-moose","LOCALS",1)~ + ~Moose Tracks.~ DO ~SetGlobal("c-moose","LOCALS",1)~ + nomood 
+ ~!Global("c-fudge","LOCALS",1)~ + ~Fudge Ripple.~ DO ~SetGlobal("c-fudge","LOCALS",1)~ + boring 
+ ~!Global("c-liccorice","LOCALS",1)~ + ~Liccorice.~ DO ~SetGlobal("c-liccorice","LOCALS",1)~ + weird 
++ ~Mint chip.~ + winner 
END

 

This will.

IF ~True()~ THEN BEGIN state0 
SAY ~I'm going to the store for ice cream. What flavor should I buy?~ 
++ ~Chocolate.~ DO ~SetGlobal("c-chocolate","LOCALS",1)~ + nomood 
++ ~Vanilla.~ DO ~SetGlobal("c-vanilla","LOCALS",1)~ + boring 
++ ~Green Tea.~ DO ~SetGlobal("c-greentea","LOCALS",1)~ + weird 
++ ~Peach.~ DO ~SetGlobal("c-peach","LOCALS",1)~ + nomood 
++ ~Butter Pecan.~ DO ~SetGlobal("c-butterpecan","LOCALS",1)~ + boring 
++ ~Burnt orange caramel.~ DO ~SetGlobal("c-burntorange","LOCALS",1)~ + weird 
++ ~Strawberry.~ DO ~SetGlobal("c-strawberry","LOCALS",1)~ + nomood 
++ ~Sweet cream.~ DO ~SetGlobal("c-sweetcream","LOCALS",1)~ + boring 
++ ~Pistachio.~ DO ~SetGlobal("c-pistachio","LOCALS",1)~ + weird 
++ ~Coffee.~ DO ~SetGlobal("c-coffee","LOCALS",1)~ + nomood 
++ ~Cookies 'n' cream.~ DO ~SetGlobal("c-cookies","LOCALS",1)~ + boring 
++ ~Rose Petal.~ DO ~SetGlobal("c-rose","LOCALS",1)~ + weird 
++ ~Moose Tracks.~ DO ~SetGlobal("c-moose","LOCALS",1)~ + nomood 
++ ~Fudge Ripple.~ DO ~SetGlobal("c-fudge","LOCALS",1)~ + boring 
++ ~Liccorice.~ DO ~SetGlobal("c-liccorice","LOCALS",1)~ + weird 
++ ~Mint chip.~ + winner 
END 

IF ~~ nomood 
SAY ~No, I'm not in the mood for that today.~ 
IF ~~ THEN + different 
END 

IF ~~ boring 
SAY ~Too boring.~ 
IF ~~ THEN + different 
END 

IF ~~ weird 
SAY ~Too exotic.~ 
IF ~~ THEN + different 
END 

IF ~~ winner 
SAY ~We have a winner. Back in a bit.~ 
IF ~~ THEN EXIT 
END 

IF ~~ different
SAY ~I want something we haven't had in a while, though.~ 
IF ~~ THEN + tryagain

IF ~~ tryagain 
SAY ~What else?~ 
+ ~!Global("c-chocolate","LOCALS",1)~ + ~Chocolate.~ DO ~SetGlobal("c-chocolate","LOCALS",1)~ + nomood 
+ ~!Global("c-vanilla","LOCALS",1)~ + ~Vanilla.~ DO ~SetGlobal("c-vanilla","LOCALS",1)~ + boring 
+ ~!Global("c-greentea","LOCALS",1)~ + ~Green Tea.~ DO ~SetGlobal("c-greentea","LOCALS",1)~ + weird 
+ ~!Global("c-peach","LOCALS",1)~ + ~Peach.~ DO ~SetGlobal("c-peach","LOCALS",1)~ + nomood 
+ ~!Global("c-butterpecan","LOCALS",1)~ + ~Butter Pecan.~ DO ~SetGlobal("c-butterpecan","LOCALS",1)~ + boring 
+ ~!Global("c-burntorange","LOCALS",1)~ + ~Burnt orange caramel.~ DO ~SetGlobal("c-burntorange","LOCALS",1)~ + weird 
+ ~!Global("c-strawberry","LOCALS",1)~ + ~Strawberry.~ DO ~SetGlobal("c-strawberry","LOCALS",1)~ + nomood 
+ ~!Global("c-sweetcream","LOCALS",1)~ + ~Sweet cream.~ DO ~SetGlobal("c-sweetcream","LOCALS",1)~ + boring 
+ ~!Global("c-pistachio","LOCALS",1)~ + ~Pistachio.~ DO ~SetGlobal("c-pistachio","LOCALS",1)~ + weird 
+ ~!Global("c-coffee","LOCALS",1)~ + ~Coffee.~ DO ~SetGlobal("c-coffee","LOCALS",1)~ + nomood 
+ ~!Global("c-cookies","LOCALS",1)~ + ~Cookies 'n' cream.~ DO ~SetGlobal("c-cookies","LOCALS",1)~ + boring 
+ ~!Global("c-rose","LOCALS",1)~ + ~Rose Petal.~ DO ~SetGlobal("c-rose","LOCALS",1)~ + weird 
+ ~!Global("c-moose","LOCALS",1)~ + ~Moose Tracks.~ DO ~SetGlobal("c-moose","LOCALS",1)~ + nomood 
+ ~!Global("c-fudge","LOCALS",1)~ + ~Fudge Ripple.~ DO ~SetGlobal("c-fudge","LOCALS",1)~ + boring 
+ ~!Global("c-liccorice","LOCALS",1)~ + ~Liccorice.~ DO ~SetGlobal("c-liccorice","LOCALS",1)~ + weird 
++ ~Mint chip.~ + winner 
END

Share this post


Link to post

Yep - that "filter state" is the kicker for any attempt to send things down different pathways when you are setting the variable within the same conversation you reference. Good followup for the pullout from A. B. C. D. above.

 

Another followup -

 

!Global("c-strawberry","LOCALS",1)

 

Global("c-strawberry","LOCALS",1)

 

pairings are darned powerful and easy, sometimes easier to view/troubleshoot than Global("c-strawberry","LOCALS",0).

 

An example in scripting is that

 

CombatCounter(0) = ActuallyInCombat()

 

so instead of detailing specific numbers, you can do the YES|NO pairing -

 

ActuallyInCombat()

!ActuallyInCombat()

 

Global("myVar",LOCALS",1)

!Global("myVar",LOCALS",1)

 

 

The only real reason to use

Global("myVar","LOCALS",0) -> Global("myVar","LOCALS",1)

is to see the 0->1->2 progression if you are advancing the variable.

 

For these single non-advancing variables, while "spelled" differently,

 

Global("myVar","LOCALS",1) = GlobalGT("myVar","LOCALS",0) = !Global("myVar","LOCALS",0)

 

and

 

!Global("myVar","LOCALS",1) = GlobalLT("myVar","LOCALS",1) = Global("myVar",LOCALS",0)

 

 

But when you are writing while coding, since I think I might want an opportunity to advance stuff, I tend to use discreet values {0,1,2,3,4,5}. I don't often use IncrementGlobal() for the same reason - following a pathway becomes easier across-project when you can do a grep/text search for "c-aran_thinks_this" and it returns

 

file mybaf.baf

 

line 100 Global("c-aran_thinks_this","GLOBAL",0)

line 105 SetGlobal("c-aran_thinks_this","GLOBAL",1)

 

line 109 Global("c-aran_thinks_this","GLOBAL",2)

line 114 SetGlobal("c-aran_thinks_this","GLOBAL",3)

 

file mydialog.d

 

line 1049 Global("c-aran_thinks_this","GLOBAL",1)

line 1054 SetGlobal("c-aran_thinks_this","GLOBAL",2)

line 1055 SetGlobal("c-aran_thinks_this","GLOBAL",2)

line 1056 SetGlobal("c-aran_thinks_this","GLOBAL",2)

 

line 1060 Global("c-aran_thinks_this","GLOBAL",3)

line 1061 SetGlobal("c-aran_thinks_this","GLOBAL",4)

line 1062 SetGlobal("c-aran_thinks_this","GLOBAL",4)

line 1063 SetGlobal("c-aran_thinks_this","GLOBAL",4)

 

 

It matters far less in your work, B, where you plan out things from the start. I tend to free-write directly into codeblocks, then extend the conversation by building on new pathways or altering old ones, so I never know if i am going to be reusing a variable or advancing it or not :suspect:

Edited by cmorgan
typos in code

Share this post


Link to post
Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...