mcServerWebsite/app/templates/calculator/index.html.twig
Ploush 10976f6145
Some checks failed
Build & Deploy / Validation, build et push (push) Failing after 5m8s
Add Create mod calculator
2026-07-07 14:49:38 +02:00

140 lines
8.7 KiB
Twig
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{% extends 'base.html.twig' %}
{% block title %}Calcul{% endblock %}
{% block stylesheets %}
{{ parent() }}
<link rel="stylesheet" href="{{ asset('styles/globals/bulles.css') }}">
{# Styles spécifiques au calculateur (inputs, readouts, tip, chart) #}
<link rel="stylesheet" href="{{ asset('styles/calculator/index.css') }}">
{% endblock %}
{% block main %}
<div class="bulle-container aero-calc" data-controller="calculateur">
<div class="bulle bulle-all-col bulle-header">
<h1>Calulateur pour Create Aeronautics.</h1>
<p class="ac-sub">Calculs dérivés des mods Aeronautics et Sable. Le ballon est supposé pleinement chauffé (volume rempli = capacité).</p>
</div>
<div class="bulle bulle-all-col">
<details class="ac-consts">
<summary>Constantes (config par défaut)</summary>
<div class="ac-consts-grid">
<div class="ac-field"><label>C_T <span class="u">poussée</span></label><input id="aero-ct" type="number" step="any" value="0.2"></div>
<div class="ac-field"><label>s_air <span class="u">kpg/m³</span></label><input id="aero-sair" type="number" step="any" value="1.5"></div>
<div class="ac-field"><label>g <span class="u">gravité</span></label><input id="aero-g" type="number" step="any" value="11"></div>
<div class="ac-field"><label>y_mer <span class="u">niveau mer</span></label><input id="aero-sea" type="number" step="any" value="63"></div>
<div class="ac-field"><label>k <span class="u">pente pression</span></label><input id="aero-k" type="number" step="any" value="-0.004"></div>
<div class="ac-field"><label>P_max <span class="u">plafond</span></label><input id="aero-pmax" type="number" step="any" value="1.5"></div>
<div class="ac-field"><label>y_top <span class="u">limite haute</span></label><input id="aero-ytop" type="number" step="any" value="320"></div>
<div class="ac-field"><label>y_bas <span class="u">limite basse</span></label><input id="aero-ybot" type="number" step="any" value="-64"></div>
</div>
</details>
</div>
<div class="bulle bulle-all-col">
<div class="ac-tool">
<h2 class="ac-h3">Hélice</h2>
<p class="ac-hint">Poussée le long de l'axe du bearing.</p>
<div class="ac-field"><label>Voiles (sails) <span class="u">P</span></label><input id="aero-sails" type="number" min="0" step="1" value="24"></div>
<div class="ac-field"><label>Vitesse de rotation <span class="u">N · RPM</span></label><input id="aero-rpm" type="number" step="any" value="256"></div>
<div class="ac-field"><label>Altitude <span class="u">y</span></label><input id="aero-palt" type="number" step="any" value="63"></div>
<div class="ac-readout"><div class="ac-rk">Poussée brute</div><div class="ac-rv key" id="aero-othrust">0 <small>pN</small></div></div>
<div class="ac-readout"><div class="ac-rk">Appliquée à l'arrêt (× P_air)</div><div class="ac-rv" id="aero-othrustapp">0 <small>pN</small></div></div>
</div>
</div>
<div class="bulle bulle-all-col">
<div class="ac-tool">
<h2 class="ac-h3">Ballon chauffé</h2>
<p class="ac-hint">Pleinement chauffé : volume rempli = capacité V.</p>
<div class="ac-field"><label>Volume intérieur <span class="u">V · m³</span></label><input id="aero-vol" type="number" min="0" step="any" value="512"></div>
<div class="ac-field"><label>Altitude <span class="u">y</span></label><input id="aero-balt" type="number" step="any" value="63"></div>
<div class="ac-readout"><div class="ac-rk">Force ascensionnelle brute</div><div class="ac-rv key" id="aero-oforce">0 <small>pN</small></div></div>
<div class="ac-readout"><div class="ac-rk">Portance (masse soulevable)</div><div class="ac-rv" id="aero-olift">0 <small>kpg</small></div></div>
<div class="ac-readout"><div class="ac-rk">Pression locale</div><div class="ac-rv" id="aero-opress">1.000</div></div>
</div>
</div>
<div class="bulle bulle-all-col">
<h2 class="ac-h2">Altitude maximale du ballon</h2>
<p class="ac-desc">Altitude de flottaison neutre où la portance compense le poids.</p>
<div class="ac-controls">
<div class="ac-field">
<label>Tracer en fonction</label>
<select id="aero-mode">
<option value="mass">du poids (volume fixé)</option>
<option value="vol">du volume (poids fixé)</option>
</select>
</div>
<div class="ac-field" id="aero-fixvolwrap"><label>Volume fixé <span class="u">V · m³</span></label><input id="aero-fixvol" type="number" min="1" step="any" value="512"></div>
<div class="ac-field" id="aero-fixmasswrap"><label>Poids fixé <span class="u">m · kpg</span></label><input id="aero-fixmass" type="number" min="1" step="any" value="400"></div>
</div>
<div class="ac-chart-shell">
<canvas id="aero-chart"></canvas>
<div class="ac-tip" id="aero-tip"></div>
</div>
<div class="ac-legend">
<span><i class="ac-sw"></i> altitude max</span>
<span><i class="ac-sw"></i> repères (mer, limite)</span>
<span><i class="ac-sw"></i> ne décolle pas</span>
</div>
<p class="ac-note"><b>m</b> kpg = <b>m</b> blocs standard (masse défaut 1 kpg/bloc). L'atténuation de pression sur les 40 derniers mètres sous la limite haute n'est pas modélisée.</p>
</div>
<section class="bulle bulle-all-col">
<h2 class="ac-h2">Volume requis</h2>
<p class="ac-desc">Volume d'air chaud minimal pour flotter à une altitude visée.</p>
<div class="ac-vol">
<div class="ac-vol-inputs">
<div class="ac-field"><label>Poids total <span class="u">m · kpg</span></label><input id="aero-vmass" type="number" min="0" step="any" value="400"></div>
<div class="ac-field"><label>Altitude visée <span class="u">y</span></label><input id="aero-valt" type="number" step="any" value="150"></div>
</div>
<div class="ac-vol-out">
<div class="ac-readout"><div class="ac-rk">Volume requis</div><div class="ac-rv key" id="aero-ovolreq">0 <small>m³</small></div></div>
<p class="ac-cube" id="aero-ocube"></p>
</div>
</div>
<p class="ac-note" id="aero-vwarn"></p>
</section>
<section class="bulle bulle-all-col">
<h2 class="ac-h2">Formules</h2>
<div class="ac-formulas">
<div><div class="ac-fk">Poussée hélice brute</div><code>T = C_T · P^(3/2) · N</code></div>
<div><div class="ac-fk">Appliquée (à l'arrêt, A_flux = 1)</div><code>F = T · A_flux · P_air</code></div>
<div><div class="ac-fk">Force ballon brute (pleinement chauffé)</div><code>F = V · s_air · g · P_air(y)</code></div>
<div><div class="ac-fk">Portance (masse)</div><code>L = V · s_air · P_air(y)</code></div>
<div><div class="ac-fk">Pression atmosphérique</div><code>P_air(y) = min( e^(k·(y y_mer)) , P_max )</code></div>
<div><div class="ac-fk">Altitude max (flottaison neutre)</div><code>y_max = y_mer + ln( V·s_air / m ) / k</code></div>
<div><div class="ac-fk">Volume requis</div><code>V = m / ( s_air · P_air(y) )</code></div>
</div>
</section>
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script>
// Fallback: si Stimulus n'a pas attaché le controller (par ex. problème de chargement),
// on charge l'ancien script autonome qui cible la class .aero-calc.
setTimeout(function(){
try{
const root = document.querySelector('.aero-calc');
if(root && root.dataset.calculateurConnected !== '1'){
const s = document.createElement('script');
s.type = 'module';
s.src = '{{ asset('js/calcultateur_create.js') }}';
document.head.appendChild(s);
console.warn('calculateur: fallback legacy script injected');
}
}catch(e){ console.error(e); }
}, 300);
</script>
{% endblock %}