Compare commits

...

10 Commits

Author SHA1 Message Date
Colin McLeod
bef741332d Bumping version to 0.12.1 2015-06-15 10:11:34 -07:00
Colin McLeod
f54620ee24 Imperial Courier shield correction 2015-06-15 10:11:12 -07:00
Colin McLeod
7d28e69b1c Bumping version to 0.12.0 2015-06-15 09:32:59 -07:00
Colin McLeod
abfe1b4a68 Updating base shield strength for Diamondback ships 2015-06-15 09:31:33 -07:00
Colin McLeod
59e400d7b8 Detailed suface scanner power management special case 2015-06-14 18:58:27 -07:00
Colin McLeod
4b3bb3bcde License readme tweak 2015-06-14 18:58:05 -07:00
Colin McLeod
a4a562bd40 Linting fixes 2015-06-14 17:47:16 -07:00
Colin McLeod
a1506d4f37 Selectable power bands, with right click to clear feature 2015-06-14 17:26:21 -07:00
Colin McLeod
8b0f58cb69 Right-click to clear slots feature 2015-06-14 17:26:04 -07:00
Colin McLeod
1a14674352 Updating License details to comply with Frontier terms and conditions 2015-06-14 17:25:28 -07:00
12 changed files with 143 additions and 56 deletions

View File

