Jump to content

The Slayer Change


cmorgan

Recommended Posts

Well here is another 'formula' talk, presented to the PC by his or her Romantic Interest, and it is a logical one. When the Slayer aspect is first introduced, and then when Player1 turns into the Slayer, there are some comments built into regular BioWare romances that most folks seem to like to have happen for their NPCs too.

 

Most of the time, modders work with NPC dialog files, and the responses within those dialog states are either "get me to another NPC", like this:

 

IF ~~ c-aranIsDrunk
SAY ~[ARAN] Hey, bring that bottle o - over here, eh? *belch*~
IF ~InParty("OtherNPC")~ THEN EXTERN ~OtherNPCdialog~ othernpc_new_state
END

(sample only, this one would have some big problems :blush: )

 

or more commonly, have the PC responses

 

IF ~~ c-aranIsDrunk
SAY ~[ARAN] Hey, bring that bottle o - over here, eh? *belch*~
++ ~[PC] Get your own bottle, Aran. this one is aaaaaaall mine.~ EXIT
END

 

In-game, the portrait of the .cre (if assigned) shows up, and the responses look as if player1 is giving them.

 

With the Slayer stuff, though, something different happens. This set of materials is assigned to PLAYER1.DLG, a .dlg file that is self-referential - in other words, the player is actually talking to themselves. For the most part, modders tend to stay away from using PLAYER1.DLG calls. First of all, this is forcing a player action. Usually players don't want to be forced - they want a choice. So a little bit of use of this goes a long way, and BioWare has used this space up almost completely. The Slayer and the dragging to hell are both forced on the player, so they fit this usage (heh - the other way around, really - it was why the dialog file was set up this way in the first place!).

 

Commenting on Boiled Lobster Feelings

 

Some modders skip this sequence in favor of quick commentary, and do a simple I_C_T into PLAYER1.DLG. For example, in CoMSolaufein's Ninfer,

 

in file: NinaV102\d\CMNINAFJ.D

I_C_T PLAYER1 5 NinaSeesSlayer
== CMNINAFJ IF ~IsValidForPartyDialog("cmninaf")~ THEN 
~<CHARNAME> what... what was that? The transformation it was... was horrorifying. I need to... well nevermind. We will figure this out.~
END

 

This is solid practice, as it tosses a comment and does not interfere with anything. he romances assume more contact, but not all of them do the full treatment, either. Theaceface does just as straightforward a job, putting the NPC into the action, using that same treatment:

 

in file \sarahsoa-v1.3\sarahsoa\dialogues\k#sarahj.d

INTERJECT_COPY_TRANS PLAYER1 5 sarahcommentslayer1
== K#SarahJ IF ~InParty("K#Sarah") InMyArea("K#Sarah")~ THEN
~What the...what was that?! Are you all right?~
= ~No, you're not all right at all! We need to get your soul back, <CHARNAME>, before something worse than this happens.~
END

 

Amber has a cool and complete full treatment, using INTERJECT to take us off the beaten path (look up the file to see both the Spellhold Slayer stuff and the second talk to get a great rundown of how this all works, with more conversation and choice added in.)

 

INTERJECT PLAYER1 5 M#AmberSlayer3
== M#AMBERJ IF ~InParty("M#Amber")
	Range("M#Amber",15)
	!StateCheck("M#Amber",STATE_SLEEPING)
		!StateCheck("M#Amber",STATE_HELPLESS)
		!StateCheck("M#Amber",STATE_STUNNED)
		!StateCheck("M#Amber",STATE_SILENCED) 		
		!Global("AerieRomanceActive","GLOBAL",2)
		!Global("ViconiaRomanceActive","GLOBAL",2)
		!Global("JaheiraRomanceActive","GLOBAL",2)
		!Global("AnomenRomanceActive","GLOBAL",2)
		!Global("J#KelseyRomanceActive","GLOBAL",2)
		!Global("ChloeRomanceActiveCR","GLOBAL",2)
		!Global("KiaraRomanceActive","GLOBAL",2)
	!Global("H#ValygarRomanceActive","GLOBAL",1)
		!Global("TsujathaRomanceActive","GLOBAL",2)
		!Global("E3FadeRomanceActive","GLOBAL",2)
		!Global("EdwinRomanceActive","GLOBAL",2)~ THEN
