function draw_question( question, answers ) { x = 64; y = 400; sel = null; for(;;) { height = 64 + dict_size( answers ) * 24; SS_DrawColorRect_WH( x, y, 400, height, 0, 0, 0, 0.5 ); SS_DrawTextLine( question, Font, x, y, color(1,1,1) ); i = 0; mon = null; selfunc = null; foreach( func, name : answers ) { ay = y + 64 + i * 24; mouseon = mpos.x >= x && mpos.x < x + 400 && mpos.y >= ay && mpos.y < ay + 24; if( mouseon ) mon = i; issel = i === sel; if( issel ) selfunc = func; SS_DrawColorRect_WH( x, ay, 400, 24, mouseon - issel * 0.5, 0, 0, 0.5 ); SS_DrawTextLine_VC( name, Font, x, ay + 12, color(1) ); i++; } if( curclick && !prevclick ) sel = mon; else if( !curclick && prevclick ) { if( sel !== null && mon === sel ) { thread _G[ "q_" $ selfunc ](); return; } sel = null; } yield; } } function q_step0(){ draw_question( "why not?", { "step1" = "Well, let me think about it", "step0" = "No reason" } ); } function q_step1(){ draw_question( "shall we proceed?", { "step2" = "Yes", "step0" = "No", "info" = "Tell me more" } ); } function q_info(){ draw_question( "This is a test dialog", { "step1" = "Ok, got it" } ); } function q_step2(){ draw_question( "what should we do?", { "action1" = "Let's do the action 1", "action2" = "Let's do the action 2", "step1" = "Let's take a step back" } ); } function q_action1(){ draw_question( "Action 1 done!", { "step2" = "Ok!" } ); } function q_action2(){ draw_question( "Action 2 done!", { "step2" = "Ok!" } ); } // started with "thread q_step1();"