Jump to content

Reflections - Let's Make a Mod for EET


Recommended Posts

Posted (edited)

Part 3: Belt Tightening

Moving onward, because all this stuff can be revised and improved later. This next bit is short: we want to change the scene after you confront Sarevok and prevent his coronation, to stop Belt and Liia from teleporting you to the Thieves' Guild. The part of their dialogue that leads to this is conditioned on a variable which is set when Sarevok reveals his true self and attempts to kill Belt and Liia: Global("SarevokBehavior","GLOBAL",1). We will change that condition to require a value of 99, which will never happen. Then we will add some lines of dialogue that have the same original condition, so the player will see the new dialogue instead:

Spoiler
<<<<<<<< d5/belt+.d
REPLACE_STATE_TRIGGER BELT 11 ~Global("SarevokBehavior","GLOBAL",99)~

APPEND BELT

IF ~Global("SarevokBehavior","GLOBAL",1) Global("D5PostCoronation","GLOBAL',0)~ THEN BEGIN d5belt_0
  SAY ~Well. I suppose we must thank you for your timely intervention. Though, if I am being honest, the timing of your arrival does seem quite convenient. Who did you say you are?~
  IF ~~ THEN REPLY ~I am <CHARNAME>. We have been investigating the Iron Throne's involvement with the iron crisis and the push for war with Amn. We have spoken to Scar about it.~ GOTO d5belt_1
END

IF ~~ THEN BEGIN d5belt_1
  SAY ~Yes, well, unfortunately Scar is dead, and won't be coming back. So we cannot ask him about it. ~
  IF ~~ THEN GOTO d5belt_1
END

IF ~~ THEN BEGIN d5belt_2
  SAY ~At any rate, Sarevok is gone, and there is no way to track where they went. That was a Dimension Door, not a teleport spell. But the range is limited, so he cannot have gone far. He is surely still in the city. I will order all entrances to be monitored and have mages checking for magical passage. He will not easily escape.~
  IF ~~ THEN REPLY ~You assume he *wants* to escape...~ GOTO d5belt_3
  IF ~~ THEN REPLY ~He will wish he could escape. I will hunt him down!~ GOTO d5belt_4
END

IF ~~ THEN BEGIN d5belt_3
  SAY ~Yes, he did say he would come after you right before leaving, did he not? That is worrying. With all the power he amassed through the Iron Throne, he no doubt still has significant resources close at hand.~
  IF ~~ THEN GOTO d5belt_5
END

IF ~~ THEN BEGIN d5belt_4
  SAY ~I admire your enthusiasm. It is clear to me that Sarevok is an enemy who meant to cause - who did cause - grave harm. But you might consider whether, in your zeal to pursue him, you are playing into his hands. With all the power he amassed through the Iron Throne, he no doubt still has significant resources close at hand.~
  IF ~~ THEN GOTO d5belt_5
END

IF ~~ THEN BEGIN d5belt_5
  SAY ~We must find him. I think the best course of action is to inquire with the Flaming Fist. Sarevok's stooge, Angelo, is gone and his goons will have been run out. But maybe someone gleaned some information from him in the short time he was running the place.~
  IF ~~ THEN REPLY ~Good idea. I will go talk to an officer in the Flaming Fist.~ DO ~SetGlobal("D5PostCoronation","GLOBAL",1)~ JOURNAL ~The Hunt for Sarevok
Sarevok's coronation as a grand duke was interrupted, but he escaped to an unknown location. The dukes have suggested that an officer of the Flaming Fist who may have worked with Angelo might have information that can help. Angelo was installed, however briefly, at the Flaming Fist headquarters ion the southwest quadrant of the city. That is the best place to start.~ EXIT
  IF ~~ THEN REPLY ~I do not really see eye to eye with the Flaming Fist. I suppose I could talk to them... if I feel like it. We'll see.~ DO ~SetGlobal("D5PostCoronation","GLOBAL",1)~ JOURNAL ~The Hunt for Sarevok
Sarevok's coronation as a grand duke was interrupted, but he escaped to an unknown location. The dukes have suggested that an officer of the Flaming Fist who may have worked with Angelo might have information that can help. Angelo was installed, however briefly, at the Flaming Fist headquarters ion the southwest quadrant of the city. That is the best place to start.~ EXIT
END

IF ~GlobalGT("D5PostCoronation","GLOBAL",0) Global("D5SarevokDead","GLOBAL",0)~ THEN BEGIN d5belt_6
  SAY ~I urge you to find Sarevok and bring him to justice. It would be a boon for the city... and it would go a long way toward shoring up your own credibility and reputation.~
  IF ~~ THEN REPLY ~Right. I am on it.~ EXIT
  IF ~~ THEN REPLY ~I do what I want to do, you aren't my boss.~ EXIT
END

END
>>>>>>>> 
COPY ~d5/belt+.d~ ~weidu_external/reflections/compile/belt+.d~
COMPILE ~weidu_external/reflections/compile/belt+.d~

...and the same for Liia:

Spoiler
<<<<<<<< d5/liia+.d
REPLACE_STATE_TRIGGER LIIA 8 ~Global("SarevokBehavior","GLOBAL",99)~

APPEND LIIA

IF ~Global("SarevokBehavior","GLOBAL",1) Global("D5PostCoronation","GLOBAL',0)~ THEN BEGIN d5liia_0
  SAY ~Well. I suppose we must thank you for your timely intervention. Though, if I am being honest, the timing of your arrival does seem quite convenient. Who did you say you are?~
  IF ~~ THEN REPLY ~I am <CHARNAME>. We have been investigating the Iron Throne's involvement with the iron crisis and the push for war with Amn. We have spoken to Scar about it.~ GOTO d5liia_1
END

IF ~~ THEN BEGIN d5liia_1
  SAY ~Yes, well, unfortunately Scar is dead, and won't be coming back. So we cannot ask him about it. ~
  IF ~~ THEN GOTO d5liia_1
END

IF ~~ THEN BEGIN d5liia_2
  SAY ~At any rate, Sarevok is gone, and there is no way to track where they went. That was a Dimension Door, not a teleport spell. But the range is limited, so he cannot have gone far. He is surely still in the city. I will order all entrances to be monitored and have mages checking for magical passage. He will not easily escape.~
  IF ~~ THEN REPLY ~You assume he *wants* to escape...~ GOTO d5liia_3
  IF ~~ THEN REPLY ~He will wish he could escape. I will hunt him down!~ GOTO d5liia_4
END

IF ~~ THEN BEGIN d5liia_3
  SAY ~Yes, he did say he would come after you right before leaving, did he not? That is worrying. With all the power he amassed through the Iron Throne, he no doubt still has significant resources close at hand.~
  IF ~~ THEN GOTO d5liia_5
END

IF ~~ THEN BEGIN d5liia_4
  SAY ~I admire your enthusiasm. It is clear to me that Sarevok is an enemy who meant to cause - who did cause - grave harm. But you might consider whether, in your zeal to pursue him, you are playing into his hands. With all the power he amassed through the Iron Throne, he no doubt still has significant resources close at hand.~
  IF ~~ THEN GOTO d5liia_5
END

IF ~~ THEN BEGIN d5liia_5
  SAY ~We must find him. I think the best course of action is to inquire with the Flaming Fist. Sarevok's stooge, Angelo, is gone and his goons will have been run out. But maybe someone gleaned some information from him in the short time he was running the place.~
  IF ~~ THEN REPLY ~Good idea. I will go talk to an officer in the Flaming Fist.~ DO ~SetGlobal("D5PostCoronation","GLOBAL",1)~ JOURNAL ~The Hunt for Sarevok
Sarevok's coronation as a grand duke was interrupted, but he escaped to an unknown location. The dukes have suggested that an officer of the Flaming Fist who may have worked with Angelo might have information that can help. Angelo was installed, however briefly, at the Flaming Fist headquarters ion the southwest quadrant of the city. That is the best place to start.~ EXIT
  IF ~~ THEN REPLY ~I do not really see eye to eye with the Flaming Fist. I suppose I could talk to them... if I feel like it. We'll see.~ DO ~SetGlobal("D5PostCoronation","GLOBAL",1)~ JOURNAL ~The Hunt for Sarevok
Sarevok's coronation as a grand duke was interrupted, but he escaped to an unknown location. The dukes have suggested that an officer of the Flaming Fist who may have worked with Angelo might have information that can help. Angelo was installed, however briefly, at the Flaming Fist headquarters ion the southwest quadrant of the city. That is the best place to start.~ EXIT
END

IF ~GlobalGT("D5PostCoronation","GLOBAL",0) Global("D5SarevokDead","GLOBAL",0)~ THEN BEGIN d5liia_6
  SAY ~I urge you to find Sarevok and bring him to justice. It would be a boon for the city... and it would go a long way toward shoring up your own credibility and reputation.~
  IF ~~ THEN REPLY ~Right. I am on it.~ EXIT
  IF ~~ THEN REPLY ~I do what I want to do, you aren't my boss.~ EXIT
END

END
>>>>>>>> 
COPY ~d5/belt+.d~ ~weidu_external/reflections/compile/liia+.d~
COMPILE ~weidu_external/reflections/compile/liia+.d~

Note: for reasons of exigency I have simply given both Belt and Liia the same dialogue lines. The dialogue will only fire once, so the player will not actually see that, so it kind of doesn't matter. But for sure it is not great characterization. As I say, we can come back later and differentiate them.

The next step will be talking to the Flaming Fist to try to track down Sarevok. But it occurred to me, what if your reputation is 1 because you have Dorn in the party and you are a loathsome pair of murder-hobos? Well, in any event, whether with good intentions or not, you did just save the lives of the Dukes. So I will add a block to the Palace area script that will run a one-time check and, if your rep is lower than 8, raise it to 8.

Spoiler
<<<<<<<< d5/area0108.baf
IF
	Global("D5DukesRepReset","GLOBAL",0)
	Global("D5PostCoronation","GLOBAL",1)
	ReputationLT("Player1",8)
THEN
	RESPONSE #100
		ReputationSet(8)
		SetGlobal("D5DukesRepReset","GLOBAL",1)
END
>>>>>>>>
COPY ~d5/area0108.baf~ ~weidu_external/reflections/compile/%bg1_area_prefix%0108.baf~

ACTION_IF (FILE_EXISTS_IN_GAME ~%bg1_area_prefix%0108.bcs~) BEGIN
  EXTEND_TOP ~%bg1_area_prefix%0108.BCS~ ~weidu_external/reflections/compile/%bg1_area_prefix%0108.baf~
END

ACTION_IF !(FILE_EXISTS_IN_GAME ~%bg1_area_prefix%0108.bcs~) BEGIN
  COMPILE ~weidu_external/reflections/compile/%bg1_area_prefix%0108.baf~
END

That, again, does not assume the area script already exists. Such caution may be silly, but it should not hurt anything.

Finally, after the dukes send you to speak with someone in the Flaming Fist, we want to create a Flaming Fist officer who will actually talk about this stuff. Let's make a clone of Officer Jenks from SoD:

Spoiler
COPY_EXISTING ~bdjenks.cre~ ~override/d5njenk.cre~
  SAY 0x08 ~Captain Gregson~
  SAY 0x0c ~Captain Gregson~
  WRITE_ASCII 0x280 ~d5njenk~ #20	// script name
  WRITE_ASCII 0x2cc ~d5njenk~ #8	// creature dialogue file name
IF_EXISTS

We don't want it to actually be Jenks, so the filename, creature script, and script name will be "NJenk." I'll name him Captain Gregson, after a relatively competent policeman from the Sherlock Holmes stories. (EDIT - in my local version I have changed the filename et al. to "D5Gregs.") Now let's add a block to the Flaming Fist headquarters area script that will spawn Captain Gregson:

Spoiler
<<<<<<<< d5/area0607.baf
IF
	Global("D5GregsonExist","GLOBAL",0)
	Global("D5PostCoronation","GLOBAL",1)
THEN
	RESPONSE #100
		CreateCreature("d5gregs",[1120.850],14)
		SetGlobal("D5GregsonExist","GLOBAL",1)
END
>>>>>>>>
COPY ~d5/area0607.baf~ ~weidu_external/reflections/compile/%bg1_area_prefix%0607.baf~

ACTION_IF (FILE_EXISTS_IN_GAME ~%bg1_area_prefix%0607.bcs~) BEGIN
  EXTEND_TOP ~%bg1_area_prefix%0607.BCS~ ~weidu_external/reflections/compile/%bg1_area_prefix%0607.baf~
END

ACTION_IF !(FILE_EXISTS_IN_GAME ~%bg1_area_prefix%0607.bcs~) BEGIN
  COMPILE ~weidu_external/reflections/compile/%bg1_area_prefix%0607.baf~
END

The NPC will spawn at coordinate x=1120, y=850. The way I find this out is to inspect the .ARE file in Near Infinity (AR0607.ARE in BGEE/SoD, BG0607.ARE in EET). Clock the "View Area" button, and you will see the entire are in a window. As you move your mouse around the area, the coordinates will change in the bottom-right section of the window. In this way you can find just the right spot to CreateCreature() an NPC or monster, or place an info/travel trigger, or whatnot.

We need to give Gregson some dialogue, in which 1) he will point you toward Korlasz as a possible lead to find Sarevok; and 2) we will set a variable that we will use later as we approach Korlasz' crypt.

