Jump to content

Unexpected dialog behaviour when using RandomNum()


argent77

Recommended Posts

Hello,

 

I have another problem concerning dialogs. This time it's a bit more complicated.

In the course of a conversation my character has to solve three riddles. I have a pool of five riddles from which I choose three in a random order, but no riddle should be asked twice.

 

The first issue crops up when the first riddle is posed the first time. The "Correct answer" reply is always missing. In subsequent conversations it works as expected.

The second issue crops up after I solve the first riddle. The second and third pass will loop through twice, meaning the dialog jumps back to the states Statue.9 and Statue.10 twice before it advances.

 

This is the code I have written for it (it's rather complicated, I know):

// Asking the first riddle
IF ~~ Statue.7
SAY ~Here is my first riddle. Listen carefully.~
IF ~RandomNum(5, 1)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 1)~ + Statue.Riddle.1
IF ~RandomNum(5, 2)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 1)~ + Statue.Riddle.2
IF ~RandomNum(5, 3)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 1)~ + Statue.Riddle.3
IF ~RandomNum(5, 4)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 1)~ + Statue.Riddle.4
IF ~RandomNum(5, 5)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 1)~ + Statue.Riddle.5
END

// Asking the second riddle
IF ~~ Statue.8
SAY ~You are correct. Now pay attention to my second riddle.~
IF ~RandomNum(5, 1) Global("riddle1", "LOCALS", 0)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.1
IF ~RandomNum(5, 1) Global("riddle1", "LOCALS", 1)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.2

IF ~RandomNum(5, 2) Global("riddle2", "LOCALS", 0)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.2
IF ~RandomNum(5, 2) Global("riddle2", "LOCALS", 1)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.3

IF ~RandomNum(5, 3) Global("riddle3", "LOCALS", 0)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.3
IF ~RandomNum(5, 3) Global("riddle3", "LOCALS", 1)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.4

IF ~RandomNum(5, 4) Global("riddle4", "LOCALS", 0)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.4
IF ~RandomNum(5, 4) Global("riddle4", "LOCALS", 1)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.5

IF ~RandomNum(5, 5) Global("riddle5", "LOCALS", 0)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.5
IF ~RandomNum(5, 5) Global("riddle5", "LOCALS", 1)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 2)~ + Statue.Riddle.1
END

// Asking the third riddle
IF ~~ Statue.9
SAY ~I am impressed. Her comes my last riddle.~
IF ~RandomNum(5, 1) Global("riddle1", "LOCALS", 0)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.1
IF ~RandomNum(5, 1) Global("riddle1", "LOCALS", 1) Global("riddle2", "LOCALS", 1)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.3
IF ~RandomNum(5, 1) Global("riddle1", "LOCALS", 1) Global("riddle3", "LOCALS", 1)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.4
IF ~RandomNum(5, 1) Global("riddle1", "LOCALS", 1) Global("riddle4", "LOCALS", 1)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.5
IF ~RandomNum(5, 1) Global("riddle1", "LOCALS", 1) Global("riddle5", "LOCALS", 1)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.2

IF ~RandomNum(5, 2) Global("riddle2", "LOCALS", 0)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.2
IF ~RandomNum(5, 2) Global("riddle2", "LOCALS", 1) Global("riddle1", "LOCALS", 1)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.5
IF ~RandomNum(5, 2) Global("riddle2", "LOCALS", 1) Global("riddle3", "LOCALS", 1)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.1
IF ~RandomNum(5, 2) Global("riddle2", "LOCALS", 1) Global("riddle4", "LOCALS", 1)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.3
IF ~RandomNum(5, 2) Global("riddle2", "LOCALS", 1) Global("riddle5", "LOCALS", 1)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.4

