Jump to content

[bug] SoD issues from jastey


CamDawg

Recommended Posts

When I was first thinking about doing this project @jastey sent me some issues she found while working on SoD. Forgive the formatting, as this is essentially copied from Discord:

Quote
  • 1- bd7300.bcs uses wrong script name for Corwin
  • 2- Probable mixup in Rasaad's prison farewell lovetalk
  • 3- Typo in #53484 (extra space)
  • 4- Wrong scriptname for Imoen in bd6200.bcs
  • 5- bdcrus22.cre scriptname mismatch

I also have more explicit descriptions of bugs I found 2017-2019, no idea whether they got considered in the 2.6 patch: EDIT let me know if you want more detailed info for these. (edited)

  • A- MGTEOS01.dlg - misspelled timer
  • B- Walls in AR0903.are should always block sight of creatures behind them (I think that was fixed)
  • C- MGTEOS01.dlg - misspelled timer
  • D- M'Khiin's script name should be "MKHIIN"
  • E- Husam should leave after talking to him for the first time
  • F- Aldeth Sashenstar's betrayal shouldn't bring PC in front of Angelo if PC was already brought in front of Angelo (before revealing Sarevok in the Palace)
  • H- If NPCs are kicked out in Korlasz' crypt, telling them to "return to the crypt's entrance" does nothing

The other ones were tagged as "Closed - Fixed" so I guess they made it in.

And then a followup:

Quote

I need to correct the list A-H. I missed some reply emails. The actual list of not "Closed - Fixed" items would be:

  • A - Walls in AR0903.are should always block sight of creatures behind them (was only changed to "submitted", but I think it got addressed.)
  • B - M'Khiin's script name should be "MKHIIN" Observed: the script bd5100aw.bcs uses the script name "BDMKHIIN" for M'Khiin Expected: the script bd5100aw.bcs should use the script name "MKHIIN" for M'Khiin
  • C - If NPCs are kicked out in Korlasz' crypt, telling them to "return to the crypt's entrance" does nothing: If looking at Minsc's post dialogue bdminsc.dlg, the same triggers are used like for the coalition camps later, including the setting of "SetGlobal("bd_npc_camp","locals",1)" which is later used to move NPCs to one of the three camps. Only that here, it does nothing.

The others got fixed according to BeamDog's internal notes.

Link to comment

Thanks for putting them up, I guess I would have at some point, too. The reason why 1-5 are only titles is because i didn't note down the details after reporting them to BeamDog recently (where the bug reports are now being made non-public shortly after posting without giving a summary in the notification email).

EDIT: ooh. I just noticed I can still see the reports when i log in, if i click on the link from teh notification email. That's neat. So I did the work double, ahaha.

I looked them up again:

1- bd7300.bcs uses wrong script name for Corwin

  • What is currently happening: in bd7300.bcs, the scriptname "bdcorwin" is used twice for Corwin.
  • What should be happening: Corwin's scriptname at this point in game is "corwin".
  • Steps to reproduce the bug: look at this script block in bd7300.bcs and see that it uses "bdcorwin" twice:
IF
	Global("bd_parley_retreat","bd7300",1)  // Dead Man's Pass
	!InParty("Corwin")  // Corwin
	!Dead("Corwin")  // Corwin
THEN
	RESPONSE #100
		ActionOverride("bddelanc",MoveToPoint([1200.2250]))
		ActionOverride("bdnederl",MoveToPoint([1200.2250]))
		ActionOverride("bdstoneh",MoveToPoint([1200.2250]))
		ActionOverride("bdbence",MoveToPoint([1200.2250]))
		ActionOverride("bddagf59",MoveToPoint([1200.2250]))
		ActionOverride("bdwtr61",MoveToPoint([1200.2250]))
		ActionOverride("bdcorwin",MoveToPoint([1200.2250]))
		Wait(10)
		ActionOverride("bddelanc",DestroySelf())
		ActionOverride("bdnederl",DestroySelf())
		ActionOverride("bdstoneh",DestroySelf())
		ActionOverride("bdbence",DestroySelf())
		ActionOverride("bddagf59",DestroySelf())
		ActionOverride("bdwtr61",DestroySelf())
		ActionOverride("bdcorwin",DestroySelf())
		SetGlobal("bd_parley_retreat","bd7300",2)  // Dead Man's Pass
		SetGlobal("BD_SPWN_CUTSCENE","MYAREA",0)