Spoiler
<<<<<<<< d5/d5njenk.d
IF ~Global("D5NJenksCrypt","GLOBAL",0)~ THEN BEGIN d5njenk_0
  SAY ~Can I help you? I'm afraid we don't have the time for civilian inquiries at the moment.~
  IF ~~ THEN GOTO d5njenk_1
END

IF ~~ THEN BEGIN d5njenk_1
  SAY ~Say, I know you. You're that troublemaker that Angelo wanted us to arrest!~
  IF ~~ THEN GOTO d5njenk_2
END

IF ~~ THEN BEGIN d5njenk_2
  SAY ~Heh heh. Well, an enemy of Angelo's is a friend of mine. That guy was no good for the Fist. What can I do for you?~
  IF ~~ THEN REPLY ~I am trying to track down Sarevok Anchev. He was working with Angelo and I need to put a stop to their scheming, once and for all. Do you have any information about where they might be?~ GOTO d5njenk_3
  IF ~~ THEN REPLY ~Nothing right now. I have to do some things, then maybe I will be back.~ EXIT
END

IF ~~ THEN BEGIN d5njenk_3
  SAY ~I can't say that I do. I'm sorry. However... Sarevok and Angelo didn't exactly hide their activities. Why should they? A grand duke and the leader of the Flaming fist!~
  IF ~~ THEN GOTO d5njenk_4
END

IF ~~ THEN BEGIN d5njenk_4
  SAY ~When Sarevok was angling to become a duke, he was courting favor with most of the city's noble families. Some were more eager than others to work with him. One in particular, name of Korlasz, seemed unusually eager to get involved. Well, I asked around a bit - quiet, like - and rumor has it she is into some dark magicks.~
  IF ~~ THEN REPLY ~Do you think Korlasz might have information on where Sarevok and Angelo are now? Where is her estate?~ GOTO d5njenk_5
END

IF ~~ THEN BEGIN d5njenk_5
  SAY ~Funny thing, that. I already sent some men 'round to her house. But nobody was home. And nobody has come or gone in some time. But, here's where it gets interesting. There was one time, when Angelo met with this Korlasz, and he ordered a squad of Fist men to accompany him for protection. But they didn't go to her house. See, Korlasz also has a big fancy crypt for her family, right in the middle of the city. And that's where the meet took place.~
  IF ~~ THEN GOTO d5njenk_6
END

IF ~~ THEN BEGIN d5njenk_6
  SAY ~Now, I have to ask myself: why would they want to hold a meeting in a bleedin' mausoleum? It's a head-scratcher, hey? But I tell you what: I would like to see this mausoleum. I would like that very much. Who knows? Maybe we will find Angelo there. I would quite like to see him strapped to a hard chair in the basement, and asnwer some questions for me.~
  IF ~~ THEN REPLY ~I would like that as well. Can you tell me where this crypt is? It's all I have to go on.~ GOTO d5njenk_7
  IF ~~ THEN REPLY ~Tell me where the crypt is. You should stay here - you will only get in my way.~ GOTO d5njenk_8
END

IF ~~ THEN BEGIN d5njenk_7
  SAY ~It is right near the center of the city, north of the harbor near the steps to the entrance in the old walls. I am already gathering a force to go there and get inside, by force if necessary. We are heading there soon; if you want to join, you can meet me there. I won't lie, I wouldn't mind having someone with your... capabilities... along with my men.~
  IF ~~ THEN REPLY ~Sounds good.~ JOURNAL ~The Hunt for Sarevok
I spoke with Captain Gregson of the Flaming Fist. He did not know where Sarevok and Angelo may be, but he mentioned a member of the noble class, Korlasz, who had some suspicious dealings with Angelo at her family's crypt in the center of the city. Captain Gregson intends to enter the crypt and look for clues. It is as good a place to start as any. The entrance to the crypt is near the gate in the inner city walls, just north of the harbor. Captain Gregson will meet me there with a company of Flaming Fist soldiers.~ GOTO d5njenk_9
  IF ~~ THEN REPLY ~I've got some things to do first. I will meet you there when I am done.~ JOURNAL ~The Hunt for Sarevok
I spoke with Captain Gregson of the Flaming Fist. He did not know where Sarevok and Angelo may be, but he mentioned a member of the noble class, Korlasz, who had some suspicious dealings with Angelo at her family's crypt in the center of the city. Captain Gregson intends to enter the crypt and look for clues. It is as good a place to start as any. The entrance to the crypt is near the gate in the inner city walls, just north of the harbor. Captain Gregson will meet me there with a company of Flaming Fist soldiers.~ GOTO d5njenk_9
END

IF ~~ THEN BEGIN d5njenk_8
  SAY ~Sorry friend, but I'm not sitting this one out. If you want in, you can meet me there. The crypt is right near the center of the city, north of the harbor near the steps to the entrance in the old walls. I won't lie, I wouldn't mind having someone with your... capabilities... along with my men. If things get violent, though, you make sure that big weapon of yours is pointed in the right direction. Understand?~
  IF ~~ THEN REPLY ~Fine, I will meet you there. But your men better not slow me down.~ JOURNAL ~The Hunt for Sarevok
I spoke with Captain Gregson of the Flaming Fist. He did not know where Sarevok and Angelo may be, but he mentioned a member of the noble class, Korlasz, who had some suspicious dealings with Angelo at her family's crypt in the center of the city. Captain Gregson intends to enter the crypt and look for clues. It is as good a place to start as any. The entrance to the crypt is near the gate in the inner city walls, just north of the harbor. Captain Gregson will meet me there with a company of Flaming Fist soldiers.~ GOTO d5njenk_9
  IF ~~ THEN REPLY ~No promises.~ JOURNAL ~The Hunt for Sarevok
I spoke with Captain Gregson of the Flaming Fist. He did not know where Sarevok and Angelo may be, but he mentioned a member of the noble class, Korlasz, who had some suspicious dealings with Angelo at her family's crypt in the center of the city. Captain Gregson intends to enter the crypt and look for clues. It is as good a place to start as any. The entrance to the crypt is near the gate in the inner city walls, just north of the harbor. Captain Gregson will meet me there with a company of Flaming Fist soldiers.~ GOTO d5njenk_9
END

IF ~~ THEN BEGIN d5njenk_9
  SAY ~Alright then, I will see you there.~ 
  IF ~~ THEN DO ~SetGlobal("D5NJenksCrypt","GLOBAL",1)~ DO ~EscapeArea()~ EXIT
END
>>>>>>>> 
COPY ~d5/d5njenk.d~ ~weidu_external/reflections/compile/d5njenk.d~
COMPILE ~weidu_external/reflections/compile/d5njenk.d~

Captain Gregson will EscapeArea() after this conversation. Because he won't be around to say it again, we will create a journal entry telling the player where to go. I also added a journal entry from Belt/Liia to take the place of the one that will no longer happen in the original dialogue branch. Note to self, since we are in the main plot of the game, I probably need to do this more extensively and make sure all journal entreis are properly handled. Another thing I have never done before, so... learning by doing.

Based on the variable we set at the end, Gregson will appear outside Korlasz' crypt. The plan is to match how EndlessBG1 places it in the game, to maximize compatibility. At that point we will APPEND some more dialogue to Captain Gregson, which will be how we actually enter the crypt (again following the example of Endless BG1 for compatibility).

But that for Step 4. Step 4 will bring Korlasz' dungeon forward from the SoD campaign to the BG1 campaign. It will need inspection of Endless BG1 so that they can work together, and it will need to adjust a bunch of dialogues there which express an assumption that Sarevok is already dead. And then make sure all game variables are straight to go from there to actually finding and battling Sarevok. I anticipate that will be a fair bit more work, so the next post probably won't go up as quickly.

