quizid == 0) and ($game->questioncategoryid == 0)){ if( $game->sourcemodule == 'quiz') error( get_string('millionaire_must_select_quiz', 'game')); else error( get_string('millionaire_must_select_questioncategory','game')); } if( $attempt != false and $millionaire != false){ //continue an existing game return game_millionaire_play( $id, $game, $attempt, $millionaire); } if( $attempt == false){ $attempt = game_addattempt( $game); } $newrec->id = $attempt->id; $newrec->queryid = 0; $newrec->level = 0; $newrec->state = 0; if( !game_insert_record( 'game_millionaire', $newrec)){ error( 'error inserting in game_millionaire'); } game_millionaire_play( $id, $game, $attempt, $newrec); } function game_millionaire_play( $id, $game, $attempt, $millionaire) { global $CFG; $help5050 = optional_param('Help5050_x', 0, PARAM_INT); $helptelephone = optional_param('HelpTelephone_x', 0, PARAM_INT); $helppeople = optional_param('HelpPeople_x', 0, PARAM_INT); $quit = optional_param('Quit_x', 0, PARAM_INT); if( $millionaire->queryid){ $query = get_record( 'game_queries', 'id', $millionaire->queryid); }else { $query = new StdClass; } $buttons = optional_param('buttons', 0, PARAM_INT); $found = 0; for($i=1; $i <= $buttons; $i++){ $letter = substr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', $i-1, 1); $bt = optional_param('btAnswer'.$letter, 0, PARAM_BOOL); $bt1 = optional_param("btAnswer{$letter}1", 0, PARAM_BOOL); if( !empty($bt) or !empty($bt1)){ game_millionaire_OnAnswer( $id, $game, $attempt, $millionaire, $query, $i); $found = 1; } } if($found != 1){ if( !empty($help5050)) game_millionaire_OnHelp5050( $game, $id, $millionaire, $game, $query); else if( !empty($helptelephone)) game_millionaire_OnHelpTelephone( $game, $id, $millionaire, $query); else if( !empty($helppeople)) game_millionaire_OnHelpPeople( $game, $id, $millionaire, $query); else if( !empty($quit)) game_millionaire_OnQuit( $id, $game, $attempt, $query); else { $millionaire->state = 0; $millionaire->grade = 1; game_millionaire_ShowNextQuestion( $id, $game, $attempt, $millionaire); } } } function game_millionaire_showgrid( $game, $millionaire, $id, $query, $aAnswer, $info) { $question = str_replace( '\"', '"', $query->questiontext); $textlib = textlib_get_instance(); $color1 = 'black'; $color2 = 'DarkOrange'; $colorback="white"; $stylequestion = "background:$colorback;color:$color1"; $stylequestionselected = "background:$colorback;color:$color2"; global $CFG; $state = $millionaire->state; $level = $millionaire->level; if( $game->param8 == '') $color = 408080; else $color = base_convert($game->param8, 10, 16); $background = "style='background:#$color'"; echo '
'; echo "\r\n"; echo ""; echo ''; echo ""; echo ''; echo "\r\n"; echo ""; echo "\r\n"; $styletext = ""; if( strpos( $question, 'color:') == false and strpos( $question, 'background:') == false){ $styletext = "style='$stylequestion'"; } $aVal = array( 100, 200, 300, 400, 500, 1000, 1500, 2000, 4000, 5000, 10000, 20000, 40000, 80000, 150000); for( $i=15; $i >= 1; $i--) { $bTR = false; switch( $i) { case 15: echo "\r\n"; $bTR = true; break; case 14: case 13: echo "\n"; $bTR = true; break; case 12: echo ""; $question = game_filtertext($question, $game->course); echo "\r\n"; $bTR = true; break; case 11: case 10: case 9: case 8: case 7: case 6: case 5: case 4: case 3: case 2: case 1: echo ""; $bTR = true; break; default: echo ""; $bTR = true; } if( $i == $level+1) $style = "background:$color2;color:$color1"; else $style = $stylequestion; echo ""; if( $i < $level+1) echo ""; else if( $i == 15 and $level <= 1) echo ""; else echo ""; echo "\r\n"; if( $bTR) echo "\r\n"; } echo "\r\n"; $bFirst = true; $letters = get_string( 'lettersall', 'game'); for( $i=0; $i < count( $aAnswer); $i++) { $name = "btAnswer".substr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', $i, 1); $s = $textlib->substr( $letters, $i, 1); $disabled = ( $state == 15 ? "disabled=1" : ""); $style = $stylequestion; if( (strpos( $aAnswer[ $i], 'color:') != false) or (strpos( $aAnswer[ $i], 'background:') != false)){ $style = ''; } if( $state == 15 and $i+1 == $query->correct){ $style = $stylequestionselected; } $button = '"; $answer = "". game_filtertext($aAnswer[ $i],$game->course).''; if( $aAnswer[ $i] != ""){ echo "\n"; echo "\n"; echo ""; if( $bFirst){ $bFirst = false; $info = game_filtertext($info, $game->course); echo ""; } echo "\r\n\r\n"; } } echo "\r\n"; echo "\r\n"; echo ''; echo "\r\n"; echo "
                      
