19-7 見えない罠(わな)をこえて②

解説動画

クエスト19の19-6から19-10で必要なブロック番号

解答コード

const TORCH_ID: number = 50; // たいまつ
const COAL_ID: number = 173; // ゴール地点の目印(横穴・トンネル・橋のゴールで共通)
const AIR_ID: number = 0;    // 空気(Stage06〜10共通、前方・足元などが塞がっていないかの判定に使う)

function digForward() {
    // プレイヤーの身長(2ブロック)分の通路を前方に確保する。処理後、エージェントは元の高さ・位置に戻る
    // destroyは対象がAIRだとエラーになるため、いずれも先にinspectで確認してから実行する
    let aheadId: number = agent.inspect(AgentInspection.Block, FORWARD);
    if (aheadId != AIR_ID) {
        agent.destroy(FORWARD);
    }
    agent.move(UP, 1);
    let aheadUpId: number = agent.inspect(AgentInspection.Block, FORWARD);
    if (aheadUpId != AIR_ID) {
        agent.destroy(FORWARD);
    }
    agent.move(DOWN, 1);
}

function placeTorch() {
    // たいまつは床から1ブロック上(プレイヤーの身長と同じ高さ)の右の壁に置く。呼び出し元でスロット1を選択済み・設置可能な位置であることを確認してから呼ぶ。処理後、エージェントは床の高さへ戻る
    agent.move(UP, 1);
    agent.setItem(TORCH_ID, 1, 1);
    agent.place(RIGHT);
    agent.move(DOWN, 1);
}

player.onChat("19-7", function () {
    player.say("横穴を進みながらたいまつを置きます");
    agent.setSlot(1); // このあとはスロット1に常に1個だけたいまつを補充しながら使う
    let reachedGoal: boolean = false;
    while (!reachedGoal) {
        try {
            let aheadId: number = agent.inspect(AgentInspection.Block, FORWARD);
            if (aheadId != AIR_ID) {
                throw "天井がくずれて進めません";
            }
            agent.move(FORWARD, 1);
        } catch (e) {
            player.say("例外を検出: " + e);
            player.say("掘り返してから進みます");
            digForward();
            agent.move(FORWARD, 1);
        }
        let belowId: number = agent.inspect(AgentInspection.Block, DOWN);
        if (belowId == COAL_ID) {
            reachedGoal = true;
        } else {
            placeTorch();
        }
    }
    player.say("横穴の先まで到達しました");
});