EDCD / coriolis

Coriolis Shipyard for Elite Dangerous
https://coriolis.io
Other
262 stars 82 forks source link

Calculate ship heat #105

Open SapiensAnatis opened 7 years ago

SapiensAnatis commented 7 years ago

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.

cmdrmcdonald commented 7 years ago

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.

BeckyYork commented 7 years ago

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

  1. Heat added to ship from power draw
  2. Module usage (guns, thrusters, etc)
  3. External heat (proximity to star, special effects from attacking weapons)
  4. Power Plant's Heat Dissipation (PP class makes no difference)
  5. 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

andrewgoz commented 7 years ago

Relevant forum thread:

https://forums.frontier.co.uk/showthread.php/286628-Research-Detailed-Heat-Mechanics

figrin commented 5 years ago

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.

jessb321 commented 5 years ago

@figrin I have just added to beta.coriolis.io a resting heat column based on that formula.

figrin commented 5 years ago

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.

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

jessb321 commented 5 years ago

Thanks, will take a look soon

Jacco-V commented 5 years ago

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()
felixlinker commented 5 years ago

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.

Jacco-V commented 11 months ago

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?