// 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();
}