@2114 /* @2114 = ~What was that... monster? I - I have heard of the avatar of Bhaal... but I could not have imagined anything so horrifying. It was as if you lost all control of yourself and whatever took you over - you would have slain us all had we not run away.~ */ 
=
@2115 /* @2115 = ~You will *have* to learn to control that beast; it is bound to make another attempt to take you over. I will help you in any way I can - even if I can offer you little besides comfort and reassurance.~ */ 
END
IF ~~ THEN EXIT

INTERJECT PLAYER1 7 M#AmberSlayer4
== M#AMBERJ IF ~InParty("M#Amber")
	See("M#Amber")
	!StateCheck("M#Amber",STATE_SLEEPING)
		!StateCheck("M#Amber",STATE_HELPLESS)
		!StateCheck("M#Amber",STATE_STUNNED)
		!StateCheck("M#Amber",STATE_SILENCED)
	Global("M#AmberMatch","GLOBAL",1)
	Global("M#AmberRomanceActive","GLOBAL",2)
	Global("M#AmberMad","GLOBAL",0)~ THEN
@2116 /* @2116 = ~You are shivering, <CHARNAME>. Can I get you an extra blanket... no, this is not about the chill, is it? Come, let me hold you - perhaps I can give you some strength to fight whatever is ailing you.~ */ 
END
IF ~~ THEN REPLY @2117 /* @2117 = ~No! Stay away, Amber. Please! I'm not in control of my actions!~ */ EXTERN M#AMBERJ AmberSlayer4A
IF ~~ THEN REPLY @2118 /* @2118 = ~Run! For your own sake, get the hell out of here!~ */ EXTERN M#AMBERJ AmberSlayer4A
IF ~~ THEN REPLY @2119 /* @2119 = ~Yes, perhaps that would help...~ */ EXTERN M#AMBERJ AmberSlayer4B

APPEND M#AMBERJ
 IF ~~ THEN BEGIN AmberSlayer4A
SAY @2120 /* @2120 = ~Eaaaaiiik!~ */ 
IF ~~ THEN DO ~SetGlobal("M#EndangerAmber","GLOBAL",1)
		   ActionOverride(Player1,ReallyForceSpell(Myself,SLAYER_CHANGE))~ EXIT
 END

 IF ~~ THEN BEGIN AmberSlayer4B
SAY @2121 /* @2121 = ~Eaaaaiirrrgghhhllglgg!~ */ 
IF ~~ THEN DO ~SetGlobal("M#AmberRomanceActive","GLOBAL",3)
		   SetGlobal("M#AmberTalk","GLOBAL",100)	
	   SetGlobal("M#AmberMurderedBySlayer","GLOBAL",1)
	   SetGlobal("M#EndangerAmber","GLOBAL",1)
		   ApplySpellRES("m#chunk","M#Amber")
		   ActionOverride(Player1,ReallyForceSpell(Myself,SLAYER_CHANGE))~ EXIT 
 END
END

 

... though I am not going to add the option to chunk Aran - the player will have that opportunity soon enough!

 

Everyone skips out on the EndangerLovedOne BioWare variable being set, but I am tracing it down anyway to learn what it really does. I think it is a red herring, but it is nice to refresh my memory of what is going on around the encounter.

 

JCompton's deArnise, Sister Vigilante's Angelo, and Kulyok's Xan all had Kulyok involved in coding, so those mod's approaches are interesting to look at from the standpoint of what was *different* rather than what was the same about each. Different characterizations call for different ways to introduce the material to the game, and seeing what one modder does as opposed to another modder is cool, but sometimes you learn more about how things work by seeing the same modder or modder team do different treatments.

 

After looking at the examples out there, I think Aran might be best served by something closer to the regular BioWare romances, and the closest treatment to that seems to be deArnise. But since we are playing with pushing some envelopes, I think a page or two from Amber thrown in will give some life into a standard encounter, too. Let's start with the original BioWare files, and put an interpretation that derives from both Amber's and deArnise's code.

 

PLAYER1.DLG Dialog States

So, where the Canon dudes and dudettes do their "my, wow - you are all sweaty - are you ok?" talk? We will add our own in - and here we find the state, state #3:

 

