argent77 Posted January 28, 2012 Posted January 28, 2012 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!
Wisp Posted January 28, 2012 Posted January 28, 2012 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.
argent77 Posted January 28, 2012 Author Posted January 28, 2012 There is a delay when you set variables in dialogues. Accessing them from the same dialogue is generally unreliable. That's too bad. Does this also apply to area or global variables?
Miloch Posted January 28, 2012 Posted January 28, 2012 Hmm, maybe a Wait(1) or even a SmallWait(5) before DOing anything else might help?
argent77 Posted January 28, 2012 Author Posted January 28, 2012 That's worth a try. I'll check it out.
argent77 Posted January 28, 2012 Author Posted January 28, 2012 Neither Wait() nor SmallWait() appear to work. I didn't even notice any delay at all. Guess I have to find another way to add randomness.
i30817 Posted January 29, 2012 Posted January 29, 2012 Require tobex and use SetDialogGlobal (or whatever it is). There is no other way to add randomness (that i'm aware of).
argent77 Posted January 29, 2012 Author Posted January 29, 2012 I've already eliminated the need of variables, so it works without tobex. But it has tripled my code size.
Recommended Posts
Archived
This topic is now archived and is closed to further replies.