Jump to content

Things I think should be considered for Fixpack 10


Wisp

Recommended Posts

Sure.

Here's a fix.

 

Thanks!

 

Could you code up a fix for the Aerie's broken PartyRested() banter as well?

Sure. There are several Aerie stutter bugs. Three, I think. I'll see if I can track them down and post fixes for the lot.
Link to comment

While we're listing stuff for the next version, there's a long standing issue with the inventory icon for Warhammer +2: Borok's Fist (IHAMM05.BAM) which was actually introduced by the fixpack.

 

The supposedly fixed version of the BAM has an ugly pink outline instead of the proper shadow effects. I've double checked the original BAM and it seems to work just fine in-game so I vote for getting rid of the edited version for the next release.

Link to comment

Here's some misc stuff I had lying around.

 

 

The strangely non-magical spell traps

 

For some reason, TRAP_FIREBALL, TRAP_LIGHTNING_BOLT and TRAP_MAGIC_MISSILE happily bypass the target's magic resistance while none of the other trap spells do. As these are clearly magical traps based on actual arcane spells, I'd vote for making them behave as such.

 

// A few trap spells ignore magic resistance, but they probably should not since all other trap spells don't

COPY_EXISTING ~spwi001.spl~ ~override~ // Fireball (trap)
		  ~spwi002.spl~ ~override~ // Lightning Bolt (trap)
		  ~spwi003.spl~ ~override~ // Magic Missile (trap)
 READ_LONG  0x64 "abil_off"
 READ_SHORT 0x68 "abil_num"
 READ_LONG  0x6a "fx_off"
 FOR (index = 0 ; index < abil_num ; index = index + 1 ) BEGIN // cycle through abilities
READ_SHORT  ("%abil_off%" + 0x1e + (0x28 * "%index%")) "abil_fx_num"
READ_SHORT  ("%abil_off%" + 0x20 + (0x28 * "%index%")) "abil_fx_idx"
FOR (index2 = 0 ; index2 < abil_fx_num ; index2 = index2 + 1) BEGIN
  READ_SHORT ("%fx_off%" +		(0x30 * ("%index2%" + "%abil_fx_idx%"))) "opcode"
  READ_BYTE  ("%fx_off%" + 0x0d + (0x30 * ("%index2%" + "%abil_fx_idx%"))) "dispel"
  PATCH_IF ("%dispel%" != 1) BEGIN
	WRITE_BYTE ("%fx_off%" + 0x0d + (0x30 * ("%index2%" + "%abil_fx_idx%"))) "1" // resist/dispel: 1
  END
END
 END
BUT_ONLY_IF_IT_CHANGES

 

 

Mordenkainen's dispellable mind-shield

 

Due to a wrong dispel/resist setting, using a Dispel Magic on a Mordenkeinen's Sword will remove its natural immunity to Psionics and Mind Affecting spells. Since the immunity is not bestowed as a spell but as a virtue of the sword being an animated object, I'd suggest making it undispellable.

 

// The innate immunity to psionics and mind-affecting spells of Mordenkainen Sword should not be dispellable

COPY_EXISTING ~ipsion.itm~ ~override~  // Greenstone Amulet ("equipped" by Mordenkainen's Sword)
READ_LONG   0x64 "abil_off"
READ_SHORT  0x68 "abil_num"
READ_LONG   0x6a "fx_off"
READ_SHORT  0x70 "fx_num"
 FOR (index2 = 0 ; index2 < fx_num ; index2 = index2 + 1) BEGIN
WRITE_BYTE ("%fx_off%" + 0x03 + ("%index2%" * 0x30)) "0" // power: 0
WRITE_BYTE ("%fx_off%" + 0x0d + ("%index2%" * 0x30)) "0" // dispel/resist: 0 (non-magical)
WRITE_LONG ("%fx_off%" + 0x0e + ("%index2%" * 0x30)) "0" // duration: 0
 END
BUT_ONLY_IF_IT_CHANGES

 

 

