Code viewer for World: Enemy versus Agent Game Ba...
// Cloned by Test Purpose on 12 Nov 2022 from World "Enemy versus Agent Game Back Up" by Aoife Doherty
// Please leave this clone trail here.

var aoife = 0;
(AB.clockTick = 1e-7), (AB.maxSteps = 1e3), (AB.screenshotStep = 50);
const show3d = !0,
    TEXTURE_WALL = "/uploads/starter/door.jpg",
    TEXTURE_MAZE = "/uploads/aoifemariedoherty/Cavewallblack.jpg",
    TEXTURE_AGENT = "/uploads/aoifemariedoherty/indiana.jpg",
    TEXTURE_ENEMY = "/uploads/aoifemariedoherty/stonegrey.jpg",
    MUSIC_BACK = "/uploads/starter/Defense.Line.mp3",
    SOUND_ALARM = "/uploads/starter/air.horn.mp3",
    gridsize = 50,
    NOBOXES = Math.trunc((gridsize * gridsize) / 3),
    squaresize = 100,
    spheresize = 55,
    MAXPOS = gridsize * squaresize,
    SKYCOLOR = 14548957,
    startRadiusConst = 0.8 * MAXPOS,
    maxRadiusConst = 10 * MAXPOS;
(ABHandler.MAXCAMERAPOS = maxRadiusConst), (ABHandler.GROUNDZERO = !0);
const SKYBOX_ARRAY = [
    "/uploads/aoifemariedoherty/bluecloud_rt.jpg",
    "/uploads/aoifemariedoherty/bluecloud_lf.jpg",
    "/uploads/aoifemariedoherty/bluecloud_up.jpg",
    "/uploads/aoifemariedoherty/bluecloud_dn.jpg",
    "/uploads/aoifemariedoherty/bluecloud_bk.jpg",
    "/uploads/aoifemariedoherty/bluecloud_ft.jpg",
],
    ACTION_LEFT = 0, ACTION_RIGHT = 1, ACTION_UP = 2, ACTION_DOWN = 3, ACTION_STAYSTILL = 4, GRID_BLANK = 0, GRID_WALL = 1, GRID_MAZE = 2;
var BOXHEIGHT, theagent, theenemy, wall_texture, agent_texture, enemy_texture, maze_texture, ei, ej, ai, aj,
    badsteps, goodsteps,
    GRID = new Array(gridsize),
    shownPath = [],
    path = [];
