Jump to content


Photo

Writing dialogue in .d: TIPS


  • Please log in to reply
2 replies to this topic

#1 Kulyok

Kulyok
  • Modder
  • 2450 posts

Posted 21 June 2009 - 09:38 PM

Originally written for Pen52; I hope it can help you, as well.

And here're a few new coding tips:



1) Suppose you are writing an NPC(romance) mod, and you need an influence variable, or something like "KivanLikes"/"KivanDislikes" variable from Domi's Kivan of Shilmista. Here's how it's done:

setting Sarevok's(for example) influence variable is very-very easy. Example:
was:
++ ~Torture? And here I thought we were getting along so well. ~ + Sare8knives2 (SareInfluence +1)
is:
++ ~Torture? And here I thought we were getting along so well. ~ DO ~IncrementGlobal("SareInfluence","GLOBAL",1)~ + Sare8knives2

IncrementGlobal = add something to this variable. IncrementGlobal("SarekInfluence","GLOBAL",1)=SareInfluence+1.

Obviously, decreasing it is just as easy:
was:
++ ~Please, don’t hurt me. ~  + Sare8knives4 (SareInfluence -1)
is:
++ ~Please, don’t hurt me. ~ DO ~IncrementGlobal("SareInfluence","GLOBAL",-1)~ + Sare8knives4



2) Comments in your code:

Also, if you want to use comments in your code, you can use these symbols: /* note */
This way the compiler will ignore them - and will not tell us that there's a mistake.
Example:
was:
IF ~~ Sare8knives4 (and -1=<SareInfluence<2)
is:
IF ~~ Sare8knives4 /* (and -1=<SareInfluence<2) */

You can also use

IF ~~ Sare8knives4 // (and -1=<SareInfluence<2)

- but be careful: "//" can only work for one line. If you've got long commentary, it will have to go like this:
// make sure
// you use tildas
// and finish each state with an END



3) If we have to choose Sarevok's answer to PC, depending on SareInfluence, here's what we do.
Original code:
++ ~Please, don’t hurt me. ~ DO ~IncrementGlobal("SareInfluence","GLOBAL",-1)~ + Sare8knives4

IF ~~ Sare8knives4 /* (and SareInfluence=>2) */
SAY ~So those knees of yours do know how to bend. ~ 
IF ~~ + Sare8knives1   
END

IF ~~ Sare8knives4 /* (and -1=<SareInfluence<2) */
SAY ~Pleading does not become you.  ~ 
IF ~~ + Sare8knives1   
END

How do we actually code it? The answer very simple: we write two replies, one for one condition, one for another.
And we insert our condition in both replies between two "+"'s, in tildas:

+ ~GlobalGT("SareInfluence","GLOBAL",1)~ + ~Please, don’t hurt me. ~ DO ~IncrementGlobal("SareInfluence","GLOBAL",-1)~ + Sare8knives4
+ ~GlobalLT("SareInfluence","GLOBAL",2)~ + ~Please, don’t hurt me. ~ DO ~IncrementGlobal("SareInfluence","GLOBAL",-1)~ + Sare8knives4

GlobalLT means that variable is less than(SareInfluence<2); GlobalGT means that variable is greater than(SareInfluence>=2, or SareInfluence>1)

If you want to add another condition(SareInfluence>=-1, or SareInfluence>-2), you just need to add an extra condition toi the line(no AND's):

+ ~GlobalGT("SareInfluence","GLOBAL",1)~ + ~Please, don’t hurt me. ~ DO ~IncrementGlobal("SareInfluence","GLOBAL",-1)~ + Sare8knives4
+ ~GlobalGT("SareInfluence","GLOBAL",-2) GlobalLT("SareInfluence","GLOBAL",2)~ + ~Please, don’t hurt me. ~ DO ~IncrementGlobal("SareInfluence","GLOBAL",-1)~ + Sare8knives4



4) Conditions for PC responses(race, class, etc)

Race is simple:

+ ~Race(Player1,ELF)~ + ~I am an elf.~ + elf
+ ~!Race(Player1,ELF)~ + ~I am not an elf.~ + notelf /* ! means NOT */
+ ~OR(2) Race(Player1,ELF) Race(Player1,HALF_ELF)~ + ~I am an elf or a half-elf.~ + elfish /* OR(2) and _two_ commands after it means A or B */

Also, races can be HUMAN, HALFLING, DWARF, GNOME or HALFORC.

Gender:

Gender(Player1,FEMALE) - Player1 is a woman
Gender(Player1,MALE) - Player1 is a man

Class id but basically the same:

+ ~Class(Player1,MAGE_ALL)~ + ~I am a wild mage, a mage, a sorcerer!~ + mage_or_sorcerer_or_wild_mage
+ ~Class(Player1,BARD_ALL)~ + ~I am a bard! A scald! A jester! A blade!~ + bards
+ ~!Class(Player1,MAGE_ALL) !Class(Player1,BARD_ALL)~ + ~I cannot cast mage spells.~ + notmageandnotbard
+ ~Class(Player1,FIGHTER_ALL)~ + ~I am a cool fighter!~ + fighter

Others: DRUID_ALL, CLERIC_ALL, PALADIN_ALL, RANGER_ALL, MONK, SORCERER.

Stats are a tad more difficult:

CheckStatGT and CheckStatLT are two commands you will need. For example: CheckStatGT(Player1,11,INT) means that Player1's Intelligence > 11 (12 or higher).

+ ~CheckStatGT(Player1,12,CHR)~ + ~I am pretty!~ + cha_13_or_higher
+ ~CheckStatLT(Player1,10,STR)~ + ~I am weak.~ + str_9_or_lower

All stats are: STR, DEX, CON, INT, WIS, CHR(not CHA!!).

Just in case - here is a full list of various commands(it looks complicated, though):
http://iesdp.gibberl...bg2triggers.htm



5) Setting and checking variables:

Now, there are two commands. Setting a variable is simple, just like with CLUAConsole: SetGlobal("variablename","GLOBAL",2)
And checking if our variable is 2 or not 2 is even simpler: Global("variablename","GLOBAL",2) checks if your variable=2 or not.

Clean code follows:

If you want to set SarevokPCLie=1(if PC lies), it's usually best to do it this way:

++ ~I love you, Sarevok! (truth)~ + sarevok_replies_truth /* we do nothing */
++ ~I love you, Sarevok! (lie)~ DO ~SetGlobal("SarevokPCLie","GLOBAL",1)~ + sarevok_replies_lie /* we set a variable*/

Now, if you want to check a variable, then you can do it this way:

+ ~Global("RE_SarevokPCLie","GLOBAL",0)~ + ~I never lied to you before, Sarevok!~ + this_is_true_sarevok_replies
+ ~Global("RE_SarevokPCLie","GLOBAL",1)~ + ~I never lied to you before, Sarevok!~ + this_is_NOT_true_sarevok_replies


#2 GeN1e

GeN1e

    A very GAR character

  • Modder
  • 1604 posts

Posted 22 June 2009 - 12:51 AM

Kulyok, I believe the title should read 'Writing dialogue in .d: TIPS for very beginners'

Retired from modding.


#3 Epantiras

Epantiras

    Proudly Chaotic Neutral

  • Member
  • 810 posts

Posted 22 June 2009 - 04:04 AM

Thanks for writing this ^_^
I'm already familiar with the whole influence system, I discovered how it works by checking Solaufein's dialogue (the original character in the Underdark, not the mod.), but I think it's good to write this for beginners.

oO My DA Gallery Oo
oO My Artcorner on SHS Oo
oO "Ask the Betrayer" parody comic Oo
oO My other parody comics on SHS Oo


Oh, and Epantiras, you're simply Epantirastic.

(and no, I'M not egocentric!)

I Hate Elminster! (proud member of the We Hate Elminster club)