Also, I'd suggest dropping the racial "fix" for the Empathic Manifestation in the Unseeing Eye quest since it can break things. There's no evidence that this is supposed to be a true demonic creature, save for the Tanar'ri avatar, and Bioware slapped that on a bunch of things. In the unmodded game, the race and class of the creature are simply set to "None".

 

--- setup-bg2fixpack.tp2	2010-03-15 19:54:10.000000000 +0100
+++ setup-bg2fixpack.v10	2012-01-10 22:23:27.062500000 +0100
@@ -6207,11 +6207,6 @@
  BUT_ONLY_IF_IT_CHANGES

// racial fixes
-COPY_EXISTING ~RIFTCR04.CRE~ ~override~
-  WRITE_BYTE 0x0272 121 // demonic
-  BUT_ONLY_IF_IT_CHANGES
-
-// racial fixes
COPY_EXISTING ~AEWERE2.CRE~ ~override~
		   ~AEWERE3.CRE~ ~override~
		   ~AEWERE4.CRE~ ~override~

Link to comment
The supposedly fixed version of the BAM has an ugly pink outline instead of the proper shadow effects. I've double checked the original BAM and it seems to work just fine in-game so I vote for getting rid of the edited version for the next release.
I'd rather just drop it or move it off to OBC, to be honest. BioWare was perfectly capable of picking whatever icons they wanted to use.

 

For some reason, TRAP_FIREBALL, TRAP_LIGHTNING_BOLT and TRAP_MAGIC_MISSILE happily bypass the target's magic resistance while none of the other trap spells do. As these are clearly magical traps based on actual arcane spells, I'd vote for making them behave as such.
Seems kind of nitpicky. When you get down to it, there are some non-player spells and items that do this, or have unusual powers, or what not.

 

if you start dwelling on that stuff, you're going to be here all year.

 

Also, I'd suggest dropping the racial "fix" for the Empathic Manifestation in the Unseeing Eye quest
Go for it.
Link to comment

I thought there were three bugged dialogues for Aerie, but I could only find two. Unfortunately, both are really messy fixes, which may be why they were never implemented.

 

Aerie's never-seen-in-game "blanket stealing" banter for female PCs.

 

It's a really cute banter between Aerie and a female PC. The problem is that the script uses PartyRested()... and so does the dialogue file. The script will run every morning, but it will never fire. Unfortunately somebody thought it was a good idea to use variable=0 triggers for these, so there isn't a neat-and-easy fix. The easiest fix for it is less than ideal, since it involves falsing out the original script block, extending Aerie's script with a replacement that use variable=1 instead of variable=0, and then changing both the triggers and the actions in the banter itself. Like I said, it's clunky, but as it stands, this banter will never fire, so we aren't losing much.

 

/* Fix Aerie's "Blanket Thieves" banter */
ACTION_IF GAME_IS ~bg2 bgt~ THEN BEGIN
COPY_EXISTING ~aerie.bcs~ ~override~
DECOMPILE_BCS_TO_BAF
	REPLACE_TEXTUALLY ~Global("BAerie10","LOCALS",0)~
	~Global("BAerie10","LOCALS",0)
	False()~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
<<<<<<<< bg2fixpack/Inlined/aerie_blanket_thief.baf
IF
 InParty(Myself)
 Gender(Player1,FEMALE)
 PartyRested()
 See(Player1)
 CombatCounter(0)
 !StateCheck(Player1,STATE_SLEEPING)
 !StateCheck(Myself,STATE_SLEEPING)
 Global("BAerie10","LOCALS",0)
THEN
 RESPONSE #100
SetGlobal("BAerie10","LOCALS",1)
END
>>>>>>>>
 EXTEND_TOP ~aerie.bcs~ ~bg2fixpack/Inlined/aerie_blanket_thief.baf~

<<<<<<<< bg2fixpack/Inlined/aerie_blanket_thief.d
REPLACE_STATE_TRIGGER BAERIE 66 ~Global("BAerie10","LOCALS",1)~
ALTER_TRANS BAERIE
BEGIN 66 END
BEGIN END // I think that's what you use when you want to alter all transtions for that state
BEGIN
	"ACTION" ~SetGlobal("BAerie","LOCALS",2)~