in PLAYER1.D (decompiled)

IF ~~ THEN BEGIN 3 // from: 0.0
 SAY #49596 /* ~The feeling passes, but far too slowly for your liking.~ */
 IF ~!IsValidForPartyDialogue("IMOEN2")
!IsValidForPartyDialogue("JAHEIRA")
!IsValidForPartyDialogue("VICONIA")
!IsValidForPartyDialogue("AERIE")
!IsValidForPartyDialogue("ANOMEN")
!IsValidForPartyDialogue("MINSC")
!IsValidForPartyDialogue("CERND")
!IsValidForPartyDialogue("HAERDALIS")
!IsValidForPartyDialogue("MAZZY")
!IsValidForPartyDialogue("NALIA")
!IsValidForPartyDialogue("JAN")
!IsValidForPartyDialogue("KORGAN")
!IsValidForPartyDialogue("KELDORN")
!IsValidForPartyDialogue("VALYGAR")
!IsValidForPartyDialogue("EDWIN")~ THEN DO ~SetGlobal("SelfTalk","GLOBAL",2)
~ EXIT
 IF ~IsValidForPartyDialogue("IMOEN2")
~ THEN DO ~SetGlobal("SelfTalk","GLOBAL",2)
~ EXTERN ~IMOEN2J~ 0
<<etc.>>

 

So, BioWare covers solo play, and also covers the exit if everyone is toast but the player, and then goes through checking whether or not anyone else can talk. Easy enough - we use EXTEND_BOTTOM to add our own version onto State #3:

 

/* Slayer Transformation Talks, 2, canonical, third class. With frosting. */

EXTEND_BOTTOM ~PLAYER1~ 3
IF ~InParty("c-aran") InMyArea("c-aran") !StateCheck("c-aran",CD_STATE_NOTVALID) OR(2) Global("c-aranromance","GLOBAL",1) Global("c-aranromance","GLOBAL",2) ~ EXTERN ~C-ARANJ~  c-aranslayer1
END

 

Since the replies are evaluated from the bottom to the top, Aran gets a shot, and if it doesn't fire the next up the chain tries, until finally if no-one is able to talk the big long reply with all the !IsValidForPartyDialogue("myDV") checks dumps the player out of the sequence. This is why we don't need to do anything fancier, like adding !IsValidForPartyDialogue("c-aran") to the first reply - we know that condition is already true if the engine is finally getting all the way up to the top of this list.

 

BUT - hey, some folks do it just to make sure nothing goes wrong anyways. Fade does, as do several others. If we really wanted to, we could put this immediately before our E_B:

 

/* This adds to every possible response in  dialog state 3 */
ADD_TRANS_TRIGGER PLAYER1 3 ~OR(3) !InParty("c-aran") !InMyArea("c-aran") StateCheck("c-aran",CD_STATE_NOTVALID)  !Global("c-aranromance","GLOBAL",1) !Global("c-aranromance","GLOBAL",2)~

 

but I'm not going to bother. If Aran is in the party, area, valid, and at either 1 or 2 the dialog extern to his stuff and his response will fire. If it doesn't, for some odd reason, why tinker with other things - it will not speed up evaluation of the states, the way we would want to in a script, so it seems like weighing down the evaluation tree. Plus, if it doesn't fire, then these is a chance a multi-romancer will get another one evaluated true.

 

OK, next step, add in Aran's "concerned" dialog state. Here is Imoen's:

 

// creator  : BG2_DLG\WeiDU.exe (version 20800)
// argument : BG2_DLG\IMOEN2J.DLG
// game		 : C:\Program Files\Black Isle\BGII - SoA
// source	 : BG2_DLG\IMOEN2J.DLG
// dialog	 : C:\Program Files\Black Isle\BGII - SoA/dialog.tlk
// dialogF  : (none)

BEGIN ~IMOEN2J~

IF ~~ THEN BEGIN 0 // from:
 SAY #49240 /* ~Whoa, stop for a bit. How are you feeling? You looked really sick for a moment there.~ */
 IF ~~ THEN REPLY #49875 /* ~It's nothing. I'm just a little dizzy, that's all. It's already passed.~ */ GOTO 3
 IF ~~ THEN REPLY #49876 /* ~I don't know. Have you felt any ill effects since the spell they cast on you?~ */ GOTO 4
 IF ~~ THEN REPLY #49877 /* ~Leave me alone. I'll be fine.~ */ GOTO 3