END
  • If available, a fix: Change "bdcorwin" to "corwin" in bd7300.bcs.

2- Probable mixup in Rasaad's prison farewell lovetalk: this is probably not a bug that needs fixing. I just noticed that if the PC is not seen as murderer (i.e. gets the "hero ending"), Rasaad's dialogue is over after one click. Whereas if the PC is seen s murderer (and gets the "evil assassin" ending), Rasaad's dialogue is like two pages long. Which I think should be the other way around, especially because he makes hints at nearly falling for the PC and what-ifs for the bad ending which would be more appropriate for the good ending imho. Just my 2c. This is what I reported to BeamDog:

Quote
Description
 

When the PC is locked up in prison at the end of SoD and Rasaad comes for the final lovetalk in case his romance is committed ("Global("bd_rasaad_romanceactive","global",2)"), there seems to be a mixup in dialogue path with respect to what he'd say for PC is found guilty / PC is found innocent. (Innocent = Global("bd_player_exiled","global",1) )

bdrasaad 80, for these reply options the transactions they lead to should be switched:

>> IF ~ Global("bd_player_exiled","global",0)
~ THEN REPLY #53484 /* ~Go away. Go away! ~ */ DO ~SetGlobal("bd_jail_visitors","bd0104",6)
SetGlobal("bd_visit_player","locals",1)
~ GOTO 87 //<-- this should go to 84 imho
IF ~ Global("bd_player_exiled","global",1)
~ THEN REPLY #53484 /* ~Go away. Go away! ~ */ DO ~SetGlobal("bd_jail_visitors","bd0104",6)
SetGlobal("bd_visit_player","locals",1)
~ GOTO 84 //<-- this should go to 87 imho

(...)

IF ~~ THEN BEGIN 84 // from: 80.5 81.1 82.2 83.0 83.1
SAY #70298 /* If Selûne wills it, we will meet again, <CHARNAME>. And if she is not willing, I shall take what solace I can from the memory of our time together. Farewell. */
IF ~~ THEN EXIT
END

(...)

IF ~~ THEN BEGIN 87 // from: 80.4
SAY #53490 /* Why? Can I not look upon the one I called friend, the one I called... something more? [BD53490] */
IF ~~ THEN REPLY #53491 /* I don't want you to see me like this. */ GOTO 88
IF ~~ THEN REPLY #53492 /* This has all been a terrible misunderstanding. Please Rasaad, you have to believe me. */ GOTO 90
IF ~~ THEN REPLY #53493 /* Leave me. I can't bear to look at you right now. */ GOTO 89
END <<

I do believe Rasaad's reaction is switched in these instances. He would more likely leave quickly if the PC is found guilty, and talk about the PC being more than a friend in case she is not.

3- Typo in #53484 (extra space): seems no longer to be an issue.  EDIT: #53484 /* ~Go away. Go away! ~ There is an extra space at the end. Used in bdrasaad.dlg.

4- Wrong scriptname for Imoen in bd6200.bcs

  • What is currently happening: in bd6200.bcs, the scriptname "bdimoen" is used once for Imoen.
  • What should be happening: Imoen's scriptname is "imoen" in BG:SoD (not EET!).
  • Steps to reproduce the bug: look at this script block in bd6200.bcs and see that it uses "bdimoen":
IF
	GlobalLT("bd_plot","global",660)
	Global("chapter","global",13)
THEN
	RESPONSE #100
		SetGlobal("bd_plot","global",660)
		IncrementGlobal("bd_canon_party_size","bd6200",1)  // Sewers Exit
		CreateCreature("bdimoen",[775.705],E)  // Imoen
		ActionOverride("bdimoen",MakeGlobalOverride())
		DisplayStringHead("IMOEN",39697)  // Heya! Over here! 
		Wait(1)
		ActionOverride("IMOEN",Dialog(Player1))
