日記

日本語の勉強のためのブログ

【ガルフレ】聖櫻学園劇場のお呼び出しの質問に全問正解するためのコードを組む

注意

以下の内容は2021/09/19時点での仕様に基づいて書かれたものである。GFの仕様変更により、いつか使えなくなるかもしれない。

概要

ガールフレンド(仮)というゲームには聖櫻学園劇場というコンテンツがある。
ここでは各キャラクターごとのストーリーを読むことができるのだが、ストーリーを進めるごとにそのキャラから"お呼び出しメール"が届く。
お呼び出し中にはいくつかの質問をされ(図1参照)、正解するごとに親密度ゲージがたまっていき、ゲージが満タンになればアイテムが手に入る。

図1. 質問された際の表示

ただ、質問のなかには引っかけもあったりするので、全問正解するのは少し難しい。そこで、正解の選択肢をページから取得するJavaScriptコードを作成することにした。

先に結論

会話に突入したらDevToolを起動(F12を押す)し、以下のコードをDevToolの下側にあるコンソールに入力して実行(エンターキーを押す)する。
すると正解の選択肢のみが表示される(図6参照)ので、それに従って会話をやり過ごす。

for (var s in scenarioData) {
    let question = scenarioData[s]["question"];
    if (question != undefined) {
        question = question["question"];
        let choose = question["choose"];
        let collect = question["collect_number"];
        console.log(choose[collect]);
    }
}

作成手順

ページのHTMLソースファイル179行目(環境によって差異があるかもしれない)の<script>タグの中身に会話データが入っている。
会話データはscenarioDataという変数の中に連想配列の形で入っているため、コンソールに

console.log(scenarioData);

と打って実行(エンターキー)すれば会話内容が確認できる。

図2. scenarioDataの中身

図2にはquestioncollect_numberという文字が見える。つまりscenarioDataには質問の内容や、それに対する正答が記載されているのである。
これらを取り出してみよう。まず会話データを一言ずつ読み込んで出力してみる。

for (var s in scenarioData) {
    console.log(scenarioData[s]);
}

図3. 一言ずつ読み込んだ出力結果

次にここから質問と正答のみを取り出す。質問がない場合、以下のコード中の変数questionはundefinedとなるので、その場合は出力しないようにした。

for (var s in scenarioData) {
    let question = scenarioData[s]["question"];
    if (question != undefined) console.log(question);
}

図4. 取り出せた質問データ

これで質問データが取り出せたので、あとは選択肢chooseと正答collect_numberを取り出す。

for (var s in scenarioData) {
    let question = scenarioData[s]["question"];
    if (question != undefined) {
        question = question["question"];
        let choose = question["choose"];
        let collect = question["collect_number"];
        console.log(choose);
        console.log(collect);
    }
}

図5. 選択肢と正答番号の出力結果

もしくは正解の選択肢のみを表示するようにしてもよいだろう。

for (var s in scenarioData) {
    let question = scenarioData[s]["question"];
    if (question != undefined) {
        question = question["question"];
        let choose = question["choose"];
        let collect = question["collect_number"];
        console.log(choose[collect]);
    }
}

図6. 正解の選択肢のみを表示した様子

余談

正解・不正解時のリアクションがみられるコードも書いてみた。

for (var s in scenarioData) {
    let question = scenarioData[s]["question"];
    if (question != undefined) {
        let q = question["question"];
        let choose = q["choose"];
        let q_message = q["message"];
        let collect = q["collect_number"]

        let response = question["response"];
        let message_collect = response["True"]["message"];
        let message_incollect = response["False"]["message"];

        console.log("質問: " + q_message);
        console.log("選択肢: " + choose[1] + " / " + choose[2]);
        console.log("正しい選択肢: " + choose[collect]);
        console.log("正解時: "   + message_collect);
        console.log("不正解時: " + message_incollect);
        console.log("");
    }
}

図7. リアクションの出力結果

概要で引っかけ問題があると言ったが、図7の2問目がその典型例であろう。春瑚だから花壇だろうと思って選択すると間違える。