coriolis
coriolis copied to clipboard
Calculate ship heat
So, I don't know if feature requests are appropriate for GitHub, however I can't think of a better place, so here goes:
Coriolis is great, but if I had to state an issue with it, it's that there are too many numbers and there isn't enough demonstration. The latest update added the pips which was nice, but I think there could still be more work on this.
I use it primarily for combat builds, so I'd like it if I could view my capacitors and heat as I changed the pips and fired weapons, maybe even charged my FSD. The "distributor drains in" numbers are nice for things like lasers and multicannons, but don't really make sense in the context of plasma accelerators or railguns.
Perhaps this it out of scope and more suited for another site (taking a Coriolis link as input data). I figure it's worth suggesting anyway.
Unfortunately heat is one area that is not well-understood in Elite so we have no model to work from. It is something that we are discussing with Frontier to see if we can obtain an idea of how it works but right now there's not a lot we can work with.
I've worked a lot with stealth and making ships have very cold idle heat; my corvette and python for example run idle at 14% heat and the Vette still has 2000mj of shields - and I've made it so my exploration ships can sit fuel scooping at a steady 65% heat without gaining anything extra.
From testing the determining factors for temperature are
- Heat added to ship from power draw
- Module usage (guns, thrusters, etc)
- External heat (proximity to star, special effects from attacking weapons)
- Power Plant's Heat Dissipation (PP class makes no difference)
- The Ship's innate Heat Dissipation capability
Dissipation is calculated from Power Draw, Power Plant Efficiency and Ship Efficiency And given a "heat load", dissipation results in %heat gained or lost per second
Relevant forum thread:
https://forums.frontier.co.uk/showthread.php/286628-Research-Detailed-Heat-Mechanics
I've been doing some sleuthing into the math behind heat. There's a fairly simple equation for the resting heat of a ship that could be really helpful to see in Coriolis. The folks in the thread linked above have done a ton of good work.
Resting Heat = SQRT( ( ( Power Plant Current Output * Power Plant Efficiency ) / Ship Heat Capacity ) / 0.2 )
This doesn't account for thrusters' thermal load modifier.
@figrin I have just added to beta.coriolis.io a resting heat column based on that formula.
Thanks @willyb321 , it's awesome that this is being tested out for implementation.
It looks like it looks like the numbers the code is using aren't quite right.
- Resting temperature isn't being adjusted when the power plant's efficiency is modified with engineering.
- Resting temperature isn't being adjusted when a ship's modules are being changed.
- Temperatures in general also appear too high.
I should clarify that the formula I referenced earlier, power Plant Current Output should be current power draw from modules. This should be equal to the Retracted Power Draw that Coriolis shows at the bottom of the screen, minus the power draw from thrusters (these only draw full power when in use).
Ship Heat Capacity is a value attached to each ship, and may need to be added to each ship's data in coriolis. There's a fairly up to date table showing each ship's heat capacity as determined through community testing here: https://docs.google.com/spreadsheets/d/1Evn8wnlO4-LS0IkuBz_uuYI_QtMMyX0epsfuzX90vnA/edit?usp=sharing
Thanks, will take a look soon
What is wrong with the calculations used by EDSY (edshipyard.com)? EDSY is licenced Creative Commons Attribution-NonCommercial 4.0 and everything is calculated on the client side.
So, why not extract the heat calculations from there?
code from EDSY:
var getEquilibriumHeatLevel = function(heatdismax, thmload) {
// https://forums.frontier.co.uk/showthread.php/286628-Research-Detailed-Heat-Mechanics
// https://forums.frontier.co.uk/showthread.php/286628-Research-Detailed-Heat-Mechanics?p=6399855&viewfull=1#post6399855
return sqrt(thmload / heatdismax);
}; // getEquilibriumHeatLevel()
var getTimeUntilHeatLevel = function(heatcap, heatdismax, thmload, heatlevel0, heatlevel) {
// https://forums.frontier.co.uk/showthread.php/286628-Research-Detailed-Heat-Mechanics?p=6519883&viewfull=1#post6519883
heatdismax /= heatcap;
if (!thmload) {
var C = -1 / (heatdismax * heatlevel0);
return ((1 / (heatdismax * heatlevel)) + C);
}
thmload /= heatcap;
var sqrtAdivB = sqrt(heatdismax / thmload);
var sqrtAmulB = sqrt(heatdismax * thmload);
var C = -atanh(heatlevel0 * sqrtAdivB) / sqrtAmulB
return ((atanh(heatlevel * sqrtAdivB) / sqrtAmulB) + C);
}; // getTimeUntilHeatLevel()
var getHeatLevelAtTime = function(heatcap, heatdismax, thmload, heatlevel0, seconds) {
// https://forums.frontier.co.uk/showthread.php/286628-Research-Detailed-Heat-Mechanics?p=6519883&viewfull=1#post6519883
heatdismax /= heatcap;
if (!thmload) {
var C = -1 / (heatdismax * heatlevel0);
return ((1 / (seconds - C)) / heatdismax);
}
thmload /= heatcap;
var sqrtAdivB = sqrt(heatdismax / thmload);
var sqrtAmulB = sqrt(heatdismax * thmload);
var C = -atanh(heatlevel0 * sqrtAdivB) / sqrtAmulB
return (tanh((seconds - C) * sqrtAmulB) / sqrtAdivB);
}; // getHeatLevelAtTime()
var getEffectiveWeaponThermalLoad = function(thmload, distdraw, wepcap, weplvl) {
// https://forums.frontier.co.uk/showthread.php/286628-Research-Detailed-Heat-Mechanics?p=6408594&viewfull=1#post6408594
return (thmload * (1 + 4 * min(max(1 - (wepcap * weplvl - distdraw) / wepcap, 0), 1)));
}; // getEffectiveWeaponThermalLoad()
Thanks for looking up the code. There is nothing wrong with these calculations but putting them in the right place and making sure, that we have all the data points needed to do the calculations is extra work and not our current top priority. As the development of ed-forge progresses, I'm sure that we will have a look at this.
I have a working implementation (based on EDSY). I plan on cleaning up the code a bit more, but I should be able to provide a pr soon. Is a pr still welcome? or is this codebase considered stale?