Compare commits

...

35 Commits

Author SHA1 Message Date
Alex Williams
fa9fe1c571 Merge pull request #822 from EDCD/develop
Develop
2025-06-28 14:32:28 +01:00
Alex Williams
1dfd3cdc23 Merge pull request #821 from Brighter-Applications/develop
Develop
2025-06-28 14:31:03 +01:00
Alex Williams
a3d7c8b7a7 Features/add corsair (#94)
* Corsair Added Announcement

* Adding FDName Corsair Translation to imperial_corsair Coriolis internal name
2025-06-28 14:27:55 +01:00
Alex Williams
60a05d93c8 Features/add_corsair (#93)
* Corsair Added Announcement

* Adding FDName Corsair Translation to imperial_corsair Coriolis internal name
2025-04-10 12:33:51 +01:00
Alex Williams
7f3056560d Merge pull request #88 from Brighter-Applications/features/add_cobra5
Adding coriolis to fdname conversion
2024-12-13 20:57:51 +00:00
Alex Williams
43718e15cf Adding coriolis to fdname conversion 2024-12-13 20:46:16 +00:00
Alex Williams
8a1ad353e2 Merge pull request #85 from Brighter-Applications/features/add_cobra5
Adding Cobra Mk V
2024-12-13 19:55:37 +00:00
Alex Williams
fbe29d8087 Adding Cobra Mk V 2024-12-13 19:46:46 +00:00
Alex Williams
8583c6a811 Merge pull request #803 from Brighter-Applications/develop
Develop
2024-12-10 23:34:10 +00:00
Alex Williams
620a82faf2 Merge pull request #82 from Brighter-Applications/issues/624_Fix_thermal_values
Fix thermal and efficiency values for blueprint effects. Also fixing …
2024-12-10 23:33:03 +00:00
Alex Williams
8296562640 Fix thermal and efficiency values for blueprint effects. Also fixing jump range calc and display. 2024-12-10 23:23:12 +00:00
Alex Williams
505c6809a1 Merge pull request #800 from Brighter-Applications/develop
Develop
2024-11-25 00:25:31 +00:00
Alex Williams
35a24a55e8 Merge pull request #79 from Brighter-Applications/issues/699_Add_Charge_Rate_To_Rails
Adding 'charge' time into calculation of RoF, as RailGuns have a 'cha…
2024-11-25 00:02:07 +00:00
Alex Williams
b365faed0a Adding 'charge' time into calculation of RoF, as RailGuns have a 'charge' time as well as a reload time. 2024-11-24 23:53:15 +00:00
Alex Williams
060b98cc89 Merge pull request #76 from Brighter-Applications/issues/597_Warn_Users_2083_URL_Length
Checks to see if the URL is over 2083 characters and if it is, presen…
2024-11-24 21:40:56 +00:00
Alex Williams
6a1eae8e9e Checks to see if the URL is over 2083 characters and if it is, presents this as the most likely error with an import. 2024-11-24 21:35:33 +00:00
Alex Williams
98126267e7 Merge pull request #73 from Brighter-Applications/features/Update_About_Page
Updating the about page, removing erroneous link to edshipyard, addin…
2024-11-24 20:24:56 +00:00
Alex Williams
22b73b9b0c Updating the about page, removing erroneous link to edshipyard, adding current info, etc. 2024-11-24 20:23:02 +00:00
Alex Williams
f769a0d40d Merge pull request #70 from Brighter-Applications/features/Add_Specials_Tooltips_Descriptions
Adding functionality to pull the 'description' field from specials an…
2024-11-24 19:04:38 +00:00
Alex Williams
4ae2140178 Adding functionality to pull the 'description' field from specials and show a tooltip, describing what the special does. 2024-11-24 18:51:22 +00:00
Alex Williams
00f098ca29 Merge branch 'master' into master 2024-11-23 21:58:04 +00:00
Alex Williams
ed6cc49ae8 Merge pull request #799 from EDCD/develop
Develop
2024-11-23 21:52:48 +00:00
Alex Williams
070beade85 Merge pull request #798 from Brighter-Applications/develop
Develop
2024-11-23 21:49:46 +00:00
Alex Williams
9705a49c96 Merge pull request #66 from Brighter-Applications/issues/796_Fix_Guardian_Module_Power_Priority
Fixes the issue where Guardian Modules can be re-prioritised in the p…
2024-11-23 21:44:49 +00:00
Alex Williams
d575d97837 Fixes the issue where Guardian Modules can be re-prioritised in the power section, but cannot in game. 2024-11-23 21:40:19 +00:00
Alex Williams
dd3aa5fd7b Merge pull request #63 from Brighter-Applications/issues/776_Fix_Overcharged_Blueprint
Fixes Blueprint selection issue caused by fixing overcharged_blueprint.
2024-11-23 21:06:01 +00:00
Alex Williams
bb658e8b59 Fixes Blueprint selection issue caused by fixing overcharged_blueprint. 2024-11-23 20:57:24 +00:00
Alex Williams
a40bd5344e Merge pull request #60 from Brighter-Applications/issues/776_Fix_Overcharged_Blueprint
Issues/776 fix overcharged blueprint
2024-11-23 20:48:50 +00:00
Alex Williams
16b341d0d0 Removing console.log events that are no longer needed 2024-11-23 20:43:27 +00:00
Alex Williams
e04a99222d These changes fix the issue where MC's with the Weapon_Overcharged blueprint, don't properly show the blueprint because of the Laser Weapon_Overcharged blueprint being a conflict. 2024-11-23 20:35:47 +00:00
Alex Williams
c78bbd1db4 Merge pull request #55 from Brighter-Applications/issues/215_translation_fixes
Issues/215 translation fixes
2024-11-08 22:45:07 +00:00
Alex Williams
f48d1bae20 Fixing English translation for minmass and maxmass 2024-11-08 22:29:24 +00:00
Alex Williams
112463a9e8 Fixing translation issues in StandardSlot.jsx 2024-11-08 22:19:28 +00:00
Alex Williams
f22b7ff577 Fixing old errors 2024-10-31 21:43:29 +00:00
Alex Williams
fde4bba714 Create FUNDING.yml 2024-10-31 21:00:05 +00:00
17 changed files with 190 additions and 61 deletions

1
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1 @@
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [Brighter-Applications]

View File

@@ -69,7 +69,7 @@ export default class Coriolis extends React.Component {
noTouch: !('ontouchstart' in window || navigator.msMaxTouchPoints || navigator.maxTouchPoints), noTouch: !('ontouchstart' in window || navigator.msMaxTouchPoints || navigator.maxTouchPoints),
page: null, page: null,
// Announcements must have an expiry date in format "YYYY-MM-DDTHH:MM:SSZ" // Announcements must have an expiry date in format "YYYY-MM-DDTHH:MM:SSZ"
announcements: [{expiry: "2024-11-30T00:00:00Z", text: "Mandalay added"}, {expiry: "2024-12-06T00:00:00Z", text: "Concord Cannon added"}, {expiry: "2024-12-08T00:00:00Z", text: "Boost Interval Feature added"}], announcements: [{expiry: "2025-04-10T00:00:00Z", text: "Corsair added"}],
language: getLanguage(Persist.getLangCode()), language: getLanguage(Persist.getLangCode()),
route: {}, route: {},
sizeRatio: Persist.getSizeRatio() sizeRatio: Persist.getSizeRatio()
@@ -123,7 +123,15 @@ export default class Coriolis extends React.Component {
this._showModal(<ModalImport importString={data}/>); this._showModal(<ModalImport importString={data}/>);
} }
} catch (err) { } catch (err) {
this._onError('Failed to import ship', r.path, 0, 0, err); const fullUrl = window.location.href;
if (fullUrl.length >= 2083) {
err = 'URL Length = ' + fullUrl.length;
this._onError('Failed to import ship - Potential URL Length issue', r.path, 0, 0, err);
}
else {
this._onError('Failed to import ship - Unknown Reason', r.path, 0, 0, err);
}
} }
} }