END

IF ~~ THEN BEGIN 1 // from:
 SAY #49632 /* ~Are... are you all right? I... I've never seen anything like that...~ */
 IF ~~ THEN GOTO 2
END

IF ~~ THEN BEGIN 2 // from: 1.0
 SAY #49633 /* ~<CHARNAME>, that was... that was the Slayer. It's one of the avatar forms of Bhaal! You... you became the Slayer?~ */
 IF ~~ THEN REPLY #49890 /* ~The what? How do you know that?~ */ GOTO 5
 IF ~~ THEN REPLY #49891 /* ~I couldn't help it... it just happened. What could have caused that?~ */ GOTO 7
 IF ~~ THEN REPLY #49892 /* ~I've never felt power like that. That was me?~ */ GOTO 5
END

IF ~~ THEN BEGIN 3 // from: 0.2 0.0
 SAY #49880 /* ~If you say so. I felt really weak after my ritual too, but you looked like you were ready to keel over. Take it easy for a while, <CHARNAME>.~ */
 IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN 4 // from: 0.1
 SAY #49882 /* ~I've been getting weaker, I think, but it hasn't made me all that ill yet. You take care, all right? It's really odd that you are sick.~ */
 IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN 5 // from: 2.2 2.0
 SAY #49894 /* ~I've read descriptions of the Slayer before. It appeared when the Time of Troubles forced the gods to walk the land...~ */
 IF ~~ THEN GOTO 6
END

IF ~~ THEN BEGIN 6 // from: 7.0 5.0
 SAY #49896 /* ~<CHARNAME>, we've got to get our souls back from Bodhi and Irenicus. You've been left empty and it's affecting you different than me.~ */
 IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN 7 // from: 2.1
 SAY #49907 /* ~I don't know, but I've read descriptions of the Slayer before. It appeared when the Time of Troubles forced the gods to walk the land...~ */
 IF ~~ THEN GOTO 6
END

 

So we can give this a proper treatment:

 

APPEND ~C-ARANJ~  

IF ~~ c-aranslayer1
SAY ~[ARAN] There be somethin' wrong here. You look more than a mite fatigued. In fact, you look... Bane's Broken Bones, what in the blighted hells is wrong with you, girl? You be paler than most o' th' vellum I scrape.~
++ ~[PC] I don't know, Aran. But I will be fine. I just feel a little dizzy.~ DO ~SetGlobal("SelfTalk","GLOBAL",2)~  + c-aranslayer1ok
++ ~[PC] I felt... I definitely felt ill. It was as if I was fading away a little.~ DO ~SetGlobal("SelfTalk","GLOBAL",2)~ + c-aranslayer1b
++ ~[PC] Just leave me alone, Aran. I am fine!~ DO ~SetGlobal("SelfTalk","GLOBAL",2)~  + c-aranslayer1ok
++ ~[PC] Shut up, Aran.  Prop me up, and make it look like there is nothing wrong. Showing weakness is not acceptable.~ DO ~SetGlobal("SelfTalk","GLOBAL",2)~ + c-aranslayer1e
++ ~[PC] You worry too much. We need to move along.~ + c-aranslayer1p
END

IF ~~  c-aranslayer1p
SAY ~[ARAN] Hot soup, an' a good solid night o' sleep, that be my perscription. There's no shame in leanin' on me a bit, if you want to.~
IF ~~ THEN EXIT
END

IF ~~  c-aranslayer1ok
SAY ~[ARAN] You don't rightly sound fine, <CHARNAME>. Selune herself would envy goin' that white. Actually, more Kelemvor, eh... on death's door. But I know, I'm to shut up an' soldier.~
IF ~~ THEN EXIT
END

IF ~~ c-aranslayer1b
SAY ~[ARAN] That sounds like one hell o' a hangover. But you have had naught to drink. Here, get a bit o' water an' jerky in you, an' let's get out o' this place. Lovitar's Lash, this place would get to anyone.~
IF ~~ THEN EXIT
END

