Jump to content

The Great Vampire Caper


cmorgan

Recommended Posts

(K'aeloree, good point - optional on install is a nice idea. I have a post ruminating about how much player choice to add in, so I will save that idea for that set of ideas!)

 

 

Cutscenes and Abductions and Renewals, Oh My...

 

Things get confusing when decrypting the interrelationships between area scripts, creature scripts, etc. But here is a rundown of the Bhodi Abduction Of Your Romantic Interest. If you an follow the bouncing ball, consider yourself a darned good coder - and try to avoid painting yourself into complications with unnessesary calls to area scripts, etc. These appear to be necessary given the number of NPCs consolidated into one quest.

 

 

Now the cutscene that gets Aran out and sets a bunch of vampires on the party. This is a new compiled cutscene:

 

in C-ARCUTV.baf

IF
True()
THEN
RESPONSE #100
CutSceneId("c-aran")
CreateCreatureObject("VAMPAMB","c-aran",0,0,0)
SetGlobal("c-aranvamped","GLOBAL",1)
Wait(1)
CreateVisualEffectObject("SPDISPMA",Myself)
DropInventory()
SetLeavePartyDialogFile()
ChangeAIScript("VAMPAMB",OVERRIDE)
ChangeAIScript("",DEFAULT)
DialogInterrupt(FALSE)
LeaveParty()
EndCutSceneMode()
END

IF
True()
THEN
RESPONSE #100
CutSceneId("bodhiamb")
DialogInterrupt(FALSE)
CreateCreatureObject("VAMPIM01",Myself,0,0,0)
CreateCreatureObject("VAMPIM01",Myself,0,0,0)
CreateCreatureObject("VAMPIM01",Myself,0,0,0)
CreateCreatureObject("VAMPIM01",Myself,0,0,0)
END

 

Notice that there is a reference to ChangeAIScript("VAMPAMB",OVERRIDE). We don't want to mess with this, because the game is playing shell games with scripts. It has the following for VAMPAMB.BCS:

 

IF
Global("CleanseVampire","AR1401",2)
Global("AerieVampire","GLOBAL",3)
Name("Aerie",Myself)
AreaCheck("AR1401")
THEN
RESPONSE #100
	SetGlobal("AerieVampire","GLOBAL",4)
	DialogInterrupt(TRUE)
	ChangeAIScript("Aerie",OVERRIDE)
END

IF
Global("CleanseVampire","AR1401",2)
Global("AnomenVampire","GLOBAL",3)
Name("Anomen",Myself)
AreaCheck("AR1401")
THEN
RESPONSE #100
	SetGlobal("AnomenVampire","GLOBAL",4)
	DialogInterrupt(TRUE)
	ChangeAIScript("Anomen",OVERRIDE)
END

IF
Global("CleanseVampire","AR1401",2)
Global("JaheiraVampire","GLOBAL",3)
Name("Jaheira",Myself)
AreaCheck("AR1401")
THEN
RESPONSE #100
	SetGlobal("JaheiraVampire","GLOBAL",4)
	DialogInterrupt(TRUE)
	ChangeAIScript("Jaheira",OVERRIDE)
END

IF
Global("CleanseVampire","AR1401",2)
Global("ViconiaVampire","GLOBAL",3)
Name("Viconia",Myself)
AreaCheck("AR1401")
THEN
RESPONSE #100
	SetGlobal("ViconiaVampire","GLOBAL",4)
	DialogInterrupt(TRUE)
	ChangeAIScript("Viconia",OVERRIDE)
END

IF
OR(4)
	Global("AerieVampire","GLOBAL",1)
	Global("AnomenVampire","GLOBAL",1)
	Global("JaheiraVampire","GLOBAL",1)
	Global("ViconiaVampire","GLOBAL",1)
Global("RomanceVampire","GLOBAL",0)
THEN
RESPONSE #100
	SetGlobal("RomanceVampire","GLOBAL",1)
	Continue()
END

IF
OR(4)
	Global("AerieVampire","GLOBAL",1)
	Global("AnomenVampire","GLOBAL",1)
	Global("JaheiraVampire","GLOBAL",1)
	Global("ViconiaVampire","GLOBAL",1)
Global("RomanceVampire","GLOBAL",1)
Global("RomanceVampireTeleport","GLOBAL",0)
THEN
RESPONSE #100
	SetGlobal("RomanceVampireTeleport","GLOBAL",1)
	CreateVisualEffectObject("SPDIMNDR",Myself)
	Wait(2)
	MoveBetweenAreas("ARAM00",[0.0],0)
END

 

We need to add our own conditions to this. So, in the .tp2,

EXTEND_BOTTOM ~vampamb.bcs~ ~aran/baf/c-aranvampamb.baf~

 

The related file, c-aranvamp.baf

IF
Global("CleanseVampire","AR1401",2)
Global("c-aranvamped","GLOBAL",3)
Name("c-aran",Myself)
AreaCheck("AR1401")
THEN
RESPONSE #100
	SetGlobal("c-aranvamped","GLOBAL",4)
	DialogInterrupt(TRUE)
	ChangeAIScript("c-aran",OVERRIDE)
END

IF
Global("c-aranvamped","GLOBAL",1)
Global("RomanceVampire","GLOBAL",0)
THEN
RESPONSE #100
	SetGlobal("RomanceVampire","GLOBAL",1)
	Continue()
END

IF
Global("c-aranvamped","GLOBAL",1)
Global("RomanceVampireTeleport","GLOBAL",0)
THEN
RESPONSE #100
	SetGlobal("RomanceVampireTeleport","GLOBAL",1)
	CreateVisualEffectObject("SPDIMNDR",Myself)
	Wait(2)
	DestroySelf()
END

 

Note: BioWare moves the object to ARAMOO.ARE, but everyone out there does a DeatrioySelf() call instead. I am not going to bother retesting why they chose that - it works with DestroySelf().

 

For getting the Queen Vamping B out of town, the original script is

IF
NumTimesTalkedTo(0)
THEN
RESPONSE #100
	StartDialogueNoSet(Player1)
END

IF
Global("JaheiraVampire","GLOBAL",1)
THEN
RESPONSE #100
	SetGlobal("Deactivate0801","AR0800",3)
	ForceSpell(Myself,DRYAD_TELEPORT)
END

IF
Global("AerieVampire","GLOBAL",1)
THEN
RESPONSE #100
	SetGlobal("Deactivate0801","AR0800",3)
	ForceSpell(Myself,DRYAD_TELEPORT)
END

IF
Global("AnomenVampire","GLOBAL",1)
THEN
RESPONSE #100
	SetGlobal("Deactivate0801","AR0800",3)
	ForceSpell(Myself,DRYAD_TELEPORT)
END

IF
Global("ViconiaVampire","GLOBAL",1)
THEN
RESPONSE #100
	SetGlobal("Deactivate0801","AR0800",3)
	ForceSpell(Myself,DRYAD_TELEPORT)
END

 

so, here a simple tp2 command of

 

 
EXTEND_BOTTOM ~bodhiamb.bcs~ ~aran/bcs/c-aranbodhivamp.baf~

 

with related file

 

c-aranbodhivamp.baf

IF
Global("c-aranvamped","GLOBAL",1)
THEN
RESPONSE #100
	SetGlobal("Deactivate0801","AR0800",3)
	ForceSpell(Myself,DRYAD_TELEPORT)
END

 

We need to get Aran back after all the silliness is over, so here we follow the standard "copy BioWare and insert our own values".

 

vanilla CLEANSE.BCS

IF
OR(4)
	Contains("MISCBL",Myself) // Aerie's Body
	Contains("MISCBM",Myself) // Anomen's Body
	Contains("MISCBN",Myself) // Jaheira's Body
	Contains("MISCBO",Myself) // Viconia's Body
Global("CleanseVampire","AR1401",0)
THEN
RESPONSE #100
	SetGlobal("CleanseVampire","AR1401",1)
END

IF
Contains("MISCBL",Myself) // Aerie's Body
Contains("MISCBP",Myself) // Bodhi's Black Heart
THEN
RESPONSE #100
	SetInterrupt(FALSE)
	SetGlobal("CleanseVampire","AR1401",2)
	DestroyItem("MISCBL") // Aerie's Body
	DestroyItem("MISCBP") // Bodhi's Black Heart
	CreateVisualEffect("SPMETSW2",[2592.1701])
	CreateVisualEffect("SPMETSW2",[2645.1742])
	Wait(1)
	CreateVisualEffect("SPFLESHS",[2565.1677])
	Wait(1)
	MoveGlobal("AR1401","Aerie",[2565.1677])
	SetInterrupt(TRUE)
END

IF
Contains("MISCBM",Myself) // Anomen's Body
Contains("MISCBP",Myself) // Bodhi's Black Heart
THEN
RESPONSE #100
	SetInterrupt(FALSE)
	SetGlobal("CleanseVampire","AR1401",2)
	DestroyItem("MISCBM") // Anomen's Body
	DestroyItem("MISCBP") // Bodhi's Black Heart
	CreateVisualEffect("SPMETSW2",[2592.1701])
	CreateVisualEffect("SPMETSW2",[2645.1742])
	Wait(1)
	CreateVisualEffect("SPFLESHS",[2565.1677])
	Wait(1)
	MoveGlobal("AR1401","Anomen",[2565.1677])
	SetInterrupt(TRUE)
END

IF
Contains("MISCBN",Myself) // Jaheira's Body
Contains("MISCBP",Myself) // Bodhi's Black Heart
THEN
RESPONSE #100
	SetInterrupt(FALSE)
	SetGlobal("CleanseVampire","AR1401",2)
	DestroyItem("MISCBN") // Jaheira's Body
	DestroyItem("MISCBP") // Bodhi's Black Heart
	CreateVisualEffect("SPMETSW2",[2592.1701])
	CreateVisualEffect("SPMETSW2",[2645.1742])
	Wait(1)
	CreateVisualEffect("SPFLESHS",[2565.1677])
	Wait(1)
	MoveGlobal("AR1401","Jaheira",[2565.1677])
	SetInterrupt(TRUE)
END

IF
Contains("MISCBO",Myself) // Viconia's Body
Contains("MISCBP",Myself) // Bodhi's Black Heart
THEN
RESPONSE #100
	SetInterrupt(FALSE)
	SetGlobal("CleanseVampire","AR1401",2)
	DestroyItem("MISCBO") // Viconia's Body
	DestroyItem("MISCBP") // Bodhi's Black Heart
	CreateVisualEffect("SPMETSW2",[2592.1701])
	CreateVisualEffect("SPMETSW2",[2645.1742])
	Wait(1)
	CreateVisualEffect("SPFLESHS",[2565.1677])
	Wait(1)
	MoveGlobal("AR1401","Viconia",[2565.1677])
	SetInterrupt(TRUE)
END

 

Now, with much of the above stuff and this too, we could do this by using some cool WeiDU stuff, adding c-aran to the OR(4) in the first block, but since we also have to add the action block later on, no existing mod does that - they add both blocks. Safer that way, too. If I change the OR(4) into an OR(5), it means everyone searching for the same thing will not be able to find it, and thier mod will fail. The follow - on with tp2 =

EXTEND_BOTTOM ~cleanse.bcs~ ~aran/baf/c-arancleanse.baf~

 

and the related file c-arancleanse.baf

  
IF
	Contains("C-ARNBDY",Myself)
Global("CleanseVampire","AR1401",0)
THEN
RESPONSE #100
	SetGlobal("CleanseVampire","AR1401",1)
END
IF
Contains("C-ARNBDY",Myself) // Aran's Body
Contains("MISCBP",Myself) // Bodhi's Black Heart
THEN
RESPONSE #100
	SetInterrupt(FALSE)
	SetGlobal("CleanseVampire","AR1401",2)
	DestroyItem("C-ARNBDY") // Aran's Body
	DestroyItem("MISCBP") // Bodhi's Black Heart
	CreateVisualEffect("SPMETSW2",[2592.1701])
	CreateVisualEffect("SPMETSW2",[2645.1742])
	Wait(1)
	CreateVisualEffect("SPFLESHS",[2565.1677])
	Wait(1)
	MoveGlobal("AR1401","c-aran",[2565.1677])
	SetInterrupt(TRUE)
END

 

 

Wait a sec - we have to create a body. Most folks just distribute a new .itm. But heck - why bother when we can play with WeiDU. After all, there is a perfectly good male body already existying in game, Anomen's, another human male. So in the tp2,

 

COPY_EXISTING	~miscbm.itm~ ~override/c-arnbdy.itm~
 SAY NAME1 ~Aran Whitehand's Body~
 SAY NAME2 ~Aran Whitehand's Body~
 SAY UNIDENTIFIED_DESC ~Aran was captured by Bodhi and infected with vampirism, forcing you to slay him. There may be some way to revive him, though you don't know what it would be.~
 SAY DESC ~Aran was captured by Bodhi and infected with vampirism, forcing you to slay him. There may be some way to revive him, though you don't know what it would be.~

 

Back in Bodhi's layer, the puzzle-piece that consists of creating the Aran version of the vampire and setting up the fight uses the area script, AR0809.BCS. So we need to add the relevant blocks there, too. Looking at the script shows that one block is needed per Bloodsucked Love Interest -

creating the creature,

IF
Global("AnomenVampire","GLOBAL",1)
THEN
RESPONSE #100
	SetGlobal("AnomenVampire","GLOBAL",2)
	CreateCreature("Vampano",[1473.332],2) // Anomen
END

 

But some modders add a second backup block, the added journal entry removal. Some put this in dialog, but since there is no harm in double-checking,

IF
Dead("C6Bodhi")
GlobalLT("udMind","GLOBAL",41)
THEN
RESPONSE #100
	EraseJournalEntry(16351) // The Final Battle with Bodhi.  Bodhi has revealed herself to me, letting me know that she is aware of my pursuit... and in an attempt to dissuade me from entering her lair unleashed yet more of her undead creations upon me.  She swears I will lose much more than my life if I continue to pursue her... although, in truth, I have little choice.
	EraseJournalEntry(7002) // The Final Battle with Bodhi.  Bodhi appeared in an ambush shortly before I reached her haven, warning me that she was aware of my pursuit and stealing from me the one person that is dearest to my heart: Jaheira.  Before she vanished and unleashed more of her undead creations upon me, Bodhi warned me that if I continue I will lose even more than I thought possible.  I cannot give up on the Rhynn Lanthorn... but now the life and immortal soul of the one I love is at stake, as well!
	EraseJournalEntry(3716) // The Final Battle with Bodhi.  Bodhi appeared in an ambush shortly before I reached her haven, warning me that she was aware of my pursuit and stealing from me the one person that is dearest to my heart: Viconia.  Before she vanished and unleashed more of her undead creations upon me, Bodhi warned me that if I continue I will lose even more than I thought possible.  I cannot give up on the Rhynn Lanthorn... but now the life and immortal soul of the one I love is at stake, as well!
	EraseJournalEntry(5814) // The Final Battle with Bodhi.  Bodhi appeared in an ambush shortly before I reached her haven, warning me that she was aware of my pursuit and stealing from me the one person that is dearest to my heart: Aerie.  Before she vanished and unleashed more of her undead creations upon me, Bodhi warned me that if I continue I will lose even more than I thought possible.  I cannot give up on the Rhynn Lanthorn... but now the life and immortal soul of the one I love is at stake, as well!
	EraseJournalEntry(16331) // The Final Battle with Bodhi.  Bodhi appeared in an ambush shortly before I reached her haven, warning me that she was aware of my pursuit and stealing from me the one person that is dearest to my heart: Anomen.  Before she vanished and unleashed more of her undead creations upon me, Bodhi warned me that if I continue I will lose even more than I thought possible.  I cannot give up on the Rhynn Lanthorn... but now the life and immortal soul of the one I love is at stake, as well!
	EraseJournalEntry(15710) // The Final Battle with Bodhi.  I have finally encountered Bodhi within her lair!  I must be careful to use every advantage I have at my disposal, including the holy water that Elhan gave me.  I doubt it will do much to her personally... but perhaps there is some way to pollute the power she draws from this place, use the holy water to dim the blood she draws... And if I survive, I will have many questions for Elhan.  He knows more than he has said about Irenicus and Bodhi. 
	SetGlobal("udMind","GLOBAL",41)
END

 

Well, we can do this too, just for kicks -

 

IF
Global("c-aranvamped","GLOBAL",1)
THEN
RESPONSE #100
	SetGlobal("c-aranvamped","GLOBAL",2)
	CreateCreature("c-arnvmp",[1473.332],2) // Aran as a vampire
END

IF
Dead("C6Bodhi")
Global("c-aranjfixv","GLOBAL",0)
THEN
RESPONSE #100
	EraseJournalEntry(@2000)
	SetGlobal("c-aranjfixv","GLOBAL",1)
END

 

and the related .tra,

 

@2000 = ~The Final Battle with Bodhi.

Bodhi appeared in an ambush shortly before I reached her haven, warning me that she was aware of my pursuit and stealing Aran from my side. Before she vanished and unleashed more of her undead creations upon me, Bodhi warned that if I continue I will lose even more than I thought possible. I cannot give up on the Rhynn Lanthorn... but now the life and immortal soul of Aran is at stake, as well!~

 

That means a tp2 extension,

 

EXTEND_BOTTOM ~ar0809.bcs~ ~aran/baf/c-aranvampar0809.baf~
USING ~aran/tra/%language%/c-aranvampar0809.tra~

 

That creature created, of course, like Vampano.cre, means we need the false creature to clobber - the classic "fight and die" replacement for a new creature, Aran when bloodsucked, c-arnvmp.cre.

 

c-arnvmp.cre is a modified vampire, with

 

dv = c-arnvmp

dlg = c-arnvmp

(most modders leave the default script as wdasight.bcs)

 

and the override script = c-arnvmp.bcs, which is this, a modified compy of vampano.cre's VAMPANO.BCS:

 

file c-arnvmp.baf

IF
Global("C6BodhiFight","AR0809",1)
Allegiance(Myself,NEUTRAL)
THEN
RESPONSE #100
Enemy()
END

IF
Die()
THEN
RESPONSE #100
SetGlobal("c-aranvamped","GLOBAL",3)
DropInventory()
DestroySelf()
END

IF
See([PC])
Delay(12)
Allegiance(Myself,ENEMY)
THEN
RESPONSE #100
ReallyForceSpellDead([PC],VAMPIRE_DOMINATION)
END

 

Let's set him up via tp2 patching. I like to do overkill on blanking references, so this can probably be done much more efficiently, but I like it:

 

COPY_EXISTING ~vampano.cre~ ~override\c-arnvmp.cre~
SAY NAME1 ~Aran Whitehand~
SAY NAME2 ~Aran Whitehand~
WRITE_LONG INITIAL_MEETING (BNOT 0x0)
WRITE_LONG MORALE (BNOT 0x0)
WRITE_LONG HAPPY (BNOT 0x0)
WRITE_LONG UNHAPPY_ANNOYED (BNOT 0x0)
WRITE_LONG UNHAPPY_SERIOUS (BNOT 0x0)
WRITE_LONG UNHAPPY_BREAKING (BNOT 0x0)
WRITE_LONG LEADER (BNOT 0x0)
WRITE_LONG TIRED (BNOT 0x0)
WRITE_LONG BORED (BNOT 0x0)
WRITE_LONG BATTLE_CRY1 (BNOT 0x0)
WRITE_LONG BATTLE_CRY2 (BNOT 0x0)
WRITE_LONG BATTLE_CRY3 (BNOT 0x0)
WRITE_LONG BATTLE_CRY4 (BNOT 0x0)
WRITE_LONG BATTLE_CRY5 (BNOT 0x0)
WRITE_LONG ATTACK1 (BNOT 0x0)
WRITE_LONG ATTACK2 (BNOT 0x0)
WRITE_LONG DAMAGE (BNOT 0x0)
WRITE_LONG DYING (BNOT 0x0)
WRITE_LONG HURT (BNOT 0x0)
WRITE_LONG AREA_FOREST (BNOT 0x0)
WRITE_LONG AREA_CITY (BNOT 0x0)
WRITE_LONG AREA_DUNGEON (BNOT 0x0)
WRITE_LONG AREA_DAY (BNOT 0x0)
WRITE_LONG AREA_NIGHT (BNOT 0x0)
WRITE_LONG SELECT_COMMON1 (BNOT 0x0)
WRITE_LONG SELECT_COMMON2 (BNOT 0x0)
WRITE_LONG SELECT_COMMON3 (BNOT 0x0)
WRITE_LONG SELECT_COMMON4 (BNOT 0x0)
WRITE_LONG SELECT_COMMON5 (BNOT 0x0)
WRITE_LONG SELECT_COMMON6 (BNOT 0x0)
WRITE_LONG SELECT_ACTION1 (BNOT 0x0)
WRITE_LONG SELECT_ACTION2 (BNOT 0x0)
WRITE_LONG SELECT_ACTION3 (BNOT 0x0)
WRITE_LONG SELECT_ACTION4 (BNOT 0x0)
WRITE_LONG SELECT_ACTION5 (BNOT 0x0)
WRITE_LONG SELECT_ACTION6 (BNOT 0x0)
WRITE_LONG SELECT_ACTION7 (BNOT 0x0)
WRITE_LONG INTERACTION1 (BNOT 0x0)
WRITE_LONG INTERACTION2 (BNOT 0x0)
WRITE_LONG INTERACTION3 (BNOT 0x0)
WRITE_LONG INTERACTION4 (BNOT 0x0)
WRITE_LONG INTERACTION5 (BNOT 0x0)
WRITE_LONG INSULT (BNOT 0x0)
WRITE_LONG COMPLIMENT1 (BNOT 0x0)
WRITE_LONG SPECIAL1 (BNOT 0x0)
WRITE_LONG REACT_TO_DIE_GENERAL (BNOT 0x0)
WRITE_LONG REACT_TO_DIE_SPECIFIC (BNOT 0x0)
WRITE_LONG RESPONSE_TO_COMPLIMENT2 (BNOT 0x0)
WRITE_LONG RESPONSE_TO_INSULT1 (BNOT 0x0)
WRITE_LONG RESPONSE_TO_INSULT2 (BNOT 0x0)
WRITE_LONG DIALOGUE_HOSTILE (BNOT 0x0)
WRITE_LONG SELECT_RARE1 (BNOT 0x0)
WRITE_LONG SELECT_RARE2 (BNOT 0x0)
WRITE_LONG BIO (BNOT 0x0)
WRITE_EVALUATED_ASCII 0x280 ~%DEST_RES%~ #32 // death variable
WRITE_EVALUATED_ASCII 0x2CC ~%DEST_RES%~ #8  // dialog
WRITE_EVALUATED_ASCII 0x248 ~%DEST_RES%~ #8  // override script
REPLACE_CRE_ITEM ~c-arnbdy~ #0 #0 #0 ~IDENTIFIED&UNSTEALABLE~ ~QITEM1~ // swap in Aran's body

 

OK, so what have I forgotten. Hmmm.

 

Oh, yeah - hey, Aran is supposed to chime in when he gets back to normal, and give Player1 the opportunity to kick him out or hug him or rip his clothes off or something. So, in C-ARAN.BCS we need a block to fire this. Here is Amber's:

 

// Bodhi Abduction
IF
  !InParty("M#Amber")
  Global("M#AmberVampire","GLOBAL",4)
THEN
	RESPONSE #100
	PlaySong(999997)
  	SetGlobal("M#AmberVampire","GLOBAL",5)
	StartDialogNoSet(Player1)
END

 

I am going to simplify it a bit, because I am handling sound later on, but here is the snippet;

 

// Bodhi Abduction
IF
  !InParty("c-aran")
  Global("c-aranvamped","GLOBAL",4)
THEN
	RESPONSE #100
	PlaySong(0)
	PlaySound("c-aranh")
  	SetGlobal("c-aranvamped","GLOBAL",5)
	StartDialogNoSet(Player1)
END

 

Well, pending a recheck of spelling and a recheck of variable advancing, it looks like this particular romance quest is wrapped up.

 

Except - how is the CLEANSE.BCS triggered?

 

Well, let's go spelunking. First stop, NI and DLTCEP and he Shade lord area, 1401. And here we find a cute little message that pops for regular NPCs, but gets skipped for mod-added ones -

 

VLUVINFO.BCS

IF
Entered([ANYONE])
Global("GotBook94","GLOBAL",1)
OR(4)
	Global("AerieVampire","GLOBAL",3)
	Global("AnomenVampire","GLOBAL",3)
	Global("ViconiaVampire","GLOBAL",3)
	Global("JaheiraVampire","GLOBAL",3)
THEN
RESPONSE #100
	DisplayString(LastTrigger,56407) // This appears to be the statue described in the Vapiricus Omnibus.  The book spoke of placing the vampire and it's master's heart within the statue's arms to destroy the curse.
	Wait(2)
END

 

Easy enough to do, with an added block:

 

VLUVINFO.BCS

IF
Entered([ANYONE])
Global("GotBook94","GLOBAL",1)
Global("c-aranvamped","GLOBAL",3)

THEN
RESPONSE #100
	DisplayString(LastTrigger,56407)
	Wait(2)
END

 

 

And poking about, we have Container 3 using the CLEANSE.BCS - so mystery solved. We know that in this area, the container provides the trigger for the script. (Actually, we knew that from the get-go, both because we have played the game a zillion tmes, and because there were giveaways, like Contains() in the script, but the point is that poking about is a good way to see how all this plays out, so that you can steal rip-off learn from the Masters of Code.

Link to comment
Let's set him up via tp2 patching. I like to do overkill on blanking references, so this can probably be done much more efficiently, but I like it:

 

COPY_EXISTING ~vampano.cre~ ~override\c-arnvmp.cre~
WRITE_LONG BIO (BNOT 0x0)
REPLACE_TEXTUALLY CASE_INSENSITIVE ~miscbm~ ~c-arnbdy~ // swap in Aran's body

 

REPLACE_TEXTUALLY on a .cre is a bit foolhardy. And since your two strings are of different lengths, offsets after the item table will become off-by-two in this case. It may happen to work by luck, but... not a good habit. Better hunt the itm reference the long way around, I'm sure the fixpack has stealable code. :blush:

 

WRITE_LONG strref_offset (BNOT 0x0) is cute, I may have to steal that trick.

Link to comment

That is either Smoketest's or devSin's cool (BNOT 0x0) - I agree :blush:

 

And the R_T was stupid. Especially when I don't even have to build patching loops tweaked from Fixpack - I forgot that the bigg has a bunch of cool ADD_ | REPLACE_ | REMOVE_ CRE_ITEM materials built into newer versions of WeiDU. I will replace that

 

REPLACE_TEXTUALLY CASE_INSENSITIVE ~miscbm~ ~c-arnbdy~ // swap in Aran's body

 

with

 

REPLACE_CRE_ITEM itmName #charge1 #charge2 #charge3 flags slot [ EQUIP ] [ TWOHANDED ] If there’s an item in the slot position, replace it; otherwise, process ADD_CRE_ITEM

 

which I think works out to

 

REPLACE_CRE_ITEM ~c-arnbdy~ #0 #0 #0 ~IDENTIFIED&UNSTEALABLE~ ~QITEM1~

Link to comment

I've got to agree with what others have said. Tree of Life is essential, the Vampire Abduction isn't.

 

The only variation on the Vamp abduction I can see, doesn't work for Aran. It would require both an evil Charname AND an evil NPC; namely, the NPC chooses to remain a vampire and remain in Charname's party as one. But having zero clue about coding (all the coding language in these posts reads as Sanskrit to me), I'm sure any coder would run screaming at the thought. And, again, it wouldn't fit Aran anyhow.

Link to comment

Vampires are dominated by their makers, so having Aran remain in the party a one isn't really possible, even if the PC is evil.

 

Bodhi has a coven of vampires to do her bidding. She wants to annoy the PC, so she makes her love interest one of them. That's all. And then, she commands the love interest to kill the PC.

 

You know what's ironic is that I've actually had Bodhi die before the love interest. According to the principle that lesser vampires are bound to the wills of their masters, the love interest should have died, but he didn't, and kept on fighting the PC. Dunno what's possible with Aerie, Jaheira, Viconia, and Anomen, but mod NPCs should definitely have something added to their script to kill them if Bodhi dies.

Link to comment

Archived

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

×
×
  • Create New...