function loadResources() {
    var e = new THREE.TextureLoader(),
        a = new THREE.TextureLoader(),
        t = new THREE.TextureLoader(),
        i = new THREE.TextureLoader();
    e.load(TEXTURE_WALL, function (e) {
        (e.minFilter = THREE.LinearFilter),
            (wall_texture = e),
            asynchFinished() && initScene();
    }),
        a.load(TEXTURE_AGENT, function (e) {
            (e.minFilter = THREE.LinearFilter),
                (agent_texture = e),
                asynchFinished() && initScene();
        }),
        t.load(TEXTURE_ENEMY, function (e) {
            (e.minFilter = THREE.LinearFilter),
                (enemy_texture = e),
                asynchFinished() && initScene();
        }),
        i.load(TEXTURE_MAZE, function (e) {
            (e.minFilter = THREE.LinearFilter),
                (maze_texture = e),
                asynchFinished() && initScene();
        });
}
function asynchFinished() {
    return !!(wall_texture && agent_texture && enemy_texture && maze_texture);
}
function occupied(e, a) {
    return (
        (ei == e && ej == a) ||
        (ai == e && aj == a) ||
        GRID[e][a] == GRID_WALL ||
        GRID[e][a] == GRID_MAZE
    );
}
function translate(e, a) {
    var t = new THREE.Vector3();
    return (
        (t.y = 0),
        (t.x = e * squaresize - MAXPOS / 2),
        (t.z = a * squaresize - MAXPOS / 2),
        t
    );
}
function initScene() {
    var e, a, t, i;
    for (e = 0; e < gridsize; e++) GRID[e] = new Array(gridsize);
    for (e = 0; e < gridsize; e++)
        for (a = 0; a < gridsize; a++)
            0 == e || e == gridsize - 1 || 0 == a || a == gridsize - 1
                ? ((GRID[e][a] = GRID_WALL),
                    (t = new THREE.BoxGeometry(squaresize, BOXHEIGHT, squaresize)),
                    ((i = new THREE.Mesh(t)).material = new THREE.MeshBasicMaterial({
                        map: wall_texture,
                    })),
                    i.position.copy(translate(e, a)),
                    ABWorld.scene.add(i))
                : (GRID[e][a] = GRID_BLANK);
    for (var r = 1; r <= NOBOXES; r++)
        (e = AB.randomIntAtoB(1, gridsize - 2)),
            (a = AB.randomIntAtoB(1, gridsize - 2)),
            (GRID[e][a] = GRID_MAZE),
            (t = new THREE.BoxGeometry(squaresize, BOXHEIGHT, squaresize)),
            ((i = new THREE.Mesh(t)).material = new THREE.MeshBasicMaterial({
                map: maze_texture,
            })),
            i.position.copy(translate(e, a)),
            ABWorld.scene.add(i);
    do {
        (e = AB.randomIntAtoB(1, gridsize - 2)),
            (a = AB.randomIntAtoB(1, gridsize - 2));
    } while (occupied(e, a));
    (ei = e),
        (ej = a),
        (t = new THREE.BoxGeometry(squaresize, BOXHEIGHT, squaresize)),
        ((theenemy = new THREE.Mesh(t)).material = new THREE.MeshBasicMaterial({
            map: enemy_texture,
        })),
        ABWorld.scene.add(theenemy),
        drawEnemy();
    do {
        (e = AB.randomIntAtoB(1, gridsize - 2)),
            (a = AB.randomIntAtoB(1, gridsize - 2));
    } while (occupied(e, a));
    (ai = e),
        (aj = a),
        (t = new THREE.BoxGeometry(squaresize, BOXHEIGHT, squaresize)),
        ((theagent = new THREE.Mesh(t)).material = new THREE.MeshBasicMaterial({
            map: agent_texture,
        })),
        ABWorld.scene.add(theagent),
        drawAgent(),
        (ABWorld.scene.background = new THREE.CubeTextureLoader().load(
            SKYBOX_ARRAY,
            function () {
                ABWorld.render(), AB.removeLoading(), (AB.runReady = !0);
            }
        ));
}
function drawEnemy() {
    theenemy.position.copy(translate(ei, ej)),
        ABWorld.lookat.copy(theenemy.position);
}
function drawAgent() {
    theagent.position.copy(translate(ai, aj)),
        ABWorld.follow.copy(theagent.position);
}
function removeFromArray(e, a) {
    for (var t = e.length - 1; t >= 0; t--) e[t] == a && e.splice(t, 1);
}
function MakeSpot(e, a) {
    (this.i = e),
    (this.j = a),
    (this.f = 0),
    (this.g = 0),
    (this.h = 0),
    (this.neighbors = []),
    (this.previous = void 0),
    (this.wall = GRID[e][a] !== GRID_BLANK),
    console.log(GRID[e][a] !== GRID_BLANK, this.wall),
    (this.addNeighbors = function (e) {
        var a = this.i,
        t = this.j;
        a < gridsize - 1 && this.neighbors.push(e[a + 1][t]),
                t < gridsize - 1 && this.neighbors.push(e[a][t + 1]),
                a > 0 && this.neighbors.push(e[a - 1][t]),
                t > 0 && this.neighbors.push(e[a][t - 1]);
        });
}
function heuristic(e, a) {
    return Math.abs(e.i - a.i) + Math.abs(e.j - a.j);
}