END
  • If available, a fix: Change
    ActionOverride("bdimoen",MakeGlobalOverride())
      to 
    ActionOverride("imoen",MakeGlobalOverride())
    in bd6200.bcs for BG:Sod (not EET!). (EET already fixes this for itself).

5- bdcrus22.cre scriptname mismatch:

  • What is currently happening: bdcrus22.cre has the scriptname bdcrus20.
  • What should be happening: I would expect bdcrus22.cre to have the script name bdcrus22.
  • Steps to reproduce the bug: For bdcrus22.cre, the cre is pawned in bd4300.bcs. Afterwards, the script addresses a bdcrus22.cre to ChangeAIScript - but there is no cre with this scriptname:      
CreateCreature("BDCRUS22",[1380.985],SW)  // Crusader
ActionOverride("BDCRUS22",ChangeAIScript("bd4300ex",OVERRIDE))

And also, "bdcrus20" is used to address the also existent cre bdcrus20.cre.

  • If available, a fix: Change the scriptnames of bdcrus22.cre to bdcrus22.

Same goes for bdcrus21.cre, but it seems not to be used anywhere as far as i can tell.

 

Link to comment
11 hours ago, CamDawg said:

C - If NPCs are kicked out in Korlasz' crypt, telling them to "return to the crypt's entrance" does nothing: If looking at Minsc's post dialogue bdminsc.dlg, the same triggers are used like for the coalition camps later, including the setting of "SetGlobal("bd_npc_camp","locals",1)" which is later used to move NPCs to one of the three camps. Only that here, it does nothing.

This is what I reported to BeamDog, with a slight adaption. Last message I received was the report was categorized as SoD Public Bugs. I started a 2.6.6 new game and the issue is still there, Minsc (with Dynaheir) not going to the crypt entrance as told but keeps standing where he was kicked out. It's a minor issue I think. Maybe the NPC's are just stubborn.

1. Start SoD
2. Load a new game as a cleric (so Minsc is in party)
3. kick Minsc out of the party
4. if he comes to talk to the PC, tell him and Dynaheir to go wait at the crypt's entrance.
5. end dialogue.

Observed
Minsc and Dynaheir remain standing where they were kicked out.

Expected
Minsc and Dynaheir should move to the crypt's entrance in bd0120.are.

Notes
If looking at Minsc's post dialogue bdminsc.dlg, the same triggers are used like for the coalition camps later, including the setting of "SetGlobal("bd_npc_camp","locals",1)" which is later used to move NPCs to one of the three camps. Only that here, it does nothing.

IF ~  OR(2)
AreaCheck("BD0120")
AreaCheck("BD0130")
GlobalGT("bd_joined","locals",0)
~ THEN BEGIN 6 // from: 
  SAY #66236 /* ~Having Minsc leave you, this I can nearly understand. But to turn away the space hamster, ho ho... I don't get it.~ [BD66236] */
  IF ~  IsValidForPartyDialogue("dynaheir")
~ THEN REPLY #66237 /* ~Just remain here and await my return, all right?~ */ GOTO 7
  IF ~  !IsValidForPartyDialogue("dynaheir")
~ THEN REPLY #66237 /* ~Just remain here and await my return, all right?~ */ DO ~SetGlobal("bd_joined","locals",0)
~ GOTO 8
  IF ~  IsValidForPartyDialogue("dynaheir")
OR(2)
!Range("ff_camp",999)
NextTriggerObject("ff_camp")
!IsOverMe("minsc")
~ THEN REPLY #66238 /* ~I want you to go wait for me at the crypt's entrance.~ */ GOTO 7
  IF ~  !IsValidForPartyDialogue("dynaheir")
OR(2)
!Range("ff_camp",999)
NextTriggerObject("ff_camp")
!IsOverMe("minsc")
~ THEN REPLY #66238 /* ~I want you to go wait for me at the crypt's entrance.~ */ DO ~SetGlobal("bd_joined","locals",0)
SetGlobal("bd_npc_camp","locals",1)
~ GOTO 8
  IF ~~ THEN REPLY #66239 /* ~Normally, yes, but this is no time for words. We must be alert to any dangers around us.~ */ GOTO 9
