mirror of
https://github.com/EDCD/coriolis.git
synced 2025-12-08 22:33:24 +00:00
Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b44f5fe27 | ||
|
|
7332dc69ed | ||
|
|
381387c04f | ||
|
|
e0db9fdfb0 | ||
|
|
a8d66b22af | ||
|
|
bdc1e622f9 | ||
|
|
ad8130ae9b | ||
|
|
394a3bb9f1 | ||
|
|
54907b462c | ||
|
|
1350de1910 | ||
|
|
89d3fd69e1 | ||
|
|
7325081ec9 | ||
|
|
680872a302 | ||
|
|
a3c65d6c69 | ||
|
|
a189265326 | ||
|
|
b447e913ff | ||
|
|
b5a249fb4b | ||
|
|
ae081c147e | ||
|
|
3ce0d0bdd8 |
@@ -7,7 +7,7 @@
|
||||
<!-- Standard headers -->
|
||||
<meta name="description" content="A ship outfitting and comparison tool for Elite Dangerous">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="viewport" content="width = device-width, initial-scale = 1.0">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
|
||||
<link rel="manifest" href="/images/logo/manifest.json">
|
||||
<link rel="icon" sizes="152x152 192x192" type="image/png" href="/images/logo/192x192.png">
|
||||
<link rel="shortcut icon" href="/images/logo/favicon.ico">
|
||||
|
||||
@@ -45,8 +45,13 @@ function($rootScope, $location, $window, $doc, $state, CArr, shipPurpose, sz, hp
|
||||
$rootScope.STATUS_CLASS = ['', 'disabled', 'warning', 'secondary-disabled'];
|
||||
$rootScope.title = 'Coriolis';
|
||||
|
||||
$rootScope.cName = function(c) {
|
||||
return c.c ? c.c.name ? c.c.name : GroupMap[c.c.grp] : null;
|
||||
/**
|
||||
* Returns the name of the component mounted in the specified slot
|
||||
* @param {Object} slot The slot object
|
||||
* @return {String} The component name
|
||||
*/
|
||||
$rootScope.cName = function(slot) {
|
||||
return slot.c ? slot.c.name ? slot.c.name : GroupMap[slot.c.grp] : null;
|
||||
};
|
||||
|
||||
// Formatters
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
angular.module('app').controller('OutfitController', ['$window', '$rootScope', '$scope', '$state', '$stateParams', 'ShipsDB', 'Ship', 'Components', 'Serializer', 'Persist', 'calcTotalRange', 'calcSpeed', function($window, $rootScope, $scope, $state, $p, Ships, Ship, Components, Serializer, Persist, calcTotalRange, calcSpeed) {
|
||||
var win = angular.element($window); // Angularized window object for event triggering
|
||||
var data = Ships[$p.shipId]; // Retrieve the basic ship properties, slots and defaults
|
||||
var ship = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship instance
|
||||
var win = angular.element($window); // Angularized window object for event triggering
|
||||
var retrofitShip = new Ship($p.shipId, data.properties, data.slots); // Create a new Ship for retrofit comparison
|
||||
|
||||
// Update the ship instance with the code (if provided) or the 'factory' defaults.
|
||||
if ($p.code) {
|
||||
@@ -11,8 +12,6 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
ship.buildWith(data.defaults); // Populate with default components
|
||||
}
|
||||
|
||||
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
|
||||
$scope.buildName = $p.bn;
|
||||
$rootScope.title = ship.name + ($scope.buildName ? ' - ' + $scope.buildName : '');
|
||||
$scope.ship = ship;
|
||||
@@ -32,11 +31,27 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
$scope.selectedSlot = null;
|
||||
$scope.savedCode = Persist.getBuild(ship.id, $scope.buildName);
|
||||
$scope.canSave = Persist.isEnabled();
|
||||
$scope.allBuilds = Persist.builds;
|
||||
$scope.fuel = 0;
|
||||
$scope.pwrDesc = false;
|
||||
$scope.pwrPredicate = 'type';
|
||||
$scope.retroDesc = false;
|
||||
$scope.retroPredicate = 'netCost';
|
||||
$scope.costDesc = true;
|
||||
$scope.costPredicate = 'c.cost';
|
||||
$scope.costTab = Persist.getCostTab() || 'costs';
|
||||
|
||||
if ($scope.savedCode) {
|
||||
Serializer.toShip(retrofitShip, $scope.savedCode); // Populate components from last save
|
||||
$scope.retrofitBuild = $scope.buildName;
|
||||
} else {
|
||||
retrofitShip.buildWith(data.defaults);
|
||||
$scope.retrofitBuild = null;
|
||||
}
|
||||
|
||||
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
updateRetrofitCosts();
|
||||
|
||||
$scope.jrSeries = {
|
||||
xMin: 0,
|
||||
@@ -189,6 +204,9 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
if ($scope.code != $scope.savedCode) {
|
||||
Persist.saveBuild(ship.id, $scope.buildName, $scope.code);
|
||||
$scope.savedCode = $scope.code;
|
||||
if ($scope.retrofitBuild === $scope.buildName) {
|
||||
Serializer.toShip(retrofitShip, $scope.code);
|
||||
}
|
||||
updateState($scope.code);
|
||||
}
|
||||
};
|
||||
@@ -232,6 +250,11 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
$scope.pwrPredicate = key;
|
||||
};
|
||||
|
||||
$scope.sortRetrofit = function(key) {
|
||||
$scope.retroDesc = $scope.retroPredicate == key ? !$scope.retroDesc : $scope.retroDesc;
|
||||
$scope.retroPredicate = key;
|
||||
};
|
||||
|
||||
/**
|
||||
* Toggle the power on/off for the selected component
|
||||
* @param {object} item The component being toggled
|
||||
@@ -266,6 +289,15 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
return ship.getSlotStatus(slot, true);
|
||||
};
|
||||
|
||||
$scope.setRetrofitBase = function() {
|
||||
if ($scope.retrofitBuild) {
|
||||
Serializer.toShip(retrofitShip, Persist.getBuild(ship.id, $scope.retrofitBuild));
|
||||
} else {
|
||||
retrofitShip.buildWith(data.defaults);
|
||||
}
|
||||
updateRetrofitCosts();
|
||||
};
|
||||
|
||||
// Utilify functions
|
||||
|
||||
function updateState(code) {
|
||||
@@ -274,17 +306,66 @@ angular.module('app').controller('OutfitController', ['$window', '$rootScope', '
|
||||
$scope.speedSeries.xMax = $scope.trSeries.xMax = $scope.jrSeries.xMax = ship.cargoCapacity;
|
||||
$scope.jrSeries.yMax = ship.unladenRange;
|
||||
$scope.trSeries.yMax = ship.unladenTotalRange;
|
||||
updateRetrofitCosts();
|
||||
win.triggerHandler('pwrchange');
|
||||
}
|
||||
|
||||
function updateRetrofitCosts() {
|
||||
var costs = $scope.retrofitList = [];
|
||||
var cName = $rootScope.cName;
|
||||
var total = 0, i, l, item;
|
||||
|
||||
if (ship.bulkheads.id != retrofitShip.bulkheads.id) {
|
||||
item = {
|
||||
buyClassRating: ship.bulkheads.c.class + ship.bulkheads.c.rating,
|
||||
buyName: cName(ship.bulkheads),
|
||||
sellClassRating: retrofitShip.bulkheads.c.class + retrofitShip.bulkheads.c.rating,
|
||||
sellName: cName(retrofitShip.bulkheads),
|
||||
netCost: ship.bulkheads.discountedCost - retrofitShip.bulkheads.discountedCost
|
||||
};
|
||||
costs.push(item);
|
||||
total += item.netCost;
|
||||
}
|
||||
|
||||
for (var g in { common: 1, internal: 1, hardpoints: 1 }) {
|
||||
var retroSlotGroup = retrofitShip[g];
|
||||
var slotGroup = ship[g];
|
||||
for (i = 0, l = slotGroup.length; i < l; i++) {
|
||||
if (slotGroup[i].id != retroSlotGroup[i].id) {
|
||||
item = { netCost: 0 };
|
||||
if (slotGroup[i].id) {
|
||||
item.buyName = cName(slotGroup[i]);
|
||||
item.buyClassRating = slotGroup[i].c.class + slotGroup[i].c.rating;
|
||||
item.netCost = slotGroup[i].discountedCost;
|
||||
}
|
||||
if (retroSlotGroup[i].id) {
|
||||
item.sellName = cName(retroSlotGroup[i]);
|
||||
item.sellClassRating = retroSlotGroup[i].c.class + retroSlotGroup[i].c.rating;
|
||||
item.netCost -= retroSlotGroup[i].discountedCost;
|
||||
}
|
||||
costs.push(item);
|
||||
total += item.netCost;
|
||||
}
|
||||
}
|
||||
}
|
||||
$scope.retrofitTotal = total;
|
||||
}
|
||||
|
||||
$scope.updateCostTab = function(tab) {
|
||||
Persist.setCostTab(tab);
|
||||
$scope.costTab = tab;
|
||||
};
|
||||
|
||||
// Hide any open menu/slot/etc if the background is clicked
|
||||
$scope.$on('close', function() {
|
||||
$scope.selectedSlot = null;
|
||||
});
|
||||
|
||||
// Hide any open menu/slot/etc if the background is clicked
|
||||
// Hide any open menu/slot/etc if the background is clicked
|
||||
$scope.$on('discountChange', function() {
|
||||
ship.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
retrofitShip.applyDiscounts($rootScope.discounts.ship, $rootScope.discounts.components);
|
||||
updateRetrofitCosts();
|
||||
});
|
||||
|
||||
}]);
|
||||
|
||||
@@ -21,7 +21,7 @@ angular.module('app').directive('componentSelect', function() {
|
||||
list.push((o.maxmass && mass > o.maxmass) ? ' disabled"' : '" cpid="', id, '">');
|
||||
|
||||
if (o.mode) {
|
||||
list.push('<svg cpid="', id, '" class="icon lg"><use xlink:href="#mount-', o.mode, '"></use></svg> ');
|
||||
list.push('<svg cpid="', id, '" class="icon lg"><use cpid="', id, '" xlink:href="#mount-', o.mode, '"></use></svg> ');
|
||||
}
|
||||
|
||||
list.push(o.class, o.rating);
|
||||
|
||||
@@ -204,6 +204,27 @@ angular.module('app').service('Persist', ['$window', 'lodash', function($window,
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Persist selected cost tab
|
||||
* @param {number} val Discount value/amount
|
||||
*/
|
||||
this.setCostTab = function(tabName) {
|
||||
if (this.lsEnabled) {
|
||||
return localStorage.setItem('costTab', tabName);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get the saved discount
|
||||
* @return {number} val Discount value/amount
|
||||
*/
|
||||
this.getCostTab = function() {
|
||||
if (this.lsEnabled) {
|
||||
return localStorage.getItem('costTab');
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* Retrieve the last router state from local storage
|
||||
* @param {object} state State object containing state name and params
|
||||
|
||||
@@ -22,7 +22,10 @@
|
||||
|
||||
html, body {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
text-rendering: optimizeLegibility;
|
||||
overflow-x: hidden;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
}
|
||||
|
||||
body {
|
||||
@@ -40,7 +43,9 @@ div, a, li {
|
||||
|
||||
#main {
|
||||
margin: 0;
|
||||
padding: 0.5em 0;
|
||||
padding: 0.5em 0.5em;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
min-height: 90%;
|
||||
clear: both;
|
||||
text-align: center;
|
||||
|
||||
@@ -84,6 +84,19 @@ header {
|
||||
-webkit-overflow-scrolling: touch;
|
||||
max-height: 500px;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width: 0.5em;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-track {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background-color: @warning-disabled;
|
||||
}
|
||||
|
||||
|
||||
.smallTablet({
|
||||
max-height: 400px;
|
||||
left: 0;
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
input {
|
||||
background: none;
|
||||
line-height: 1.3em;
|
||||
width: 20em;
|
||||
width: 15em;
|
||||
font-size: 0.9em;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
@@ -99,6 +99,12 @@
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.optional-hide {
|
||||
.largePhone({
|
||||
display: none;
|
||||
});
|
||||
}
|
||||
|
||||
table.total {
|
||||
width: 100%;
|
||||
|
||||
@@ -113,6 +119,26 @@ table.total {
|
||||
}
|
||||
}
|
||||
|
||||
.tabs {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
margin-bottom: 1px;
|
||||
|
||||
&, th {
|
||||
border-collapse: collapse;
|
||||
color: @primary-disabled;
|
||||
background-color: @primary-bg;
|
||||
border: 1px solid @primary-disabled;
|
||||
padding-top: 1px;
|
||||
}
|
||||
|
||||
.active {
|
||||
color: @primary-bg;
|
||||
background-color: @primary-disabled;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.group {
|
||||
width: 25%;
|
||||
padding: 0.5em 0.2em;
|
||||
@@ -141,6 +167,12 @@ table.total {
|
||||
|
||||
.smallTablet({
|
||||
width: 50%;
|
||||
|
||||
.axis.x {
|
||||
g.tick:nth-child(2n + 1) text {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
.largePhone({
|
||||
@@ -164,14 +196,6 @@ table.total {
|
||||
&.third {
|
||||
width: 33%;
|
||||
|
||||
.smallTablet({
|
||||
.axis.x {
|
||||
g.tick:nth-child(2n + 1) text {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
.largePhone({
|
||||
width: 100% !important;
|
||||
});
|
||||
@@ -228,9 +252,6 @@ table.total {
|
||||
&:nth-child(3) {
|
||||
display: none;
|
||||
}
|
||||
&:nth-child(2) {
|
||||
font-size: 0.7em;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
select {
|
||||
.border-radius(0);
|
||||
cursor: pointer;
|
||||
background: none;
|
||||
color: @primary-disabled;
|
||||
font-family: @fStandard;
|
||||
font-size: 1em;
|
||||
background-color: transparent;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
appearance: none;
|
||||
padding: 0.1em 0.5em;
|
||||
outline:none;
|
||||
border: 0;
|
||||
|
||||
&:focus {
|
||||
outline:none;
|
||||
}
|
||||
|
||||
&::-moz-focus-inner {
|
||||
border: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.select {
|
||||
color: @primary-disabled;
|
||||
position: absolute;
|
||||
@@ -15,6 +39,19 @@
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
|
||||
&::-webkit-scrollbar {
|
||||
width: 0.5em;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-track {
|
||||
background-color: transparent;
|
||||
border-left: 1px solid @primary;
|
||||
}
|
||||
|
||||
&::-webkit-scrollbar-thumb {
|
||||
background-color: @primary-disabled;
|
||||
}
|
||||
|
||||
.select-group {
|
||||
line-height: 1.5em;
|
||||
text-align: left;
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
{{c.c.class}}{{c.c.rating}} {{c.c.name || lbl}}
|
||||
<div class="r">{{c.c.mass || c.c.capacity || '0'}} <u>T</u></div>
|
||||
<div class="cb"></div>
|
||||
<div class="l" ng-if="c.c.optmass">Opt: {{c.c.optmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.maxmass">Max: {{c.c.maxmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.optmass">Optimal Mass: {{c.c.optmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.maxmass">Max Mass: {{c.c.maxmass}} <u>T</u></div>
|
||||
<div class="l" ng-if="c.c.bins">{{c.c.bins}} <u>Bins</u></div>
|
||||
<div class="l" ng-if="c.c.rate">Rate: {{c.c.rate}} <u>Kg/s</u> Refuel Time: {{$r.fTime(fuel * 1000 / c.c.rate)}}</div>
|
||||
<div class="l" ng-if="c.c.ammo">Ammo: {{c.c.ammo}}</div>
|
||||
|
||||
@@ -30,16 +30,18 @@
|
||||
<th rowspan="2">Agility</th>
|
||||
<th rowspan="2">Speed</th>
|
||||
<th rowspan="2">Boost</th>
|
||||
<th rowspan="2">DPS</th>
|
||||
<th rowspan="2">Armour</th>
|
||||
<th rowspan="2">Shields</th>
|
||||
<th colspan="2">Mass</th>
|
||||
<th colspan="3">Mass</th>
|
||||
<th rowspan="2">Cargo</th>
|
||||
<th rowspan="2">Fuel</th>
|
||||
<th colspan="3">Jump Range</th>
|
||||
<th colspan="3">Total Range</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="lft">Unladen</th>
|
||||
<th class="lft">Hull</th>
|
||||
<th>Unladen</th>
|
||||
<th>Laden</th>
|
||||
<th class="lft">Max</th>
|
||||
<th>Full Tank</th>
|
||||
@@ -55,8 +57,10 @@
|
||||
<td>{{ship.agility}}/10</td>
|
||||
<td>{{fRound(ship.speed)}} <u>m/s</u></td>
|
||||
<td>{{fRound(ship.boost)}} <u>m/s</u></td>
|
||||
<td>{{fRound(ship.totalDps)}}</td>
|
||||
<td>{{ship.armourTotal}} <span ng-if="ship.armourAdded">({{ship.armour}} + {{ship.armourAdded}})</span></td>
|
||||
<td>{{fRound(ship.shieldStrength)}} <u>MJ</u> <span ng-if="ship.shieldMultiplier > 1 && ship.shieldStrength > 0">({{fRPct(ship.shieldMultiplier)}})</span></td>
|
||||
<td>{{ship.mass}} <u>T</u></td>
|
||||
<td>{{fRound(ship.unladenMass)}} <u>T</u></td>
|
||||
<td>{{fRound(ship.ladenMass)}} <u>T</u></td>
|
||||
<td>{{fRound(ship.cargoCapacity)}} <u>T</u></td>
|
||||
@@ -237,28 +241,36 @@
|
||||
</div>
|
||||
|
||||
<div class="group half">
|
||||
<table style="width:100%">
|
||||
<table class="tabs">
|
||||
<thead>
|
||||
<tr class="main">
|
||||
<th colspan="2" class="sortable le" ng-click="sortCost(cName)">
|
||||
Component
|
||||
<div class="r">
|
||||
<u ng-if="discounts.ship < 1">[Ship {{fRPct(1 - discounts.ship)}} off]</u>
|
||||
<u ng-if="discounts.components < 1">[Components {{fRPct(1 - discounts.components)}} off]</u>
|
||||
</div>
|
||||
</th>
|
||||
<th class="sortable le" ng-click="sortCost('discountedCost')">Credits</th>
|
||||
<tr>
|
||||
<th style="width:50%" ng-class="{active: costTab == 'retrofit'}" ng-click="updateCostTab('retrofit')">Retrofit Costs</th>
|
||||
<th style="width:50%" ng-class="{active: costTab == 'costs'}" ng-click="updateCostTab('costs')">Costs</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="highlight" ng-repeat="item in costList | orderBy:costPredicate:costDesc" ng-if="item.c.cost > 0" ng-class="{disabled:!item.incCost}">
|
||||
<td class="toggleable" style="width:1em;" ng-click="toggleCost(item)">{{item.c.class}}{{item.c.rating}}</td>
|
||||
<td class="le toggleable shorten" ng-click="toggleCost(item)">{{cName(item)}}</td>
|
||||
<td class="ri toggleable" ng-click="toggleCost(item)">{{fCrd(item.discountedCost)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="total">
|
||||
|
||||
<div ng-if="costTab == 'costs'">
|
||||
<table style="width:100%">
|
||||
<thead>
|
||||
<tr class="main">
|
||||
<th colspan="2" class="sortable le" ng-click="sortCost(cName)">
|
||||
Component
|
||||
<u class="optional-hide" ng-if="discounts.ship < 1">[Ship {{fRPct(1 - discounts.ship)}} off]</u>
|
||||
<u class="optional-hide" ng-if="discounts.components < 1">[Components {{fRPct(1 - discounts.components)}} off]</u>
|
||||
</th>
|
||||
<th class="sortable le" ng-click="sortCost('discountedCost')">Credits</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="highlight" ng-repeat="item in costList | orderBy:costPredicate:costDesc" ng-if="item.c.cost > 0" ng-class="{disabled:!item.incCost}">
|
||||
<td class="toggleable" style="width:1em;" ng-click="toggleCost(item)">{{item.c.class}}{{item.c.rating}}</td>
|
||||
<td class="le toggleable shorten" ng-click="toggleCost(item)">{{cName(item)}}</td>
|
||||
<td class="ri toggleable" ng-click="toggleCost(item)">{{fCrd(item.discountedCost)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="total">
|
||||
<tr class="ri">
|
||||
<td class="lbl">Total</td>
|
||||
<td>{{fCrd(ship.totalCost)}} <u>CR</u></td>
|
||||
@@ -267,7 +279,52 @@
|
||||
<td class="lbl">Insurance</td>
|
||||
<td>{{fCrd(ship.totalCost * insurance.current.pct)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</table>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div ng-if="costTab == 'retrofit'">
|
||||
<div class="scroll-x">
|
||||
<table style="width:100%">
|
||||
<thead>
|
||||
<tr class="main">
|
||||
<th colspan="2" class="sortable le" ng-click="sortRetrofit('sellName')">Sell</th>
|
||||
<th colspan="2" class="sortable le" ng-click="sortRetrofit('buyName')">Buy</th>
|
||||
<th class="sortable le" ng-click="sortRetrofit('netCost')">
|
||||
Net Cost <u class="optional-hide" ng-if="discounts.components < 1">[{{fRPct(1 - discounts.components)}} off]</u>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr ng-if="!retrofitList || retrofitList.length == 0">
|
||||
<td colspan="5" style="padding: 3em 0;">No Retrofitting changes</td>
|
||||
</tr>
|
||||
<tr class="highlight" ng-repeat="item in retrofitList | orderBy:retroPredicate:retroDesc">
|
||||
<td style="width:1em;">{{item.sellClassRating}}</td>
|
||||
<td class="le shorten">{{item.sellName}}</td>
|
||||
<td style="width:1em;">{{item.buyClassRating}}</td>
|
||||
<td class="le shorten">{{item.buyName}}</td>
|
||||
<td class="ri" ng-class="item.netCost > 0 ? 'warning' : 'secondary-disabled'">{{ fCrd(item.netCost)}} <u>CR</u></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<table class="total">
|
||||
<tr class="ri">
|
||||
<td class="lbl">Cost</td>
|
||||
<td colspan="2" ng-class="retrofitTotal > 0 ? 'warning' : 'secondary-disabled'">{{fCrd(retrofitTotal)}} <u>CR</u></td>
|
||||
</tr>
|
||||
<tr class="ri">
|
||||
<td class="lbl">Retrofit from</td>
|
||||
<td class="cen" style="border-right:none;width: 1em;"><u class="primary-disabled">▾</u></td>
|
||||
<td style="border-left:none;padding:0;">
|
||||
<select style="width: 100%;padding: 0" ng-model="$parent.retrofitBuild" ng-change="setRetrofitBase()" ng-options="name as name for (name, build) in allBuilds[ship.id]">
|
||||
<option value="">Stock / Standard</option>
|
||||
</select>
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="group half">
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"dependencies": {
|
||||
"d3": "~3.5.5",
|
||||
"ng-lodash": "~0.2.0",
|
||||
"ui-router-extras": "~0.0.13",
|
||||
"ui-router-extras": "0.0.13",
|
||||
"angular-ui-router": "^0.2.15",
|
||||
"d3-tip": "~0.6.7",
|
||||
"ng-sortable": "~1.2.1",
|
||||
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"Fuel Transfer Limpet Ctrl": [
|
||||
{ "id": "Ff", "grp":"fx", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":-0.55, "range":1.02, "maximum": 8 },
|
||||
{ "id": "Fg", "grp":"fx", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":-0.41, "range":1.36, "maximum": 8 },
|
||||
{ "id": "Fh", "grp":"fx", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":-0.69, "range":1.70, "maximum": 8 },
|
||||
{ "id": "Fi", "grp":"fx", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":-0.97, "range":2.04, "maximum": 8 },
|
||||
{ "id": "Fj", "grp":"fx", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":-0.83, "range":2.38, "maximum": 8 },
|
||||
{ "id": "Ff", "grp":"fx", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":0.55, "range":1.02, "maximum": 8 },
|
||||
{ "id": "Fg", "grp":"fx", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.41, "range":1.36, "maximum": 8 },
|
||||
{ "id": "Fh", "grp":"fx", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range":1.70, "maximum": 8 },
|
||||
{ "id": "Fi", "grp":"fx", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":0.97, "range":2.04, "maximum": 8 },
|
||||
{ "id": "Fj", "grp":"fx", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":0.83, "range":2.38, "maximum": 8 },
|
||||
|
||||
{ "id": "Fa", "grp":"fx", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":-0.40, "range":0.78, "maximum": 4 },
|
||||
{ "id": "Fb", "grp":"fx", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":-0.30, "range":1.04, "maximum": 4 },
|
||||
{ "id": "Fc", "grp":"fx", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":-0.50, "range":1.30, "maximum": 4 },
|
||||
{ "id": "Fd", "grp":"fx", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":-0.97, "range":1.56, "maximum": 4 },
|
||||
{ "id": "Fe", "grp":"fx", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":-0.60, "range":1.82, "maximum": 4 },
|
||||
{ "id": "Fa", "grp":"fx", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":0.40, "range":0.78, "maximum": 4 },
|
||||
{ "id": "Fb", "grp":"fx", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":0.30, "range":1.04, "maximum": 4 },
|
||||
{ "id": "Fc", "grp":"fx", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":0.50, "range":1.30, "maximum": 4 },
|
||||
{ "id": "Fd", "grp":"fx", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":0.97, "range":1.56, "maximum": 4 },
|
||||
{ "id": "Fe", "grp":"fx", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":0.60, "range":1.82, "maximum": 4 },
|
||||
|
||||
{ "id": "F5", "grp":"fx", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":-0.27, "range":0.66, "maximum": 2 },
|
||||
{ "id": "F6", "grp":"fx", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":-0.20, "range":0.88, "maximum": 2 },
|
||||
{ "id": "F7", "grp":"fx", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":-0.34, "range":1.10, "maximum": 2 },
|
||||
{ "id": "F8", "grp":"fx", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":-0.48, "range":1.32, "maximum": 2 },
|
||||
{ "id": "F9", "grp":"fx", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":-0.41, "range":1.54, "maximum": 2 },
|
||||
{ "id": "F5", "grp":"fx", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":0.27, "range":0.66, "maximum": 2 },
|
||||
{ "id": "F6", "grp":"fx", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":0.20, "range":0.88, "maximum": 2 },
|
||||
{ "id": "F7", "grp":"fx", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":0.34, "range":1.10, "maximum": 2 },
|
||||
{ "id": "F8", "grp":"fx", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":0.48, "range":1.32, "maximum": 2 },
|
||||
{ "id": "F9", "grp":"fx", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":0.41, "range":1.54, "maximum": 2 },
|
||||
|
||||
{ "id": "F0", "grp":"fx", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":-0.18, "range":0.60, "maximum": 1 },
|
||||
{ "id": "F1", "grp":"fx", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":-0.14, "range":0.80, "maximum": 1 },
|
||||
{ "id": "F2", "grp":"fx", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":-0.23, "range":1.00, "maximum": 1 },
|
||||
{ "id": "F3", "grp":"fx", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":-0.32, "range":1.20, "maximum": 1 },
|
||||
{ "id": "F4", "grp":"fx", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":-0.28, "range":1.40, "maximum": 1 }
|
||||
{ "id": "F0", "grp":"fx", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":0.18, "range":0.60, "maximum": 1 },
|
||||
{ "id": "F1", "grp":"fx", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":0.14, "range":0.80, "maximum": 1 },
|
||||
{ "id": "F2", "grp":"fx", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":0.23, "range":1.00, "maximum": 1 },
|
||||
{ "id": "F3", "grp":"fx", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":0.32, "range":1.20, "maximum": 1 },
|
||||
{ "id": "F4", "grp":"fx", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":0.28, "range":1.40, "maximum": 1 }
|
||||
]
|
||||
}
|
||||
@@ -1,52 +1,12 @@
|
||||
{
|
||||
"Fuel Tank": [
|
||||
{
|
||||
"id": "f1",
|
||||
"grp": "ft",
|
||||
"class": 1,
|
||||
"rating": "C",
|
||||
"cost": 1000,
|
||||
"capacity": 2
|
||||
},
|
||||
{
|
||||
"id": "f2",
|
||||
"grp": "ft",
|
||||
"class": 2,
|
||||
"rating": "C",
|
||||
"cost": 3750,
|
||||
"capacity": 4
|
||||
},
|
||||
{
|
||||
"id": "f3",
|
||||
"grp": "ft",
|
||||
"class": 3,
|
||||
"rating": "C",
|
||||
"cost": 7063,
|
||||
"capacity": 8
|
||||
},
|
||||
{
|
||||
"id": "f4",
|
||||
"grp": "ft",
|
||||
"class": 4,
|
||||
"rating": "C",
|
||||
"cost": 24734,
|
||||
"capacity": 16
|
||||
},
|
||||
{
|
||||
"id": "f5",
|
||||
"grp": "ft",
|
||||
"class": 5,
|
||||
"rating": "C",
|
||||
"cost": 97754,
|
||||
"capacity": 32
|
||||
},
|
||||
{
|
||||
"id": "f6",
|
||||
"grp": "ft",
|
||||
"class": 6,
|
||||
"rating": "C",
|
||||
"cost": 341577,
|
||||
"capacity": 64
|
||||
}
|
||||
{ "id": "f1", "grp": "ft", "class": 1, "rating": "C", "cost": 1000, "capacity": 2 },
|
||||
{ "id": "f2", "grp": "ft", "class": 2, "rating": "C", "cost": 3750, "capacity": 4 },
|
||||
{ "id": "f3", "grp": "ft", "class": 3, "rating": "C", "cost": 7063, "capacity": 8 },
|
||||
{ "id": "f4", "grp": "ft", "class": 4, "rating": "C", "cost": 24734, "capacity": 16 },
|
||||
{ "id": "f5", "grp": "ft", "class": 5, "rating": "C", "cost": 97754, "capacity": 32 },
|
||||
{ "id": "f6", "grp": "ft", "class": 6, "rating": "C", "cost": 341577, "capacity": 64 },
|
||||
{ "id": "f7", "grp": "ft", "class": 7, "rating": "C", "cost": 1780900, "capacity": 128 },
|
||||
{ "id": "f8", "grp": "ft", "class": 8, "rating": "C", "cost": 5428400, "capacity": 256 }
|
||||
]
|
||||
}
|
||||
@@ -1,27 +1,27 @@
|
||||
{
|
||||
"Prospector Limpet Ctrl": [
|
||||
{ "id": "Pf", "grp":"pc", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":-0.55, "range": 5.10, "maximum": 8 },
|
||||
{ "id": "Pg", "grp":"pc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":-0.41, "range": 6.80, "maximum": 8 },
|
||||
{ "id": "Ph", "grp":"pc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":-0.69, "range": 8.50, "maximum": 8 },
|
||||
{ "id": "Pi", "grp":"pc", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":-0.97, "range":10.20, "maximum": 8 },
|
||||
{ "id": "Pj", "grp":"pc", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":-0.83, "range":11.90, "maximum": 8 },
|
||||
{ "id": "Pf", "grp":"pc", "class":7, "rating":"E", "cost": 437400, "mass": 80.0, "power":0.55, "range": 5.10, "maximum": 8 },
|
||||
{ "id": "Pg", "grp":"pc", "class":7, "rating":"D", "cost": 874800, "mass": 32.0, "power":0.41, "range": 6.80, "maximum": 8 },
|
||||
{ "id": "Ph", "grp":"pc", "class":7, "rating":"C", "cost":1749600, "mass": 80.0, "power":0.69, "range": 8.50, "maximum": 8 },
|
||||
{ "id": "Pi", "grp":"pc", "class":7, "rating":"B", "cost":3499200, "mass":128.0, "power":0.97, "range":10.20, "maximum": 8 },
|
||||
{ "id": "Pj", "grp":"pc", "class":7, "rating":"A", "cost":6998400, "mass": 80.0, "power":0.83, "range":11.90, "maximum": 8 },
|
||||
|
||||
{ "id": "Pa", "grp":"pc", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":-0.40, "range": 3.90, "maximum": 4 },
|
||||
{ "id": "Pb", "grp":"pc", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":-0.30, "range": 5.20, "maximum": 4 },
|
||||
{ "id": "Pc", "grp":"pc", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":-0.50, "range": 6.50, "maximum": 4 },
|
||||
{ "id": "Pd", "grp":"pc", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":-0.97, "range": 7.80, "maximum": 4 },
|
||||
{ "id": "Pe", "grp":"pc", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":-0.60, "range": 9.10, "maximum": 4 },
|
||||
{ "id": "Pa", "grp":"pc", "class":5, "rating":"E", "cost": 48600, "mass": 20.0, "power":0.40, "range": 3.90, "maximum": 4 },
|
||||
{ "id": "Pb", "grp":"pc", "class":5, "rating":"D", "cost": 97200, "mass": 8.0, "power":0.30, "range": 5.20, "maximum": 4 },
|
||||
{ "id": "Pc", "grp":"pc", "class":5, "rating":"C", "cost": 194400, "mass": 20.0, "power":0.50, "range": 6.50, "maximum": 4 },
|
||||
{ "id": "Pd", "grp":"pc", "class":5, "rating":"B", "cost": 388800, "mass": 32.0, "power":0.97, "range": 7.80, "maximum": 4 },
|
||||
{ "id": "Pe", "grp":"pc", "class":5, "rating":"A", "cost": 777600, "mass": 20.0, "power":0.60, "range": 9.10, "maximum": 4 },
|
||||
|
||||
{ "id": "P5", "grp":"pc", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":-0.27, "range": 3.30, "maximum": 2 },
|
||||
{ "id": "P6", "grp":"pc", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":-0.20, "range": 4.40, "maximum": 2 },
|
||||
{ "id": "P7", "grp":"pc", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":-0.34, "range": 5.50, "maximum": 2 },
|
||||
{ "id": "P8", "grp":"pc", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":-0.48, "range": 6.60, "maximum": 2 },
|
||||
{ "id": "P9", "grp":"pc", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":-0.41, "range": 7.70, "maximum": 2 },
|
||||
{ "id": "P5", "grp":"pc", "class":3, "rating":"E", "cost": 5400, "mass": 5.0, "power":0.27, "range": 3.30, "maximum": 2 },
|
||||
{ "id": "P6", "grp":"pc", "class":3, "rating":"D", "cost": 10800, "mass": 2.0, "power":0.20, "range": 4.40, "maximum": 2 },
|
||||
{ "id": "P7", "grp":"pc", "class":3, "rating":"C", "cost": 21600, "mass": 5.0, "power":0.34, "range": 5.50, "maximum": 2 },
|
||||
{ "id": "P8", "grp":"pc", "class":3, "rating":"B", "cost": 43200, "mass": 8.0, "power":0.48, "range": 6.60, "maximum": 2 },
|
||||
{ "id": "P9", "grp":"pc", "class":3, "rating":"A", "cost": 86400, "mass": 5.0, "power":0.41, "range": 7.70, "maximum": 2 },
|
||||
|
||||
{ "id": "P0", "grp":"pc", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":-0.18, "range": 3.00, "maximum": 1 },
|
||||
{ "id": "P1", "grp":"pc", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":-0.14, "range": 4.00, "maximum": 1 },
|
||||
{ "id": "P2", "grp":"pc", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":-0.23, "range": 5.00, "maximum": 1 },
|
||||
{ "id": "P3", "grp":"pc", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":-0.32, "range": 6.00, "maximum": 1 },
|
||||
{ "id": "P4", "grp":"pc", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":-0.28, "range": 7.00, "maximum": 1 }
|
||||
{ "id": "P0", "grp":"pc", "class":1, "rating":"E", "cost": 600, "mass": 1.3, "power":0.18, "range": 3.00, "maximum": 1 },
|
||||
{ "id": "P1", "grp":"pc", "class":1, "rating":"D", "cost": 1200, "mass": 0.5, "power":0.14, "range": 4.00, "maximum": 1 },
|
||||
{ "id": "P2", "grp":"pc", "class":1, "rating":"C", "cost": 2400, "mass": 1.3, "power":0.23, "range": 5.00, "maximum": 1 },
|
||||
{ "id": "P3", "grp":"pc", "class":1, "rating":"B", "cost": 4800, "mass": 2.0, "power":0.32, "range": 6.00, "maximum": 1 },
|
||||
{ "id": "P4", "grp":"pc", "class":1, "rating":"A", "cost": 9600, "mass": 1.3, "power":0.28, "range": 7.00, "maximum": 1 }
|
||||
]
|
||||
}
|
||||
@@ -140,7 +140,7 @@ gulp.task('generateIndexHTML', function(done) {
|
||||
gulp.src('app/index.html')
|
||||
.pipe(template({
|
||||
version: pkg.version,
|
||||
date : (new Date()).toLocaleDateString(),
|
||||
date : new Date().toISOString().slice(0, 10),
|
||||
uaTracking: process.env.CORIOLIS_UA_TRACKING || false,
|
||||
svgContent: svgIconsContent,
|
||||
gapiKey: process.env.CORIOLIS_GAPI_KEY
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "coriolis_shipyard",
|
||||
"version": "0.14.1",
|
||||
"version": "1.0.3",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/cmmcleod/coriolis"
|
||||
|
||||
50
test/tests/test-controller-outfit.js
Normal file
50
test/tests/test-controller-outfit.js
Normal file
@@ -0,0 +1,50 @@
|
||||
describe("Outfit Controller", function() {
|
||||
beforeEach(module('app'));
|
||||
|
||||
var outfitController, scope;
|
||||
|
||||
var eventStub = {
|
||||
preventDefault: function(){ },
|
||||
stopPropagation: function(){ }
|
||||
};
|
||||
|
||||
beforeEach(inject(function(_$rootScope_, $controller) {
|
||||
$rootScope = _$rootScope_;
|
||||
$rootScope.discounts = { ship: 1, components: 1};
|
||||
$stateParams = { shipId: 'anaconda'};
|
||||
scope = $rootScope.$new();
|
||||
outfitController = $controller('OutfitController', { $rootScope: $rootScope, $scope: scope, $stateParams: $stateParams });
|
||||
}));
|
||||
|
||||
describe("Retrofitting Costs", function() {
|
||||
|
||||
it("are empty by default", function() {
|
||||
expect(scope.retrofitTotal).toEqual(0);
|
||||
expect(scope.retrofitList.length).toEqual(0);
|
||||
});
|
||||
|
||||
it("updates on bulkheads change", function() {
|
||||
scope.select('b', scope.ship.bulkheads, eventStub, "1"); // Use Reinforced Alloy Bulkheads
|
||||
expect(scope.retrofitTotal).toEqual(58787780);
|
||||
expect(scope.retrofitList.length).toEqual(1);
|
||||
scope.select('b', scope.ship.bulkheads, eventStub, "0"); // Use Reinforced Alloy Bulkheads
|
||||
expect(scope.retrofitTotal).toEqual(0);
|
||||
expect(scope.retrofitList.length).toEqual(0);
|
||||
});
|
||||
|
||||
it("updates on component change", function() {
|
||||
scope.select('h', scope.ship.hardpoints[0], eventStub, "0u"); // 3C/F Beam Laser
|
||||
expect(scope.retrofitTotal).toEqual(1177600);
|
||||
expect(scope.retrofitList.length).toEqual(1);
|
||||
scope.select('h', scope.ship.hardpoints[6], eventStub, "empty"); // Remove default pulse laser
|
||||
scope.select('h', scope.ship.hardpoints[7], eventStub, "empty"); // Remove default pulse laser
|
||||
expect(scope.retrofitTotal).toEqual(1173200);
|
||||
expect(scope.retrofitList.length).toEqual(3);
|
||||
scope.select('i', scope.ship.internal[3], eventStub, "11"); // Use 6A Auto field maintenance unit
|
||||
expect(scope.retrofitTotal).toEqual(16478701);
|
||||
expect(scope.retrofitList.length).toEqual(4);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user