IF ~~ c-aranslayer1e
SAY ~[ARAN]  Bugger your image - get your blighted arse awake, <CHARNAME>. You are Bane's Own Blood, an' stronger than anythin' what opposes you, even aspects o' th' gods. Stand on your own two bloody feet, an' command me, girl, as is your right. An' th' first command better be to get you some hot soup an' a place to rest.~
IF ~~ THEN EXIT
END

 

 

That takes care of the first. Now the second, where the Player is forced to change into an ugly spiky lobster thing worthy of the Creature from the Black Lagoon, complete with Wolverine's claws and probably really bad breath...

 

in PLAYER1.DLG

IF WEIGHT #11 /* Triggers after states #: 10 13 15 16 18 21 27 28 30 even though they appear after this state */
~Global("drowTalk","GLOBAL",2)~ THEN BEGIN 7 // from:
 SAY #49908 /* ~You wake suddenly, a pounding in your ears. A shock of pain passes through your body, and you feel your mind slipping away, forced aside by the darkness within.~ */
 IF ~!Global("JaheiraRomanceActive","GLOBAL",1)
!Global("JaheiraRomanceActive","GLOBAL",2)
!Global("AerieRomanceActive","GLOBAL",1)
!Global("AerieRomanceActive","GLOBAL",2)
!Global("ViconiaRomanceActive","GLOBAL",1)
!Global("ViconiaRomanceActive","GLOBAL",2)
!Global("AnomenRomanceActive","GLOBAL",1)
!Global("AnomenRomanceActive","GLOBAL",2)
NumInPartyGT(1)~ THEN GOTO 8
<<etc.>>

IF ~~ THEN BEGIN 8 // from: 7.0
 SAY #49914 /* ~Your distress wakes your companions, but they can only watch as your pain grows more intense. ~ */
 IF ~~ THEN DO ~ReallyForceSpell(Myself,SLAYER_CHANGE)~ EXIT
END

IF ~~ THEN BEGIN 9 // from: 7.1
 SAY #49915 /* ~With no comrades to see your distress you can only hope the madness passes quickly, as it has done so before.~ */
 IF ~~ THEN DO ~ReallyForceSpell(Myself,SLAYER_CHANGE)~ EXIT
END

IF WEIGHT #2 ~Global("DrowTalk","GLOBAL",4)~ THEN BEGIN 10 // from:
 SAY #49951 /* ~The madness fades, and the essence within retreats, but if this continues you will lose not only yourself, but also everything you hold dear.~ */
 IF ~Global("EndangerLovedOne","GLOBAL",0)
NumInPartyGT(1)
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ GOTO 11
 IF ~Global("EndangerLovedOne","GLOBAL",0)
!NumInPartyGT(1)
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ EXIT
 IF ~Global("EndangerLovedOne","GLOBAL",4)
!IsValidForPartyDialogue("ANOMEN")~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ GOTO 12
 IF ~Global("EndangerLovedOne","GLOBAL",2)
!IsValidForPartyDialogue("AERIE")~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ GOTO 12
 IF ~Global("EndangerLovedOne","GLOBAL",3)
!IsValidForPartyDialogue("VICONIA")
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ GOTO 12
 IF ~Global("EndangerLovedOne","GLOBAL",1)
!IsValidForPartyDialogue("JAHEIRA")
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ GOTO 12
 IF ~Global("EndangerLovedOne","GLOBAL",1)
IsValidForPartyDialogue("JAHEIRA")
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ EXTERN ~JAHEIRAJ~ 416
 IF ~Global("EndangerLovedOne","GLOBAL",2)
IsValidForPartyDialogue("AERIE")
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ EXTERN ~AERIEJ~ 100
 IF ~Global("EndangerLovedOne","GLOBAL",3)
IsValidForPartyDialogue("VICONIA")
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ EXTERN ~VICONIJ~ 64
 IF ~Global("EndangerLovedOne","GLOBAL",4)
IsValidForPartyDialogue("ANOMEN")
~ THEN DO ~SetGlobal("DrowTalk","GLOBAL",5)~ EXTERN ~ANOMENJ~ 229
END