"; $dirgif = "{$CFG->wwwroot}/mod/game/millionaire/1/"; if( $state & 1) { $gif = "5050x.gif"; $disabled = "disabled=1"; }else { $gif = "5050.gif"; $disabled = ""; } echo ' '; if( $state & 2) { $gif = "telephonex.gif"; $disabled = "disabled=1"; }else { $gif = "telephone.gif"; $disabled = ""; } echo ' '; if( $state & 4) { $gif = "peoplex.gif"; $disabled = "disabled=1"; }else { $gif = "people.gif"; $disabled = ""; } echo ' '; echo ' '; echo "\r\n"; echo "      
$question
$i  *        ".sprintf( "%10d", $aVal[ $i-1])."
     
$button   $answer$info
     
\r\n"; echo "
\r\n"; } function game_millionaire_ShowNextQuestion( $id, $game, $attempt, $millionaire) { game_millionaire_SelectQuestion( $aAnswer, $game, $attempt, $millionaire, $query); if( $game->toptext != ''){ echo $game->toptext.'

'; } game_millionaire_ShowGrid( $game, $millionaire, $id, $query, $aAnswer, ""); if( $game->bottomtext != ''){ echo '
'.$game->bottomtext; } } //updates tables: games_millionaire, game_attempts, game_questions function game_millionaire_SelectQuestion( &$aAnswer, $game, $attempt, &$millionaire, &$query) { global $CFG, $USER; if( ($game->sourcemodule != 'quiz') and ($game->sourcemodule != 'question')){ error( get_string('millionaire_sourcemodule_must_quiz_question', 'game', get_string( 'modulename', 'quiz')).' '.get_string( 'modulename', $attempt->sourcemodule)); } if( $millionaire->queryid != 0){ game_millionaire_loadquestions( $millionaire, $query, $aAnswer); return; } if( $game->sourcemodule == 'quiz'){ if( $game->quizid == 0){ error( get_string( 'must_select_quiz', 'game')); } $select = "qtype='multichoice' AND quiz='$game->quizid' ". " AND {$CFG->prefix}quiz_question_instances.question={$CFG->prefix}question.id"; $table = "question,{$CFG->prefix}quiz_question_instances"; }else { if( $game->questioncategoryid == 0){ error( get_string( 'must_select_questioncategory', 'game')); } //include subcategories $select = 'category='.$game->questioncategoryid; if( $game->subcategories){ $cats = question_categorylist( $game->questioncategoryid); if( strpos( $cats, ',') > 0){ $select = 'category in ('.$cats.')'; } } $select .= " AND qtype='multichoice'"; $table = "question"; } $select .= " AND {$CFG->prefix}question.hidden=0"; if( $game->shuffle) $questionid = game_question_selectrandom( $game, $table, $select, "{$CFG->prefix}question.id as id", true); else $questionid = game_millionaire_select_serial_question( $game, $table, $select, "{$CFG->prefix}question.id as id", $millionaire->level); if( $questionid == 0){ error( get_string( 'no_questions', 'game')); } $q = get_record_select( 'question', "id=$questionid",'id,questiontext'); $recs = get_records_select( 'question_answers', "question=$questionid"); if( $recs === false){ error( get_string( 'no_questions', 'game')); } $correct = 0; $ids = array(); foreach( $recs as $rec){ $aAnswer[] = $rec->answer; $ids[] = $rec->id; if( $rec->fraction == 1){ $correct = $rec->id; } } $count = count( $aAnswer); for($i=1; $i <= $count; $i++){ $sel = mt_rand(0, $count-1); $temp = array_splice( $aAnswer, $sel, 1); $aAnswer[ ] = $temp[ 0]; $temp = array_splice( $ids, $sel, 1); $ids[ ] = $temp[ 0]; } $query = new StdClass; $query->attemptid =$attempt->id; $query->gameid = $game->id; $query->userid = $USER->id; $query->sourcemodule = $game->sourcemodule; $query->glossaryentryid = 0; $query->questionid = $questionid; $query->questiontext = addslashes( $q->questiontext); $query->answertext = implode( ',', $ids); $query->correct = array_search( $correct, $ids) + 1; if( !$query->id = insert_record( 'game_queries', $query)){ print_object( $query); error( 'error inserting to game_queries'); } $updrec->id = $millionaire->id; $updrec->queryid = $query->id; if( !$newid = update_record( 'game_millionaire', $updrec)){ error( 'error updating in game_millionaire'); } $score = $millionaire->level / 15; game_updateattempts( $game, $attempt, $score, 0); game_update_queries( $game, $attempt, $query, $score, ''); } function game_millionaire_select_serial_question( $game, $table, $select, $id_fields="id", $level) { global $CFG, $USER; if( $game->sourcemodule == 'quiz') { $rec = get_record_select( 'quiz', "id=$game->quizid"); if( $rec === false) return false; $questions = $rec->questions; $questions = explode( ',', $rec->questions); array_pop( $questions); }else { $sql = "SELECT $id_fields,$id_fields FROM {$CFG->prefix}".$table." WHERE $select ORDER BY {$CFG->prefix}question.name"; if( ($recs = get_records_sql( $sql)) == false) return false; $questions = array(); foreach( $recs as $rec) $questions[] = $rec->id; } $count = count( $questions); $from = $level * $count / 15; $to = max( $from, ($level+1) * $count / 15 - 1); $pos = mt_rand( round( $from), round( $to)); return $questions[ $pos]; } function game_millionaire_loadquestions( $millionaire, &$query, &$aAnswer) { $query = get_record_select( 'game_queries', "id=$millionaire->queryid",'id,questiontext,answertext,correct'); $aids = explode( ',', $query->answertext); $aAnswer = array(); foreach( $aids as $id) { $rec = get_record_select( 'question_answers', "id=$id",'id,answer'); $aAnswer[] = $rec->answer; } } //flag 1:5050, 2:telephone 4:people function game_millionaire_setstate( &$millionaire, $mask) { $millionaire->state |= $mask; $updrec->id = $millionaire->id; $updrec->state = $millionaire->state; if( !update_record( 'game_millionaire', $updrec)){ error( 'error updating in game_millionaire'); } } function game_millionaire_onhelp5050( $game, $id, &$millionaire, $query) { game_millionaire_loadquestions( $millionaire, $query, $aAnswer); if( ($millionaire->state & 1) != 0) { game_millionaire_ShowGrid( $game, $millionaire, $id, $query, $aAnswer, ''); return; } game_millionaire_setstate( $millionaire, 1); $n = count( $aAnswer); if( $n > 2) { for(;;) { $wrong = mt_rand( 1, $n); if( $wrong != $query->correct){ break; } } for( $i=1; $i <= $n; $i++) { if( $i <> $wrong and $i <> $query->correct){ $aAnswer[ $i-1] = ""; } } } game_millionaire_showgrid( $game, $millionaire, $id, $query, $aAnswer, ''); } function game_millionaire_OnHelpTelephone( $game, $id, &$millionaire, $query) { game_millionaire_loadquestions( $millionaire, $query, $aAnswer); if( ($millionaire->state & 2) != 0) { game_millionaire_ShowGrid( $game, $millionaire, $id, $query, $aAnswer, ''); return; } game_millionaire_setstate( $millionaire, 2); $n = count( $aAnswer); if( $n < 2){ $wrong = $correct; }else { for(;;) { $wrong = mt_rand( 1, $n); if( $wrong != $query->correct) break; } } //with 80% gives the correct answer if( mt_rand( 1, 10) <= 8) $response = $query->correct; else $response = $wrong; $info = get_string( 'millionaire_info_telephone','game').'
'.$aAnswer[ $response-1].''; game_millionaire_ShowGrid( $game, $millionaire, $id, $query, $aAnswer, $info); } function game_millionaire_OnHelpPeople( $game, $id, &$millionaire, $query) { $textlib = textlib_get_instance(); game_millionaire_loadquestions( $millionaire, $query, $aAnswer); if( ($millionaire->state & 4) != 0){ game_millionaire_ShowGrid( $game, $millionaire, $id, $query, $aAnswer, ''); return; } game_millionaire_setstate( $millionaire, 4); $n = count( $aAnswer); $sum = 0; $aPercent = array(); for( $i = 0; $i+1 < $n; $i++) { $percent = mt_rand( 0, 100-$sum); $aPercent[ $i] = $percent; $sum += $percent; } $aPercent[ $n-1] = 100 - $sum; if( mt_rand( 1, 100) <= 80) { //with percent 80% sets in the correct answer the biggest percent $max_pos = 0; for( $i=1; $i+1 < $n; $i++) { if( $aPercent[ $i] >= $aPercent[ $max_pos]) $max_pos = $i; } $temp = $aPercent[ $max_pos]; $aPercent[ $max_pos] = $aPercent[ $query->correct-1]; $aPercent[ $query->correct-1] = $temp; } $info = '
'.get_string( 'millionaire_info_people', 'game').':
'; for( $i=0; $i < $n; $i++){ $info .= "
". $textlib->substr( get_string( 'lettersall', 'game'), $i, 1) ." : ".$aPercent[ $i]. ' %'; } game_millionaire_ShowGrid( $game, $millionaire, $id, $query, $aAnswer, $textlib->substr( $info, 4)); } function game_millionaire_OnAnswer( $id, $game, $attempt, &$millionaire, $query, $answer) { global $CFG; game_millionaire_loadquestions( $millionaire, $query, $aAnswer); if( $answer == $query->correct) { if( $millionaire->level < 15){ $millionaire->level++; } $finish = ($millionaire->level == 15 ? 1 : 0); $scorequestion = 1; }else { $finish = 1; $scorequestion = 0; } $score = $millionaire->level / 15; game_update_queries( $game, $attempt, $query, $scorequestion, $answer); game_updateattempts( $game, $attempt, $score, $finish); $updrec->id = $millionaire->id; $updrec->level = $millionaire->level; $updrec->queryid = 0; if( !update_record( 'game_millionaire', $updrec)){ error( 'error updating in game_millionaire'); } if( $answer == $query->correct) { //correct if( $finish){ echo get_string( 'win', 'game'); game_millionaire_OnQuit( $id, $game, $attempt, $query); }else { $millionaire->queryid = 0; //so the next function select a new question game_millionaire_ShowNextQuestion( $id, $game, $attempt, $millionaire, $query); } }else { //wrong answer $info = get_string( 'millionaire_info_wrong_answer', 'game'). '

'.$aAnswer[ $query->correct-1].''; $millionaire->state = 15; game_millionaire_ShowGrid( $game, $millionaire, $id, $query, $aAnswer, $info); } } function game_millionaire_onquit( $id, $game, $attempt, $query) { global $CFG; game_updateattempts( $game, $attempt, -1, true); if (! $cm = get_record("course_modules", "id", $id)) { error("Course Module ID was incorrect id=$id"); } echo '
'; echo "wwwroot/mod/game/attempt.php?id=$id\">".get_string( 'nextgame', 'game').'         '; echo "wwwroot/course/view.php?id=$cm->course\">".get_string( 'finish', 'game').' '; } ?>