IF ~RandomNum(5, 3) Global("riddle3", "LOCALS", 0)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.3
IF ~RandomNum(5, 3) Global("riddle3", "LOCALS", 1) Global("riddle1", "LOCALS", 1)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.2
IF ~RandomNum(5, 3) Global("riddle3", "LOCALS", 1) Global("riddle2", "LOCALS", 1)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.4
IF ~RandomNum(5, 3) Global("riddle3", "LOCALS", 1) Global("riddle4", "LOCALS", 1)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.5
IF ~RandomNum(5, 3) Global("riddle3", "LOCALS", 1) Global("riddle5", "LOCALS", 1)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.1

IF ~RandomNum(5, 4) Global("riddle4", "LOCALS", 0)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.4
IF ~RandomNum(5, 4) Global("riddle4", "LOCALS", 1) Global("riddle1", "LOCALS", 1)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.3
IF ~RandomNum(5, 4) Global("riddle4", "LOCALS", 1) Global("riddle2", "LOCALS", 1)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.5
IF ~RandomNum(5, 4) Global("riddle4", "LOCALS", 1) Global("riddle3", "LOCALS", 1)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.2
IF ~RandomNum(5, 4) Global("riddle4", "LOCALS", 1) Global("riddle5", "LOCALS", 1)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.1