IF ~~ THEN BEGIN 11 // from: 10.0
 SAY #49957 /* ~The uncertainty of your condition has obviously worried those you travel with. The quest is treacherous enough without having to worry about what you might do.~ */
 IF ~~ THEN EXIT
END

IF ~~ THEN BEGIN 12 // from: 10.5 10.4 10.3 10.2
 SAY #49967 /* ~The danger of your condition is terrifyingly clear, written in the blood of those you care about.  This must be resolved or you are certainly lost.~ */
 IF ~~ THEN EXIT
END

Here we pop a new option on the bottom, again, first evaluated, unless someone else has done the same - but that is fine. Aran won't care if Tsjuatha or someone has first crack at this - multiromancers with one of those mods put after Aran in the install order will have that E_B take precedence. The other way would be to be greedy, and hijack the whole thing, as simply as this;

 

ADD_STATE_TRIGGER ~PLAYER1~ 7 ~Global("AllYouOtherModsBuggerOff","GLOBAL",1)~

 

and voila - you have shut that puppy down permanently. Other modders come along and adjust, change, E_B, E_T, everything else - and their stuff will do its job without complaining. But Iron Chef Aran would Reign Supreme, because we would create a new state with the original trigger, and nothing ever sets "AllYouOtherModsBuggerOff", so the condition is never met, and the original dialog state and all its past and future alterations vanish in a puff of incandescent logic. Adding back the rebuilt state,

APPEND ~PLAYER1~ 
IF ~Global("drowTalk","GLOBAL",2)~ THEN BEGIN c-aranisanass
SAY ~You wake suddenly, a pounding in your ears. A shock of pain passes through your body, and you feel your mind slipping away, forced aside by the darkness within.~ 
IF ~
NumInPartyGT(1)
OR(3) 
	!InParty("c-aran") 
	!InMyArea("c-aran") 
	StateCheck("c-aran",CD_STATE_NOTVALID)
!Global("c-aranromance","GLOBAL",1) 
!Global("c-aranromance","GLOBAL",2)~ THEN GOTO 8
IF ~InParty("c-aran") InMyArea("c-aran") !StateCheck("c-aran",CD_STATE_NOTVALID) OR(2) Global("c-aranromance","GLOBAL",1) Global("c-aranromance","GLOBAL",2)~ EXTERN ~C-ARANJ~  c-aranslayer2
IF ~NumInPartyLT(2)~ THEN <<do_something_else>>
END

END // of APPEND

The code work here renders other modders work irrelevant, and rebuilds the interaction the way I want it to go.

 

Of course, you just blew away everyone else's work, and flooded the various NPC forums with "hey, that Slayer talk doesn't wory like it did last version", and the person trying to troubleshoot will spend hours looking at their code and seeing *nothing wrong*, which will frustrate them so much they will drop i.e. modding and create computer viruses instead, and then one of those viruses will break containment on Super Sekret Governmint Projekt dealing with nuclear anhalliation or bio-chemical warfare, and the entire world will be wiped clean of all life... and YOU will be responsible.

 

