diff --git a/src/index.html b/src/index.html
index b7c202f..bd4c547 100644
--- a/src/index.html
+++ b/src/index.html
@@ -25,6 +25,7 @@
Time wasted on this ateroid: 0 hours
Asteroid classification:
+
diff --git a/src/main.js b/src/main.js
index 69e644d..c9c986a 100644
--- a/src/main.js
+++ b/src/main.js
@@ -27,15 +27,37 @@ class Engine {
// The ship
$('#active-tool').fill(this.ship.active_tool);
- if (_.keys(engine.ship.equipment).length > $('#ship-equipment > li').length) {
+ if (_.keys(engine.ship.equipment).length != $('#ship-equipment > li').length) {
$('#ship-equipment').fill();
- _.eachObj(engine.ship.equipment, (tool) => {
- // Add the tool to the DOM inventory and add a mount button
- let mount_button = EE('a', {'@href': '#', '%tool': tool}, 'mount').onClick((e) => {
- engine.ship.active_tool = tool;
- engine.update();
- });
- $('#ship-equipment').add(EE('li', tool+' ').add(mount_button));
+ _.eachObj(engine.ship.equipment, (item) => {
+ // Skip if it is not a tool to mount
+ let type = this.ship.equipment[item]['type'];
+
+ // Tools can mount on the ship
+ if (type == 'tool') {
+ // Add the tool to the DOM inventory and add a mount button
+ let mount_button = EE('a', {'@href': '#', '%tool': item}, 'mount').onClick((e) => {
+ engine.ship.active_tool = item;
+ engine.update();
+ });
+ $('#ship-equipment').add(EE('li', item+' ').add(mount_button));
+ }
+
+ // Bots can deploy on an asteroid
+ if (type == 'bot') {
+ let deploy_button = EE('a', {'@href': '#'}, 'deploy').onClick((e) => {
+ // This only works on asteroids
+ if (engine.ship.docked_to instanceof Asteroid) {
+ let bot = new Bot(item, engine.ship.equipment[item]['capability']);
+ engine.ship.docked_to.deploy_bot(bot);
+ delete engine.ship.equipment[item];
+ engine.update();
+ } else {
+ alert('You need to land on an asteroid first.');
+ }
+ });
+ $('#ship-equipment').add(EE('li', item+' ').add(deploy_button));
+ }
});
}
@@ -50,6 +72,15 @@ class Engine {
$('#time').fill((this.ticks-this.current_asteroid.landed_on) + ' hours');
$('#asteroid-classification').fill(this.current_asteroid.classification);
+
+ $('#bots').fill();
+ _.eachObj(this.current_asteroid.bots, (i, bot) => {
+ let destroy_button = EE('a', {'@href': '#'}, 'destroy').onClick((e) => {
+ bot.docked_to.bots.splice(i, 1);
+ engine.update();
+ });
+ $('#bots').add(EE('li', bot.model+' ').add(destroy_button));
+ });
}
}
}
@@ -84,15 +115,37 @@ class Ship {
mine() {
if (this.docked_to instanceof Asteroid) {
- let [type, amount] = this.docked_to.harvest(this);
+ let [type, amount] = this.docked_to.harvest(this.equipment[this.active_tool]);
this.resources[type] += amount;
}
}
}
+class Bot {
+ constructor(model) {
+ this.model = model;
+ this.tool = {'name': 'probe', 'capability': engine.station.inventory['probe'] };
+ this.docked_to = false;
+ }
+
+ // TODO: Build a gui for this
+ mount(tool, props) {
+ this.tool = {'name': tool, 'capability': props};
+ }
+
+ mine() {
+ if (this.docked_to instanceof Asteroid &&
+ engine.ship.docked_to == this.docked_to) {
+ let [type, amount] = this.docked_to.harvest(this.tool['capability']);
+ engine.ship.resources[type] += amount;
+ }
+ }
+}
+
class Asteroid {
constructor() {
this.landed_on = 0;
+ this.bots = [];
// Determine the class
this.classification = [
@@ -103,7 +156,7 @@ class Asteroid {
][Helper.random_number(0, 4)];
}
- harvest(ship) {
+ harvest(tool) {
let resources = {
'A': ['dust', 'dust', 'stone'],
'C': ['dust', 'carbon', 'carbon', 'carbon'],
@@ -111,9 +164,14 @@ class Asteroid {
'X': ['metal']
}[this.classification];
let res_type = resources[Helper.random_number(0, resources.length)];
- let amount = ship.equipment[ship.active_tool]['capability'][this.classification];
+ let amount = tool['capability'][this.classification];
return [res_type, amount];
}
+
+ deploy_bot(bot) {
+ bot.docked_to = this;
+ this.bots.push(bot);
+ }
}
class Station {
@@ -122,32 +180,44 @@ class Station {
// take probes from the asteroid
'probe': {
'price': 10,
+ 'type': 'tool',
'capability': {'A': 1, 'C': 1, 'S': 1, 'X': 1}
},
// mine on surface
'conveyor': {
'price': 500,
+ 'type': 'tool',
'capability': {'A': 2, 'C': 8, 'S': 4, 'X': 1}
},
// shaft mining into the asteroid
'pipe-drill': {
'price': 3000,
+ 'type': 'tool',
'capability': {'A': 3, 'C': 15, 'S': 12, 'X': 2}
},
// pick up loose grains with magnet, x-class asteroids only
'magnet': {
'price': 4500,
+ 'type': 'tool',
'capability': {'A': 3, 'C': 1, 'S': 1, 'X': 20}
},
// melt the matrix
'vaporizer': {
'price': 4000,
+ 'type': 'tool',
'capability': {'A': 4, 'C': 7, 'S': 6, 'X': 5}
+ },
+
+ 'mining-bot': {
+ 'price': 20000,
+ 'type': 'bot',
+ 'capability': {'A': 8, 'C': 8, 'S': 8, 'X': 8}
}
+
};
this.market = {
'dust': 1,
@@ -192,6 +262,11 @@ var engine = new Engine();
$(() => {
setInterval(() => {
engine.tick();
+ _.each(engine.asteroids, (asteroid) => {
+ _.each(asteroid.bots, (bot) => {
+ bot.mine();
+ })
+ });
engine.update();
}, 1000);