IF ~RandomNum(5, 5) Global("riddle5", "LOCALS", 0)~ DO ~SetGlobal("riddle5", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.5
IF ~RandomNum(5, 5) Global("riddle5", "LOCALS", 1) Global("riddle1", "LOCALS", 1)~ DO ~SetGlobal("riddle4", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.4
IF ~RandomNum(5, 5) Global("riddle5", "LOCALS", 1) Global("riddle2", "LOCALS", 1)~ DO ~SetGlobal("riddle1", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.1
IF ~RandomNum(5, 5) Global("riddle5", "LOCALS", 1) Global("riddle3", "LOCALS", 1)~ DO ~SetGlobal("riddle2", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.2
IF ~RandomNum(5, 5) Global("riddle5", "LOCALS", 1) Global("riddle4", "LOCALS", 1)~ DO ~SetGlobal("riddle3", "LOCALS", 1) SetGlobal("riddles", "LOCALS", 3)~ + Statue.Riddle.3
END

// Riddles solved, get a reward, etc.
IF ~~ Statue.10
SAY ~You have satisfied my curiosity...~
IF ~~ DO ~GiveItem("A704WS3", LastTalkedToBy) SetGlobal("StatueTalk", "ARA704", 2)~ EXIT
END

// Riddle #1: the correct answer should be randomly listed between the wrong answers (riddles #2...#5 look the same)
IF ~~ Statue.Riddle.1
SAY ~First Riddle...~
+ ~RandomNum(7, 1) Global("riddles", "LOCALS", 1)~ + ~Right answer~ + Statue.8
+ ~RandomNum(7, 1) Global("riddles", "LOCALS", 2)~ + ~Right answer~ + Statue.9
+ ~RandomNum(7, 1) Global("riddles", "LOCALS", 3)~ + ~Right answer~ + Statue.10
+ ~RandomNum(3, 1)~ + ~Wrong answer 1~ + Statue.Riddle.Wrong.1
+ ~RandomNum(3, 2)~ + ~Wrong answer 1~ + Statue.Riddle.Wrong.2
+ ~RandomNum(3, 3)~ + ~Wrong answer 1~ + Statue.Riddle.Wrong.3
+ ~RandomNum(7, 2) Global("riddles", "LOCALS", 1)~ + ~Right answer~ + Statue.8
+ ~RandomNum(7, 2) Global("riddles", "LOCALS", 2)~ + ~Right answer~ + Statue.9
+ ~RandomNum(7, 2) Global("riddles", "LOCALS", 3)~ + ~Right answer~ + Statue.10
+ ~RandomNum(3, 1)~ + ~Wrong answer 2~ + Statue.Riddle.Wrong.1
+ ~RandomNum(3, 2)~ + ~Wrong answer 2~ + Statue.Riddle.Wrong.2
+ ~RandomNum(3, 3)~ + ~Wrong answer 2~ + Statue.Riddle.Wrong.3
+ ~RandomNum(7, 3) Global("riddles", "LOCALS", 1)~ + ~Right answer~ + Statue.8
+ ~RandomNum(7, 3) Global("riddles", "LOCALS", 2)~ + ~Right answer~ + Statue.9
+ ~RandomNum(7, 3) Global("riddles", "LOCALS", 3)~ + ~Right answer~ + Statue.10
+ ~RandomNum(3, 1)~ + ~Wrong answer 3~ + Statue.Riddle.Wrong.1
+ ~RandomNum(3, 2)~ + ~Wrong answer 3~ + Statue.Riddle.Wrong.2
+ ~RandomNum(3, 3)~ + ~Wrong answer 3~ + Statue.Riddle.Wrong.3
+ ~RandomNum(7, 4) Global("riddles", "LOCALS", 1)~ + ~Right answer~ + Statue.8
+ ~RandomNum(7, 4) Global("riddles", "LOCALS", 2)~ + ~Right answer~ + Statue.9
+ ~RandomNum(7, 4) Global("riddles", "LOCALS", 3)~ + ~Right answer~ + Statue.10
+ ~RandomNum(3, 1)~ + ~Wrong answer 4~ + Statue.Riddle.Wrong.1
+ ~RandomNum(3, 2)~ + ~Wrong answer 4~ + Statue.Riddle.Wrong.2
+ ~RandomNum(3, 3)~ + ~Wrong answer 4~ + Statue.Riddle.Wrong.3
+ ~RandomNum(7, 5) Global("riddles", "LOCALS", 1)~ + ~Right answer~ + Statue.8
+ ~RandomNum(7, 5) Global("riddles", "LOCALS", 2)~ + ~Right answer~ + Statue.9
+ ~RandomNum(7, 5) Global("riddles", "LOCALS", 3)~ + ~Right answer~ + Statue.10
+ ~RandomNum(3, 1)~ + ~Wrong answer 5~ + Statue.Riddle.Wrong.1
+ ~RandomNum(3, 2)~ + ~Wrong answer 5~ + Statue.Riddle.Wrong.2
+ ~RandomNum(3, 3)~ + ~Wrong answer 5~ + Statue.Riddle.Wrong.3
+ ~RandomNum(7, 6) Global("riddles", "LOCALS", 1)~ + ~Right answer~ + Statue.8
+ ~RandomNum(7, 6) Global("riddles", "LOCALS", 2)~ + ~Right answer~ + Statue.9
+ ~RandomNum(7, 6) Global("riddles", "LOCALS", 3)~ + ~Right answer~ + Statue.10
+ ~RandomNum(3, 1)~ + ~Wrong answer 6~ + Statue.Riddle.Wrong.1
+ ~RandomNum(3, 2)~ + ~Wrong answer 6~ + Statue.Riddle.Wrong.2
+ ~RandomNum(3, 3)~ + ~Wrong answer 6~ + Statue.Riddle.Wrong.3
+ ~RandomNum(7, 7) Global("riddles", "LOCALS", 1)~ + ~Right answer~ + Statue.8
+ ~RandomNum(7, 7) Global("riddles", "LOCALS", 2)~ + ~Right answer~ + Statue.9
+ ~RandomNum(7, 7) Global("riddles", "LOCALS", 3)~ + ~Right answer~ + Statue.10
++ ~I don't want to play your games anymore.~ + Statue.Refused
END

 

I am unsure what is causing this behaviour. I guess there are either side effects in the RandomNum() action which I don't understand or the local variables aren't set on time to be evaluated correctly by the subsequent dialog blocks.

 

Any help would be appreciated!

Link to comment

or the local variables aren't set on time to be evaluated correctly by the subsequent dialog blocks.

This. There is a delay when you set variables in dialogues. Accessing them from the same dialogue is generally unreliable.

If you use ToBEx there is a set-dlg-var-instantaneously action available.

Link to comment

Archived

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

×
×
  • Create New...