id");
return game_cryptex_play( $id, $game, $attempt, $cryptexrec, $crossm);
}
if( $attempt === false){
$attempt = game_addattempt( $game);
}
$textlib = textlib_get_instance();
$cryptex = new CryptexDB();
$questions = array();
$infos = array();
$answers = array();
$recs = game_questions_shortanswer( $game);
if( $recs == false){
error( get_string( 'no_words', 'game'));
}
$infos = array();
$reps = array();
foreach( $recs as $rec){
if( $game->param7 == false){
if( $textlib->strpos( $rec->answertext, ' ')){
continue; //spaces not allowed
}
}
$rec->answertext = game_upper( $rec->answertext);
$answers[ $rec->answertext] = game_repairquestion( $rec->questiontext);
$infos[ $rec->answertext] = array( $game->sourcemodule, $rec->questionid, $rec->glossaryentryid);
$select = "gameid=$game->id AND userid='$USER->id' AND questionid='$rec->questionid' AND glossaryentryid='$rec->glossaryentryid'";
if(($rec2 = get_record_select('game_repetitions', $select, 'id,repetitions r')) != false){
$reps[ $rec->answertext] = $rec2->r;
}
}
$cryptex->setwords( $answers, $game->param1, $reps);
if( $cryptex->computedata( $crossm, $crossd, $letters, $game->param2)){
$new_crossd = array();
foreach( $crossd as $rec)
{
if( array_key_exists( $rec->answertext, $infos)){
$info = $infos[ $rec->answertext];
$rec->id = 0;
$rec->sourcemodule = $info[ 0];
$rec->questionid = $info[ 1];
$rec->glossaryentryid = $info[ 2];
}
game_update_queries( $game, $attempt, $rec, 0, '');
$new_crossd[] = $rec;
}
$cryptexrec = $cryptex->save( $game, $crossm, $new_crossd, $attempt->id, $letters);
}
game_updateattempts( $game, $attempt, 0, 0);
return game_cryptex_play( $id, $game, $attempt, $cryptexrec, $crossm);
}
function cryptex_showlegend( $legend, $title)
{
if( count( $legend) == 0)
return;
echo "
$title
";
foreach( $legend as $key => $line)
echo "$key: $line
";
}
//q means game_queries.id
function game_cryptex_check( $id, $game, $attempt, $cryptexrec, $q, $answer)
{
if( $attempt === false){
game_cryptex_continue( $id, $game, $attempt, $cryptexrec);
return;
}
$crossm = get_record_select( 'game_cross', "id=$attempt->id");
$query = get_record_select( 'game_queries', "id=$q");
$answer1 = trim( game_upper( $query->answertext));
$answer2 = trim( game_upper( $answer));
$textlib = textlib_get_instance();
$len1 = $textlib->strlen( $answer1);
$len2 = $textlib->strlen( $answer2);
$equal = ( $len1 == $len2);
if( $equal){
for( $i=0; $i < $len1; $i++)
{
if( $textlib->substr( $answer1, $i, 1) != $textlib->substr( $answer2, $i, 1))
{
$equal = true;
break;
}
}
}
if( $equal == false)
{
game_update_queries( $game, $attempt, $query, 0, $answer2, true);
game_cryptex_play( $id, $game, $attempt, $cryptexrec, $crossm, true);
return;
}
game_update_queries( $game, $attempt, $query, 1, $answer2);
game_cryptex_play( $id, $game, $attempt, $cryptexrec, $crossm, true);
}
function game_cryptex_play( $id, $game, $attempt, $cryptexrec, $crossm, $updateattempt=false, $onlyshow=false, $showsolution=false)
{
$textlib = textlib_get_instance();
global $CFG;
if( $game->toptext != ''){
echo $game->toptext.'
';
}
echo '
';
$cryptex = new CryptexDB();
$language = $attempt->language;
$questions = $cryptex->load( $crossm, $mask, $corrects, $attempt->language);
if( $language != $attempt->language){
if( !set_field( 'game_attempts', 'language', $attempt->language, 'id', $attempt->id)){
error( "game_cross_play: Can't set language");
}
}
game_compute_reserve_print( $attempt, $wordrtl, $reverseprint);
if( $reverseprint)
$textdir = 'dir="'.($wordrtl ? 'rtl' : 'ltr').'"';
else
$textdir = '';
$len = $textlib ->strlen( $mask);
//count1 means there is a guested letter
//count2 means there is a letter that not guessed
$count1 = $count2 = 0;
for($i=0; $i < $len; $i++)
{
$c = $textlib->substr( $mask, $i, 1);
if( $c == '1'){
$count1++;
}else if( $c == '2')
{
$count2++;
}
}
if( $count1 + $count2 == 0){
$gradeattempt = 0;
}else
{
$gradeattempt = $count1 / ($count1 + $count2);
}
$finished = ($count2 == 0);
if( ($finished === false) && ($game->param8 > 0))
{
$found = false;
foreach ( $questions as $q)
{
if ( $q->tries < $game->param8)
$found = true;
}
if( $found == false)
$finished = true; //rich max tries
}
if( $updateattempt){
game_updateattempts( $game, $attempt, $gradeattempt, $finished);
}
if( ($onlyshow == false) and ($showsolution == false)){
if( $finished){
game_cryptex_onfinished( $id, $game, $attempt, $cryptexrec);
}
}
?>
';
echo '