@@ -28,12 +28,14 @@ See [Data wiki](https://github.com/cmmcleod/coriolis/wiki/Database) for details
## License ## License
The MIT License All Data and [associated JSON](https://github.com/cmmcleod/coriolis/tree/master/data) files are intellectual property and copyright of Frontier Developments plc ('Frontier', 'Frontier Developments') and are subject to their
[terms and conditions](https://www.frontierstore.net/terms-and-conditions/).
The code specificially for Coriolis.io is released under the MIT License.
Copyright (c) 2015 Coriolis.io, Colin McLeod Copyright (c) 2015 Coriolis.io, Colin McLeod
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software (Javascript, CSS, HTML, and SVG files only), and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is copies of the Software, and to permit persons to whom the Software is

View File

@@ -83,9 +83,9 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
* @param {[type]} slot The slot object belonging to the ship instance * @param {[type]} slot The slot object belonging to the ship instance
* @param {[type]} e The event object * @param {[type]} e The event object
*/ */
$scope.select = function(type, slot, e) { $scope.select = function(type, slot, e, id) {
e.stopPropagation(); e.stopPropagation();
var id = angular.element(e.target).attr('cpid'); // Get component ID id = id || angular.element(e.target).attr('cpid'); // Get component ID
if (id) { if (id) {
if (id == 'empty') { if (id == 'empty') {

View File

@@ -0,0 +1,12 @@
angular.module('app').directive('contextMenu', ['$parse', function($parse) {
return function(scope, element, attrs) {
var fn = $parse(attrs.contextMenu);
element.bind('contextmenu', function(e) {
scope.$apply(function() {
e.preventDefault();
fn(scope, { $event: e });
});
});
};
}]);

View File

@@ -8,6 +8,7 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
link: function(scope, element) { link: function(scope, element) {
var margin = { top: 20, right: 130, bottom: 20, left: 40 }, var margin = { top: 20, right: 130, bottom: 20, left: 40 },
barHeight = 20, barHeight = 20,
bands = null,
innerHeight = (barHeight * 2) + 3, innerHeight = (barHeight * 2) + 3,
height = innerHeight + margin.top + margin.bottom + 1, height = innerHeight + margin.top + margin.bottom + 1,
wattScale = d3.scale.linear(), wattScale = d3.scale.linear(),
@@ -19,8 +20,17 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
// Create chart // Create chart
svg = d3.select(element[0]).append('svg'), svg = d3.select(element[0]).append('svg'),
vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'), vis = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'),
deployed = vis.append('g'), deployed = vis.append('g').attr('class', 'power-band'),
retracted = vis.append('g'); retracted = vis.append('g').attr('class', 'power-band');
svg.on('contextmenu', function() {
d3.event.preventDefault();
for (var i = 0, l = bands.length; i < l; i++) {
bands[i].retSelected = false;
bands[i].depSelected = false;
}
render();
});
// Create Y Axis SVG Elements // Create Y Axis SVG Elements
vis.append('g').attr('class', 'watt axis'); vis.append('g').attr('class', 'watt axis');
@@ -36,12 +46,17 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
angular.element($window).bind('orientationchange resize pwrchange', render); angular.element($window).bind('orientationchange resize pwrchange', render);
function render() { function render() {
var bands = scope.bands, bands = scope.bands;
available = scope.available,
var available = scope.available,
width = element[0].offsetWidth, width = element[0].offsetWidth,
w = width - margin.left - margin.right, w = width - margin.left - margin.right,
maxBand = bands[bands.length - 1], maxBand = bands[bands.length - 1],
maxPwr = Math.max(available, maxBand.deployedSum); deployedSum = 0,
retractedSum = 0,
retBandsSelected = false,
depBandsSelected = false,
maxPwr = Math.max(available, maxBand.retractedSum, maxBand.deployedSum);
// Update chart size // Update chart size
svg.attr('width', width).attr('height', height); svg.attr('width', width).attr('height', height);
@@ -55,50 +70,80 @@ angular.module('app').directive('powerBands', ['$window', function($window) {
// Update X & Y Axis // Update X & Y Axis
wattScale.range([0, w]).domain([0, maxPwr]).clamp(true); wattScale.range([0, w]).domain([0, maxPwr]).clamp(true);
pctScale.range([0, w]).domain([0, maxPwr / available]).clamp(true); pctScale.range([0, w]).domain([0, maxPwr / available]).clamp(true);
vis.selectAll('.watt.axis').call(wattAxis); vis.selectAll('.watt.axis').call(wattAxis);
vis.selectAll('.pct.axis').attr('transform', 'translate(0,' + innerHeight + ')').call(pctAxis); vis.selectAll('.pct.axis').attr('transform', 'translate(0,' + innerHeight + ')').call(pctAxis);
retLbl for (var b = 0, l = bands.length; b < l; b++) {
.attr('x', w + 5 ) if (bands[b].retSelected) {
.attr('class', maxBand.retractedSum > available ? 'warning' : 'primary') retractedSum += bands[b].retracted + bands[b].retOnly;
.text(wattFmt(Math.max(0, maxBand.retractedSum)) + ' (' + pctFmt(Math.max(0, maxBand.retractedSum / available)) + ')'); retBandsSelected = true;
}
if (bands[b].depSelected) {
deployedSum += bands[b].deployed + bands[b].retracted;
depBandsSelected = true;
}
}
depLbl updateLabel(retLbl, w, retBandsSelected, retBandsSelected ? retractedSum : maxBand.retractedSum, available);
.attr('x', w + 5 ) updateLabel(depLbl, w, depBandsSelected, depBandsSelected ? deployedSum : maxBand.deployedSum, available);
.attr('class', maxBand.deployedSum > available ? 'warning' : 'primary')
.text(wattFmt(Math.max(0, maxBand.deployedSum)) + ' (' + pctFmt(Math.max(0, maxBand.deployedSum / available)) + ')');
retracted.selectAll('rect').data(bands).enter().append('rect') retracted.selectAll('rect').data(bands).enter().append('rect')
.attr('height', barHeight) .attr('height', barHeight)
.attr('width', function(d) { return Math.max(wattScale(d.retracted) - 1, 0); }) .attr('width', function(d) { return Math.max(wattScale(d.retracted + d.retOnly) - 1, 0); })
.attr('x', function(d) { return wattScale(d.retractedSum) - wattScale(d.retracted); }) .attr('x', function(d) { return wattScale(d.retractedSum) - wattScale(d.retracted + d.retOnly); })
.attr('y', 1) .attr('y', 1)
.attr('class', function(d) { return (d.retractedSum > available) ? 'warning' : 'primary'; }); .on('click', function(d) {
d.retSelected = !d.retSelected;
render();
})
.attr('class', function(d) { return getClass(d.retSelected, d.retractedSum, available); });
retracted.selectAll('text').data(bands).enter().append('text') retracted.selectAll('text').data(bands).enter().append('text')
.attr('x', function(d) { return wattScale(d.retractedSum) - (wattScale(d.retracted) / 2); }) .attr('x', function(d) { return wattScale(d.retractedSum) - (wattScale(d.retracted + d.retOnly) / 2); })
.attr('y', 15) .attr('y', 15)
.style('text-anchor', 'middle') .style('text-anchor', 'middle')
.attr('class', 'primary-bg') .attr('class', 'primary-bg')
.text(function(d, i) { return bandText(d.retracted, i); }); .on('click', function(d) {
d.retSelected = !d.retSelected;
render();
})
.text(function(d, i) { return bandText(d.retracted + d.retOnly, i); });
deployed.selectAll('rect').data(bands).enter().append('rect') deployed.selectAll('rect').data(bands).enter().append('rect')
.attr('height', barHeight) .attr('height', barHeight)
.attr('width', function(d) { return Math.max(wattScale(d.deployed + d.retracted) - 1, 0); }) .attr('width', function(d) { return Math.max(wattScale(d.deployed + d.retracted) - 1, 0); })
.attr('x', function(d) { return wattScale(d.deployedSum) - wattScale(d.retracted) - wattScale(d.deployed); }) .attr('x', function(d) { return wattScale(d.deployedSum) - wattScale(d.retracted) - wattScale(d.deployed); })
.attr('y', barHeight + 2) .attr('y', barHeight + 2)
.attr('class', function(d) { return (d.deployedSum > available) ? 'warning' : 'primary'; }); .on('click', function(d) {
d.depSelected = !d.depSelected;
render();
})
.attr('class', function(d) { return getClass(d.depSelected, d.deployedSum, available); });
deployed.selectAll('text').data(bands).enter().append('text') deployed.selectAll('text').data(bands).enter().append('text')
.attr('x', function(d) { return wattScale(d.deployedSum) - ((wattScale(d.retracted) + wattScale(d.deployed)) / 2); }) .attr('x', function(d) { return wattScale(d.deployedSum) - ((wattScale(d.retracted) + wattScale(d.deployed)) / 2); })
.attr('y', barHeight + 17) .attr('y', barHeight + 17)
.style('text-anchor', 'middle') .style('text-anchor', 'middle')
.attr('class', 'primary-bg') .attr('class', 'primary-bg')
.on('click', function(d) {
d.depSelected = !d.depSelected;
render();
})
.text(function(d, i) { return bandText(d.deployed + d.retracted, i); }); .text(function(d, i) { return bandText(d.deployed + d.retracted, i); });
} }
function updateLabel(lbl, width, selected, sum, available) {
lbl
.attr('x', width + 5 )
.attr('class', getClass(selected, sum, available))
.text(wattFmt(Math.max(0, sum)) + ' (' + pctFmt(Math.max(0, sum / available)) + ')');
}
function getClass(selected, sum, available) {
return selected ? 'secondary' : (sum > available) ? 'warning' : 'primary';
}
function bandText(val, index) { function bandText(val, index) {
if (val > 0 && wattScale(val) > 13) { if (val > 0 && wattScale(val) > 13) {
return index + 1; return index + 1;

View File

@@ -1,5 +1,23 @@
angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'lodash', function(Components, calcShieldStrength, calcJumpRange, _) { angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength', 'calcJumpRange', 'lodash', function(Components, calcShieldStrength, calcJumpRange, _) {
/**
* Returns the power usage type of a slot and it's particular component
* @param {object} slot The Slot
* @param {object} component The component in the slot
* @return {string} The key for the power usage type
*/
function powerUsageType(slot, component) {
if (component) {
if (component.retractedOnly) {
return 'retOnly';
}
if (component.passive) {
return 'retracted';
}
}
return slot.cat != 1 ? 'retracted' : 'deployed';
}
/** /**
* Ship model used to track all ship components and properties. * Ship model used to track all ship components and properties.
* *
@@ -37,11 +55,11 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
this.powerList.unshift(this.common[0]); // Add Power Plant this.powerList.unshift(this.common[0]); // Add Power Plant
this.priorityBands = [ this.priorityBands = [
{ deployed: 0, retracted: 0 }, { deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0 }, { deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0 }, { deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0 }, { deployed: 0, retracted: 0, retOnly: 0 },
{ deployed: 0, retracted: 0 } { deployed: 0, retracted: 0, retOnly: 0 }
]; ];
} }
@@ -75,6 +93,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
for (i = 0, l = this.priorityBands.length; i < l; i++) { for (i = 0, l = this.priorityBands.length; i < l; i++) {
this.priorityBands[i].deployed = 0; this.priorityBands[i].deployed = 0;
this.priorityBands[i].retracted = 0; this.priorityBands[i].retracted = 0;
this.priorityBands[i].retOnly = 0;
} }
if (this.cargoScoop.enabled) { if (this.cargoScoop.enabled) {
@@ -82,6 +101,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
} }
for (i = 0; i < cl; i++) { for (i = 0; i < cl; i++) {
common[i].cat = 0;
common[i].enabled = enabled ? enabled[i + 1] * 1 : true; common[i].enabled = enabled ? enabled[i + 1] * 1 : true;
common[i].priority = priorities ? priorities[i + 1] * 1 : 0; common[i].priority = priorities ? priorities[i + 1] * 1 : 0;
common[i].type = 'SYS'; common[i].type = 'SYS';
@@ -94,6 +114,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
cl++; // Increase accounts for Cargo Scoop cl++; // Increase accounts for Cargo Scoop
for (i = 0, l = hps.length; i < l; i++) { for (i = 0, l = hps.length; i < l; i++) {
hps[i].cat = 1;
hps[i].enabled = enabled ? enabled[cl + i] * 1 : true; hps[i].enabled = enabled ? enabled[cl + i] * 1 : true;
hps[i].priority = priorities ? priorities[cl + i] * 1 : 0; hps[i].priority = priorities ? priorities[cl + i] * 1 : 0;
hps[i].type = hps[i].maxClass ? 'WEP' : 'SYS'; hps[i].type = hps[i].maxClass ? 'WEP' : 'SYS';
@@ -107,6 +128,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
cl += hps.length; // Increase accounts for hardpoints cl += hps.length; // Increase accounts for hardpoints
for (i = 0, l = internal.length; i < l; i++) { for (i = 0, l = internal.length; i < l; i++) {
internal[i].cat = 2;
internal[i].enabled = enabled ? enabled[cl + i] * 1 : true; internal[i].enabled = enabled ? enabled[cl + i] * 1 : true;
internal[i].priority = priorities ? priorities[cl + i] * 1 : 0; internal[i].priority = priorities ? priorities[cl + i] * 1 : 0;
internal[i].type = 'SYS'; internal[i].type = 'SYS';
@@ -141,18 +163,14 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
*/ */
Ship.prototype.use = function(slot, id, component, preventUpdate) { Ship.prototype.use = function(slot, id, component, preventUpdate) {
if (slot.id != id) { // Selecting a different component if (slot.id != id) { // Selecting a different component
var slotIndex = preventUpdate ? -1 : this.internal.indexOf(slot);
// Slot is an internal slot, is not being emptied, and the selected component group/type must be of unique // Slot is an internal slot, is not being emptied, and the selected component group/type must be of unique
if (slotIndex != -1 && component && _.includes(['sg', 'rf', 'fs'], component.grp)) { if (slot.cat != 2 && component && _.includes(['sg', 'rf', 'fs'], component.grp)) {
// Find another internal slot that already has this type/group installed // Find another internal slot that already has this type/group installed
var similarSlotIndex = this.findInternalByGroup(component.grp); var similarSlot = this.findInternalByGroup(component.grp);
// If another slot has an installed component with of the same type // If another slot has an installed component with of the same type
if (similarSlotIndex != -1 && similarSlotIndex != slotIndex) { if (similarSlot && similarSlot !== slot) {
// Empty the slot
var similarSlot = this.internal[similarSlotIndex];
this.updateStats(similarSlot, null, similarSlot.c, true); // Update stats but don't trigger a global update this.updateStats(similarSlot, null, similarSlot.c, true); // Update stats but don't trigger a global update
similarSlot.id = null; similarSlot.id = similarSlot.c = null; // Empty the slot
similarSlot.c = null;
} }
} }
var oldComponent = slot.c; var oldComponent = slot.c;
@@ -181,9 +199,13 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
* @return {number} The index of the slot in ship.internal * @return {number} The index of the slot in ship.internal
*/ */
Ship.prototype.findInternalByGroup = function(group) { Ship.prototype.findInternalByGroup = function(group) {
return _.findIndex(this.internal, function(slot) { var index = _.findIndex(this.internal, function(slot) {
return slot.c && slot.c.grp == group; return slot.c && slot.c.grp == group;
}); });
if (index !== -1) {
return this.internal[index];
}
return null;
}; };
/** /**
@@ -198,7 +220,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
slot.priority = newPriority; slot.priority = newPriority;
if (slot.enabled) { // Only update power if the slot is enabled if (slot.enabled) { // Only update power if the slot is enabled
var usage = (slot.c.passive || this.hardpoints.indexOf(slot) == -1) ? 'retracted' : 'deployed'; var usage = powerUsageType(slot, slot.c);
this.priorityBands[oldPriority][usage] -= slot.c.power; this.priorityBands[oldPriority][usage] -= slot.c.power;
this.priorityBands[newPriority][usage] += slot.c.power; this.priorityBands[newPriority][usage] += slot.c.power;
this.updatePower(); this.updatePower();
@@ -217,8 +239,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
Ship.prototype.setSlotEnabled = function(slot, enabled) { Ship.prototype.setSlotEnabled = function(slot, enabled) {
if (slot.enabled != enabled && slot.c) { // Enabled state is changing if (slot.enabled != enabled && slot.c) { // Enabled state is changing
var usage = (slot.c.passive || this.hardpoints.indexOf(slot) == -1) ? 'retracted' : 'deployed'; this.priorityBands[slot.priority][powerUsageType(slot, slot.c)] += enabled ? slot.c.power : -slot.c.power;
this.priorityBands[slot.priority][usage] += enabled ? slot.c.power : -slot.c.power;
this.updatePower(); this.updatePower();
} }
slot.enabled = enabled; slot.enabled = enabled;
@@ -229,9 +250,10 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
return 0; // No Status (Not possible) return 0; // No Status (Not possible)
} else if (!slot.enabled) { } else if (!slot.enabled) {
return 1; // Disabled return 1; // Disabled
} else if (deployed) { } else if (deployed && !slot.c.retractedOnly) { // Certain component (e.g. Detaild Surface scanner) are power only while retracted
return this.priorityBands[slot.priority].deployedSum > this.powerAvailable ? 2 : 3; // Offline : Online return this.priorityBands[slot.priority].deployedSum > this.powerAvailable ? 2 : 3; // Offline : Online
} else if (this.hardpoints.indexOf(slot) != -1 && !slot.c.passive) { // Active hardpoints have no retracted status // Active hardpoints have no retracted status
} else if ((deployed && slot.c.retractedOnly) || (slot.cat === 1 && !slot.c.passive)) {
return 0; // No Status (Not possible) return 0; // No Status (Not possible)
} }
return this.priorityBands[slot.priority].retractedSum > this.powerAvailable ? 2 : 3; // Offline : Online return this.priorityBands[slot.priority].retractedSum > this.powerAvailable ? 2 : 3; // Offline : Online
@@ -241,7 +263,6 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
* Updates the ship's cumulative and aggregated stats based on the component change. * Updates the ship's cumulative and aggregated stats based on the component change.
*/ */
Ship.prototype.updateStats = function(slot, n, old, preventUpdate) { Ship.prototype.updateStats = function(slot, n, old, preventUpdate) {
var isHardPoint = this.hardpoints.indexOf(slot) != -1;
var powerChange = slot == this.common[0]; var powerChange = slot == this.common[0];
if (old) { // Old component now being removed if (old) { // Old component now being removed
@@ -265,7 +286,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
} }
if (old.power && slot.enabled) { if (old.power && slot.enabled) {
this.priorityBands[slot.priority][(isHardPoint && !old.passive) ? 'deployed' : 'retracted'] -= old.power; this.priorityBands[slot.priority][powerUsageType(slot, old)] -= old.power;
powerChange = true; powerChange = true;
} }
this.unladenMass -= old.mass || 0; this.unladenMass -= old.mass || 0;
@@ -295,7 +316,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
} }
if (n.power && slot.enabled) { if (n.power && slot.enabled) {
this.priorityBands[slot.priority][(isHardPoint && !n.passive) ? 'deployed' : 'retracted'] += n.power; this.priorityBands[slot.priority][powerUsageType(slot, n)] += n.power;
powerChange = true; powerChange = true;
} }
this.unladenMass += n.mass || 0; this.unladenMass += n.mass || 0;
@@ -319,7 +340,7 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
for (var i = 0, l = bands.length; i < l; i++) { for (var i = 0, l = bands.length; i < l; i++) {
var band = bands[i]; var band = bands[i];
prevRetracted = band.retractedSum = prevRetracted + band.retracted; prevRetracted = band.retractedSum = prevRetracted + band.retracted + band.retOnly;
prevDeployed = band.deployedSum = prevDeployed + band.deployed + band.retracted; prevDeployed = band.deployedSum = prevDeployed + band.deployed + band.retracted;
} }
@@ -329,8 +350,8 @@ angular.module('shipyard').factory('Ship', ['Components', 'calcShieldStrength',
}; };
Ship.prototype.updateShieldStrength = function() { Ship.prototype.updateShieldStrength = function() {
var sgSI = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any var sgSlot = this.findInternalByGroup('sg'); // Find Shield Generator slot Index if any
this.shieldStrength = sgSI != -1 ? calcShieldStrength(this.mass, this.shields, this.internal[sgSI].c, this.shieldMultiplier) : 0; this.shieldStrength = sgSlot ? calcShieldStrength(this.mass, this.shields, sgSlot.c, this.shieldMultiplier) : 0;
}; };
/** /**

View File

@@ -169,6 +169,12 @@ table.total {
} }
} }
.power-band {
text, rect {
cursor: pointer;
}
}
#componentPriority { #componentPriority {
.tablet({ .tablet({
text.primary, text.warning, text.primary-bg { text.primary, text.warning, text.primary-bg {

View File

@@ -165,7 +165,7 @@
<div id="internal" class="group"> <div id="internal" class="group">
<h1>Internal Compartments</h1> <h1>Internal Compartments</h1>
<div class="slot" ng-repeat="i in ship.internal" ng-click="selectSlot($event, i)" ng-class="{selected: selectedSlot==i}"> <div class="slot" ng-repeat="i in ship.internal" ng-click="selectSlot($event, i)" context-menu="select('i', i, $event, 'empty')" ng-class="{selected: selectedSlot==i}">
<div slot-internal class="details" slot="i" lbl="GMAP[i.c.grp]" fuel="ship.fuelCapacity"></div> <div slot-internal class="details" slot="i" lbl="GMAP[i.c.grp]" fuel="ship.fuelCapacity"></div>
<div class="select" ng-if="selectedSlot==i" ng-click="select('i',i,$event)"> <div class="select" ng-if="selectedSlot==i" ng-click="select('i',i,$event)">
<div component-select s="i" groups="availCS.getInts(i.maxClass)"></div> <div component-select s="i" groups="availCS.getInts(i.maxClass)"></div>
@@ -175,7 +175,7 @@
<div id="hardpoints" class="group"> <div id="hardpoints" class="group">
<h1>HardPoints</h1> <h1>HardPoints</h1>
<div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '!0'}" ng-click="selectSlot($event, h)" ng-class="{selected: selectedSlot==h}"> <div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '!0'}" ng-click="selectSlot($event, h)" context-menu="select('h', h, $event, 'empty')" ng-class="{selected: selectedSlot==h}">
<div slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="GMAP[h.c.grp]"></div> <div slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="GMAP[h.c.grp]"></div>
<div class="select" ng-class="{hardpoint: h.maxClass > 0}" ng-if="selectedSlot==h" ng-click="select('h',h,$event)"> <div class="select" ng-class="{hardpoint: h.maxClass > 0}" ng-if="selectedSlot==h" ng-click="select('h',h,$event)">
<div component-select s="h" groups="availCS.getHps(h.maxClass)"></div> <div component-select s="h" groups="availCS.getHps(h.maxClass)"></div>
@@ -185,7 +185,7 @@
<div id="utility" class="group"> <div id="utility" class="group">
<h1>Utility Mounts</h1> <h1>Utility Mounts</h1>
<div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '0'}" ng-click="selectSlot($event, h)" ng-class="{selected: selectedSlot==h}"> <div class="slot" ng-repeat="h in ship.hardpoints | filter:{maxClass: '0'}" ng-click="selectSlot($event, h)" context-menu="select('h', h, $event, 'empty')" ng-class="{selected: selectedSlot==h}">
<div slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="GMAP[h.c.grp]"></div> <div slot-hardpoint class="details" hp="h" size="HPC[h.maxClass]" lbl="GMAP[h.c.grp]"></div>
<div class="select" ng-class="{hardpoint: h.maxClass > 0}" ng-if="selectedSlot==h" ng-click="select('h',h,$event)"> <div class="select" ng-class="{hardpoint: h.maxClass > 0}" ng-if="selectedSlot==h" ng-click="select('h',h,$event)">
<div component-select s="h" groups="availCS.getHps(h.maxClass)"></div> <div component-select s="h" groups="availCS.getHps(h.maxClass)"></div>

View File

@@ -38,6 +38,7 @@
"grp": "sc", "grp": "sc",
"name": "Detailed Surface Scanner", "name": "Detailed Surface Scanner",
"class": 1, "class": 1,
"retractedOnly": 1,
"rating": "C", "rating": "C",
"cost": 250000, "cost": 250000,
"mass": 1.3, "mass": 1.3,

View File

@@ -9,7 +9,7 @@
"speed": 283, "speed": 283,
"boost": 384, "boost": 384,
"agility": 8, "agility": 8,
"shields": 93, "shields": 118,
"armour": 216, "armour": 216,
"fuelcost": 50, "fuelcost": 50,
"mass": 170 "mass": 170

View File

@@ -9,7 +9,7 @@
"speed": 242, "speed": 242,
"boost": 316, "boost": 316,
"agility": 5, "agility": 5,
"shields": 115, "shields": 146,
"armour": 270, "armour": 270,
"fuelcost": 50, "fuelcost": 50,
"mass": 298 "mass": 298

View File

@@ -9,7 +9,7 @@
"speed": 277, "speed": 277,
"boost": 380, "boost": 380,
"agility": 6, "agility": 6,
"shields": 230, "shields": 197,
"armour": 144, "armour": 144,
"fuelcost": 50, "fuelcost": 50,
"mass": 35 "mass": 35

View File

@@ -1,6 +1,6 @@
{ {
"name": "coriolis_shipyard", "name": "coriolis_shipyard",
"version": "0.11.1", "version": "0.12.1",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/cmmcleod/coriolis" "url": "https://github.com/cmmcleod/coriolis"