END
>>>>>>>>
 COMPILE ~bg2fixpack/Inlined/aerie_blanket_thief.d~
END

And if you think that's ugly, wait until you see the fix for Aerie's bugged Raelis reminder. Same deal variable=0 for a trigger with a million triggers in the dlg. Personally, I think the engine just saw all those triggers and said to itself "Yeah, right."

Anyway, the first part is the same. false out the original script block and extend Aerie's script with one that will use one unique variable that won't cause games to stutter.

/* Fix Aerie's Raelis reminder */
ACTION_IF GAME_IS ~bg2 bgt~ THEN BEGIN
COPY_EXISTING ~aerie.bcs~ ~override~
DECOMPILE_BCS_TO_BAF
	REPLACE_TEXTUALLY ~GlobalLT("AerieReminder2","LOCALS",2)~
	~GlobalLT("AerieReminder2","LOCALS",2)
	False()~
COMPILE_BAF_TO_BCS
BUT_ONLY_IF_IT_CHANGES
<<<<<<<< bg2fixpack/Inlined/aerie_raelis_reminder.baf
IF
 GlobalTimerExpired("AerieRemindsRaelis","GLOBAL")
 GlobalLT("AerieReminder2","LOCALS",2)
 Global("CD_AerieReminder2","LOCALS",0)
 Global("QuayleJob","GLOBAL",1)
 AreaType(OUTDOOR)
 AreaType(CITY)
 !AreaCheck("AR2000")
 !Global("Chapter","GLOBAL",4)
 !Global("Chapter","GLOBAL",5)
 !Global("Chapter","GLOBAL",7)
 CombatCounter(0)
 Global("HaerDalisPlotStarted","GLOBAL",0)
 Global("HaerDalisFree","GLOBAL",0)
 IfValidForPartyDialogue(Myself)
 See(Player1)
 !StateCheck(Player1,STATE_SLEEPING)
THEN
 RESPONSE #100
SetGlobal("CD_AerieReminder2","LOCALS",1)
StartDialogNoSet(Player1)
END
>>>>>>>>

EXTEND_TOP ~aerie.bcs~ ~bg2fixpack/Inlined/aerie_raelis_reminder.baf~
<<<<<<<< bg2fixpack/Inlined/aerie_raelis_reminder.d
REPLACE_STATE_TRIGGER AERIEJ 207 ~Global("CD_AerieReminder2","LOCALS",1)~
ALTER_TRANS AERIEJ
BEGIN 207 END
BEGIN END // I think that's what you use when you want to alter all transtions for that state
BEGIN
	"ACTION" ~SetGlobal("CD_AerieReminder2","LOCALS",2)
	IncrementGlobal("AerieReminder2","LOCALS",1)
	SetGlobalTimer("AerieRemindsRaelis","GLOBAL",TWO_DAYS)~
END
>>>>>>>>
COMPILE ~bg2fixpack/Inlined/aerie_raelis_reminder.d~
END

Link to comment

I'd rather just drop it or move it off to OBC, to be honest. BioWare was perfectly capable of picking whatever icons they wanted to use.

 

There shouldn't be any harm in keeping the code which switches the icon to IHAMM05.BAM since the original (unmodded) version of that file works fine. Dropping the botched pink-outlined edit of the BAM which the fixpack currently ships is a must though.

 

Seems kind of nitpicky. When you get down to it, there are some non-player spells and items that do this, or have unusual powers, or what not.

 

Heh, I guess you're right.

 

I took notice of these by chance while running some tests on my revised Wizard Slayer kit and was surprised to see that only those three spell traps ignored his MR. The thing is, all of the other traps that are based on actual spells (i.e. TRAP_CLOUDKILL, TRAP_STINKING_CLOUD, TRAP_FLAMESTRIKE, TRAP_CALL_LIGHTNING, TRAP_CHROMATIC_ORB, TRAP_DIRE_CHARM... etc.) respect the target's MR, so we could justify this particular fix on the grounds of consistency. ;)