There are alot of really slick ways of doing this (the destructively modding other people's work, not the destruction of the world - you are on your own on that one), including ALTER_TRANS, INTERJECT without a follow up COPY_TRANS, etc., but frankly, that kind of destructive hijacking of stuff never has been my cup of tea. Unless it is absolutely necessary (and it rarely truly is), I prefer mods that try to work within the framework to add content over those that grab the chainsaw, put on a facemask, and go all Jason on the darned game. Yes, I understand that there are times when it makes no sense *not* to take the thing over - Saerileth is not going to make it 2 steps into the Thieves Guild before Black Lilly is going to be pawning off baubles from her vivisected corpse, so carving great gouges out with INTERJECT is fine (though many times there is a noce COPY_TRANS even there, losing as little content as possible under the author's interpretation). Her whole "third way" concept is plot driven, so ok (though it would have been much more interesting if she had less of that and more of the "how do a Paladin PC and a Paladin NPC wind their way through the Gritty Greyness of Necessity While Still Being Paragons Of Pure Virtue, but that is just my opinion). For various reasons other mods and NPCs have decided that there is no way that the NPC in question could play within the rules and framework of the game, and I am not judging that - plus, many mods were built in a time when you just did not have the kind of way-cool options BiggDU now provides. Aran is not that kind of dude, and I like the challenge of scalpel and reconstructive surgery over chopping the head off and sewing another on :blush:

 

So I will stick with

 

EXTEND_BOTTOM PLAYER1 7
IF ~InParty("c-aran") InMyArea("c-aran") !StateCheck("c-aran",CD_STATE_NOTVALID) OR(2) Global("c-aranromance","GLOBAL",1) Global("c-aranromance","GLOBAL",2) ~ EXTERN ~C-ARANJ~  c-aranslayer2
END

 

Now at this point, the PC is going from "Oh, darling, I feel like seafood tonight - literally" to "Has anyone seen my PschoKiller-From-Hell script, and my extra pair of claws?" So here Aran sees the twitching and moaning, and checks out what is going on (BioWare seems to assume the romance-active means you are sharing a bedroll, so they expect the bedpartner changing into a spiky avatar is a little less Ghostbusters II and a little more Night Of The Living Dead, I think).

 

IF ~~ c-aranslayer2
SAY ~[ARAN] Right, you don't look all there, <CHARNAME>. Somethin' is hittin' you hard an' fast. Are you about to be sick?~
++ ~[PC] No... I... need... to... control! Loosing... ~ DO ~SetGlobal("c-aranslayerchange1","GLOBAL",1)~ + c-aranslayer2c
++ ~[PC] I am changing again! The Slayer! I am...~ DO ~SetGlobal("c-aranslayerchange1","GLOBAL",1)~ + c-aranslayer2c
++ ~[PC] Run, if you value your life!~ DO ~SetGlobal("c-aranslayerchange1","GLOBAL",1)~ + c-aranslayer2c
END

IF ~~ c-aranslayer2c
SAY ~[ARAN] Your lips be movin' <CHARNAME>, but that's not rightly any language I know... hey... Lolth's Cruel Fingernails, you be growin' claws!~ DO ~ActionOverride(Player1,ReallyForceSpell(Myself,SLAYER_CHANGE))~
IF ~~ THEN EXIT
END

 

So Aran gets the scenic backchatter, and evidences concern. The follow up, when you are back from your Walk on the Wild Side, comes out of state #10. Now, folks have handled this differently - but the simplest way I have seen so far is in deArnise, with a !Detect("dv") || Detect("dv") pair of possibilities. So rather than go through Amber's stuff, I am just going to say "look at Fade, Amber, deArnise, and search for PLAYER1 within files and Enlightenment Will Be Granted, if you have an Open Mind And Willing Heart, Grasshopper". A straightforward rebuild of deArnise, with some Amber-style dialog options placed into play:

 

EXTEND_BOTTOM ~PLAYER1~ 10
IF ~Global("c-aranslayerchange1","GLOBAL",1) !Detect("c-aran")~ DO ~SetGlobal("DrowTalk","GLOBAL",5)~ GOTO 12 // this one is the "written in the blood of those you care about"
IF ~Global("c-aranslayerchange1","GLOBAL",1) Detect("c-aran")~ DO ~SetGlobal("DrowTalk","GLOBAL",5)~ EXTERN ~C-ARAN~ c-aranslayer3
END

APPEND ~C-ARANJ~

IF ~~ c-aranslayer3
SAY ~[ARAN] What in all th' gods names was that?~
++ ~[PC] I think I am following my father's curse.~ + c-aranslayer3c
++ ~[PC] I think I am following my father's blessing.~ + c-aranslayer3b
++ ~[PC] I do not know precisely. But I intend to find out.~ EXIT
EXIT

IF ~~ c-aranslayer3c
SAY ~[ARAN] We need to find you a cure for that, an' right quick. I'm right fond o' you, <CHARNAME>, but I can't hold you down in that change wi' out bein' torn limb from limb.~
IF ~~ THEN EXIT
EXIT

IF ~~ c-aranslayer3b
SAY ~[ARAN] Blessin'? Well, it be powerful. But your power has always been you, not somethin' else posessin' you.  If you can control it, well, it will be a fearsome power, it will. But if you can't, it won't rightly be a pretty endin', eh?~
IF ~~ THEN EXIT
EXIT

END // of APPEND

 

And that should take care of it.

 

Well, if someone is following along and building thier own mod, one small point, not meant as derogatory to the two mods in question in any way. If you are researching this, there are two mods which are not a great place to start, as they make extensive use of PLAYER1.DLG to control player action or allow third-person view of other NPCs interacting. All versions of Lord M's Imoen Romance and Chloe are better left for when you are pretty confident you know how stuff works, or you probably will get lost. I certainly did. For more advanced folks, Cloe has one of those "Hmmm... interesting" ideas that never really caught on in a big way - take a look at this:

 

APPEND CHLOEJ
IF WEIGHT #200 ~Global("ChloeGTKUCR","GLOBAL",26)~ THEN BEGIN GTKU72
  SAY @872 
  IF ~~ THEN REPLY @873 DO ~ActionOverride(Player1,SetDialog("PLAYER1"))~ GOTO GTKU77
  IF ~!IsValidForPartyDialog("Nalia")~ THEN REPLY @874 DO ~ActionOverride(Player1,SetDialog("PLAYER1"))~ GOTO GTKU76
  IF ~IsValidForPartyDialog("Nalia")~ THEN REPLY @874 DO ~ActionOverride(Player1,SetDialog("PLAYER1"))~ EXTERN NALIAJ GTKU76nalia
  IF ~~ THEN REPLY @875 DO ~ActionOverride(Player1,SetDialog("PLAYER1"))~ GOTO GTKU75
  IF ~~ THEN REPLY @876 DO ~ActionOverride(Player1,SetDialog("PLAYER1"))~ GOTO GTKU74
  IF ~~ THEN REPLY @877 DO ~ActionOverride(Player1,SetDialog("PLAYER1"))~ GOTO GTKU73
END
END

CHAIN CHLOEJ GTKU75
@880
== PLAYER1 @881
== CHLOEJ @882
== PLAYER1 @883
== CHLOEJ @884
== PLAYER1 @885
== MINSCJ IF ~IsValidForPartyDialog("Minsc")~ THEN @886
== CHLOEJ @887
== PLAYER1 @888
== CHLOEJ @889
== PLAYER1 @890
== CHLOEJ @891 DO ~IncrementGlobal("ChloeInterest","GLOBAL",1)~
EXIT

 

I am not a fan of dictating player responses, but that is certainly something one doesn't see in the regular modding day. It might be useful somewhere as a shell dialog trick. (Yep - I know - the argument against this kind of thing is that if you are doing this, the player is completely railroaded. But the swapping dilaog files around like Amber does as an NPC when applied to a PC, that is interesting to me.)

Link to comment

This doesn't have anything to do with the modding (though I must say your tutorials make it far easier for the script-impaired, like I, to understand) but I wanted to give you a "good job!" because now you've motivated me to go replace my lost disks for BGII.

 

Good job, keep up the good work! :)

