Jump to content

cernd no valid replies issue


Recommended Posts

This was originally found as an OR(4) with only three conditions, but the problem's worse. cernd.dlg state 6:

 

IF ~~ THEN BEGIN 6 // from: 69.0
 SAY #7874 /* ~It is not unheard of, but the attacks have me worried.  It can only lead to greater evils; these people will eventually strike out as an animal cornered.~ */
 IF ~!Class(Player1,DRUID_ALL)
OR(4)
!Class(Player1,RANGER_ALL)
!InParty("Jaheira")
!InParty("Minsc")
~ THEN GOTO 70
 IF ~InParty("Jaheira")
AreaCheckObject("AR2009","Jaheira")
!Dead("Jaheira")
~ THEN GOTO 32
 IF ~!InParty("Jaheira")
InParty("Minsc")
AreaCheckObject("AR2009","Minsc")
!Dead("Minsc")
~ THEN GOTO 33
 IF ~OR(2)
Class(Player1,DRUID_ALL)
Class(Player1,RANGER_ALL)
!InParty("Jaheira")
!InParty("Minsc")
~ THEN GOTO 31
END

 

This is the initial meeting with Cernd in the Trademeet prison, where he's explaining the attacks to the party. He's basically looking for a tree-hugger in the party so he can insert a one-off line about Jaheira/Minsc/Player1 (in that order) understanding the problems of nature.

 

The DRUID_ALL class check is probably supposed to be the fourth condition under the OR(4), but even then we've got a bigger problem: the dialogue can crap out if, for example, Player 1 is a ranger or druid AND Minsc and Jaheira are both in the party but dead. The problem is essentially that the triggers for transitions 1 and 2 are more strict than 0 and 3. Since transition 0 is supposed to be the default keep-explaining-the-quest we should just eliminate the trigger and move on. Triggers in states 3 and 4 need to reflect the stricter triggers upstream as well, so we have (for soa-dlg.d):

 

ALTER_TRANS CERND BEGIN 6 END BEGIN 0 END  BEGIN TRIGGER ~~ END
ALTER_TRANS CERND BEGIN 6 END BEGIN 2 END  BEGIN TRIGGER
~OR(3)
 !InParty("Jaheira")
 !AreaCheckObject("AR2009","Jaheira")
 Dead("Jaheira")
InParty("Minsc")
AreaCheckObject("AR2009","Minsc")
!Dead("Minsc")~ END
ALTER_TRANS CERND BEGIN 6 END BEGIN 3 END  BEGIN TRIGGER
~OR(2)
 Class(Player1,DRUID_ALL)
 Class(Player1,RANGER_ALL)
OR(3)
 !InParty("Jaheira")
 !AreaCheckObject("AR2009","Jaheira")
 Dead("Jaheira")
OR(3)
 !InParty("Minsc")
 !AreaCheckObject("AR2009","Minsc")
 Dead("Minsc")~ END

 

It results in the uglier-but-more-robust state 6:

 

IF ~~ THEN BEGIN 6 // from: 69.0
 SAY #7874 /* ~It is not unheard of, but the attacks have me worried.  It can only lead to greater evils; these people will eventually strike out as an animal cornered.~ */
 IF ~~ THEN GOTO 70
 IF ~InParty("Jaheira")
AreaCheckObject("AR2009","Jaheira")
!Dead("Jaheira")
~ THEN GOTO 32
 IF ~OR(3)
!InParty("Jaheira")
!AreaCheckObject("AR2009","Jaheira")
Dead("Jaheira")
InParty("Minsc")
AreaCheckObject("AR2009","Minsc")
!Dead("Minsc")
~ THEN GOTO 33
 IF ~OR(2)
Class(Player1,DRUID_ALL)
Class(Player1,RANGER_ALL)
OR(3)
!InParty("Jaheira")
!AreaCheckObject("AR2009","Jaheira")
Dead("Jaheira")
OR(3)
!InParty("Minsc")
!AreaCheckObject("AR2009","Minsc")
Dead("Minsc")
~ THEN GOTO 31
END

Link to comment

That looks about right, but I don't know if it's entirely necessary to be so thorough. Both the !Class() checks should be outside the Or(), which is the main bug. The Dead() checks are spurious (covered by InParty()), though, and I don't think the AreaCheckObject() is doing anything worthwhile (this is an auto-save transition IIRC)?

 

So it could be fixed just by changing "!Class(Player1,DRUID_ALL)\rOr(4)\r!Class(Player1,RANGER_ALL)" to "!Class(Player1,D_A) !Class(Player1,R_A) Or(2)" ...

Link to comment
The Dead() checks are spurious (covered by InParty())

I thought dead party members still returned true to InParty() checks (been a while). If so, yeah, trans 0 is the only issue.

 

I don't think the AreaCheckObject() is doing anything worthwhile (this is an auto-save transition IIRC)?

Yep, completely useless.

 

So it could be fixed just by changing "!Class(Player1,DRUID_ALL)\rOr(4)\r!Class(Player1,RANGER_ALL)" to "!Class(Player1,D_A) !Class(Player1,R_A) Or(2)" ...

Honestly, it just looks like another dialogue file written by Bioware without understanding the transitions get evaluated bottom-up. :/ I'd rather just remove all triggers on trans 0 instead of a rat's nest of unnecessary ones.

Link to comment

All of SoA was written with explicit triggers, though (it wasn't until ToB that they decided to take the shortcut), so the empty trigger is out of place (BIS didn't code dialogues the ToB way either; BioWare simply got corrupted by the community).

 

The AreaCheckObject() thing has something to do with the designer who put Cernd in (his code is the only to use it, in a couple places, ever). Maybe he was new.

 

InParty() returns only the living (InPartyAllowDead() is needed to pick up corpses).

 

But either way should give same results (I was just suggesting the route with the least difference from original), true.

Link to comment

Archived

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

×
×
  • Create New...