Link to comment

I thought there were three bugged dialogues for Aerie, but I could only find two. Unfortunately, both are really messy fixes, which may be why they were never implemented.

 

Cheers! :)

 

I'll look these over in more detail over the next few days. It might be possible to avoid falsing out the relevant blocks by using REPLACE_BCS_BLOCK.

Link to comment

The thing is, all of the other traps that are based on actual spells (i.e. TRAP_CLOUDKILL, TRAP_STINKING_CLOUD, TRAP_FLAMESTRIKE, TRAP_CALL_LIGHTNING, TRAP_CHROMATIC_ORB, TRAP_DIRE_CHARM... etc.) respect the target's MR, so we could justify this particular fix on the grounds of consistency. ;)

Unless you fear being here all year (I'll bring cookies and milk!), it's a fix I like for - as you say - consistency.
Link to comment

Ok, I've streamlined the Aerie "Blanket thief banter" fix a bit. Looks solid, tested in-game and seems to work fine.

EDIT - realized that only removing the PartyRested() trigger from the dialogue file is actually needed for the banter to fire. In the spirit of keeping the changes of the original content to the minimum within the fixpack, new code:

 

// Fix Aerie's "Blanket Thieves" banter (berelinde)

COPY_EXISTING ~baerie.dlg~ ~override~
 DECOMPILE_DLG_TO_D
   REPLACE_TEXTUALLY EXACT_MATCH ~PartyRested()
Gender(Player1,FEMALE)~ ~Gender(Player1,FEMALE)~
 COMPILE_D_TO_DLG
BUT_ONLY_IF_IT_CHANGES

 

However, I'm still on the ropes concerning the Realis reminder. Can we get a bit more backstory on that one? I'm not entirely sure what's being fixed there.

Link to comment

http://forums.gibberlings3.net/index.php?showtopic=19681&view=findpost&p=165889

http://forums.gibberlings3.net/index.php?showtopic=19614

 

Mostly, the reason people are able to pinpoint the cause of the stutter is because they are running with a debugger on all the time, spitting out the numbers of the script blocks as they fire. This particular script block turns up again and again and again and again. In fact, it will keep popping up indefinitely until the party goes to talk to Raelis, at which point, it stops.

Link to comment

Thanks for the links. However, like devSin, I'm not quite convinced about this.

 

All the variables seem to match up between Aerie's script and her dialogue. The only suspect trigger is the misspelled AreaType(OUTSIDE) (should be OUTDOOR) but we already handle that in Core Fixes. On the other hand, I can see how someone who doesn't install the fixpack might get this bug.

 

Anyhow, your proposed solution would cause Aerie to initiate the relevant dialogue only once which would prevent the final reminder from triggering ("I suppose you think we don't have time to go and see this Raelis Quayle mentioned...").

Link to comment

One of Haer'Dalis' banters with Edwin never fires due to the duplicated PartyRested() trigger issue, as was the case with Aerie. Here's the fix:

 

// Fix Haer'Dalis' "Arcane muttering" banter with Edwin

COPY_EXISTING ~bhaerda.dlg~ ~override~
 DECOMPILE_DLG_TO_D
   REPLACE_TEXTUALLY EXACT_MATCH ~PartyRested()
InParty("Edwin")~ ~InParty("Edwin")~
 COMPILE_D_TO_DLG
BUT_ONLY_IF_IT_CHANGES

 

BTW, I stumbled upon this while doing a search of all dialogue files for the PartyRested() trigger. It seems that Aerie and Haer'Dalis were the only ones affected.

Link to comment

Hi there!

I remember that time ago Miloch the Great made available a fix that prevent CTD after killing a Glazebru. It was very useful, since I get this annoying bug most of the time.

I can't find the post, but I do hope you plan to add this fix in the upcoming version.

Link to comment

Archived

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

×
×
  • Create New...