Link to comment
SAY ~[ARAN] Hot soup, an' a good solid night o' sleep, that be my perscription. There's no shame in leanin' on me a bit, if you want to.~

"prescription"

 

SAY ~[ARAN] That sounds like one hell o' a hangover. But you have had naught to drink. Here, get a bit o' water an' jerky in you, an' let's get out o' this place. Lovitar's Lash, this place would get to anyone.~

"Loviatar's"

 

++ ~[PC] No... I... need... to... control! Loosing... ~ DO ~SetGlobal("c-aranslayerchange1","GLOBAL",1)~ + c-aranslayer2c

I assume "Losing" in this case.

 

SAY ~[ARAN] Blessin'? Well, it be powerful. But your power has always been you, not somethin' else posessin' you. If you can control it, well, it will be a fearsome power, it will. But if you can't, it won't rightly be a pretty endin', eh?~

"possessin' you"

Link to comment

Hmmm. This raises an important point, possibly something (else) to throw into Crossmod Banter Pack.

 

Amber uses INTERJECT. This means that if anybody writes a romance mod after Amber's latest update, Amber will cut off the love interest's comments.

 

I think it's possible to change the triggers for this dialogue using STATE_WHICH_SAYS to include newly released romances, like Angelo (and eventually Aran, Gavin, another mod, etc.), but we're going to have to check it out.

 

In any case, this is something for CBP, not Aran.

Link to comment

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...