{# il2ks-template: templates/il2ks/aircraft/detail.html v1 - copy this line along when you override #} {% extends "il2ks/base.html" %}{% load i18n static il2ks %}{% comment %} One aircraft type (FR-WEB-8, FR-WEB-18). View: il2ks.web.views.aircraft.aircraft_detail. Context: stats (AircraftStats, all time: the side badge), tile (the counters of the tiles and the pilot count: the selected tour's `TourAircraftStats`, an empty one when nobody flew the type in it, or `stats` for all time), aircraft (GameObject), survived (tile's sorties without a death), hits (HitsToDestroy: kills, average, by_ammo (AmmoHits: name, kills, average), mixes / more_mixes (AmmoMixRow: parts (MixPart: name, designation, average), instances, average))), matchups (MatchupTable: rows (Matchup: enemy, kills, losses, rated), best, worst), tours / tour (the scope of the tiles and the matchups), role ("all", "air_superiority", "attack": filters every section with the tour and the modification filter), show_elo / show_ground (which top-pilots tables), intercept, can_intercept (false for the attack role: no toggle), min_encounters, all_fights_url, intercept_url, sort, elo_pilots (PlayerAircraft rows with .player and .elo; visible players only), ground_pilots (BoardRow: rank, player, stats, per_hour), ground_first (an attack type), rules (the leaderboard minimums), loadouts (Loadout: payload (AircraftPayload), elo, kills_per_sortie, kd, ground_hour; None = a dash), loadout_sort (?lsort=), mod_filters (ModFilter: mod_id, name, state "any" / "with" / "without"; only a type with significant weapon modifications has any), mod_filtered, mod_sets (ModSet: stats (AircraftMods), names, label, elo, kills_per_sortie, kd, ground_hour), mod_sort (?msort=), crumbs, page_title. Top pilots are ranked by skill: per-type Elo and ground score per hour on target (OQ-49), both from the stored columns. The totals include hidden players; only the top-pilots tables leave them out (FR-ADM-3). K/D and K/L use air kills (OQ-38). Blocks of this page: content. {% endcomment %} {% block head %}{% endblock %} {% block content %} {% breadcrumbs crumbs %}

{% aircraft_icon aircraft "aircraft-table__icon" %} {{ aircraft|object_name }} {% if aircraft.propulsion == "jet" %}{% badge _("Jet") "purple" %}{% elif aircraft.propulsion == "prop" %}{% badge _("Prop") "teal" %}{% endif %} {% if stats.side %}{% coalition_badge stats.side %}{% endif %}

{% tour_select tours tour %}

{% blocktranslate with pilots=tile.pilots|num count n=tile.pilots %}Flown by {{ pilots }} pilot.{% plural %}Flown by {{ pilots }} pilots.{% endblocktranslate %}

{% role_toggle role %} {% if mod_filters %} {% mod_filter mod_filters %} {% endif %}

{% translate "Everything on this page follows the selected tour, role and modifications; choose all time to see every tour. Matchups use the role and modifications of this aircraft's sortie, hits to destroy those of the aircraft that was shot down." %}

{% if absence %}{% blocktranslate asvar absent_message with name=aircraft|object_name tour=absence.tour|tour_title %}{{ name }} was not flown in {{ tour }}.{% endblocktranslate %}{% tour_absent absence absent_message %}{% endif %}
{% blocktranslate with rate=survived|percent:tile.sorties asvar sub_sorties %}{{ rate }} survived{% endblocktranslate %} {% stat_tile tile.sorties|num _("Sorties") sub=sub_sorties icon="stat/sorties" %} {% stat_tile tile.flight_time_s|duration _("Flight time") icon="stat/flight-time" %} {% blocktranslate with value=tile.kills_air|ratio:tile.deaths asvar sub_air %}K/D {{ value }}{% endblocktranslate %} {% stat_tile tile.kills_air|num _("Air kills") sub=sub_air icon="stat/air-kills" %} {% blocktranslate with value=tile.kills_ground|ratio:tile.sorties asvar sub_ground %}{{ value }} per sortie{% endblocktranslate %} {% stat_tile tile.kills_ground|num _("Ground kills") sub=sub_ground icon="stat/ground-kills" %} {% stat_tile tile.deaths|num _("Deaths") icon="stat/deaths" %} {% blocktranslate with value=tile.kills_air|ratio:tile.planes_lost asvar sub_lost %}K/L {{ value }}{% endblocktranslate %} {% stat_tile tile.planes_lost|num _("Aircraft lost") sub=sub_lost icon="stat/planes-lost" %} {% if tile.elo_games %} {% blocktranslate with games=tile.elo_games|num asvar sub_elo %}{{ games }} games between types{% endblocktranslate %} {% stat_tile tile.elo|num _("Elo") sub=sub_elo icon="stat/air-kills" %} {% endif %} {% blocktranslate with rate=tile.attack_sorties|percent:tile.sorties asvar sub_attack %}{{ rate }} attack{% endblocktranslate %} {% stat_tile tile.attack_sorties|num _("Attack sorties") sub=sub_attack icon="stat/sorties" %} {% if tile.accuracy_rounds %} {% blocktranslate with air=tile.accuracy_air_hits|accuracy:tile.accuracy_air_rounds ground=tile.accuracy_ground_hits|accuracy:tile.accuracy_ground_rounds asvar sub_accuracy %}{{ air }} air, {{ ground }} ground{% endblocktranslate %} {% stat_tile tile.accuracy_hits|accuracy:tile.accuracy_rounds _("Gun accuracy") sub=sub_accuracy icon="stat/accuracy" %} {% endif %}

{% translate "Matchups" %}

{% if can_intercept %}

{% translate "All kills and losses" %} {% translate "Intercept sorties only" %}

{% endif %} {% if intercept %}

{% translate "Only kills where both pilots flew an air superiority sortie (fighter against fighter); attack sorties are left out." %}

{% endif %} {% results_region %}
{% sort_th "enemy" _("Enemy aircraft") %} {% sort_th "kills" _("Kills") numeric=True %} {% sort_th "losses" _("Losses") numeric=True %} {# Translators: column header; the number is kills plus losses between the two aircraft types (not the Elo "Encounters" of the leaderboards) #} {% sort_th "encounters" _("Kills + losses") numeric=True hint="kills_plus_losses" %} {% sort_th "ratio" _("K/L") numeric=True hint="kl_matchup" %} {% for m in matchups.rows %} {% empty %} {% empty_row 5 _("No player-versus-player air kills with this aircraft here yet.") %} {% endfor %}
{% aircraft_icon m.enemy "aircraft-table__icon" %} {{ m.enemy|object_name }} {{ m.kills|num }} {{ m.losses|num }} {{ m.encounters|num }} {% if not m.rated %}—{% elif m.losses %}{{ m.kills|ratio:m.losses }}{% else %}{% translate "no losses" %}{% endif %}
{% endresults_region %}
{% if ground_first %} {% if show_ground %}{% include "il2ks/aircraft/top_ground.html" with primary=True %}{% endif %} {% if show_elo %}{% include "il2ks/aircraft/top_elo.html" with primary=False %}{% endif %} {% else %} {% if show_elo %}{% include "il2ks/aircraft/top_elo.html" with primary=True %}{% endif %} {% if show_ground %}{% include "il2ks/aircraft/top_ground.html" with primary=False %}{% endif %} {% endif %}

{% translate "Hits to destroy" %}

{% translate "Gun kills by a single attacker only." %}

{% col_th _("Kills") numeric=True hint="mix_instances" %} {% col_th _("Average hits") numeric=True hint="hits_average" %} {% if hits.by_ammo %} {% for mix in ammo_mixes %} {% empty %} {% blocktranslate asvar mixes_empty count n=min_events %}No ammunition mix with at least {{ n }} kill yet.{% plural %}No ammunition mix with at least {{ n }} kills yet.{% endblocktranslate %} {% empty_row 3 mixes_empty %} {% endfor %} {% else %} {% empty_row 3 _("No kill of this aircraft by a single attacker yet.") %} {% endif %}
{% translate "Ammunition" %}
{% translate "All gun ammunition" %}{{ hits.kills }}{{ hits.average }}
{% for part in mix.parts %}{% if not forloop.first %} + {% endif %}{% if part.designation %}{{ part.name }}{% else %}{{ part.name }}{% endif %}{% endfor %} {{ mix.instances }} {{ mix.averages }}
{% translate "Hits to destroy" as mixes_name %}{% blocktranslate asvar mixes_pages with name=mixes_name %}Pagination: {{ name }}{% endblocktranslate %} {% pagination ammo_mixes param="page_mixes" anchor="ammo" label=mixes_pages %}

{% translate "Loadouts" %}

{% if loadout_tabs %}

{% for tab in loadout_tabs %} {{ tab.label }}{% endfor %}

{% endif %} {% if loadout_role == "attack" %}

{% blocktranslate with sorties=rules.min_attack_sorties|num minutes=rules.min_time_on_target_minutes|num %}Attack proficiency needs at least {{ sorties }} attack sorties and {{ minutes }} minutes on target.{% endblocktranslate %}

{% else %}

{% blocktranslate with n=rules.min_air_superiority_sorties|num %}Average Elo shows the pilots' skill as much as the loadout's. Rates need at least {{ n }} air superiority sorties.{% endblocktranslate %}

{% endif %}
{% sort_th "loadout" _("Loadout") current=loadout_sort param="lsort" %} {% sort_th "sorties" _("Sorties") current=loadout_sort param="lsort" numeric=True %} {% if loadout_role == "attack" %} {% sort_th "kills_ground" _("Ground kills") current=loadout_sort param="lsort" numeric=True %} {% sort_th "deaths" _("Deaths") current=loadout_sort param="lsort" numeric=True %} {% sort_th "ground_hour" _("Attack proficiency") current=loadout_sort param="lsort" numeric=True %} {% else %} {% sort_th "kills_air" _("Air kills") current=loadout_sort param="lsort" numeric=True %} {% sort_th "deaths" _("Deaths") current=loadout_sort param="lsort" numeric=True %} {# Translators: column header; the sortie-weighted average Elo rating of the pilots who flew this loadout (it reflects their skill, not only the loadout) #} {% sort_th "elo" _("Average pilot Elo") current=loadout_sort param="lsort" numeric=True %} {% sort_th "kills_per_sortie" _("Air kills per sortie") current=loadout_sort param="lsort" numeric=True %} {# Translators: column header; player-versus-player air kills per death with this loadout #} {% sort_th "kd" _("PvP K/D") current=loadout_sort param="lsort" numeric=True %} {% endif %} {% for row in loadouts %} {% with p=row.payload %} {% if loadout_role == "attack" %} {% else %} {% endif %} {% endwith %} {% empty %} {% blocktranslate asvar loadouts_empty count n=min_events %}No loadout with at least {{ n }} sortie yet.{% plural %}No loadout with at least {{ n }} sorties yet.{% endblocktranslate %} {% if loadout_role == "attack" %}{% empty_row 5 loadouts_empty %}{% else %}{% empty_row 7 loadouts_empty %}{% endif %} {% endfor %}
{% if p.payload_name %}{{ p.payload_name }}{% else %}{% translate "Unknown loadout" %}{% endif %} {{ p.sorties|num }}{{ p.kills_ground|num }} {{ p.deaths|num }} {{ row.ground_hour|num:1 }}{{ p.kills_air|num }} {{ p.deaths|num }} {{ row.elo|num }} {{ row.kills_per_sortie|num:2 }} {{ row.kd|num:2 }}
{% translate "Loadouts" as loadouts_name %}{% blocktranslate asvar loadouts_pages with name=loadouts_name %}Pagination: {{ name }}{% endblocktranslate %} {% pagination loadouts param="page_loadouts" anchor="loadouts" label=loadouts_pages %}

{% translate "Modifications" %}

{% sort_th "mods" _("Modifications") current=mod_sort param="msort" %} {% sort_th "sorties" _("Sorties") current=mod_sort param="msort" numeric=True %} {% sort_th "kills_air" _("Air kills") current=mod_sort param="msort" numeric=True %} {% sort_th "kills_ground" _("Ground kills") current=mod_sort param="msort" numeric=True %} {% sort_th "deaths" _("Deaths") current=mod_sort param="msort" numeric=True %} {% sort_th "elo" _("Average pilot Elo") current=mod_sort param="msort" numeric=True %} {% sort_th "kills_per_sortie" _("Air kills per sortie") current=mod_sort param="msort" numeric=True %} {% sort_th "kd" _("PvP K/D") current=mod_sort param="msort" numeric=True %} {% sort_th "ground_hour" _("Attack proficiency") current=mod_sort param="msort" numeric=True %} {% for row in mod_sets %} {% with p=row.stats %} {% endwith %} {% empty %} {% blocktranslate asvar mods_empty count n=min_events %}No modification set with at least {{ n }} sortie yet.{% plural %}No modification set with at least {{ n }} sorties yet.{% endblocktranslate %} {% empty_row 9 mods_empty %} {% endfor %}
{% if row.names %}{{ row.label }}{% else %}{% translate "No modifications" %}{% endif %}{% if role == "all" and p.combat_role %} {% role_badge p.combat_role %}{% endif %} {{ p.sorties|num }} {{ p.kills_air|num }} {{ p.kills_ground|num }} {{ p.deaths|num }} {{ row.elo|num }} {{ row.kills_per_sortie|num:2 }} {{ row.kd|num:2 }} {{ row.ground_hour|num:1 }}
{% translate "Modifications" as mods_name %}{% blocktranslate asvar mods_pages with name=mods_name %}Pagination: {{ name }}{% endblocktranslate %} {% pagination mod_sets param="page_mods" anchor="mods" label=mods_pages %}
{% endblock %}