END

I didn't check all NPCs but it might well be this behavior is the same for the others, too.

 

Link to comment
11 hours ago, CamDawg said:

B - M'Khiin's script name should be "MKHIIN" Observed: the script bd5100aw.bcs uses the script name "BDMKHIIN" for M'Khiin Expected: the script bd5100aw.bcs should use the script name "MKHIIN" for M'Khiin

is fixed in 2.6.6.

Link to comment
11 hours ago, CamDawg said:

And I'll add one myself: SoD removes the XP-matching script from Imoen when you meet her in Lion's Way, reported most recently here.

Imoen's script "imoen.bcs" misses these script blocks the other BG1 NPC's have. Again, BG:SoD only, EET has this fixed for itself (plus uses a different script name for Imoen):

IF
	Global("BD_JOINXP","LOCALS",0)
	InParty(Myself)
	XPGT(Player1,31999)
	XPLT(Myself,32000)
THEN
	RESPONSE #100
		SetInterrupt(FALSE)
		SetGlobal("BD_JOINXP","LOCALS",1)
		ChangeStat(Myself,XP,32000,SET)
		SetInterrupt(TRUE)
END

IF
	Global("BD_JOINXP","LOCALS",0)
	InParty(Myself)
	XPGT(Player1,15999)
	XPLT(Myself,16000)
THEN
	RESPONSE #100
		SetInterrupt(FALSE)
		SetGlobal("BD_JOINXP","LOCALS",1)
		ChangeStat(Myself,XP,16000,SET)
		SetInterrupt(TRUE)
END

IF
	Global("BD_JOINXP","LOCALS",0)
	InParty(Myself)
	XPGT(Player1,7999)
	XPLT(Myself,8000)
THEN
	RESPONSE #100
		SetInterrupt(FALSE)
		SetGlobal("BD_JOINXP","LOCALS",1)
		ChangeStat(Myself,XP,8000,SET)
		SetInterrupt(TRUE)
END

IF
	Global("BD_JOINXP","LOCALS",0)
	InParty(Myself)
	XPGT(Player1,3999)
	XPLT(Myself,4000)
THEN
	RESPONSE #100
		SetInterrupt(FALSE)
		SetGlobal("BD_JOINXP","LOCALS",1)
		ChangeStat(Myself,XP,4000,SET)
		SetInterrupt(TRUE)
END

IF
	Global("BD_JOINXP","LOCALS",0)
	InParty(Myself)
	XPGT(Player1,1999)
	XPLT(Myself,2000)
THEN
	RESPONSE #100
		SetInterrupt(FALSE)
		SetGlobal("BD_JOINXP","LOCALS",1)
		ChangeStat(Myself,XP,2000,SET)
		SetInterrupt(TRUE)
END

IF
	Global("BD_JOINXP","LOCALS",0)
	InParty(Myself)
THEN
	RESPONSE #100
		SetInterrupt(FALSE)
		SetGlobal("BD_JOINXP","LOCALS",1)
		SetInterrupt(TRUE)
END

 

Link to comment

I'm not sure this is a "Bug", but I'd call it an "Oversight".

EDIT: OR the script never works at all because "Followers" is not the death variable of any cres, but the name they have in the are-file? Is this a name the engine can see?

In bd0120.bcs, the NPCs make a comment after the first batch or enemies is defeated:

IF
	Global("bd_plot","global",10)
	Global("bd_mdd000te_ot","bd0120",0)  // Tomb Safehouse, First Floor
	NumDeadGT("Followers",4)
	CombatCounter(0)
THEN
	RESPONSE #100
		SetGlobal("bd_mdd000te_ot","bd0120",1)  // Tomb Safehouse, First Floor
END

(This triggers some of the comments in a randomized manner, for example Minsc:)

Spoiler

IF
    Global("bd_plot","global",10)
    GlobalGT("bd_mdd000te_ot","bd0120",0)  // Tomb Safehouse, First Floor
    GlobalLT("bd_mdd000te_ot","bd0120",3)  // Tomb Safehouse, First Floor
    Global("bd_mdd000te_ot_Minsc","bd0120",0)  // Tomb Safehouse, First Floor
    IfValidForPartyDialog("Minsc")  // Minsc