function highlightPath(e, a) {
    for (var t = 0; t < e.length - 1; t++)
        (shape = new THREE.BoxGeometry(squaresize, 0.1, squaresize)),
            (ShownPath = new THREE.Mesh(shape)),
            (ShownPath.material = new THREE.MeshBasicMaterial({ color: a })),
            ShownPath.position.copy(translate(e[t].i, e[t].j)),
            ABWorld.scene.add(ShownPath),
            shownPath.push(ShownPath);
}
function moveLogicalEnemy() {
    for (
        var e = new Array(gridsize), a = [], t = [], i = 0;
        i < shownPath.length;
        i++
    )
        ABWorld.scene.remove(shownPath[i]);
    for (i = 0; i < gridsize; i++) 
        e[i] = new Array(gridsize);
    for (i = 0; i < gridsize; i++)
        for (var r = 0; r < gridsize; r++) e[i][r] = new MakeSpot(i, r);
    for (i = 0; i < gridsize; i++)
        for (r = 0; r < gridsize; r++) e[i][r].addNeighbors(e);
    for (a.push(e[ei][ej]); a.length > 0;) {
        var o = 0;
        for (i = 0; i < a.length; i++) a[i].f < a[o].f && (o = i);
        var n = a[o];
        if (n === e[ai][aj]) {
            var s = [],
                u = n;
            for (s.push(u); u.previous;) s.push(u.previous), (u = u.previous);
            highlightPath(s, 255);
            var d = s.length - 2;
            occupied(s[d].i, s[d].j) || ((ei = s[d].i), (ej = s[d].j));
            break;
        }
        removeFromArray(a, n), t.push(n);
        var h = n.neighbors;
        for (i = 0; i < h.length; i++) {
            var c = h[i];
            if (c[i] === e[ai][aj]) {
                c.previous = n;
                break;
            }
            if (!t.includes(c) && !c.wall) {
                var l = n.g + heuristic(c, n),
                    p = !1;
                a.includes(c)
                    ? l < c.g && ((c.g = l), (p = !0))
                    : ((c.g = l), (p = !0), a.push(c)),
                    p &&
                    ((c.h = heuristic(c, e[ai][aj])),
                        (c.f = c.g + c.h),
                        (c.previous = n));
            }
        }
    }
}
function moveLogicalAgent(e) { //same
    var a = ai,
        t = aj;
    e == ACTION_LEFT
        ? a--
        : e == ACTION_RIGHT
            ? a++
            : e == ACTION_UP
                ? t++
                : e == ACTION_DOWN && t--,
        occupied(a, t) || ((ai = a), (aj = t));
}
var OURKEYS = [37, 38, 39, 40];
function ourKeys(e) { //same
    return OURKEYS.includes(e.keyCode);
}
function keyHandler(e) { //same
    return (
        !AB.runReady ||
        !ourKeys(e) ||
        (37 == e.keyCode && moveLogicalAgent(ACTION_LEFT),
            38 == e.keyCode && moveLogicalAgent(ACTION_DOWN),
            39 == e.keyCode && moveLogicalAgent(ACTION_RIGHT),
            40 == e.keyCode && moveLogicalAgent(ACTION_UP),
            e.stopPropagation(),
            e.preventDefault(),
            !1)
    );
}
function badstep() { //same
    return Math.abs(ei - ai) < 2 && Math.abs(ej - aj) < 2;
}
function agentBlocked() { //same
    return (
        occupied(ai - 1, aj) &&
        occupied(ai + 1, aj) &&
        occupied(ai, aj + 1) &&
        occupied(ai, aj - 1)
    );
}
function updateStatusBefore(e) { //same
    var a = AB.world.getState();
    AB.msg(
        " Step: " + AB.step + "   x = (" + a.toString() + ")   a = (" + e + ") "
    );
}
function updateStatusAfter() { //same
    var e = AB.world.getState(),
        a = (goodsteps / AB.step) * 100;
    AB.msg(
        "   y = (" +
        e.toString() +
        ") <br> Bad steps: " +
        badsteps +
        "   Good steps: " +
        goodsteps +
        "   Score: " +
        a.toFixed(2) +
        "% ",
        2
    );
}
(AB.world.newRun = function () { //same
    AB.loadingScreen(),
        (AB.runReady = !1),
        (badsteps = 0),
        (goodsteps = 0),
        (BOXHEIGHT = squaresize),
        ABWorld.init3d(startRadiusConst, maxRadiusConst, 14548957),
        loadResources(),
        (document.onkeydown = keyHandler);
}),
    (AB.world.getState = function () { //same
        return [ai, aj, ei, ej];
    }),
    (AB.world.takeAction = function (e) { //same
        updateStatusBefore(e),
            moveLogicalAgent(e),
            AB.step % 2 == 0 && moveLogicalEnemy(),
            badstep() ? badsteps++ : goodsteps++,
            drawAgent(),
            drawEnemy(),
            updateStatusAfter(),
            agentBlocked() &&
            ((AB.abortRun = !0), (goodsteps = 0), musicPause(), soundAlarm());
    }),
    (AB.world.endRun = function () { //same
        musicPause(),
            AB.abortRun
                ? AB.msg(
                    " <br> <font color=red> <B> Indiana Jones trapped. Final score zero. </B> </font>   ",
                    3
                )
                : AB.msg(" <br> <font color=green> <B> Run over. </B> </font>   ", 3);
    }),
    (AB.world.getScore = function () { //same
        var e = (goodsteps / AB.maxSteps) * 100;
        return Math.round(100 * e) / 100;
    });
var backmusic = AB.backgroundMusic("/uploads/aoifemariedoherty/IJTheme.mp3");
function musicPlay() { //same
    backmusic.play();
}
function musicPause() { //same
    backmusic.pause();
}
function soundAlarm() { //same
    new Audio("/uploads/aoifemariedoherty/adiossapito1.mp3").play();
}