View File

@@ -57,7 +57,7 @@ export default class JumpRange extends TranslatedComponent {
const fuel = this.state.fuelLevel * ship.fuelCapacity; const fuel = this.state.fuelLevel * ship.fuelCapacity;
// Obtain the jump range // Obtain the jump range
return Calc.jumpRange(ship.unladenMass + fuel + cargo, fsd, fuel, ship); return Calc.jumpRange(ship.unladenMass + cargo, fsd, fuel, ship);
} }
/** /**

View File

@@ -57,6 +57,7 @@ export default class ModificationsMenu extends TranslatedComponent {
this.modValDidChange = false; // used to determine if component update was caused by change in modification value. this.modValDidChange = false; // used to determine if component update was caused by change in modification value.
this._handleModChange = this._handleModChange.bind(this); this._handleModChange = this._handleModChange.bind(this);
// console.log(props.m.blueprint)
this.state = { this.state = {
blueprintMenuOpened: !(props.m.blueprint && props.m.blueprint.name), blueprintMenuOpened: !(props.m.blueprint && props.m.blueprint.name),
specialMenuOpened: false specialMenuOpened: false
@@ -421,15 +422,31 @@ export default class ModificationsMenu extends TranslatedComponent {
let haveBlueprint = false; let haveBlueprint = false;
let blueprintTt; let blueprintTt;
let blueprintCv; let blueprintCv;
let bprintSearchName;
// If the fdname is Weapon_Overcharged, we need to check if it's an MC
if (m.blueprint && m.blueprint.fdname) {
// Set the bprintSearchName value to the fdname of the blueprint for this module
bprintSearchName = m.blueprint.fdname;
if (m.blueprint.fdname === 'Weapon_Overcharged') {
// If the module is a MultiCannon, we need to fix the blueprint search name, else it will find the Laser Weapon_Overcharged Blueprint and not the MC Weapon_Overcharged Blueprint
if (m.symbol.match(/MultiCannon/i)) {
// console.log(Modifications.modules[m.grp].blueprints['MC_Overcharged']);
// console.log(m.blueprint.fdname);
bprintSearchName = 'MC_Overcharged';
}
}
}
// TODO: Fix this to actually find the correct blueprint. // TODO: Fix this to actually find the correct blueprint.
if (!m.blueprint || !m.blueprint.name || !m.blueprint.fdname || !Modifications.modules[m.grp].blueprints || !Modifications.modules[m.grp].blueprints[m.blueprint.fdname]) { if (!m.blueprint || !m.blueprint.name || !m.blueprint.fdname || !Modifications.modules[m.grp].blueprints || !Modifications.modules[m.grp].blueprints[bprintSearchName]) {
this.props.ship.clearModuleBlueprint(m); this.props.ship.clearModuleBlueprint(m);
this.props.ship.clearModuleSpecial(m); this.props.ship.clearModuleSpecial(m);
} }
if (m.blueprint && m.blueprint.name && Modifications.modules[m.grp].blueprints[m.blueprint.fdname].grades[m.blueprint.grade]) { if (m.blueprint && m.blueprint.name && Modifications.modules[m.grp].blueprints[bprintSearchName].grades[m.blueprint.grade]) {
blueprintLabel = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade; blueprintLabel = translate(m.blueprint.name) + ' ' + translate('grade') + ' ' + m.blueprint.grade;
haveBlueprint = true; haveBlueprint = true;
blueprintTt = blueprintTooltip(translate, m.blueprint.grades[m.blueprint.grade], Modifications.modules[m.grp].blueprints[m.blueprint.fdname].grades[m.blueprint.grade].engineers, m.grp); // console.log(haveBlueprint);
blueprintTt = blueprintTooltip(translate, m.blueprint.grades[m.blueprint.grade], Modifications.modules[m.grp].blueprints[bprintSearchName].grades[m.blueprint.grade].engineers, m.grp);
blueprintCv = getPercent(m); blueprintCv = getPercent(m);
} }

View File

@@ -125,15 +125,31 @@ export default class PowerManagement extends TranslatedComponent {
retractedElem = <td className='ptr disabled upp' colSpan='2' onClick={toggleEnabled}>{translate('disabled')}</td>; retractedElem = <td className='ptr disabled upp' colSpan='2' onClick={toggleEnabled}>{translate('disabled')}</td>;
} }
// If this is a Guardian Shield Reinforcement Package or Guardian Hull Reinforcement Package, or Guardian Module Reinforcement Package, it cannot change priority
let priorityField;
if (m.symbol) {
if (m.symbol.match(/GuardianShield/i) || m.symbol.match(/GuardianHull/i) || m.symbol.match(/GuardianModule/i)) {
priorityField = <td>1</td>;
} else {
priorityField = <td>
<span className='flip ptr btn' onClick={this._priority.bind(this, slot, -1)}>&#9658;</span>
{' ' + (slot.priority + 1) + ' '}
<span className='ptr btn' onClick={this._priority.bind(this, slot, 1)}>&#9658;</span>
</td>;
}
}
else {
priorityField = <td>
<span className='flip ptr btn' onClick={this._priority.bind(this, slot, -1)}>&#9658;</span>
{' ' + (slot.priority + 1) + ' '}
<span className='ptr btn' onClick={this._priority.bind(this, slot, 1)}>&#9658;</span>
</td>;
}
powerRows.push(<tr key={i} className={cn('highlight', { disabled: !slot.enabled })}> powerRows.push(<tr key={i} className={cn('highlight', { disabled: !slot.enabled })}>
<td className='ptr' style={{ width: '1em' }} onClick={toggleEnabled}>{m.class + m.rating}</td> <td className='ptr' style={{ width: '1em' }} onClick={toggleEnabled}>{m.class + m.rating}</td>
<td className='ptr le shorten cap' onClick={toggleEnabled}>{slotName(translate, slot)}</td> <td className='ptr le shorten cap' onClick={toggleEnabled}>{slotName(translate, slot)}</td>
<td className='ptr' onClick={toggleEnabled}><u>{translate(slot.type)}</u></td> <td className='ptr' onClick={toggleEnabled}><u>{translate(slot.type)}</u></td>
<td> {priorityField}
<span className='flip ptr btn' onClick={this._priority.bind(this, slot, -1)}>&#9658;</span>
{' ' + (slot.priority + 1) + ' '}
<span className='ptr btn' onClick={this._priority.bind(this, slot, 1)}>&#9658;</span>
</td>
<td className='ri ptr' style={{ width: '3.25em' }} onClick={toggleEnabled}>{pwr(m.getPowerUsage())}</td> <td className='ri ptr' style={{ width: '3.25em' }} onClick={toggleEnabled}>{pwr(m.getPowerUsage())}</td>
<td className='ri ptr' style={{ width: '3em' }} onClick={toggleEnabled}><u>{pct(m.getPowerUsage() / ship.powerAvailable)}</u></td> <td className='ri ptr' style={{ width: '3em' }} onClick={toggleEnabled}><u>{pct(m.getPowerUsage() / ship.powerAvailable)}</u></td>
{retractedElem} {retractedElem}

View File

@@ -109,11 +109,11 @@ export default class ShipSummaryTable extends TranslatedComponent {
<td onMouseEnter={termtip.bind(null, boostTooltip, { cap: 0 })} onMouseLeave={hide}>{ canBoost ? <span>{int(ship.calcSpeed(4, ship.fuelCapacity, 0, true))}{u['m/s']}</span> : <span className='warning'>0 <Warning/></span> }</td> <td onMouseEnter={termtip.bind(null, boostTooltip, { cap: 0 })} onMouseLeave={hide}>{ canBoost ? <span>{int(ship.calcSpeed(4, ship.fuelCapacity, 0, true))}{u['m/s']}</span> : <span className='warning'>0 <Warning/></span> }</td>
<td>{distBoost !== 'No Boost' ? formats.time(distBoost) : 'No Boost'}</td> <td>{distBoost !== 'No Boost' ? formats.time(distBoost) : 'No Boost'}</td>
<td>{ship.boostInt && ship.boostInt !== 'undefined' ? formats.time(ship.boostInt) : 0 }</td> <td>{ship.boostInt && ship.boostInt !== 'undefined' ? formats.time(ship.boostInt) : 0 }</td>
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_MAX_SINGLE_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{ f2(Calc.jumpRange(ship.unladenMass + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump(), ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td> <td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_MAX_SINGLE_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{ f2(Calc.jumpRange(ship.unladenMass - ship.fuelCapacity + ship.standard[2].m.getMaxFuelPerJump(), ship.standard[2].m, ship.standard[2].m.getMaxFuelPerJump(), ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td>
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_UNLADEN_SINGLE_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td> <td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_UNLADEN_SINGLE_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.jumpRange(ship.unladenMass, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td>
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_LADEN_SINGLE_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.jumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td> <td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_LADEN_SINGLE_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.jumpRange(ship.unladenMass + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td>
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_UNLADEN_TOTAL_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td> <td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_UNLADEN_TOTAL_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.totalJumpRange(ship.unladenMass, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td>
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_LADEN_TOTAL_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.totalJumpRange(ship.unladenMass + ship.fuelCapacity + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td> <td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_LADEN_TOTAL_JUMP', { cap: 0 })} onMouseLeave={hide}>{ canJump ? <span>{f2(Calc.totalJumpRange(ship.unladenMass + ship.cargoCapacity, ship.standard[2].m, ship.fuelCapacity, ship))}{u.LY}</span> : <span className='warning'>0 <Warning/></span> }</td>
<td className={sgClassNames} onMouseEnter={termtip.bind(null, sgTooltip, { cap: 0 })} onMouseLeave={hide}>{int(ship.shield)}{u.MJ}</td> <td className={sgClassNames} onMouseEnter={termtip.bind(null, sgTooltip, { cap: 0 })} onMouseLeave={hide}>{int(ship.shield)}{u.MJ}</td>
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_INTEGRITY', { cap: 0 })} onMouseLeave={hide}>{int(ship.armour)}</td> <td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_INTEGRITY', { cap: 0 })} onMouseLeave={hide}>{int(ship.armour)}</td>
<td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_DPS', { cap: 0 })} onMouseLeave={hide}>{f1(ship.totalDps)}</td> <td onMouseEnter={termtip.bind(null, 'TT_SUMMARY_DPS', { cap: 0 })} onMouseLeave={hide}>{f1(ship.totalDps)}</td>

View File

@@ -133,10 +133,10 @@ export default class StandardSlot extends TranslatedComponent {
<div className={'r'}>{formats.round(mass)}{units.T}</div> <div className={'r'}>{formats.round(mass)}{units.T}</div>
<div/> <div/>
<div className={'cb'}> <div className={'cb'}>
{ m.getMinMass() ? <div className='l'>{translate('minimum mass')}: {formats.int(m.getMinMass())}{units.T}</div> : null } { m.getMinMass() ? <div className='l'>{translate('minmass')}: {formats.int(m.getMinMass())}{units.T}</div> : null }
{ m.getOptMass() ? <div className='l'>{translate('optimal mass')}: {formats.int(m.getOptMass())}{units.T}</div> : null } { m.getOptMass() ? <div className='l'>{translate('optmass')}: {formats.int(m.getOptMass())}{units.T}</div> : null }
{ m.getMaxMass() ? <div className='l'>{translate('max mass')}: {formats.int(m.getMaxMass())}{units.T}</div> : null } { m.getMaxMass() ? <div className='l'>{translate('maxmass')}: {formats.int(m.getMaxMass())}{units.T}</div> : null }
{ m.getOptMul() ? <div className='l'>{translate('optimal multiplier')}: {formats.rPct(m.getOptMul())}</div> : null } { m.getOptMul() ? <div className='l'>{translate('optmul')}: {formats.rPct(m.getOptMul())}</div> : null }
{ m.getRange() ? <div className='l'>{translate('range', m.grp)}: {formats.f2(m.getRange())}{units.km}</div> : null } { m.getRange() ? <div className='l'>{translate('range', m.grp)}: {formats.f2(m.getRange())}{units.km}</div> : null }
{ m.time ? <div className='l'>{translate('time')}: {formats.time(m.time)}</div> : null } { m.time ? <div className='l'>{translate('time')}: {formats.time(m.time)}</div> : null }
{ m.getThermalEfficiency() ? <div className='l'>{translate('efficiency')}: {formats.f2(m.getThermalEfficiency())}</div> : null } { m.getThermalEfficiency() ? <div className='l'>{translate('efficiency')}: {formats.f2(m.getThermalEfficiency())}</div> : null }

View File

@@ -14,3 +14,4 @@ export const formats = {
}; };
export { default as terms } from './de.json'; export { default as terms } from './de.json';

View File

@@ -75,8 +75,8 @@
"TT_SUMMARY_SHIELDS_NONFUNCTIONAL": "No shield generator or shield generator powered off", "TT_SUMMARY_SHIELDS_NONFUNCTIONAL": "No shield generator or shield generator powered off",
"TT_SUMMARY_INTEGRITY": "Ship integrity, including bulkheads and hull reinforcement packages", "TT_SUMMARY_INTEGRITY": "Ship integrity, including bulkheads and hull reinforcement packages",
"TT_SUMMARY_HULL_MASS": "Mass of the hull prior to any modules being installed", "TT_SUMMARY_HULL_MASS": "Mass of the hull prior to any modules being installed",
"TT_SUMMARY_UNLADEN_MASS": "Mass of the hull and modules prior to any fuel or cargo", "TT_SUMMARY_UNLADEN_MASS": "Mass of the hull and modules prior to any cargo or passengers",
"TT_SUMMARY_LADEN_MASS": "Mass of the hull and modules with full fuel and cargo", "TT_SUMMARY_LADEN_MASS": "Mass of the hull and modules with full fuel, cargo, passengers, etc.",
"TT_SUMMARY_DPS": "Damage per second with all weapons firing", "TT_SUMMARY_DPS": "Damage per second with all weapons firing",
"TT_SUMMARY_EPS": "WEP capacitor consumed per second with all weapons firing", "TT_SUMMARY_EPS": "WEP capacitor consumed per second with all weapons firing",
"TT_SUMMARY_TTD": "Time to drain WEP capacitor with all weapons firing and 4 pips to WEP", "TT_SUMMARY_TTD": "Time to drain WEP capacitor with all weapons firing and 4 pips to WEP",
@@ -276,8 +276,10 @@
"thermres": "Thermal resistance", "thermres": "Thermal resistance",
"wepcap": "Weapons capacity", "wepcap": "Weapons capacity",
"weprate": "Weapons recharge rate", "weprate": "Weapons recharge rate",
"minmass": "Minimum mass",
"minmass_sg": "Minimum hull mass", "minmass_sg": "Minimum hull mass",
"optmass_sg": "Optimal hull mass", "optmass_sg": "Optimal hull mass",
"maxmass": "Maximum mass",
"maxmass_sg": "Maximum hull mass", "maxmass_sg": "Maximum hull mass",
"minmul_sg": "Minimum strength", "minmul_sg": "Minimum strength",
"optmul_sg": "Optimal strength", "optmul_sg": "Optimal strength",

View File

@@ -33,24 +33,27 @@ export default class AboutPage extends Page {
</h1> </h1>
<p> <p>
This is a clone of the Coriolis project, whose original author is This is now the only active version of the Coriolis project. The original author has handed over the maintenance of the project to the {' '}
currently unable to maintain it. This clone is maintained by the{' '}
<a href="http://edcd.github.io/">EDCD community</a>. <a href="http://edcd.github.io/">EDCD community</a>.
</p> </p>
<h3>Expectations</h3>
<p> <p>
To recover your builds, go to{' '} Although every attempt is made to update the data as soon as possible, following the release of new modules and ships, there may be a delay, of up-to a few days, before the data is available. Wherever possible, the current maintainers aim to keep this delay to a minimum. Please be aware that the project maintainers are volunteers and have real lives to attend to, so please be patient. If you would like to help with the maintenance of the project, please see the link to the EDCD Discord Server below, where you can get involved.
<a href="https://coriolis.io/" target="_blank">
https://coriolis.io/
</a>
, backup your builds (Settings / Backup), copy the text, return here
and import (Settings / Import).
</p> </p>
<p> <p>
The Coriolis project was inspired by{' '} There are, some missing modules from the time where the project was essentially not being maintained. These modules are gradually being added to the Coriolis database as and when the maintainers have the time to do so.
<a href="http://www.edshipyard.com/" target="_blank"> </p>
E:D Shipyard <p>
</a>{' '} Please check the {' '} <a href="https://github.com/EDCD/coriolis/issues/" target="_blank" >Github Issues List</a> for any specific modules you cannot find and see if there is an open request for them. If not, please feel free to open a new issue, however, please note that there is an existing issue open for the addition of pre-engineered modules, so please do not open a new issue for these.
and, of course,{' '} </p>
<h3>Donations</h3>
<p>
If you would like to donate to the project, in order to help with the costs of hosting and maintainence, please see the link to the {' '}
<a href="https://github.com/Brighter-Applications/coriolis" target="_blank">Current Maintainers version of the Git Repository</a> and use the 'Sponsor' button at the top of the page.
</p>
<h3>History</h3>
<p>
The Coriolis project was inspired by 'E:D Shipyard' (Now Defunct) and, of course,{' '}
<a href="http://www.elitedangerous.com" target="_blank"> <a href="http://www.elitedangerous.com" target="_blank">
Elite Dangerous Elite Dangerous
</a> </a>

View File

@@ -33,7 +33,7 @@ export default class ErrorDetails extends React.Component {
<div style={{ marginTop: '2em' }}> <div style={{ marginTop: '2em' }}>
<div><span className='warning'>Browser:</span> {window.navigator.userAgent}</div> <div><span className='warning'>Browser:</span> {window.navigator.userAgent}</div>
<div><span className='warning'>Path:</span> {this.context.route.canonicalPath}</div> <div><span className='warning'>Path:</span> {this.context.route.canonicalPath}</div>
<div><span className='warning'>Error:</span> {error.type || 'Unknown'}</div> <div><span className='warning'>Error:</span> {ed["error"] || 'Unknown'}</div>
<div className='warning'>Details:</div> <div className='warning'>Details:</div>
<div><pre>{typeof ed == 'object' ? Object.keys(ed).map((e) => `${e}: ${ed[e]}\n`) : ed}</pre></div> <div><pre>{typeof ed == 'object' ? Object.keys(ed).map((e) => `${e}: ${ed[e]}\n`) : ed}</pre></div>
</div> </div>
@@ -42,18 +42,67 @@ export default class ErrorDetails extends React.Component {
const importerror = ed && ed.scriptUrl && ed.scriptUrl.indexOf('/import') != -1; const importerror = ed && ed.scriptUrl && ed.scriptUrl.indexOf('/import') != -1;
return <div className='error'> if (ed['error'].match(/URL Length/i)) {
<h1>Jameson, we have a problem..</h1> return <div className='error'>
<h1><small>{error.message}</small></h1> <h1>Jameson, we have a problem..</h1>
Import Error handling has been improved, but still isn't perfect. <br/>MOST Import failures are a result of missing modules in Coriolis, <br />OR incorrect import strings generated by third party apps. If you're seeing this page, we may have failed to handle the errors in your import correctly. Please see the data output below, specifically the 'scriptUrl:' section if it's there and then if you feel confident enough, please check the github issues page linked below and see if there is a similar issue already logged. If not, please create a new issue with the data below. If you're not confident, please ask for help on the Coriolis Channel of the EDCD Discord server. <h1><small>{error.message}</small></h1>
It looks as though you've encountered a URL Length issue for your browser.
<br /><br />
This is a known issue with Internet Explorer and Edge, as well as Google Chrome, all of which only support 2083 characters and your URL is:
<br /><br />
{ed["error"]} characters.
<br /><br />
Please try using another browser first, before reporting an issue, such as Firefox which supports 65,536 characters or Safari, which supports 80,000 characters.
<br /><br />
Don't copy the URL from Explorer, Edge or Chrome, as they will have truncated it and the data string will be incorrect. You'll need to change your default browser settings, so that when you click the link, it opens in the browser you want to use.
<br /><br />
If you're already using Firefox, which supports up to 65,536 characters or Safari, which supports up to 80,000 characters, please see the data output below.
<br/><br />
<h3>Data Output</h3>
{content}
</div>;
}
else {
return <div className='error'>
<h1>Jameson, we have a problem..</h1>
<h1><small>{error.message}</small></h1>
Import Error handling has been improved, but still isn't perfect.
<br /><br />
If you're seeing this page, we may have failed to handle the errors in your import correctly. Please check the common import failures list and then the data output below, specifically the 'scriptUrl:' section if it's there and then if you feel confident enough, please check the github issues page linked below and see if there is a similar issue already logged. If not, please create a new issue with the data below. If you're not confident, please ask for help on the Coriolis Channel of the EDCD Discord server.
<br /><br />
<h3>Common Import Failures</h3>
<ul>
<li>
Previously, most failures were a result of missing modules in Coriolis, although this is rarer now since the import system was improved. If you're using a module in game and you know it isn't in Coriolis, this could be the problem, please check the data output section below.
</li>
<li>
Incorrect import strings generated by third party apps do still occur, please check the data output below and if the import was from something like EDMC, please check you're using the latest version.
</li>
<li>
You've hit a 'maximum URL Length' for your browser. This is a known issue with Internet Explorer and Edge, as well as Google Chrome, all of which only support 2083 characters. Please try using another browser first, before reporting an issue, such as Firefox which supports 65,536 characters or Safari, which supports 80,000 characters. Don't copy the URL from Explorer, Edge or Chrome, as they will have truncated it and the data string will be incorrect. You'll need to change your default browser settings, so that when you click the link, it opens in the browser you want to use.
</li>
<li>
{importerror ? <div>If you are attempting to import a ship from EDDI or EDMC and are seeing a 'Z_BUF_ERROR' it means that the URL has not been understood correctly by the browser. This is a common problem when using Microsoft Internet Explorer or Microsoft Edge, and you should use another browser instead.</div> : null }
</li>
</ul>
<br/> <br/>
<div>Please note that this site uses Google Analytics to track performance and usage. If you are blocking cookies, for example using Ghostery, please disable blocking for this site and try again.</div>
<br/> <br/>
<br/> <h3>Data Output</h3>
{importerror ? <div>If you are attempting to import a ship from EDDI or EDMC and are seeing a 'Z_BUF_ERROR' it means that the URL has not been provided correctly. This is a common problem when using Microsoft Internet Explorer or Microsoft Edge, and you should use another browser instead.</div> : null } {content}
<br/> </div>;
<div>Please note that this site uses Google Analytics to track performance and usage. If you are blocking cookies, for example using Ghostery, please disable blocking for this site and try again.</div> }
<br/>
{content}
</div>;
} }
} }

View File

@@ -927,8 +927,9 @@ export default class Module {
const burst = this.get('burst', modified) || 1; const burst = this.get('burst', modified) || 1;
const burstRoF = this.get('burstrof', modified) || 1; const burstRoF = this.get('burstrof', modified) || 1;
const intRoF = this.get('rof', modified); const intRoF = this.get('rof', modified);
const charge = this.get('charge', modified) || 0;
return burst / (((burst - 1) / burstRoF) + 1 / intRoF); return burst / (((burst - 1) / burstRoF) + 1 / intRoF + charge);
} }
/** /**

View File

@@ -1210,12 +1210,11 @@ export default class Ship {
.value(); .value();
// Update global stats // Update global stats
this.unladenMass = unladenMass; this.unladenMass = unladenMass + fuelCapacity;
this.cargoCapacity = cargoCapacity; this.cargoCapacity = cargoCapacity;
this.fuelCapacity = fuelCapacity; this.fuelCapacity = fuelCapacity;
this.passengerCapacity = passengerCapacity; this.passengerCapacity = passengerCapacity;
this.ladenMass = unladenMass + fuelCapacity + cargoCapacity; this.ladenMass = unladenMass + fuelCapacity + cargoCapacity;
return this; return this;
} }

View File

@@ -12,6 +12,7 @@ import { STATS_FORMATTING } from '../shipyard/StatsFormatting';
* @returns {Object} The react components * @returns {Object} The react components
*/ */
export function specialToolTip(translate, blueprint, grp, m, specialName) { export function specialToolTip(translate, blueprint, grp, m, specialName) {
const description = [];
const effects = []; const effects = [];
if (!blueprint || !blueprint.features) { if (!blueprint || !blueprint.features) {
return undefined; return undefined;
@@ -19,6 +20,15 @@ export function specialToolTip(translate, blueprint, grp, m, specialName) {
if (m) { if (m) {
// We also add in any benefits from specials that aren't covered above // We also add in any benefits from specials that aren't covered above
if (m.blueprint) { if (m.blueprint) {
if (specialName) {
if (Modifications.specials[specialName].description) {
description.push(
<div className={'success'} style={{ maxWidth: 350, padding: 5, marginBottom: 10 }}>
{Modifications.specials[specialName].description}
</div>
);
}
}
for (const feature in Modifications.modifierActions[specialName]) { for (const feature in Modifications.modifierActions[specialName]) {
// if (!blueprint.features[feature] && !m.mods.feature) { // if (!blueprint.features[feature] && !m.mods.feature) {
const featureDef = Modifications.modifications[feature]; const featureDef = Modifications.modifications[feature];
@@ -53,6 +63,7 @@ export function specialToolTip(translate, blueprint, grp, m, specialName) {
return ( return (
<div> <div>
{description}
<table width='100%'> <table width='100%'>
<tbody> <tbody>
{effects} {effects}
@@ -307,10 +318,22 @@ export function isChangeValueBeneficial(feature, value) {
* @returns {Object} The matching blueprint * @returns {Object} The matching blueprint
*/ */
export function getBlueprint(name, module) { export function getBlueprint(name, module) {
// Special case for multi-cannons. Conflicting 'Weapon_Overcharged' Blueprints exist due to FD's naming conventions. If this blueprint is for a multi-cannon, we need to use the correct blueprint.
if (name === 'weapon_overcharged') {
if (module.symbol.match(/MultiCannon/i)) {
name = 'mc_overcharged';
}
}
else if (name === 'Weapon_Overcharged') {
if (module.symbol.match(/MultiCannon/i)) {
name = 'MC_Overcharged';
}
}
// Start with a copy of the blueprint // Start with a copy of the blueprint
const findMod = val => Object.keys(Modifications.blueprints).find(elem => elem.toString().toLowerCase().search(val.toString().toLowerCase().replace(/(OutfittingFieldType_|persecond)/igm, '')) >= 0); const findMod = val => Object.keys(Modifications.blueprints).find(elem => elem.toString().toLowerCase().search(val.toString().toLowerCase().replace(/(OutfittingFieldType_|persecond)/igm, '')) >= 0);
const found = Modifications.blueprints[findMod(name)]; const found = Modifications.blueprints[findMod(name)];
if (!found || !found.fdname) { if (!found || !found.fdname) {
console.error('Blueprint not found:', name);
return {}; return {};
} }
const blueprint = JSON.parse(JSON.stringify(found)); const blueprint = JSON.parse(JSON.stringify(found));

View File

@@ -14,6 +14,8 @@ export const SHIP_FD_NAME_TO_CORIOLIS_NAME = {
'BelugaLiner': 'beluga', 'BelugaLiner': 'beluga',
'CobraMkIII': 'cobra_mk_iii', 'CobraMkIII': 'cobra_mk_iii',
'CobraMkIV': 'cobra_mk_iv', 'CobraMkIV': 'cobra_mk_iv',
'CobraMkV': 'cobramkv',
'Corsair': 'imperial_corsair',
'Cutter': 'imperial_cutter', 'Cutter': 'imperial_cutter',
'DiamondBackXL': 'diamondback_explorer', 'DiamondBackXL': 'diamondback_explorer',
'DiamondBack': 'diamondback', 'DiamondBack': 'diamondback',

View File

@@ -117,7 +117,7 @@ export function shipFromLoadoutJSON(json) {
let powerplant = _moduleFromFdName(module.Item); let powerplant = _moduleFromFdName(module.Item);
// Check the powerplant returned is valid // Check the powerplant returned is valid
if (!_isValidImportedModule(powerplant, 'powerplant')) if (!_isValidImportedModule(powerplant, 'powerplant'))
{ {
powerplant = _moduleFromFdName('Int_Missing_Powerplant'); powerplant = _moduleFromFdName('Int_Missing_Powerplant');
module.Engineering = null; module.Engineering = null;
} }
@@ -130,7 +130,7 @@ export function shipFromLoadoutJSON(json) {
let thrusters = _moduleFromFdName(module.Item); let thrusters = _moduleFromFdName(module.Item);
// Check the thrusters returned is valid // Check the thrusters returned is valid
if (!_isValidImportedModule(thrusters, 'thrusters')) if (!_isValidImportedModule(thrusters, 'thrusters'))
{ {
thrusters = _moduleFromFdName('Int_Missing_Engine'); thrusters = _moduleFromFdName('Int_Missing_Engine');
module.Engineering = null; module.Engineering = null;
} }
@@ -143,7 +143,7 @@ export function shipFromLoadoutJSON(json) {
let frameshiftdrive = _moduleFromFdName(module.Item); let frameshiftdrive = _moduleFromFdName(module.Item);
// Check the frameshiftdrive returned is valid // Check the frameshiftdrive returned is valid
if (!_isValidImportedModule(frameshiftdrive, 'frameshiftdrive')) if (!_isValidImportedModule(frameshiftdrive, 'frameshiftdrive'))
{ {
frameshiftdrive = _moduleFromFdName('Int_Missing_Hyperdrive'); frameshiftdrive = _moduleFromFdName('Int_Missing_Hyperdrive');
module.Engineering = null; module.Engineering = null;
} }
@@ -156,7 +156,7 @@ export function shipFromLoadoutJSON(json) {
let lifesupport = _moduleFromFdName(module.Item); let lifesupport = _moduleFromFdName(module.Item);
// Check the lifesupport returned is valid // Check the lifesupport returned is valid
if (!_isValidImportedModule(lifesupport, 'lifesupport')) if (!_isValidImportedModule(lifesupport, 'lifesupport'))
{ {
lifesupport = _moduleFromFdName('Int_Missing_LifeSupport'); lifesupport = _moduleFromFdName('Int_Missing_LifeSupport');
module.Engineering = null; module.Engineering = null;
} }
@@ -169,8 +169,8 @@ export function shipFromLoadoutJSON(json) {
let powerdistributor = _moduleFromFdName(module.Item); let powerdistributor = _moduleFromFdName(module.Item);
// Check the powerdistributor returned is valid // Check the powerdistributor returned is valid
if (!_isValidImportedModule(powerdistributor, 'powerdistributor')) if (!_isValidImportedModule(powerdistributor, 'powerdistributor'))
{ {
powerdistributor = _moduleFromFdName('Int_Missing_PowerDistributor'); powerdistributor = _moduleFromFdName('Int_Missing_PowerDistributor');
module.Engineering = null; module.Engineering = null;
} }
ship.use(ship.standard[4], powerdistributor, true); ship.use(ship.standard[4], powerdistributor, true);
@@ -182,7 +182,7 @@ export function shipFromLoadoutJSON(json) {
let sensors = _moduleFromFdName(module.Item); let sensors = _moduleFromFdName(module.Item);
// Check the sensors returned is valid // Check the sensors returned is valid
if (!_isValidImportedModule(sensors, 'sensors')) if (!_isValidImportedModule(sensors, 'sensors'))
{ {
sensors = _moduleFromFdName('Int_Missing_Sensors'); sensors = _moduleFromFdName('Int_Missing_Sensors');
module.Engineering = null; module.Engineering = null;
} }
@@ -195,7 +195,7 @@ export function shipFromLoadoutJSON(json) {
let fueltank = _moduleFromFdName(module.Item); let fueltank = _moduleFromFdName(module.Item);
// Check the fueltank returned is valid // Check the fueltank returned is valid
if (!_isValidImportedModule(fueltank, 'fueltank')) if (!_isValidImportedModule(fueltank, 'fueltank'))
{ {
fueltank = _moduleFromFdName('Int_Missing_FuelTank'); fueltank = _moduleFromFdName('Int_Missing_FuelTank');
} }
ship.use(ship.standard[6], fueltank, true); ship.use(ship.standard[6], fueltank, true);
@@ -228,7 +228,7 @@ export function shipFromLoadoutJSON(json) {
} else { } else {
hardpoint = _moduleFromFdName(hardpointSlot.Item); hardpoint = _moduleFromFdName(hardpointSlot.Item);
// Check the hardpoint module returned is valid // Check the hardpoint module returned is valid
if (!_isValidImportedModule(hardpoint, 'hardpoint')){ if (!_isValidImportedModule(hardpoint, 'hardpoint')){
// Check if it's a Utility or Hardpoint // Check if it's a Utility or Hardpoint
if (hardpointSlot.Slot.toLowerCase().search(/tiny/)) if (hardpointSlot.Slot.toLowerCase().search(/tiny/))
{ {
@@ -293,12 +293,12 @@ export function shipFromLoadoutJSON(json) {
let internal = _moduleFromFdName(internalJson.Item); let internal = _moduleFromFdName(internalJson.Item);
// Check the internal module returned is valid // Check the internal module returned is valid
if (!_isValidImportedModule(internal, 'internal')) if (!_isValidImportedModule(internal, 'internal'))
{ {
internal = _moduleFromFdName('Int_Missing_Module'); internal = _moduleFromFdName('Int_Missing_Module');
ship.use(ship.internal[i], internal, true); ship.use(ship.internal[i], internal, true);
ship.internal[i].enabled = internalJson.On === true; ship.internal[i].enabled = internalJson.On === true;
ship.internal[i].priority = internalJson.Priority; ship.internal[i].priority = internalJson.Priority;
//throw 'Unknown internal module: "' + module.Item + '"'; //throw 'Unknown internal module: "' + module.Item + '"';
} }
else { else {
ship.use(ship.internal[i], internal, true); ship.use(ship.internal[i], internal, true);
@@ -349,6 +349,7 @@ function _addModifications(module, modifiers, quality, blueprint, grade, special
// Add the blueprint definition, grade and special // Add the blueprint definition, grade and special
if (blueprint) { if (blueprint) {
module.blueprint = getBlueprint(blueprint, module); module.blueprint = getBlueprint(blueprint, module);
if (grade) { if (grade) {
module.blueprint.grade = Number(grade); module.blueprint.grade = Number(grade);
} }

View File

@@ -9,6 +9,12 @@
} }
} }
ul {
padding: 0;
margin: 0;
text-align: left;
}
pre { pre {
white-space: pre-wrap; white-space: pre-wrap;
white-space: -moz-pre-wrap; white-space: -moz-pre-wrap;