THEN
    RESPONSE #200
        Continue()
    RESPONSE #100
        IncrementGlobal("bd_mdd000te_ot","bd0120",1)  // Tomb Safehouse, First Floor
        SetGlobal("bd_mdd000te_ot_Minsc","bd0120",1)  // Tomb Safehouse, First Floor
        DisplayStringHead("Minsc",45988)  // ...And that's why you don't side with evil!
        Wait(5)
END

Problem: there is a total of 6 cres with DV "Followers" in that encounter. Of which 3 will DestroySelf() if the game difficulty is DifficultyLT(NORMAL) (via BDLCORE.bcs which is assigned to 3 of the cres in the are-file.)

Meaning: for DifficultyLT(NORMAL), the comments of the NPCs will not show. I am not sure this is on purpose.

I'd recommend changing NumDeadGT("Followers",4) to NumDeadGT("Followers",2) in the above script block. If we want to include this into the Fixpack. I'm not sure the script should check for "Followers" at all because it's not a deathvariable but the name of the cres in the are file?

Link to comment

And another oversight, this one really vexes me.

In bd7230.are there is a spike trap the player can activate which will kill the imprisoned crusaders. One click should give the warning "you could kill the crusaders yaddayadda". Clicking a second time will activate the spike trap, kill the crusaders inside the cells and also has script blocks that if doing so, a paladin or ranger PC will fall(!).

My problem: The according script of the area region is "bdlever2.bcs", which is as follows:

Spoiler

IF
    WalkedToTrigger([ANYONE])
    !Global("bd_sdd201_missing_keherram","GLOBAL",3)
    Global("bd_sdd201_missing_keherram_lever","GLOBAL",0)
    !GlobalTimerNotExpired("BD_BARK","MYAREA")
THEN
    RESPONSE #100
        DisplayStringNoName(Myself,66758)  // This switch seems tied to the spike trap beneath the cage. Flipping the switch would kill anyone in the cage.
        SetGlobal("bd_sdd201_missing_keherram_lever","GLOBAL",1)
        SetGlobalTimer("BD_BARK","MYAREA",ONE_MINUTE)
END

IF
    WalkedToTrigger([ANYONE])
    Global("bd_sdd201_missing_keherram_lever","GLOBAL",1)
    !Global("bd_sdd201_missing_keherram","GLOBAL",3)
    !Global("bd_sdd201_missing_door","GLOBAL",2)
    !GlobalTimerNotExpired("BD_BARK","MYAREA")
THEN
    RESPONSE #100
        ScreenShake([5.5],5)
        Wait(1)
        DisplayStringNoName(Myself,66759)  // You flip the switch and spikes shoot up from the floor.
        CreateVisualEffect("TRSPEART",[2285.590])
        CreateVisualEffect("TRSPEART",[2295.600])
        CreateVisualEffect("TRSPEART",[2305.610])
        CreateVisualEffect("TRSPEART",[2315.570])
        CreateVisualEffect("TRSPEART",[2325.580])
        CreateVisualEffect("TRSPEART",[2335.590])
        CreateVisualEffect("TRSPEART",[2345.550])
        CreateVisualEffect("TRSPEART",[2355.560])
        CreateVisualEffect("TRSPEART",[2365.570])
        CreateVisualEffect("TRSPEART",[2210.530])
        CreateVisualEffect("TRSPEART",[2220.540])
        CreateVisualEffect("TRSPEART",[2230.550])
        CreateVisualEffect("TRSPEART",[2240.510])
        CreateVisualEffect("TRSPEART",[2250.520])
        CreateVisualEffect("TRSPEART",[2260.530])
        CreateVisualEffect("TRSPEART",[2270.490])
        CreateVisualEffect("TRSPEART",[2280.500])
        CreateVisualEffect("TRSPEART",[2290.510])
        CreateVisualEffect("TRSPEART",[2107.470])
        CreateVisualEffect("TRSPEART",[2117.480])
        CreateVisualEffect("TRSPEART",[2127.490])
        CreateVisualEffect("TRSPEART",[2137.450])
        CreateVisualEffect("TRSPEART",[2147.460])
        CreateVisualEffect("TRSPEART",[2157.470])
        CreateVisualEffect("TRSPEART",[2167.430])
        CreateVisualEffect("TRSPEART",[2177.440])
        CreateVisualEffect("TRSPEART",[2187.450])
        Kill("bdkharmy")  // Keherrem
        Kill("bdkher1")  // Crusader Recruit
        Kill("bdkher2")  // Crusader Recruit
        Wait(1)
        DisplayStringHead("bdkharmy",64439)  // Spikes shot up from the floor and impaled these crusaders, killing them.
        SetGlobal("bd_sdd201_missing_keherram","GLOBAL",3)
        SetGlobal("bd_sdd201_missing_keherram_lever","GLOBAL",2)
        SetGlobalTimer("BD_BARK","MYAREA",ONE_MINUTE)
        Continue()