Edited by subtledoctor
Link to comment
17 hours ago, subtledoctor said:

But using one or two .ARE files and doing your own creatures/scripts/whatnot should not be a problem.

Yes, I didn't read carefully enough. I was referring to making your whole mod idea BGT compatible, i.e. introducing the SoD content into BGT, which would definitely too much.

Link to comment

Neither here nor there, but going through the end of BG1 and making these changes, I am simultaneously playing Siege of Dragonspear. And, man, I am remembering that this thing has some problems. There are some issues with the writing - in the discussion with Caelar at the bridge, there are questions and responses that almost don't seem to line up? I can't tell if it is just the way it is written - some of the dialogue with Irenicus in BG2 was like that - or if one of the mods I installed has a bug leading to mismatched states and transitions. I mean, bugs are one thing and writing that's a little off is one thing... but you should be able to tell one from the other!

But there are larger problems with the plot. The whole "why would she let Hephernaan lead by the nose?" question. The fact that she so openly knows you are a Bhaalspawn - when did you tell anyone that? Did I miss an important moment in BG1? How is everyone so up in your business about this? And the "join me, it will be the dawn of a new age" stuff is just... not ripe. Like, I'm sitting here waiting for her to tell me she is my father, and then cut off my hand with that glowing sword...

Anyway, getting excited about this BG1 mod while also feeling critical of SoD is making me think that my original plan was good, maybe even necessary: I have to completely rewrite SoD. I've already got it mostly plotted out.

But first things first.

Link to comment
Posted (edited)

I have been looking into what it necessary to play through Korlasz' dungeon before confronting Sarevok. The basics are fairly simple: the area and all the creatures in it already exist, so we need to 1) place a travel trigger in Baldur's Gate, 2) enable getting into and out of the dungeon, and 3) change some of the dialogues inside so that they do not reference Sarevok being dead.

But boy, there are a lot of issues that are created along with that. I looked at how EndlessBG1 handles this, and... there are a bunch of fairly complicated script and dialogue patches. @jastey is very gracious in sharing it. But working with other people's code that you don't know inside and out is never comfortable. I think I can suss out which ones are necessary here, and which ones are not. (A bunch of the code in EndlessBG1 is geared toward having the dukes send you there after defeating Sarevok.) That will end ups being a HUGE time-saver. However, because it means implementing code with which I am not fully familiar it also means a fair amount of testing will be required. Which is not super easy - I guess I will have to quick-play a game up to chapter 7, or something, and try to stay out of the area in the center of Baldur's Gate? And stay out of the palace. Oy.

This also makes me think: Imoen presents a major conundrum. I mean I guess this has always been the case, but now it is more directly my conundrum. At this stage of the game, Imoen could be

  1. in the party
  2. never in the party or long-since departed
  3. in the party for most of BG1 but recently departed
  4. dead (or petrified by a basilisk or something)

I think the code in EndlessBG1 gracefully handles this as far as Korlasz' dungeon is concerned... I think? If she is in your party, she should go through the dungeon with you. (I think this is from EndlessBG1, and not from Imoen Forever... right?). And if she is not in your party, she should simply not appear in the dungeon. I think that is the best thing to do, and if this is not already covered by EndlessBG1 I think I can handle it myself.

BUT, down the road there is a bigger issue: the new beginning of Siege of Dragonspear involves Imoen being poisoned and bursting into your room seeking help. I don't love this from the SoD writers (it's basically fridging Imoen... again), nevertheless it is fairly unavoidable without rewriting major portions of SoD.  But given the four possibilities above for Imoen's status, how does she get there? I have a current savegame right before the transition to SoD, with EET and EndlessBG1 installed. I fired it up, brutally murdered Imoen, then triggered the transition, and... there she was, running into my room and getting poisoned. I think the mod will have to address this. And I'm not sure there are any really great ways to do so. We can detect which of those four states she is in easily enough. But if she is dead or out of the party, this will mean scripting a sequence where she appears in the palace and is like "Heya! It's me, Imoen!" and gets to stay with the dukes even if she has not been in your party much, or at all.

Off the top of my head, if she has not been in the party since before your return to Candlekeep, we can say that she snuck in and witnessed Rieltar's murder, or some evidence about it. And when she heard Charname was wanted for the murder, she traveled to the palace to try to clear your name. And now she is being housed there and protected as an informant?

Maybe something like that? Suggestions welcome!

Edited by subtledoctor
Link to comment

Endless BG1 gives Imoen her default tour guide role in Korlasz dungeon if she is not in your party.

I don't see a big problem with Imoen being in the palace at the start of SoD even if she wasn't in your party. She is apprenticed to Duke Jannath, it's not difficult to imagine - and explain with a line or two - that she made her own way to the city. She is no less a Bhaalspawn than you, it's ok if she is a part of the overarching story whether at your side or not.

Edited by megrimlock
Link to comment
Posted (edited)
1 hour ago, megrimlock said:

She is apprenticed to Duke Jannath, it's not difficult to imagine - and explain with a line or two - that she made her own way to the city.

Yes. But I think that line or two could look very different depending on how long she has been out of the party, or if she died and you removed her portrait without resurrecting her. Which, I guess, easy enough - I can just write four different sets of two-line explanations, and use the appropriate ones. 

In this mod, since you will go to Korlasz’ dungeon before Imoen apprentices with Liia (and because we really don’t need it to be a tutorial), I think I will depart from the EndlessBG1 practice and keep Imoen out of it entirely. 

Edited by subtledoctor
Link to comment
2 hours ago, subtledoctor said:

(I think this is from EndlessBG1, and not from Imoen Forever... right?).

Yes. The "Imoen stays in group in Korlasz Dungeon" from I4E is not compatible with EndlessBG1's "Korlasz Dungeon in BG1" (and vice versa).

2 hours ago, subtledoctor said:

And if she is not in your party, she should simply not appear in the dungeon. I think that is the best thing to do, and if this is not already covered by EndlessBG1 I think I can handle it myself.

EndlessBg1 leaves "tourguide" Imoen in if she is not in party.

Link to comment
Posted (edited)
3 hours ago, jastey said:

EndlessBg1 leaves "tourguide" Imoen in if she is not in party.

Okay I think I see how to remove her.

I think I have most of this done... just need to go into the dialogues with Korlasz and her various subordinates, and remove/rewrite the lines that mention Sarevok being dead, and the bit about his sword. Then a bunch of testing, with and without EndlessBG1.

Edited by subtledoctor
Link to comment
Posted (edited)

I'm still here. This bit about Korlasz' dungeon is kicking my butt. I'm so close to getting it done. Just need to tweak one or two conditions - e.g. I finally got rid of tour guide Imoen... but I was too thorough and now she doesn't show up even if you start SoD as a new campaign. Also, I need to write some journal entries.

On the bright side, in testing it, I really like how it plays. The end of the BG1 campaign gets stretched out, letting you breath a bit before rushing to the finale. And, has a professionally made prestige dungeon added in! What's not to like?

Most of the later steps should be way easier and quicker than this one.

  • Part 5 is a few lines of dialogue and a cut scene. I've never made a cut scene before! :7up:  but it is an exceedingly simple one - just somebody bursting into a room and butting into an ongoing dialogue. Piece of cake. Probably.
  • Part 6 is altering the end of the Sarevok fight, so that it doesn't end the campaign. EndlessBG1 already does this and it seems fairly straightforward. I only need to apply one very tiny difference: I need to make a body disappear. (I know - we've all been there, right?) **
  • Part 7 is yet more dialogue, this one implementing a choice of whether to go on to SoD or SoA. I expect the transition to SoD will be a little tricky, but here too EndlessBG1 has already done it and I want it to be as close as possible, for the sake of compatibility. Also I probably need to stick The Return Of Imoen in here.
  • Part 8 is another cut scene - but this one will be very tricky. I need to script some spell effects that cannot actually be scripted. This will be the second-hardest part of the mod, probably.
  • Part 9 is bringing another part of SoD forward into BG1... but this time it should be way simpler. The SoD-related variables and stuff won't matter, since this part will only take effect if you choose to skip SoD.
  • Part 10 - yeah, we have a part 10 now! - will involve modding the very end of SoD, after the return from Avernus. I am playing SoD right now, so when I get to the end I will have a better sense of how much work this will be.

An open-ended question: should there be a Part 11. Which would be more small adjustments to earlier parts of the BG1 campaign, dropping a couple more small hints that Irenicus is not sitting on his hands the whole time, but actively advancing his own plans. Very small stuff - smaller than killing Thalantyr, for sure. Nothing has popped into my head but I haven't thought hard about it yet. If anyone has ideas feel free to mention them.

** EDIT - although... see below.

Edited by subtledoctor
Link to comment

One of the difficulties with dropping hints about Irenicus doing things during BG1 is that the opening scene in Waukeen's Promenade makes clear that even the guys whose literal job it is to stamp out rogue mages like him don't even know that his base of operations is right under their noses. So that makes it somewhat harder for the folk in Nashkel to say something like "There's a big ole powerful mage causing trouble in Athkatla".

Link to comment
2 minutes ago, megrimlock said:

One of the difficulties with dropping hints about Irenicus doing things during BG1 is that the opening scene in Waukeen's Promenade makes clear that even the guys whose literal job it is to stamp out rogue mages like him don't even know that his base of operations is right under their noses. So that makes it somewhat harder for the folk in Nashkel to say something like "There's a big ole powerful mage causing trouble in Athkatla".

Well, yeah, that would not work. I even the existing thing with the spider lady in the Cloakwood is rather ham-fisted and generally bad. I would consider very much subtler signs. Like, maybe a duergar is nosing around Gullykin, the second time you visit it. He isn't harming anyone, he won't talk to you, doesn't given anything away. Just... there. Maybe an off-hand comment from a local halfling like "you don't see that every day!" but literally nothing more than that. Maybe a pair of dryads in the Cloudpeaks, talking to each other about their sisters, but they run away if you try to talk to them. I don't know. Just tiny little bits that are reminiscent of things connected to Irenicus. But could also be coincidences, and would be missed entirely by someone who hasn't played BG2 10+ times. Some very, very light foreshadowing.

-------------

