change meta data handling, added trampoline and some map updates
@ -1,5 +1,7 @@
|
|||||||
|
|
||||||
MAPS=$(wildcard ../maps/flood*.map)
|
MAPS=
|
||||||
|
MAPS+=$(wildcard ../maps/trampoline*.map)
|
||||||
|
MAPS+=$(wildcard ../maps/flood*.map)
|
||||||
MAPS+=$(wildcard ../maps/contest?.map ../maps/contest10.map)
|
MAPS+=$(wildcard ../maps/contest?.map ../maps/contest10.map)
|
||||||
MAPS+=$(wildcard ../maps/ems*.map)
|
MAPS+=$(wildcard ../maps/ems*.map)
|
||||||
MAPS+=../maps/pacman.map ../maps/pacman2.map
|
MAPS+=../maps/pacman.map ../maps/pacman2.map
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
var mineGui_mine, mineGui_curmap, mineGui_curndx, mineGui_moves = "";
|
var mineGui_mine = false, mineGui_curmap, mineGui_curndx, mineGui_moves = "";
|
||||||
var mineGui_movesBackup = [];
|
var mineGui_movesBackup = [];
|
||||||
var mineGui_customNdx = 1;
|
var mineGui_customNdx = 1;
|
||||||
var mineGui_canvas = true;
|
var mineGui_canvas = true;
|
||||||
@ -14,7 +14,9 @@ var mineGui_spriteOffset = {
|
|||||||
'L': 3,
|
'L': 3,
|
||||||
'O': 4,
|
'O': 4,
|
||||||
'.': 0,
|
'.': 0,
|
||||||
' ': 1
|
' ': 1,
|
||||||
|
'A': 8,'B': 8,'C': 8,'D': 8,'E': 8,'F': 8,'G': 8,'H': 8,'I': 8,
|
||||||
|
'1': 9,'2': 9,'3': 9,'4': 9,'5': 9,'6': 9,'7': 9,'8': 9,'9': 9
|
||||||
};
|
};
|
||||||
|
|
||||||
var mineGui_images = {};
|
var mineGui_images = {};
|
||||||
@ -192,7 +194,8 @@ function mineGui_updateMine() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mineGui_show() {
|
function mineGui_show() {
|
||||||
var waterLevel = Math.max(mineGui_mine.meta.Water, 0);
|
if (!mineGui_mine) return;
|
||||||
|
var waterLevel = Math.max(mineGui_mine.water_level, 0);
|
||||||
var map = mineGui_mine.toString().split(/\n/);
|
var map = mineGui_mine.toString().split(/\n/);
|
||||||
var canv = document.getElementById("mineGui_mineCanvas");
|
var canv = document.getElementById("mineGui_mineCanvas");
|
||||||
var mapNode = document.getElementById("mineGui_mineMap");
|
var mapNode = document.getElementById("mineGui_mineMap");
|
||||||
|
148
js/mine.js
@ -2,14 +2,6 @@
|
|||||||
var Mine = function() {
|
var Mine = function() {
|
||||||
var ALIVE = 0, LOST = 1, ABORTED = 2, WON = 3;
|
var ALIVE = 0, LOST = 1, ABORTED = 2, WON = 3;
|
||||||
|
|
||||||
function defaultMeta() {
|
|
||||||
return {
|
|
||||||
Water: 0,
|
|
||||||
Flooding: 0,
|
|
||||||
Waterproof: 10,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function repeat(str, n) {
|
function repeat(str, n) {
|
||||||
return new Array(n+1).join(str);
|
return new Array(n+1).join(str);
|
||||||
}
|
}
|
||||||
@ -45,7 +37,18 @@ var Mine = function() {
|
|||||||
this.moves = 0;
|
this.moves = 0;
|
||||||
this.score = 0;
|
this.score = 0;
|
||||||
this.moves_below_water = 0;
|
this.moves_below_water = 0;
|
||||||
|
this.water = {
|
||||||
|
level: 0,
|
||||||
|
flooding: 0,
|
||||||
|
proof: 10
|
||||||
|
};
|
||||||
|
|
||||||
this.lift = this.robot = false;
|
this.lift = this.robot = false;
|
||||||
|
this.trampoline = {
|
||||||
|
sources: { }, // x, y and target
|
||||||
|
targets: { }, // x, y and sources
|
||||||
|
};
|
||||||
|
this.trampoline.targets = {};
|
||||||
for (i = 0; i < height; ++i) {
|
for (i = 0; i < height; ++i) {
|
||||||
// padding
|
// padding
|
||||||
if (map[i].length < width) map[i] += repeat(' ', width - map[i].length);
|
if (map[i].length < width) map[i] += repeat(' ', width - map[i].length);
|
||||||
@ -70,6 +73,18 @@ var Mine = function() {
|
|||||||
if (this.robot !== false) throw "Only one robot is allowed";
|
if (this.robot !== false) throw "Only one robot is allowed";
|
||||||
this.robot = { x: x, y: i };
|
this.robot = { x: x, y: i };
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
if (line[x] >= 'A' && line[x] <= 'I') {
|
||||||
|
if (this.trampoline.sources[line[x]]) throw "Can have only one trampoline " + line[x];
|
||||||
|
this.trampoline.sources[line[x]] = { x: x, y: i, target: false };
|
||||||
|
this.trampoline.fromSources
|
||||||
|
} else if (line[x] >= '1' && line[x] <= '9') {
|
||||||
|
if (this.trampoline.targets[line[x]]) throw "Can have only one trampoline target " + line[x];
|
||||||
|
this.trampoline.targets[line[x]] = { x: x, y: i, sources: [] };
|
||||||
|
} else {
|
||||||
|
throw "Invalid character in map: '" + line[x] + "'";
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,12 +93,49 @@ var Mine = function() {
|
|||||||
if (this.robot === false) throw "Need a robot";
|
if (this.robot === false) throw "Need a robot";
|
||||||
|
|
||||||
// meta data
|
// meta data
|
||||||
this.meta = defaultMeta();
|
this.meta = {};
|
||||||
for (i = 0; i < lines.length; ++i) {
|
for (i = 0; i < lines.length; ++i) {
|
||||||
if (0 == lines[i].length) continue;
|
if (0 == lines[i].length) continue;
|
||||||
pair = lines[i].split(/ +/);
|
var words = lines[i].split(/ +/);
|
||||||
this.meta[pair[0]] = pair.splice(1).join(" ");
|
switch (words[0]) {
|
||||||
|
case 'Water':
|
||||||
|
this.water.level = words[1];
|
||||||
|
break;
|
||||||
|
case 'Flooding':
|
||||||
|
this.water.flooding = words[1];
|
||||||
|
break;
|
||||||
|
case 'Waterproof':
|
||||||
|
this.water.proof = words[1];
|
||||||
|
break;
|
||||||
|
case 'Trampoline':
|
||||||
|
if (words.length !== 4 || words[2] !== 'targets')
|
||||||
|
throw "Invalid trampoline: '" + words.join(" ") +"'";
|
||||||
|
if (words[1].length != 1 || words[1] < 'A' || words[1] > 'I')
|
||||||
|
throw "Invalid trampoline source '" + words[1] +"'";
|
||||||
|
if (words[3].length != 1 || words[3] < '1' || words[3] > '9')
|
||||||
|
throw "Invalid trampoline target '" + words[3] +"'";
|
||||||
|
if (!this.trampoline.sources[words[1]]) throw "Trampoline " + words[1] + " not defined";
|
||||||
|
if (!this.trampoline.targets[words[3]]) throw "Trampoline target " + words[3] + " not defined";
|
||||||
|
if (this.trampoline.sources[words[1]].target) throw "Trampoline " + words[1] + " already has a target";
|
||||||
|
this.trampoline.sources[words[1]].target = words[3];
|
||||||
|
this.trampoline.targets[words[3]].sources.push(words[1]);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
this.meta[words[0]] = words.splice(1).join(" ");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
for (i in this.trampoline.sources) {
|
||||||
|
if (this.trampoline.sources.hasOwnProperty(i)) {
|
||||||
|
if (!this.trampoline.sources[i].target) throw "Trampoline " + i + " has no target";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (i in this.trampoline.targets) {
|
||||||
|
if (this.trampoline.targets.hasOwnProperty(i)) {
|
||||||
|
if (0 == this.trampoline.targets[i].sources.length) throw "Trampoline target " + i + " has no sources";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.water_level = this.water.level;
|
||||||
this.state = ALIVE;
|
this.state = ALIVE;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -94,7 +146,7 @@ var Mine = function() {
|
|||||||
|
|
||||||
Mine.prototype.validMove = function (command) {
|
Mine.prototype.validMove = function (command) {
|
||||||
if (this.state != ALIVE) return false;
|
if (this.state != ALIVE) return false;
|
||||||
var n;
|
var n, c;
|
||||||
command = command.toUpperCase();
|
command = command.toUpperCase();
|
||||||
switch (command) {
|
switch (command) {
|
||||||
case 'L':
|
case 'L':
|
||||||
@ -102,7 +154,8 @@ var Mine = function() {
|
|||||||
n = (command == 'L' ? -1 : 1);
|
n = (command == 'L' ? -1 : 1);
|
||||||
if (this.robot.x + n < 0) return false;
|
if (this.robot.x + n < 0) return false;
|
||||||
if (this.robot.x + n >= this.width) return false;
|
if (this.robot.x + n >= this.width) return false;
|
||||||
switch (this.map[this.robot.y][this.robot.x+n]) {
|
c = this.map[this.robot.y][this.robot.x+n];
|
||||||
|
switch (c) {
|
||||||
case '#': return false;
|
case '#': return false;
|
||||||
case ' ':
|
case ' ':
|
||||||
case '.':
|
case '.':
|
||||||
@ -113,6 +166,9 @@ var Mine = function() {
|
|||||||
if (this.robot.x + 2*n < 0) return false;
|
if (this.robot.x + 2*n < 0) return false;
|
||||||
if (this.robot.x + 2*n >= this.width) return false;
|
if (this.robot.x + 2*n >= this.width) return false;
|
||||||
if (' ' == this.map[this.robot.y][this.robot.x+2*n]) return true;
|
if (' ' == this.map[this.robot.y][this.robot.x+2*n]) return true;
|
||||||
|
default:
|
||||||
|
if (this.trampoline.sources.hasOwnProperty(c)) return true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'U':
|
case 'U':
|
||||||
@ -120,7 +176,8 @@ var Mine = function() {
|
|||||||
n = (command == 'D' ? -1 : 1);
|
n = (command == 'D' ? -1 : 1);
|
||||||
if (this.robot.y + n < 0) return false;
|
if (this.robot.y + n < 0) return false;
|
||||||
if (this.robot.y + n >= this.height) return false;
|
if (this.robot.y + n >= this.height) return false;
|
||||||
switch (this.map[this.robot.y+n][this.robot.x]) {
|
c = this.map[this.robot.y+n][this.robot.x];
|
||||||
|
switch (c) {
|
||||||
case '#': return false;
|
case '#': return false;
|
||||||
case ' ':
|
case ' ':
|
||||||
case '.':
|
case '.':
|
||||||
@ -128,7 +185,10 @@ var Mine = function() {
|
|||||||
case 'L': return false;
|
case 'L': return false;
|
||||||
case 'O': return true;
|
case 'O': return true;
|
||||||
case '*': return false;
|
case '*': return false;
|
||||||
" style="}
|
default:
|
||||||
|
if (this.trampoline.sources.hasOwnProperty(c)) return true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case 'W':
|
case 'W':
|
||||||
case 'A':
|
case 'A':
|
||||||
@ -139,7 +199,7 @@ var Mine = function() {
|
|||||||
|
|
||||||
Mine.prototype.move = function(command) {
|
Mine.prototype.move = function(command) {
|
||||||
if (this.state != ALIVE) return false;
|
if (this.state != ALIVE) return false;
|
||||||
var n;
|
var n, c, s, t;
|
||||||
command = command.toUpperCase();
|
command = command.toUpperCase();
|
||||||
if (this.validMove(command)) {
|
if (this.validMove(command)) {
|
||||||
switch (command.toUpperCase()) {
|
switch (command.toUpperCase()) {
|
||||||
@ -147,7 +207,8 @@ var Mine = function() {
|
|||||||
case 'R':
|
case 'R':
|
||||||
n = (command == 'L' ? -1 : 1);
|
n = (command == 'L' ? -1 : 1);
|
||||||
this.map[this.robot.y][this.robot.x] = ' ';
|
this.map[this.robot.y][this.robot.x] = ' ';
|
||||||
switch (this.map[this.robot.y][this.robot.x+n]) {
|
c = this.map[this.robot.y][this.robot.x+n];
|
||||||
|
switch (c) {
|
||||||
case '*':
|
case '*':
|
||||||
this.map[this.robot.y][this.robot.x+2*n] = '*';
|
this.map[this.robot.y][this.robot.x+2*n] = '*';
|
||||||
break;
|
break;
|
||||||
@ -158,6 +219,18 @@ var Mine = function() {
|
|||||||
case 'O':
|
case 'O':
|
||||||
this._foundLift();
|
this._foundLift();
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
if (this.trampoline.sources.hasOwnProperty(c)) {
|
||||||
|
s = this.trampoline.sources[c];
|
||||||
|
t = this.trampoline.targets[s.target];
|
||||||
|
for (n = 0; n < t.sources.length; ++n) {
|
||||||
|
s = this.trampoline.sources[t.sources[n]];
|
||||||
|
this.map[s.y][s.x] = ' ';
|
||||||
|
}
|
||||||
|
this.robot.x = t.x;
|
||||||
|
this.robot.y = t.y;
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.robot.x += n;
|
this.robot.x += n;
|
||||||
this.map[this.robot.y][this.robot.x] = 'R';
|
this.map[this.robot.y][this.robot.x] = 'R';
|
||||||
@ -166,7 +239,8 @@ var Mine = function() {
|
|||||||
case 'D':
|
case 'D':
|
||||||
n = (command == 'D' ? -1 : 1);
|
n = (command == 'D' ? -1 : 1);
|
||||||
this.map[this.robot.y][this.robot.x] = ' ';
|
this.map[this.robot.y][this.robot.x] = ' ';
|
||||||
switch (this.map[this.robot.y+n][this.robot.x]) {
|
c = this.map[this.robot.y+n][this.robot.x];
|
||||||
|
switch (c) {
|
||||||
case '\\':
|
case '\\':
|
||||||
this.lambdas--;
|
this.lambdas--;
|
||||||
this.found_lambdas++;
|
this.found_lambdas++;
|
||||||
@ -174,6 +248,18 @@ var Mine = function() {
|
|||||||
case 'O':
|
case 'O':
|
||||||
this._foundLift();
|
this._foundLift();
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
if (this.trampoline.sources.hasOwnProperty(c)) {
|
||||||
|
s = this.trampoline.sources[c];
|
||||||
|
t = this.trampoline.targets[s.target];
|
||||||
|
for (n = 0; n < t.sources.length; ++n) {
|
||||||
|
s = this.trampoline.sources[t.sources[n]];
|
||||||
|
this.map[s.y][s.x] = ' ';
|
||||||
|
}
|
||||||
|
this.robot.x = t.x;
|
||||||
|
this.robot.y = t.y;
|
||||||
|
n = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.robot.y += n;
|
this.robot.y += n;
|
||||||
this.map[this.robot.y][this.robot.x] = 'R';
|
this.map[this.robot.y][this.robot.x] = 'R';
|
||||||
@ -185,7 +271,9 @@ var Mine = function() {
|
|||||||
}
|
}
|
||||||
this.moves++;
|
this.moves++;
|
||||||
if (0 == this.lambdas) {
|
if (0 == this.lambdas) {
|
||||||
if (false !== this.lift) this.map[this.lift.y][this.lift.x] = 'O';
|
if (false !== this.lift && 'L' == this.map[this.lift.y][this.lift.x]) {
|
||||||
|
this.map[this.lift.y][this.lift.x] = 'O';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var newMap = [], x, y, below;
|
var newMap = [], x, y, below;
|
||||||
@ -216,14 +304,14 @@ var Mine = function() {
|
|||||||
}
|
}
|
||||||
this.map = newMap;
|
this.map = newMap;
|
||||||
|
|
||||||
if (this.robot.y < this.meta['Water']) {
|
if (this.robot.y < this.water_level) {
|
||||||
this.moves_below_water++;
|
this.moves_below_water++;
|
||||||
if (this.moves_below_water > this.meta['Waterproof']) this._drown();
|
if (this.moves_below_water > this.water.proof) this._drown();
|
||||||
} else {
|
} else {
|
||||||
this.moves_below_water = 0;
|
this.moves_below_water = 0;
|
||||||
}
|
}
|
||||||
if (this.meta['Flooding'] > 0 && 0 == (this.moves % this.meta['Flooding'])) {
|
if (this.water.flooding > 0 && 0 == (this.moves % this.water.flooding)) {
|
||||||
this.meta['Water']++;
|
++this.water_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (this.state) {
|
switch (this.state) {
|
||||||
@ -274,12 +362,24 @@ var Mine = function() {
|
|||||||
|
|
||||||
Mine.prototype.metaText = function() {
|
Mine.prototype.metaText = function() {
|
||||||
var k, keys = [], lines = [];
|
var k, keys = [], lines = [];
|
||||||
|
if (this.water.level != 0) lines.push("Water " + this.water.level);
|
||||||
|
if (this.water.flooding != 0) lines.push("Flooding " + this.water.flooding);
|
||||||
|
if (this.water.proof != 10) lines.push("Waterproof " + this.water.proof);
|
||||||
|
for (k in this.trampoline.sources) {
|
||||||
|
if (this.trampoline.sources.hasOwnProperty(k)) keys.push(k);
|
||||||
|
}
|
||||||
|
keys.sort();
|
||||||
|
for (k = 0; k < keys.length; ++k) {
|
||||||
|
lines.push("Trampoline " + keys[k] + " targets " + this.trampoline.sources[keys[k]].target);
|
||||||
|
}
|
||||||
|
|
||||||
|
keys = [];
|
||||||
for (k in this.meta) {
|
for (k in this.meta) {
|
||||||
if (this.meta.hasOwnProperty(k)) keys.push(k);
|
if (this.meta.hasOwnProperty(k)) keys.push(k);
|
||||||
}
|
}
|
||||||
keys.sort();
|
keys.sort();
|
||||||
for (k = 0; k < keys.length; ++k) {
|
for (k = 0; k < keys.length; ++k) {
|
||||||
lines[k] = keys[k] + " " + this.meta[keys[k]];
|
lines.push( keys[k] + " " + this.meta[keys[k]]);
|
||||||
}
|
}
|
||||||
return lines.join("\n");
|
return lines.join("\n");
|
||||||
};
|
};
|
||||||
|
BIN
js/sprites.png
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
js/target.png
Normal file
After Width: | Height: | Size: 675 B |
BIN
js/trampoline.png
Normal file
After Width: | Height: | Size: 609 B |
19
maps/ems6.map
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
###########################
|
||||||
|
#............R............#
|
||||||
|
#.####.######L######.####.#
|
||||||
|
#.####.#*#########*#.####.#
|
||||||
|
#.####..\#*******#\..####.#
|
||||||
|
#.######..\\\\\\\..######.#
|
||||||
|
#.####*######.######*####.#
|
||||||
|
#.####\.....#.#.....\####.#
|
||||||
|
#......####.#.#.####....#.#
|
||||||
|
#####.#***#.#.#.#***#.#.#.#
|
||||||
|
#......\\\..#.#..\\\..#.#.#
|
||||||
|
#.#########*****#####.#.#.#
|
||||||
|
#..........\\\\\......#...#
|
||||||
|
###########################
|
||||||
|
|
||||||
|
Author ems_ (irc)
|
||||||
|
Water 7
|
||||||
|
Waterproof 42
|
||||||
|
Highscore 1414
|
@ -1,3 +1,5 @@
|
|||||||
|
trampoline1: RRLDDRRRRUULLDLLLURRRRRRDD (424)
|
||||||
|
|
||||||
flood1: LLLLDDRRLDRRDRRDLLUUURRRRRDDDD (945)
|
flood1: LLLLDDRRLDRRDRRDLLUUURRRRRDDDD (945)
|
||||||
flood2: RRUDRRULURULLLLDDDL (281)
|
flood2: RRUDRRULURULLLLDDDL (281)
|
||||||
flood3: LLUURUUURUULRRRRRRRDDDDDDDLLRRUUUUULLLLLRDDDDDD (1303)
|
flood3: LLUURUUURUULRRRRRRRDDDDDDDLLRRUUUUULLLLLRDDDDDD (1303)
|
||||||
|
10
maps/trampoline1.map
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
############
|
||||||
|
#..*.R..*..#
|
||||||
|
#..A....B..######
|
||||||
|
#....2.. ..#\\\C#
|
||||||
|
#......* *.#\\\1#
|
||||||
|
########L########
|
||||||
|
|
||||||
|
Trampoline A targets 1
|
||||||
|
Trampoline B targets 1
|
||||||
|
Trampoline C targets 2
|
16
maps/trampoline2.map
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
######
|
||||||
|
#....#
|
||||||
|
#.**.#
|
||||||
|
#.**.#
|
||||||
|
#.**.#
|
||||||
|
######.\\.######
|
||||||
|
#**....*.......#
|
||||||
|
#\\....L\\\....#
|
||||||
|
#A......*****..#
|
||||||
|
######R.....###########
|
||||||
|
###.....*.....\\\#
|
||||||
|
#\\\\#..1...\\\#
|
||||||
|
#\\\\#......\\\#
|
||||||
|
################
|
||||||
|
|
||||||
|
Trampoline A targets 1
|
29
maps/trampoline3.map
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#######################################
|
||||||
|
#****................#..1...\\\\\\\B..#
|
||||||
|
#R.......##############################
|
||||||
|
#.. ..................................#
|
||||||
|
#.. ........ \ ......#
|
||||||
|
#.. .*. ....**.*...#....... ..........#
|
||||||
|
#.. ... ....\\\\...#.A..... ..........#
|
||||||
|
#.. ... ....\ .....#....... * \\..#
|
||||||
|
#.. ... ....\......#....... ..........#
|
||||||
|
#.. ... ....\......#....... ..........#
|
||||||
|
#.. ... ...........#................**#
|
||||||
|
#..\\\\\...........#................\\#
|
||||||
|
########### ############## ############
|
||||||
|
#...*.................................#
|
||||||
|
#....*.................. ......#
|
||||||
|
#... .*....*.............. ..... .....#
|
||||||
|
#....*2*........########.. ..... .....L
|
||||||
|
#...*...*.......#\\\#..... ...*.......#
|
||||||
|
#.....\\\.......#\\\#....**..***......#
|
||||||
|
#.... .......#\\\#*................#
|
||||||
|
#...............#\\\#*...**...*.......#
|
||||||
|
#...............#.....................#
|
||||||
|
###### ############## ### #######
|
||||||
|
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\#
|
||||||
|
#######################################
|
||||||
|
|
||||||
|
Trampoline A targets 1
|
||||||
|
Trampoline B targets 2
|
||||||
|
|
BIN
specs/images/bricks.bmp
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
specs/images/lambda.bmp
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
specs/images/lift.bmp
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
specs/images/miner.bmp
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
specs/images/openlift.bmp
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
specs/images/rock.bmp
Normal file
After Width: | Height: | Size: 1.1 KiB |