END

IF
    WalkedToTrigger([ANYONE])
    Global("bd_sdd201_missing_keherram_lever","GLOBAL",1)
    !Global("bd_sdd201_missing_keherram","GLOBAL",3)
    !Global("bd_sdd201_missing_door","GLOBAL",2)
    !GlobalTimerNotExpired("BD_BARK","MYAREA")
    GlobalLT("bd_plot","global",250)
THEN
    RESPONSE #100
        AddJournalEntry(64444,QUEST)  // The Missing Patrol My next task is to take the crusader leader's badge back to the crusader camp. I found the missing crusader patrol and killed them by pulling a lever. The lever caused spikes to shoot up and impale all the crusaders in the cage. Gruesome. When I return to the crusader camp, I'll tell them that the cultists in this dungeon killed the crusaders. I should bring their leader's badge back with me as proof.
        Continue()
END

IF
    WalkedToTrigger([ANYONE])
    Global("bd_sdd201_missing_keherram_lever","GLOBAL",1)
    !Global("bd_sdd201_missing_keherram","GLOBAL",3)
    !Global("bd_sdd201_missing_door","GLOBAL",2)
    !GlobalTimerNotExpired("BD_BARK","MYAREA")
    GlobalLT("bd_plot","global",250)
    Class(Player1,PALADIN)
    !Kit(Player1,Blackguard)
THEN
    RESPONSE #100
        ActionOverride(Player1,RemovePaladinHood())
END

IF
    WalkedToTrigger([ANYONE])
    Global("bd_sdd201_missing_keherram_lever","GLOBAL",1)
    !Global("bd_sdd201_missing_keherram","GLOBAL",3)
    !Global("bd_sdd201_missing_door","GLOBAL",2)
    !GlobalTimerNotExpired("BD_BARK","MYAREA")
    GlobalLT("bd_plot","global",250)
    Class(Player1,RANGER)
THEN
    RESPONSE #100
        ActionOverride(Player1,RemoveRangerHood())
END

IF
    WalkedToTrigger([ANYONE])
    Global("bd_sdd201_missing_keherram_lever","GLOBAL",1)
    OR(2)
        Global("bd_sdd201_missing_keherram","GLOBAL",3)
        Global("bd_sdd201_missing_door","GLOBAL",2)
    !GlobalTimerNotExpired("BD_BARK","MYAREA")