I said above that the Sarevok fight adustment would be easy... but I was thinking about whether to make changes to the Sarevok fight itself. There are hints in what I've been writing that suggest Sarevok has a Plan B. I mean, he's a pretty competent strategist, why wouldn't he? And what's this thing about retreating to the Undercity and trying to draw Charname there? Why not just leave? I have an idea that there is a bit more significance to Sarevok luring you to a prepared battleground, which just happens to be a temple to the god of murder, which just happens to be sarevok's father and the subject of a major prophecy. Very roughly, the idea is that Sarevok has prepared some rituals or the like, which mean that his killing a relatively powerful Bhaalspawn in that location will empower him in some nontrivial way. It doesn't work both ways, of course - Charname didn't prepare the rituals. But it would explain why Sarevok collects the remnants of his followers and resources there, and risks so much for the final confrontation.

BUT, if that is the idea... it should be reflected in the mechanics of the fights. I was thinking, maybe, everytime someone dies during the fight (anyone), Sarevok himself would get a stat boost and maybe healed some hit points. Or - or maybe and - if Sarevoks hit points go below 10%, one of his teammates dies and gives him the bonus, being him back up to 50%. Something like that, just to show he is benefiting from the arena itself, and you will need to overcome that.

The problem with this idea is, would it be incompatible with existing mods that alter this fight. Which, I guess SCS is the only one. (But I don't like the SCS version very much!)

Link to comment
Posted (edited)

Part 4: Fight the Future

Okay, I think I've got this part set. This post is going to be less tutorial-y, and more about the reality of making mods for this game. Because, at least if you are me, you maybe don't entirely know exactly what everything does in the mod you publish. Someone helps you, someone on the forums writes a function for you, and you put it in your mod and it works... but maybe you don't entirely know why. It happens! The important thing is that you made a cool thing, which actually installs and works.

So, as has been mentioned, the EndlessBG1 mod has a component called "Korlasz' Dungeon Is In BG1." Sound familiar? Yes! But there is a key difference: EndlessBG1 keeps the basic plot of the BG1-SoD transition, whereby you defeat Sarevok, and then the Dukes ask to to go after the rest of his former allies and followers. The plot is a bit thin. Really Beamdog just needed a mod-level tutorial dungeon that could occur after the end of BG1 but before you leave the city to confront Caelar Argent in SoD. In addition to moving the dungeon for some cool gameplay, I want to improve the narrative, by making the dungeon an integral part of your progression to the finale of BG1 - not an afterthought clean-up quest.

The content of that EndlessBG1 component basically does two things:

  1. It places the dungeon in the BG1 maps and handles the technical issues of being in that dungeon before the actual SoD campaign has started
  2. It arranges the post-Sarevok-fight dialogue of Duke Belt et al. to send you to Korlasz' dungeon (literally, teleporting you there), and to acknowledge your completion of the dungeon in preparation of moving you to the assassination attempt and departure from the city

We definitely want to glom on to #1. The technical issues are myriad: for example, there are scripted events that advance variables that the game only expects to be advanced in the SoD campaign. There is the issue of Imoen being an out-of-party NPC giving you guidance, when you might be approaching the dungeon with Imoen in your party. Et cetera. But we definitely do not want EndlessBG1's handling of the dukes' dialogue, since it is all about how Sarevok is dead, and you are the Hero of Baldur's Gate (gag), and with the Reflections mod none of that has happened yet. So what I have done, is basically copy about two thirds of that EndlessBG1 component, and paste it directly into this mod:

Spoiler
ACTION_IF GAME_IS ~eet~ THEN BEGIN
  INCLUDE ~EET/other/cpmvars/eet_cpmvars.tpa~
END

INCLUDE ~%MOD_FOLDER%/lib/get_response_strrefs.tph~

// ADJUSTMENTS to KORLASZ' DUNGEON BORROWED FROM ENDLESSBG1:

ACTION_IF (GAME_IS ~bgee~) BEGIN
  OUTER_SPRINT ~bgee_only~ ~False()~
  OUTER_SPRINT ~sod~ ~~
  OUTER_SPRINT ~eet_only~ ~False()~
  OUTER_SPRINT ~start_bg1end_sod_cutscene~ ~ClearAllActions()
		StartCutSceneMode()
		StartCutScene("c#st2sod")~
  OUTER_SPRINT ~move_to_bg2~ ~~
  OUTER_SPRINT ~bdresurr~ ~bdresurr~
  OUTER_SPRINT ~bddispel~ ~bddispel~
  OUTER_SPRINT ~clearcld~ ~clearcld~
  OUTER_SPRINT ~BELT~ ~BELT~
  OUTER_SET BGTIMOENPState0 = 0 
  OUTER_SET BGTIMOENPState4 = 4
  OUTER_SPRINT ~eet_2~ ~~
  OUTER_SPRINT ~eet_0~ ~~
  OUTER_SET eet_200000 = GAME_IS ~eet~ ? 200000 : 0
  OUTER_SPRINT CentralBaldursGate ~AR0700~
END

ACTION_IF (GAME_IS ~eet~) BEGIN
  OUTER_SPRINT ~bgee_only~ ~False()~
  OUTER_SPRINT ~sod~ ~~
  OUTER_SPRINT ~eet_only~ ~~
  OUTER_SPRINT ~start_bg1end_sod_cutscene~ ~ClearAllActions()
		StartCutSceneMode()
		StartCutScene("c#st2sod")~
  OUTER_SPRINT ~bdresurr~ ~bdresurr~
  OUTER_SPRINT ~bddispel~ ~bddispel~
  OUTER_SPRINT ~clearcld~ ~clearcld~
  OUTER_SPRINT ~BELT~ ~BELT~
  OUTER_SET BGTIMOENPState0 = 0 
  OUTER_SET BGTIMOENPState4 = 4
  OUTER_SPRINT ~eet_2~ ~2~
  OUTER_SPRINT ~eet_0~ ~0~
  OUTER_SET eet_200000 = GAME_IS ~eet~ ? 200000 : 0
  OUTER_SPRINT CentralBaldursGate ~BG0700~
END

// Add Entrance to Korlasz Dungeon to BG city: ar0700.are 
COPY_EXISTING ~%bg1_area_prefix%0700.are~ ~override~
  LAUNCH_PATCH_FUNCTION  ~fj_are_structure~
    INT_VAR
    fj_type         = 2    //travel
    fj_box_left     = 1005  //kleinstes x
    fj_box_top      = 3172  //kleinstes y
    fj_box_right    = 1150  //grˆfltes x
    fj_box_bottom   = 3300   //grˆfltes y
    fj_cursor_idx   = 28 //stairs
    fj_vertex_0     = 1005 + (3300 << 16)   //kleinstes x +  kleinstes y
    fj_vertex_1     = 1150 + (3299 << 16)   //grˆfltes x + kleinstes y
    fj_vertex_2     = 1142 + (3172 << 16)   //grˆfltes x + grˆfltes y
    fj_vertex_3     = 1017 + (3176 << 16)   //kleinstes x + grˆfltes y
    STR_VAR
    fj_structure_type   = region
    fj_name             = C#EBG1_TranBD0120
    fj_destination_area = EVAL ~bd0120~
    fj_destination_name = EVAL ~C#EBG1_Exit0700~ 
  END
// add info trigger for closed entrance 
  LAUNCH_PATCH_FUNCTION  ~fj_are_structure~
    INT_VAR
    fj_type         = 1    //trigger
    fj_box_left     = 1005  //kleinstes x
    fj_box_top      = 3172  //kleinstes y
    fj_box_right    = 1150  //grˆfltes x
    fj_box_bottom   = 3300   //grˆfltes y
    fj_cursor_idx   = 22 //question mark
    fj_vertex_0     = 1005 + (3300 << 16)   //kleinstes x +  kleinstes y
    fj_vertex_1     = 1150 + (3299 << 16)   //grˆfltes x + kleinstes y
    fj_vertex_2     = 1142 + (3172 << 16)   //grˆfltes x + grˆfltes y
    fj_vertex_3     = 1017 + (3176 << 16)   //kleinstes x + grˆfltes y
    fj_info_point_strref = RESOLVE_STR_REF (@40024)
    STR_VAR
    fj_structure_type   = region
    fj_name             = c#ebg1korlasz
//    fj_reg_script   = c#ebg1ko
  END
BUT_ONLY

// Add Entrance to Korlasz Dungeon to BG Docks: ar1200.are 
COPY_EXISTING ~%bg1_area_prefix%1200.are~ ~override~
  LAUNCH_PATCH_FUNCTION  ~fj_are_structure~
    INT_VAR
    fj_type         = 2    //travel
    fj_box_left     = 1019  //kleinstes x
    fj_box_top      = 74  //kleinstes y
    fj_box_right    = 1154  //grˆfltes x
    fj_box_bottom   = 189   //grˆfltes y
    fj_cursor_idx   = 28 //stairs
    fj_vertex_0     = 1030 + (186 << 16)   //kleinstes x +  kleinstes y
    fj_vertex_1     = 1154 + (189 << 16)   //grˆfltes x + kleinstes y
    fj_vertex_2     = 1152 + (78 << 16)   //grˆfltes x + grˆfltes y
    fj_vertex_3     = 1019 + (74 << 16)   //kleinstes x + grˆfltes y
    STR_VAR
    fj_structure_type   = region
    fj_name             = C#EBG1_TranBD0120
    fj_destination_area = EVAL ~bd0120~
    fj_destination_name = EVAL ~C#EBG1_Exit0700~ 
  END
// add info trigger for closed entrance 
  LAUNCH_PATCH_FUNCTION  ~fj_are_structure~
    INT_VAR
    fj_type         = 1    //trigger
    fj_box_left     = 1019  //kleinstes x
    fj_box_top      = 74  //kleinstes y
    fj_box_right    = 1154  //grˆfltes x
    fj_box_bottom   = 189   //grˆfltes y
    fj_cursor_idx   = 22 //question mark
    fj_vertex_0     = 1030 + (186 << 16)   //kleinstes x +  kleinstes y
    fj_vertex_1     = 1154 + (189 << 16)   //grˆfltes x + kleinstes y
    fj_vertex_2     = 1152 + (78 << 16)   //grˆfltes x + grˆfltes y
    fj_vertex_3     = 1019 + (74 << 16)   //kleinstes x + grˆfltes y
    fj_info_point_strref = RESOLVE_STR_REF (@40024)
    STR_VAR
    fj_structure_type   = region
    fj_name             = c#ebg1korlasz
//    fj_reg_script   = c#ebg1ko
  END

// Korlasz crypt bd0120 
// patch bdrope.bcs so it doesn't initiate Imoen's dialogue
COPY_EXISTING ~bdrope.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
// cases for Imoen in party 
		SPRINT textToReplace ~\(See("imoen2?")\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY CASE_INSENSITIVE ~%textToReplace%~ ~\1 Global("C#EBG1_KorlaszQuest","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
BUT_ONLY

<<<<<<<< d5/bdrope-et.baf
// patch bdrope.bcs so it teleports the group out
IF
	Clicked([ANYONE])
	NearLocation(LastTrigger,790,1660,12)
	Global("C#EBG1_ChangeRopeTrigger","MYAREA",2) 
THEN
	RESPONSE #100
		ClearAllActions()
		StartCutSceneMode()
		StartCutSceneEx("c#st2bc",TRUE)
END
>>>>>>>>
COPY ~d5/bdrope-et.baf~ ~weidu_external/%MOD_FOLDER%/compile/bdrope-et.baf~
EXTEND_TOP ~bdrope.bcs~ ~d5/bdrope-et.baf~ EVALUATE_BUFFER

/* Add Travel points and Entrance point to Koralsz' Crypt bd0120.are */
COPY_EXISTING ~bd0120.are~ ~override~
/* travel region to SoD-area bd0050 - EDIT don't need this in Reflections
  LAUNCH_PATCH_FUNCTION  ~fj_are_structure~
    INT_VAR
    fj_type         = 2    //travel
    fj_box_left     = 750  //kleinstes x
    fj_box_top      = 1528  //kleinstes y
    fj_box_right    = 810  //grˆfltes x
    fj_box_bottom   = 1683   //grˆfltes y
    fj_cursor_idx   = 28 //stairs
    fj_vertex_0     = 756 + (1683 << 16)   //kleinstes x +  kleinstes y
    fj_vertex_1     = 810 + (1681 << 16)   //grˆfltes x + kleinstes y
    fj_vertex_2     = 804 + (1532 << 16)   //grˆfltes x + grˆfltes y
    fj_vertex_3     = 750 + (1528 << 16)   //kleinstes x + grˆfltes y
    STR_VAR
    fj_structure_type   = region
    fj_name             = C#EBG1_TranBD0050
    fj_destination_area = EVAL ~bd0050~
    fj_destination_name = EVAL ~C#EBG1_Exit0120~ 
  END
*/
  LAUNCH_PATCH_FUNCTION  ~fj_are_structure~
    INT_VAR
    fj_loc_x       = 920    //x
    fj_loc_y       = 1601   //y
    fj_orientation = 13
    STR_VAR
    fj_structure_type = entrance
    fj_name           = C#EBG1_Exit0700
  END
BUT_ONLY

// cutscene out of Korlasz dungeon in bdrope.bcs 
COMPILE ~%MOD_FOLDER%/data/korlasz_dungeon/c#st2bc.baf~ EVALUATE_BUFFER

COMPILE ~%MOD_FOLDER%/data/korlasz_dungeon/c#st2kd.baf~

// Inside Korlasz' Dungeon: disable all instances that make no sense for Imoen in party, but do it non-destructively. Thank you argent77 for the code! 
INCLUDE ~%MOD_FOLDER%/data/korlasz_dungeon/add_trans_trigger_imoen_in_kd_ebg1.tpa~

// change dialogue of the FF soldiers at crypt exit, and prevent them to transition to bdimoen: BDFF1000.dlg 
// #69736 /* ~Thank you. I'm ready to return to the Ducal Palace now.~ */
// List of all potential response strrefs to check
ACTION_DEFINE_ASSOCIATIVE_ARRAY response_strrefs BEGIN
  ~%eet_2%69736~ => 1
END
  
COPY_EXISTING ~BDFF1000.dlg~ ~override~
  // scanning listed dialog states
  PATCH_FOR_EACH state IN 0 BEGIN
    LPF GET_RESPONSE_STRREFS INT_VAR state RET strrefs RET_ARRAY strrefs END
    TEXT_SPRINT indices ~~  // a temporary variable for building the index list
    FOR (i = 0; i < strrefs; ++i) BEGIN
      SET value = $strrefs(~%i%~)
      // Include index only if strref is listed in the response_strrefs array
      PATCH_IF (VARIABLE_IS_SET $response_strrefs(~%value%~)) BEGIN
        TEXT_SPRINT indices ~%indices% %i%~ // building list of indices
      END
    END
    // prevent adding a trigger if index list is empty
    PATCH_IF (~%indices%~ STR_EQ ~~) BEGIN
      TEXT_SPRINT indices %IF ~False()~%
    END
    // initialize variables responses_39, responses_40, ...
    // EVAL is used to create the variable name dynamically
    TEXT_SPRINT EVAL ~responses_BDFF1000_%state%~ ~%indices%~
    PATCH_PRINT ~Variable %state%: %indices%~
  END
BUT_ONLY

// change dialogue of the FF soldiers at crypt exit, and prevent them to transition to bdimoen: BDFF1001.dlg 
// #69732 /* ~I'm ready to return to the Ducal Palace now and report our success.~ */ 
// List of all potential response strrefs to check
ACTION_DEFINE_ASSOCIATIVE_ARRAY response_strrefs BEGIN
  ~%eet_2%69732~ => 1
END
  
COPY_EXISTING ~BDFF1001.dlg~ ~override~
  // scanning listed dialog states
  PATCH_FOR_EACH state IN 0 BEGIN
    LPF GET_RESPONSE_STRREFS INT_VAR state RET strrefs RET_ARRAY strrefs END
    TEXT_SPRINT indices ~~  // a temporary variable for building the index list
    FOR (i = 0; i < strrefs; ++i) BEGIN
      SET value = $strrefs(~%i%~)
      // Include index only if strref is listed in the response_strrefs array
      PATCH_IF (VARIABLE_IS_SET $response_strrefs(~%value%~)) BEGIN
        TEXT_SPRINT indices ~%indices% %i%~ // building list of indices
      END
    END
    // prevent adding a trigger if index list is empty
    PATCH_IF (~%indices%~ STR_EQ ~~) BEGIN
      TEXT_SPRINT indices %IF ~False()~%
    END
    // initialize variables responses_39, responses_40, ...
    // EVAL is used to create the variable name dynamically
    TEXT_SPRINT EVAL ~responses_BDFF1001_%state%~ ~%indices%~
    PATCH_PRINT ~Variable %state%: %indices%~
  END
BUT_ONLY

// change dialogue of the FF soldiers at crypt exit, and prevent them to transition to bdimoen: BDFF1002.dlg 
// #69732 /* ~I'm ready to return to the Ducal Palace now and report our success.~ */ 
// List of all potential response strrefs to check
ACTION_DEFINE_ASSOCIATIVE_ARRAY response_strrefs BEGIN
  ~%eet_2%69732~ => 1
END
  
COPY_EXISTING ~BDFF1002.dlg~ ~override~
  // scanning listed dialog states
  PATCH_FOR_EACH state IN 0 BEGIN
    LPF GET_RESPONSE_STRREFS INT_VAR state RET strrefs RET_ARRAY strrefs END
    TEXT_SPRINT indices ~~  // a temporary variable for building the index list
    FOR (i = 0; i < strrefs; ++i) BEGIN
      SET value = $strrefs(~%i%~)
      // Include index only if strref is listed in the response_strrefs array
      PATCH_IF (VARIABLE_IS_SET $response_strrefs(~%value%~)) BEGIN
        TEXT_SPRINT indices ~%indices% %i%~ // building list of indices
      END
    END
    // prevent adding a trigger if index list is empty
    PATCH_IF (~%indices%~ STR_EQ ~~) BEGIN
      TEXT_SPRINT indices %IF ~False()~%
    END
    // initialize variables responses_39, responses_40, ...
    // EVAL is used to create the variable name dynamically
    TEXT_SPRINT EVAL ~responses_BDFF1002_%state%~ ~%indices%~
    PATCH_PRINT ~Variable %state%: %indices%~
  END
BUT_ONLY

WITH_TRA ~%MOD_FOLDER%/lang/en_US/IMOEN_IN_GROUP_KD_EBG1.TRA~ BEGIN
  COMPILE ~%MOD_FOLDER%/data/korlasz_dungeon/Imoen_in_group_kd_ebg1.d~ EVALUATE_BUFFER
END
EXTEND_BOTTOM ~bdimoen.bcs~ ~%MOD_FOLDER%/data/korlasz_dungeon/c#ebg1im.baf~ EVALUATE_BUFFER

//bd0120.BCS
COPY_EXISTING ~bd0120.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
// cases for Imoen in party 
		SPRINT textToReplace ~\(InPartyAllowDead("imoen2?")\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY CASE_INSENSITIVE ~%textToReplace%~ ~\1 Global("C#st_ImoenInGroupKD","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(!InMyArea("imoen2?")\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 !Global("C#st_ImoenInGroupKD","GLOBAL",1)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("imoen2?",JumpToPoint(\[1770\.1520\]))[%newline%]*ActionOverride("imoen2?",Face(N))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~SetGlobal("C#EBG1_ImoenMoveInCrypt","GLOBAL",1)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("imoen2?",JumpToPoint(\[1545\.700\]))[%newline%]*ActionOverride("imoen2?",Face(NE))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~SetGlobal("C#EBG1_ImoenMoveInCrypt","GLOBAL",2)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
// Other patch stuff to prevent to do SoD scriptings 
		SPRINT textToReplace ~\(Global("BD0120_START","GLOBAL",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~False()~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
BUT_ONLY

ACTION_IF GAME_IS ~eet~ BEGIN
// more patching if it's EET 
  COPY_EXISTING ~bd0120.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(Global("K#NewGame","BD0120",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 !Global("SOD_fromimport","GLOBAL",2)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
  BUT_ONLY
END

EXTEND_TOP ~bd0120.BCS~ ~%MOD_FOLDER%/data/korlasz_dungeon/c#ebg1_kd_bg1_bd0120.baf~ EVALUATE_BUFFER

<<<<<<<< .../bd0120-et.baf
IF
	GlobalGT("C#EBG1_KorlaszQuest","GLOBAL",2)
	GlobalLT("C#EBG1_KorlaszQuest","GLOBAL",99)
	Global("C#EBG1_ClearCresKD","MYAREA",0)
THEN
	RESPONSE #100
		ActionOverride("BDFF1000",DestroySelf())
		ActionOverride("BDFF1001",DestroySelf())
		ActionOverride("BDFF1002",DestroySelf())
		ActionOverride("BDKORLAS",DestroySelf())
		SetGlobal("C#EBG1_ClearCresKD","MYAREA",1)
END

IF
	InPartyAllowDead("%IMOEN_DV%")
	Global("C#st_ImoenInGroupKD","GLOBAL",0)
THEN
	RESPONSE #100
		SetGlobal("C#st_ImoenInGroupKD","GLOBAL",1)
		ApplySpellRES("bdresurr","%IMOEN_DV%")  
		SmallWait(1)
	    ApplySpellRES("bdrejuve","%IMOEN_DV%")  
	  	SmallWait(1)
END

IF
	Global("bd_plot","GLOBAL",2) 
	InMyArea("%IMOEN_DV%")
	!Dead("%IMOEN_DV%")
	!StateCheck("%IMOEN_DV%",CD_STATE_NOTVALID)
THEN
	RESPONSE #100
		ActionOverride("%IMOEN_DV%",StartDialogOverride("bdimoen",Player1))
END

IF
	Global("bd_plot","GLOBAL",2) 
	OR(3) 
		!InMyArea("%IMOEN_DV%") 
		Dead("%IMOEN_DV%")
		StateCheck("%IMOEN_DV%",CD_STATE_NOTVALID)
THEN
	RESPONSE #100
		SetGlobal("bd_plot","GLOBAL",10)
		SetGlobal("BDSH_Imoen_Floor","GLOBAL",1)
END

IF
	GlobalLT("bd_plot","GLOBAL",40)
	OR(2)
		Dead("BDKORLAS")
		Global("BD_KORLASZ_SURRENDER","GLOBAL",1)
	!InMyArea("%IMOEN_DV%")
	InMyArea(Player1)
THEN
	RESPONSE #100
		SetInterrupt(FALSE)
		SetGlobal("bd_plot","GLOBAL",40)
		SetGlobal("bd_Imoen_farewell","bd0120",2)
		SetGlobal("C#EBG1_KorlaszQuest","GLOBAL",2)
		AddJournalEntry(%eet_2%69028,QUEST_DONE)
		SetInterrupt(TRUE)
END

// exit to AR0700.are 
IF
	GlobalGT("C#EBG1_KorlaszQuest","GLOBAL",0)
/*	GlobalGT("bd_plot","GLOBAL",2) */
	GlobalLT("bd_plot","GLOBAL",50)
	GlobalLT("C#EBG1_ChangeRopeTrigger","MYAREA",2)
THEN
	RESPONSE #100
		DisplayStringHead("C#EBG1_TranBD0050",%eet_2%59576)  // A sturdy rope hanging down into the tomb offers the only viable exit from the house of the dead.
		SetGlobal("C#EBG1_ChangeRopeTrigger","MYAREA",2)
END

>>>>>>>>

EXTEND_TOP ~bd0120.BCS~ ~.../bd0120-et.baf~ EVALUATE_BUFFER

/* Korlasz should no longer be in Korlasz crypt if it's done */
<<<<<<<< .../bdshkorl-et.baf
IF
	GlobalGT("C#EBG1_KorlaszQuest","GLOBAL",2)
	GlobalLT("C#EBG1_KorlaszQuest","GLOBAL",99)
	Global("BD_KORLASZ_SURRENDER","GLOBAL",1)
	AreaCheck("bd0120")	
	Global("C#EBG1_ClearKorlaszKD","MYAREA",0)
THEN
	RESPONSE #100
		SetGlobal("C#EBG1_ClearKorlaszKD","MYAREA",1)
		DestroySelf()
END
>>>>>>>>
EXTEND_TOP ~bdshkorl.BCS~ ~.../bdshkorl-et.baf~ EVALUATE_BUFFER

// Imoen should no longer be in Korlasz crypt if it's done 
<<<<<<<< .../bdshimoe-et.baf
IF
	GlobalGT("C#EBG1_KorlaszQuest","GLOBAL",2)
	GlobalLT("C#EBG1_KorlaszQuest","GLOBAL",99)
	GlobalGT("C#EBG1_ImoenIsInKD","GLOBAL",0)
	AreaCheck("bd0120")	
	Global("C#EBG1_ClearImoenKD","MYAREA",0)
THEN
	RESPONSE #100
		SetGlobal("C#EBG1_ClearImoenKD","MYAREA",1)
		DestroySelf()
END
>>>>>>>>
EXTEND_TOP ~bdshimoe.BCS~ ~.../bdshimoe-et.baf~ EVALUATE_BUFFER

//bdintro.BCS
COPY_EXISTING ~bdintro.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(CreateCreature("bdshimoe",\[881\.1652\],NE)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("IMOEN2?",StartDialogNoSet(Player1))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(SetGlobal("bd_npc_camp_chapter","GLOBAL",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(SetGlobal("sprite_is_deadsafana","GLOBAL",0)[%newline%]*SetGlobal("sprite_is_deaddynaheir","GLOBAL",0)[%newline%]*SetGlobal("sprite_is_deadminsc","GLOBAL",0)[%newline%]*SetGlobal("sprite_is_deadrasaad","GLOBAL",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ChangeAIScript("bdplayer",OVERRIDE)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
BUT_ONLY

<<<<<<<< .../bdintro-et.baf
IF
	Global("C#st_ImoenInGroupKD","GLOBAL",0) 
	Global("C#EBG1_ImoenIsInKD","GLOBAL",0) 
THEN
	RESPONSE #100
		CutSceneId(Player1)
		SetGlobal("C#EBG1_ImoenIsInKD","GLOBAL",1)
		CreateCreature("bdshimoe",[881.1652],NE)
		Continue()
END

IF
	Global("SoD_fromimport","GLOBAL",0)
	Global("C#EBG1_ThingsForNewGame","MYAREA",0) 

THEN
	RESPONSE #100
		SetGlobal("bd_npc_camp_chapter","GLOBAL",0)
		ChangeAIScript("bdplayer",OVERRIDE)
		SetGlobal("sprite_is_deadsafana","GLOBAL",0)
		SetGlobal("sprite_is_deaddynaheir","GLOBAL",0)
		SetGlobal("sprite_is_deadminsc","GLOBAL",0)
		SetGlobal("sprite_is_deadrasaad","GLOBAL",0)
		SetGlobal("C#EBG1_ThingsForNewGame","MYAREA",1)
		Continue()
END
>>>>>>>>

EXTEND_TOP ~bdintro.BCS~ ~.../bdintro-et.baf~ EVALUATE_BUFFER

//cutskip.bcs
COPY_EXISTING ~cutskip.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(OpenDoor("door07")[%newline%]*SmallWait(11)[%newline%]*FadeFromColor(\[10\.0\],0)[%newline%]*ActionOverride("IMOEN2?",StartDialogNoSet(Player1))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~
		OpenDoor("door07")
		SmallWait(11)
		FadeFromColor([10.0],0)
		EndCutSceneMode()~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
BUT_ONLY

//bdshcut0.BCS
COPY_EXISTING ~bdshcut0.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(Global("BDSH_Spawn_Imoen","GLOBAL",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("C#st_ImoenInGroupKD","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
BUT_ONLY


//bd0130.BCS
COPY_EXISTING ~bd0130.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(ActionOverride("imoen2?",JumpToPoint(\[1955\.1075\]))[%newline%]*ActionOverride("imoen2?",Face(S))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~SetGlobal("C#EBG1_ImoenMoveInCrypt","GLOBAL",3)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("imoen2?",JumpToPoint(\[3015\.1890\]))[%newline%]*ActionOverride("imoen2?",Face(SE))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~SetGlobal("C#EBG1_ImoenMoveInCrypt","GLOBAL",4)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("imoen2?",JumpToPoint(\[1830\.2390\]))[%newline%]*ActionOverride("imoen2?",Face(SE))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~SetGlobal("C#EBG1_ImoenMoveInCrypt","GLOBAL",5)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("imoen2?",JumpToPoint(\[970\.1435\]))[%newline%]*ActionOverride("imoen2?",Face(N))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~SetGlobal("C#EBG1_ImoenMoveInCrypt","GLOBAL",6)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("imoen2?",JumpToPoint(\[1000\.1060\]))[%newline%]*ActionOverride("imoen2?",Face(N))\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~SetGlobal("C#EBG1_ImoenMoveInCrypt","GLOBAL",7)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
BUT_ONLY

EXTEND_TOP ~bd0130.BCS~ ~%MOD_FOLDER%/data/korlasz_dungeon/c#ebg1_imo_bd0130.baf~ EVALUATE_BUFFER

Yeah, that's like 600 lines of code and it is not the easiest to read. Just take it on faith, as I am taking it on faith, that this is handling those technical issues mentioned above. (It works in EndlessBG1 after all, and I have tested it in this context.) Borrowing code like this is actually not a good method; Jastey might well make updates to Endless BG1, and then the code won't match, and this mod might lag behind and have bugs that have already been fixed. In time this borrowed code will be sectioned off in its own file, so that it will be easy to simply drop in an updated version if need be. And honestly , I have actually come to understand most of what it does, and while I would no doubt write it a bit differently, the content of what it does is exactly how I would do it if I were writing it from scratch. Add travel triggers for the entrance to the dungeon, handle the contingency of Imoen being in the party, patch the dialogues of some minor characters who appear there, add some useful variables for the modified end-of-game parameters, modify some cut scenes, etc.

The relatively huge benefit of borrowing the code in this way is for compatibility. The rest of my code in this section can operate under the assumption that this is the state of things. So I can put a giant conditional clause around all those 600 lines, and say "If EndlessBG1 is installed, just skip all this." It can be skipped, but the rest of this mod will find the state of the game to be identical as if it were not skipped.

And oh yes, there is a lot more to do.

First, we very much do not want Duke Belt to send  us to Korlasz' Dungeon. In Part 3 we met Captain Gregson of the Flaming Fist who was directing us there. We will add him and a small contingent of scouts to Central Baldur's Gate, near the entrance of the dungeon, and his dialgue will trigger the cut scene for entering the dungeon:

Spoiler
// my stuff: add Gregson and some enforcers around the dungeon entrance

<<<<<<<< d5/area0700.baf
IF
	Global("D5GregsonCrypt","GLOBAL",1)
THEN
	RESPONSE #100
		CreateCreature("d5gregs",[1115.3045],14)
		CreateCreature("BDFF1002",[1290.3040],14)
		CreateCreature("BDFF1002",[1420.3200],14)
		CreateCreature("BDFF1002",[960.3100],14)
		CreateCreature("BDFF1002",[850.3265],14)
		SetGlobal("D5GregsonCrypt","GLOBAL",2)
END

IF
	GlobalLT("D5GregsonCrypt","GLOBAL",5)
	GlobalLT("D5KDOpen","GLOBAL",2)
THEN
	RESPONSE #100
		TriggerActivation("C#EBG1_TranBD0120",FALSE)
		SetGlobal("D5KDOpen","GLOBAL",2)
END

IF
	GlobalGT("D5GregsonCrypt","GLOBAL",5)
	!Global("D5KDOpen","GLOBAL",1)
THEN
	RESPONSE #100
		TriggerActivation("C#EBG1_TranBD0120",TRUE)
		SetGlobal("D5KDOpen","GLOBAL",1)
END
>>>>>>>>
COPY ~d5/area0700.baf~ ~weidu_external/%MOD_FOLDER%/compile/%bg1_area_prefix%0700.baf~

ACTION_IF (FILE_EXISTS_IN_GAME ~%bg1_area_prefix%0700.bcs~) BEGIN
  EXTEND_TOP ~%bg1_area_prefix%0700.bcs~ ~weidu_external/%MOD_FOLDER%/compile/%bg1_area_prefix%0700.baf~
END

ACTION_IF !(FILE_EXISTS_IN_GAME ~%bg1_area_prefix%0700.bcs~) BEGIN
  COMPILE ~weidu_external/%MOD_FOLDER%/compile/%bg1_area_prefix%0700.baf~
END

The non-party version of Imoen spawns as part of the initial cut scene where you see two of Korlasz' henchmen talking near the entrance we want to modify that script a bit more, to prevent Imoen spawning if Captain Gregson has been introduced into the game:

Spoiler
<<<<<<<< d5/bdintro+.baf
IF
	Global("D5GregsonExist","GLOBAL",0)
	Global("D5NoReflection","GLOBAL",0)
THEN
	RESPONSE #100
		CreateCreature("BDSHIMOE",[959.1622],NE)  // Imoen
		SetGlobal("D5NoReflection","GLOBAL",1)
END

>>>>>>>>
COPY ~d5/bdintro+.baf~ ~weidu_external/%MOD_FOLDER%/compile/bdintro+.baf~

ACTION_IF (FILE_EXISTS_IN_GAME ~bdintro.bcs~) BEGIN
  EXTEND_TOP ~bdintro.bcs~ ~weidu_external/%MOD_FOLDER%/compile/bdintro+.baf~
END

ACTION_IF (FILE_EXISTS_IN_GAME ~bdshcut0.bcs~) BEGIN
  COPY_EXISTING ~bdshcut0.bcs~ ~override~
    DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(Global("BDSH_Spawn_Imoen","GLOBAL",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("D5GregsonExist","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
    END
  IF_EXISTS BUT_ONLY
END

Even more modifications to the dungeon's area script, to add Captain Gregson and spawn the Flaming Fist guys in Imoen's absence, and add some more conditions to some stuff like Siege of Dragonspear journal entries being generated:

Spoiler
ACTION_IF (FILE_EXISTS_IN_GAME ~bd0120.bcs~) BEGIN
  COPY_EXISTING ~bd0120.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(!Global("C#st_ImoenInGroupKD","GLOBAL",1)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("D5GregsonExist","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(GlobalLT("bd_plot","GLOBAL",40)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("D5GregsonExist","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
  BUT_ONLY
END

// put Gregson into the crypt as well, in place of Imoen

<<<<<<<< d5/arebd120.baf
IF
	Global("D5GregsonCrypt","GLOBAL",4)
THEN
	RESPONSE #100
		CreateCreature("d5gregs",[765.1790],14)
		SetGlobal("D5GregsonCrypt","GLOBAL",5)
END

IF
	GlobalGT("D5GregsonCrypt","GLOBAL",3)
	GlobalLT("D5GregsonCrypt","GLOBAL",7)
	!Dead("bdff1000")
	!InMyArea("bdff1000")
THEN
	RESPONSE #100
		CreateCreature("bdff1000",[869.1738],NE)
		Continue()
END

IF
	GlobalGT("D5GregsonCrypt","GLOBAL",3)
	GlobalLT("D5GregsonCrypt","GLOBAL",7)
	!Dead("bdff1001")
	!InMyArea("bdff1001")
THEN
	RESPONSE #100
		CreateCreature("bdff1001",[866.1543],SE)
		Continue()
END

IF
	GlobalGT("D5GregsonCrypt","GLOBAL",3)
	GlobalLT("D5GregsonCrypt","GLOBAL",7)
	!Dead("bdff1002")
	!InMyArea("bdff1002")
THEN
	RESPONSE #100
		CreateCreature("bdff1002",[919.1545],S)
		Continue()
END

IF
	Global("D5KorlaszDone","GLOBAL",0)
	OR(2)
		Dead("BDKORLAS")
		Global("BD_KORLASZ_SURRENDER","GLOBAL",1)
THEN
	RESPONSE #100
		SetGlobal("D5KorlaszDone","GLOBAL",1)
		SetGlobal("D5GregsonCrypt","GLOBAL",9)
END

>>>>>>>>
COPY ~d5/arebd120.baf~ ~weidu_external/%MOD_FOLDER%/compile/bd0120.baf~

ACTION_IF (FILE_EXISTS_IN_GAME ~bd0120.bcs~) BEGIN
  EXTEND_TOP ~bd0120.bcs~ ~weidu_external/%MOD_FOLDER%/compile/bd0120.baf~
END

ACTION_IF !(FILE_EXISTS_IN_GAME ~bd0120.bcs~) BEGIN
  COMPILE ~weidu_external/%MOD_FOLDER%/compile/bd0120.baf~
END

We will give Gregson his dialogue for outside and inside the dungeon:

Spoiler
<<<<<<<< d5/d5gregs+.d
APPEND ~D5GREGS~

IF ~Global("D5GregsonCrypt","GLOBAL",2)~ BEGIN d5gregskd_0
  SAY ~It's good you are here! My scouts tell me that Korlasz is inside the crypt right now! We do not know whether Sarevok or Angelo is with her, however.~
  IF ~~ GOTO d5gregskd_1
END

IF ~~ BEGIN d5gregskd_1
  SAY ~The bad news is, I'm afraid they saw us mustering outside - one of my men heard them raise an alarm and they retreated further into the crypt. We have entered the antechamber, and apparently it opens into a rather large cave complex. We do not know how large, or where it leads. My guess is, either there is another way out, or they are fortifying and making ready for a tough fight. I don't know which possibility I prefer...~
  IF ~~ GOTO d5gregskd_2
END

IF ~~ BEGIN d5gregskd_2
  SAY ~We may be facing a tough fight in there. Let me know when you are ready to proceed.~
  IF ~~ REPLY ~I need to take care of a couple things first. I will return when I am prepared to go after Korlasz.~ DO ~SetGlobal("D5GregsonCrypt","GLOBAL",3)~ GOTO d5gregskd_3
  IF ~~ REPLY ~I am ready now. Let's go in.~ DO ~SetGlobal("C#EBG1_KorlaszQuest","GLOBAL",1)
			SetGlobal("C#EBG1_KorlaszDungeon_BG1","GLOBAL",1)
			SetGlobal("D5GregsonCrypt","GLOBAL",4)
			SetGlobal("BDSH_Imoen_Floor","GLOBAL",99)
			ClearAllActions()
			StartCutSceneMode()
			StartCutSceneEx("c#st2kd",FALSE)~ EXIT
END

IF ~~ BEGIN d5gregskd_3
  SAY ~Alright, my men will guard the entrance until you are ready to go in. We will make sure no one gets in or out.~ 
  IF ~~ EXIT
END

IF ~Global("D5GregsonCrypt","GLOBAL",3)~ BEGIN d5gregskd_4
  SAY ~You are back. Are you ready to go into the crypt to pursue Korlasz?~
  IF ~~ REPLY ~I need to take care of a couple things first. I will return when I am prepared to go after Korlasz.~ GOTO d5gregskd_3
  IF ~~ REPLY ~I am ready now. Let's go in.~ DO ~SetGlobal("C#EBG1_KorlaszQuest","GLOBAL",1)
			SetGlobal("C#EBG1_KorlaszDungeon_BG1","GLOBAL",1)
			SetGlobal("D5GregsonCrypt","GLOBAL",4)
			SetGlobal("BDSH_Imoen_Floor","GLOBAL",99)
			ClearAllActions()
			StartCutSceneMode()
			StartCutSceneEx("c#st2kd",FALSE)~ EXIT
END

IF ~Global("D5GregsonCrypt","GLOBAL",5)~ BEGIN d5gregskd_5
  SAY ~A small force of Sarevok's followers are further in - mostly mercenaries and former Iron Throne die-hards. They are presumably with Korlasz. Careful with her, she is a necromancer. Expect resistance, and expect traps. And above all, expect undead. I will stay here and secure the exit. Good luck.~
  IF ~~ DO ~SetGlobal("D5GregsonCrypt","GLOBAL",6)~ EXIT
END

IF ~Global("D5GregsonCrypt","GLOBAL",6)~ BEGIN d5gregskd_6
  SAY ~Is everything going okay? There is a Flaming Fist healer inside the crypt if you need assistance. We should make sure Korlasz does not have a chance to get away.~
  IF ~~ EXIT
END

IF ~GlobalGT("D5GregsonCrypt","GLOBAL",8)~ BEGIN d5gregskd_7
  SAY ~Great work in there. I need to get back to the Flaming Fist to get started on the paperwork. Hooray. But you are the hero of the hour. You should return to the Ducal Palace and report our success here.~
  IF ~~ DO ~SetGlobal("D5GregsonCrypt","GLOBAL",9)~ DO ~EscapeArea()~ EXIT
END

END
>>>>>>>> 
COPY ~d5/d5gregs+.d~ ~weidu_external/%MOD_FOLDER%/compile/d5gregs+.d~
COMPILE ~weidu_external/%MOD_FOLDER%/compile/d5gregs+.d~

We need to suppress a bunch of spoken references to Sarevok's death in the introductory cut scene:

Spoiler
OUTER_SET new_follower_string = RESOLVE_STR_REF(~Everything's a mess. We should have gotten out of the city days ago.~)
OUTER_SET new_flamingfist_string = RESOLVE_STR_REF(~This chamber is secure. We can proceed when you're ready.~)

ACTION_IF (FILE_EXISTS_IN_GAME ~bdintro.bcs~) BEGIN
  COPY_EXISTING ~bdintro.bcs~ ~override~
    DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(DisplayStringWait("intro_follower1",%eet_2%66857)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~DisplayStringWait("intro_follower1",%new_follower_string%)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(Global("SOD_fromimport","global",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("D5GregsonExist","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(CreateCreature("bdshimoe"\).+$~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(ActionOverride("IMOEN2"\).+$~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(DisplayStringWait("IMOEN2"\).+$~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(DisplayStringHead("BDFF1001"\).+$~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~DisplayStringHead("BDFF1001",%new_flamingfist_string%)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
    END
  IF_EXISTS BUT_ONLY
END

The small cut scene where Porios talks to you across the chasm is all about Sarevok's sword. It does not fit here, so we will simply add a condition and prevent it from happening altogether. Then we will scrub a few references to Sarevok's death from the dialogue of Porios and Korlasz:

Spoiler
ACTION_IF (FILE_EXISTS_IN_GAME ~bdporios.bcs~) BEGIN
  COPY_EXISTING ~bdporios.bcs~ ~override~
    DECOMPILE_AND_PATCH BEGIN
		SPRINT textToReplace ~\(Global("BD_SPEAKER_THREAT","BD0120",1)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("D5GregsonExist","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
    END
  BUT_ONLY
END

// change porios.dlg: 
// states 0 and 12 should only be valid if starting from a new SoD campaign

<<<<<<<< d5/d5porios+.d
ADD_STATE_TRIGGER BDPORIOS 0 ~Global("D5GregsonExist","GLOBAL",0)~

REPLACE_SAY BDPORIOS 8 ~Sarevok paid us well, but something tells me he is not long for this world, and I am in no rush to die. Everyone, lay down your arms.~

ADD_STATE_TRIGGER BDPORIOS 12 ~Global("D5GregsonExist","GLOBAL",0)~
>>>>>>>> 
COPY ~d5/d5porios+.d~ ~weidu_external/%MOD_FOLDER%/compile/d5porios+.d~
COMPILE ~weidu_external/%MOD_FOLDER%/compile/d5porios+.d~

// change bdkorlas.dlg
// change the text of states 3, 7
// add an unattainable trigger to response 3 ("sarevok himself fell before me")

<<<<<<<< d5/d5korlas+.d
REPLACE_SAY BDKORLAS 3 ~But you do, <CHARNAME>. Destroy <PRO_HIMHER>!~

REPLACE_SAY BDKORLAS 7 ~I... am defeated.~

ADD_TRANS_TRIGGER BDKORLAS 1 ~Global("D5GregsonExist","GLOBAL",0)~ DO 2
>>>>>>>> 
COPY ~d5/d5korlas+.d~ ~weidu_external/%MOD_FOLDER%/compile/d5korlas+.d~
COMPILE ~weidu_external/%MOD_FOLDER%/compile/d5korlas+.d~

We need to make one of those letters Sarevok constantly sends to all his lieutenants. (This guy leaves a huge paper trail, would make a terrible white-collar criminal. I would say his OpSec sucks, but I guess it's tough when you have to deal with literal hobgoblins...) We will copy an existing one and change the text, and then place it on the body of Korlasz' familiar:

Spoiler
// create letter identifying the Undercity
COPY_EXISTING ~scrl2n.itm~ ~override/d5scrlsk.itm~
  SAY 0x50 [Message from Sarevok to Korlasz]Korlasz, as you have no doubt heard, my coronation as grand duke was interrupted. We must regroup - all is not yet lost. I may have been denied my war, but with proper preparations the death of <CHARNAME> will still empower me. <PRO_HESHE> will no doubt be coming to confront me - <PRO_HESHE> cannot afford not to. But we will be ready. Collect what resources you can and meet me at the temple in the Undercity.

Sarevok

COPY_EXISTING ~bdshkfam.cre~ ~override~
	ADD_CRE_ITEM ~D5SCRLSK~ #1 #0 #0 ~IDENTIFIED~ ~INV~
IF_EXISTS BUT_ONLY

Finally, we need to manage some of the script conditions on the second level of the dungeon, mostly involving suppressing the Siege of Dragonspear journal entries and adding some of our own:

Spoiler
COPY_EXISTING ~bd0130.BCS~ ~override~
	DECOMPILE_AND_PATCH BEGIN
	// ***** add triggers for any existing journal additions
		SPRINT textToReplace ~\(!Global("BD_Korlasz_Fight","BD0130",2)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("D5GregsonExist","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
		SPRINT textToReplace ~\(Global("bd_korlasz_dead_journal","BD0130",0)\)~
		COUNT_REGEXP_INSTANCES ~%textToReplace%~ num_matches
		PATCH_IF (num_matches > 0) BEGIN
			REPLACE_TEXTUALLY ~%textToReplace%~ ~\1 Global("D5GregsonExist","GLOBAL",0)~
			PATCH_PRINT ~Patching: %num_matches% matches found in %SOURCE_FILESPEC% for REPLACE_TEXTUALLY: %textToReplace%~
		END ELSE BEGIN
			PATCH_WARN ~WARNING: could not find %textToReplace% in %SOURCE_FILESPEC%~
		END
	END
IF_EXISTS BUT_ONLY

<<<<<<<< d5/arebd130.baf
IF
	Global("D5GregsonExist","GLOBAL",1)
	Dead("BDKORLAS")
	Global("D5KorlaszDeadJournal","GLOBAL",0)
THEN
	RESPONSE #100
		AddJournalEntry(@40021,QUEST) /* ~The Hunt for Sarevok
Korlasz is dead. She refused to surrender, fighting to the end for Sarevok. I should search for any clues to his whereabouts.~ */
		SetGlobal("D5KorlaszDeadJournal","GLOBAL",1)
END

IF
	Global("D5GregsonExist","GLOBAL",1)
	Global("BD_KORLASZ_SURRENDER","GLOBAL",1)
	Global("D5KorlaszSurrenderJournal","GLOBAL",0)
THEN
	RESPONSE #100
		AddJournalEntry(@40022,QUEST) /* ~The Hunt for Sarevok
Korlasz has surrendered to the Flaming Fist. Whether she will willingly betray Sarevok is another question, however. I should search the area for any clues to his whereabouts.~ */
		SetGlobal("D5KorlaszSurrenderJournal","GLOBAL",1)
END

IF
	Global("D5GregsonExist","GLOBAL",1)
	PartyHasItem("D5SCRLSK",1)
	Global("D5SarevokFoundJournal","GLOBAL",0)
THEN
	RESPONSE #100
		AddJournalEntry(@40023,QUEST) /* ~The Hunt for Sarevok
I discovered a letter from Sarevok among Korlasz' things. It appears to have been hastily written, and mentions that he is calling for his supporters and allies to meet him in the Undercity. He appears to be preparing for a final confrontation. Dukes Belt and Liia will likely have an idea of how to find the Undercity.~ */
		SetGlobal("D5SarevokFoundJournal","GLOBAL",1)
END
>>>>>>>>
COPY ~d5/arebd130.baf~ ~weidu_external/%MOD_FOLDER%/compile/bd0130.baf~

ACTION_IF (FILE_EXISTS_IN_GAME ~bd0130.bcs~) BEGIN
  EXTEND_TOP ~bd0130.bcs~ ~weidu_external/%MOD_FOLDER%/compile/bd0130.baf~
END

ACTION_IF !(FILE_EXISTS_IN_GAME ~bd0130.bcs~) BEGIN
  COMPILE ~weidu_external/%MOD_FOLDER%/compile/bd0130.baf~
END

And that's it! That's... it? I think that's it. I have played through the dungeon with this installed, and it all works, and when I go back to the palace Belt and Liia are still giving me the dialogue lines I left them with after the modified coronation scene. So all seems well. We have set some variables here that can be used to add more dialogue to them. Belt will start coming around to the idea to you are something like the Hero of Baldur's Gate. But just as the conversation takes that turn...

The dead will rise!

EDIT - Entar. Entar Silvershield will rise. And he is NOT a happy camper. He is under a bit of a misapprehension - or is he?? - and the whole time everyone has been coming to grips with the whole doppelganger plot, Entar has been dead. So, being resurrected only now, he is understandably confused.

Or is he??

Edited by subtledoctor
Link to comment

Writing up dialogue for step 5. God, this is going to be so much easier than step 4.

And I think there is a very simple solution  to the problem of the dukes teleporting you into the thieves’ guild, even if we don’t move the entrance of the maze, and also why Charname would be sent alone to confront Sarevok, instead of with an army at his back. Basically, just fix it with some expository dialogue. 

Liia will tell you that all entrances to the Undercity were sealed long ago, and being useless, were forgotten. There is a rumor that one such sealed entrance was in the thieves guild. Of course, the civic leaders and city guard are not welcome there, so why doesn’t Charname go investigate that rumor. Not fight Sarevok, not end the game, just investigate the rumor. And in case it is true, here is a magical rune to unseal the passage. 

This makes a ton of sense. The Flaming Fist consists of fighters, but they are largely low-level soldiers. (And I’ll probably add a line about the most experienced members gearing up to leave the city and confront the Crusade.) Thieves’ Guild members, by contrast, are probably higher-level thieves. They are probably more than a match for low-level fighters one-on-one… then add in the fact that the fight would be on their home turf, they have traps, they have poison, they have magic… it would be a bloodbath. 

So even if the dukes know where the guild is, they cannot send their own troops. Instead they will ask Charname, as an independent agent, to investigate the possibility, and try to scout Sarevok’s location, and then report back without confronting Sarevok, do the Dukes can send in the cavalry. That is a much more sensible plan for the leaders of a major Sword Coast city, than blindly teleporting Charname into the thieves’ guild! 

Of course that plan will be frustrated. Just need a “the door locks behind you, you cannot leave” moment when you find Sarevok, to force the fight. 

So the actual end of the game can be the same as it always was, but become much more sensible and believable.

Link to comment
18 hours ago, subtledoctor said:

This makes a ton of sense. The Flaming Fist consists of fighters, but they are largely low-level soldiers. (And I’ll probably add a line about the most experienced members gearing up to leave the city and confront the Crusade.) Thieves’ Guild members, by contrast, are probably higher-level thieves. They are probably more than a match for low-level fighters one-on-one… then add in the fact that the fight would be on their home turf, they have traps, they have poison, they have magic… it would be a bloodbath. 

When returning in BG city in chapter 7, Alatos is dead, most thieves are either imprisoned, killed, or have flee the city because of Flaming Fist brutality under Angelo's rule. 

So you will probably also need to edit some vanilla dialogs for consistency. 

Link to comment
37 minutes ago, Trouveur80 said:

most thieves are either imprisoned, killed, or have flee the city because of Flaming Fist brutality under Angelo's rule.

"Ah'll say one thing for that Angelo fella, he suuure did clean up dem streets..."

Link to comment

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

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...