/** * 一つのお題を表す配列から解答行に直列化します。 * @param (string|string[]|float)[][] $word * @return string 末尾に改行 (CRLF) を含みます。 */ protected function serializeAnswerLine(array $word) : string { $line = ['A']; $specifics = new URLSearchParams($word['specifics'][0] ?? ''); if (isset($word['option'][0])) { if (isset($word['type'][0]) && $word['type'][0] === 'selection' && empty($word['answer'])) { $line[] = 2; } elseif ($specifics->has('require-all-right')) { $line[] = 3; } else { $line[] = 1; } $answers = isset($word['answer'][0]) ? $word['answer'] : $word['text']; foreach ($word['option'] as $i => $option) { $line[] = $this->serializeQuizField($option); if ($line[1] === 2) { $line[] = $i + 1; } elseif (in_array($option, $answers)) { $line[] = '\\seikai'; } } if ($specifics->has('no-random')) { $line[] = '\\norandom'; } } else { $line[] = 0; $answers = $this->getAnswers($word, [$this, 'convertToShiftJISableInAnswerWithKatakana']); if (!$answers) { $this->logUnserializableError('Inteligenceω クイズ', $word); return ''; } $bonuses = $specifics->getAll('bonus'); foreach ($answers as $i => $answer) { $line[] = $answer; if (!empty($bonuses[$i])) { $line[] = "\\bonus={$bonuses[$i]}"; } } } $explain[] = $word['text'][0]; if (isset($word['description'][0])) { $explain[] = $word['description'][0]['lml']; } $line[] = '\\explain=' . $this->serializeQuizField(implode("\n\n", $explain)); return implode(',', $line) . "\r\n"; }