THEN
    RESPONSE #100
        ScreenShake([5.5],5)
        Wait(1)
        DisplayStringNoName(Myself,66759)  // You flip the switch and spikes shoot up from the floor.
        CreateVisualEffect("TRSPEART",[2285.590])
        CreateVisualEffect("TRSPEART",[2295.600])
        CreateVisualEffect("TRSPEART",[2305.610])
        CreateVisualEffect("TRSPEART",[2315.570])
        CreateVisualEffect("TRSPEART",[2325.580])
        CreateVisualEffect("TRSPEART",[2335.590])
        CreateVisualEffect("TRSPEART",[2345.550])
        CreateVisualEffect("TRSPEART",[2355.560])
        CreateVisualEffect("TRSPEART",[2365.570])
        CreateVisualEffect("TRSPEART",[2210.530])
        CreateVisualEffect("TRSPEART",[2220.540])
        CreateVisualEffect("TRSPEART",[2230.550])
        CreateVisualEffect("TRSPEART",[2240.510])
        CreateVisualEffect("TRSPEART",[2250.520])
        CreateVisualEffect("TRSPEART",[2260.530])
        CreateVisualEffect("TRSPEART",[2270.490])
        CreateVisualEffect("TRSPEART",[2280.500])
        CreateVisualEffect("TRSPEART",[2290.510])
        CreateVisualEffect("TRSPEART",[2107.470])
        CreateVisualEffect("TRSPEART",[2117.480])
        CreateVisualEffect("TRSPEART",[2127.490])
        CreateVisualEffect("TRSPEART",[2137.450])
        CreateVisualEffect("TRSPEART",[2147.460])
        CreateVisualEffect("TRSPEART",[2157.470])
        CreateVisualEffect("TRSPEART",[2167.430])
        CreateVisualEffect("TRSPEART",[2177.440])
        CreateVisualEffect("TRSPEART",[2187.450])
        SetGlobal("bd_sdd201_missing_keherram_lever","GLOBAL",2)
        SetGlobalTimer("BD_BARK","MYAREA",ONE_MINUTE)
        Continue()
END

IF
    WalkedToTrigger([ANYONE])
    Global("bd_sdd201_missing_keherram_lever","GLOBAL",2)
    !GlobalTimerNotExpired("BD_BARK","MYAREA")
THEN
    RESPONSE #100
        DisplayStringNoName(Myself,66760)  // There's nothing more to do with the switch.
        SetGlobalTimer("BD_BARK","MYAREA",ONE_MINUTE)
END

 

Because of the "WalkedToTrigger([ANYONE])", clicking the lever with more than one character highlighted/selected will result in every character (PC/NPC) walking to the lever and counting as a "click". Meaning - the engine will count the lever to be activated more than once, the spike trap will be executed - although the player clicked only once on it. I reported this like before the 2.5 patch. This is a bad oversight.

Without having tested it I would assume switching the "WalkedToTrigger([ANYONE])" to "Clicked([ANYONE])" would make sure one click is counted as one click no matter "how many" group members are currently selected.

Link to comment

Wrong scriptname for bdhalat.cre in bd5300.bcs. bd5300.bcs uses "bdhalat" for scriptname:

IF
	Global("BD_SDD350_JAR","GLOBAL",1)
	!GlobalTimerNotExpired("bd_sdd350d_ot_timer","bd5300")  // Kanaglym
	OR(2)
		Global("BD_HALATA_RELEASED","GLOBAL",0)
		!Dead("bdhalata")  // Halatathlaer
	Switch("BD_HALATA_RELEASED","GLOBAL")
THEN
	RESPONSE #0
		SetGlobal("BD_HALATA_RELEASED","GLOBAL",2)
		SetGlobal("SPRITE_IS_DEADBDHALATA","GLOBAL",0)
		SetGlobal("BD_AREA_HOSTILE","BD5300",1)  // Kanaglym
		CreateCreature("bdhalat",[766.512],SE)  // Halatathlaer
		ChangeEnemyAlly("bdhalata",GOODBUTBLUE)  // Halatathlaer
		DisplayStringHead("bdhalat",50299)  // Free to avenge my dishonor!
	RESPONSE #1
		SetGlobal("BD_HALATA_RELEASED","GLOBAL",2)
		ChangeEnemyAlly("bdhalata",GOODBUTBLUE)  // Halatathlaer
		DisplayStringHead(Myself,50298)  // Free at last from that wretched jar!
END

If we open bdhalat.cre, we see that the correct scriptname would be "BDHALATA".

for fix, change in bd5300.bcs:

DisplayStringHead("bdhalat"

to

DisplayStringHead("bdhalata"

 

Link to comment

bd5300.bcs uses a timer that uses "bd2000" as type. This time is only used in bd5300.bcs so I guess the timer is supposed to address "bd5300" instead of "bd2000" - I'm not sure how "area" timer work, but if it's like area variables, this timer check will not work in bd5300 if it's scripted for bd2000. (All relevant script blocks still run since they check for "!GlobalTimerNotExpired" which also gives true if the timer wasn't started.)

In bd5300, the timer "bd_sdd350b_ot_timer" used in several script blocks has the area specification "bd2000":

Spoiler

bd5300_bd2000_timer.jpg

I'd expect the timer to be defined for "bd5300" instead.

To fix, change all "bd2000" instances to "bd5300" inside bd5300.bcs.

Link to comment

A few more minor ones:

  • Minsc's script (bdminsc) has a broken DV reference to Rasaad, "rasaad'". It's hard to see in the forum font, but there's a single quote before the closing quote.
  • The 'advanced AI' scripting for the PC, Imoen, Eldoth, Garrick, Kivan, Dynaheir, Edwin, and Xzar have some old BG2 string references.
  • Some of the generic townie dialogues are checking for the wrong DV for Bassilus. It doesn't change dialogue, but does change whether or not they set a journal entry (the journal entry shouldn't be set is you've killed Basillus already).
  • The woman in Beregost who calls for her Flaming Fist husband when you enter her home checks the wrong DV to see if he's dead.

 

Link to comment
On 3/30/2022 at 11:59 AM, jastey said:

I'm not sure this is a "Bug", but I'd call it an "Oversight".

EDIT: OR the script never works at all because "Followers" is not the death variable of any cres, but the name they have in the are-file? Is this a name the engine can see?

In bd0120.bcs, the NPCs make a comment after the first batch or enemies is defeated:

IF
	Global("bd_plot","global",10)
	Global("bd_mdd000te_ot","bd0120",0)  // Tomb Safehouse, First Floor
	NumDeadGT("Followers",4)
	CombatCounter(0)
THEN
	RESPONSE #100
		SetGlobal("bd_mdd000te_ot","bd0120",1)  // Tomb Safehouse, First Floor
END

(This triggers some of the comments in a randomized manner, for example Minsc:)

  Hide contents

IF
    Global("bd_plot","global",10)
    GlobalGT("bd_mdd000te_ot","bd0120",0)  // Tomb Safehouse, First Floor
    GlobalLT("bd_mdd000te_ot","bd0120",3)  // Tomb Safehouse, First Floor
    Global("bd_mdd000te_ot_Minsc","bd0120",0)  // Tomb Safehouse, First Floor
    IfValidForPartyDialog("Minsc")  // Minsc
THEN
    RESPONSE #200
        Continue()
    RESPONSE #100
        IncrementGlobal("bd_mdd000te_ot","bd0120",1)  // Tomb Safehouse, First Floor
        SetGlobal("bd_mdd000te_ot_Minsc","bd0120",1)  // Tomb Safehouse, First Floor
        DisplayStringHead("Minsc",45988)  // ...And that's why you don't side with evil!
        Wait(5)
END

Problem: there is a total of 6 cres with DV "Followers" in that encounter. Of which 3 will DestroySelf() if the game difficulty is DifficultyLT(NORMAL) (via BDLCORE.bcs which is assigned to 3 of the cres in the are-file.)

Meaning: for DifficultyLT(NORMAL), the comments of the NPCs will not show. I am not sure this is on purpose.

I'd recommend changing NumDeadGT("Followers",4) to NumDeadGT("Followers",2) in the above script block. If we want to include this into the Fixpack. I'm not sure the script should check for "Followers" at all because it's not a deathvariable but the name of the cres in the are file?

If you look in the area file, the 'override script name' flag is set so they use their area name 'Followers' instead of the DV set in their creature file. Lowering the deathcount trigger will work.

Link to comment
On 3/28/2022 at 2:12 AM, jastey said:

2- Probable mixup in Rasaad's prison farewell lovetalk:

On 3/28/2022 at 2:35 AM, jastey said:

If NPCs are kicked out in Korlasz' crypt ...

I need to look into both of these a bit more. Otherwise everything else in the thread to this point is coded and committed.

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