{% extends 'base.html.twig' %} {% block title %}{{ map.name }} — CSI World{% endblock %} {% block stylesheets %} {% endblock %} {% block body %}

Abonnement requis

Cette zone est réservée aux joueurs abonnés. Souscrivez à l'abonnement Premium pour y accéder.

Voir les abonnements
PNJ
Tableau de quêtes
Atelier
Carte / {{ map.name }} {% if map.description %} {{ map.description }} {% endif %}
{# ── Vertical nav ── #}
{# ── Team tab ── #}
{% if characters is defined and characters|length > 0 %} {% for char in characters %} {% set cs = characterStats[char.id] ?? {} %} {% set pvMax = cs.pvMax ?? 0 %} {% set pvCur = cs.currentPv ?? char.currentPv %} {% set egMax = cs.egMax ?? 0 %} {% set egCur = cs.currentEg ?? char.currentEg %} {% set slots = char.equipmentSlots %} {% set slotLabels = {0: 'Arme', 1: 'Main gauche', 2: 'Tête', 3: 'Torse', 4: 'Relique', 5: 'Relique'} %} {% set spells = characterSpells[char.id] ?? [] %}
{% if char.modelMmo and char.modelMmo.filename %} {{ char.name }} {% else %} 🧙 {% endif %}
{% if char.teamSlot is not null %}{% endif %} {{ char.name }}
{{ char.classMmo ? char.classMmo.name ~ ' niv. ' ~ char.classLevel : 'Sans classe' }}
PV
{{ pvCur }}/{{ pvMax }}
EG
{{ egCur }}/{{ egMax }}
{% set xpThresh = constant('App\\Service\\XpCurve::THRESHOLDS') %} {% set xpMax = constant('App\\Service\\XpCurve::MAX_LEVEL') %} {% if char.classLevel >= xpMax %}
EXP
MAX
{% else %} {% set xpStart = char.classLevel > 1 ? xpThresh[char.classLevel - 1] : 0 %} {% set xpEnd = xpThresh[char.classLevel] %} {% set xpSpan = xpEnd - xpStart %} {% set xpProgress = xpSpan > 0 ? ((char.experience - xpStart) / xpSpan * 100)|round : 0 %}
EXP
{{ char.experience }}/{{ xpEnd }}
{% endif %}
▶
{% set cs = characterStats[char.id] ?? {} %}
Stats
PV max{{ cs.pvMax ?? 0 }}
EG max{{ cs.egMax ?? 0 }}
Attaque{{ cs.attaque ?? 0 }}
Défense{{ cs.defense ?? 0 }}
Arcane{{ cs.arcane ?? 0 }}
Sagesse{{ cs.sagesse ?? 0 }}
Vitesse{{ cs.vitesse ?? 0 }}
Finesse{{ cs.finesse ?? 0 }}
Équipement
{% set resolvedSlots = characterSlots[char.id] ?? {} %} {% set slot0Weapon = resolvedSlots[0] ?? null %} {% set offhandBlocked = slot0Weapon is not null and (slot0Weapon.isTwoHanded ?? false) %} {% for slotIndex, label in slotLabels %} {% set slotItem = resolvedSlots[slotIndex] ?? null %} {% set isBlocked = slotIndex == 1 and offhandBlocked %}
{{ label }}
{% if isBlocked %} — Deux mains — {% elseif slotItem %}
{% if slotItem.iconUrl %} {% else %} {% endif %}
{{ slotItem.name }} {% else %} Rien {% endif %}
{% endfor %}
Sorts
{% if spells|length > 0 %}
{% for entry in spells %}
{{ entry.name }}{% if entry.egCost > 0 %} ({{ entry.egCost }} EG){% endif %} niv. {{ entry.level }}
{% if entry.description %} {{ entry.description|slice(0, 60) }}{% if entry.description|length > 60 %}…{% endif %} {% endif %}
{% endfor %}
{% else %} Aucun sort {% endif %}
{% endfor %} {% else %}
Aucun personnage
{% endif %}
{# ── Inventory tab ── #}
{{ inventoryItems|length }} / {{ inventoryLimit }} emplacements
{% set typeLabels = {weapon: 'Armes', armor: 'Armures', item: 'Objets'} %} {% set grouped = {} %} {% for entry in inventoryItems %} {% set t = entry.type in ['weapon_instance', 'armor_instance'] ? entry.type|replace({'_instance': ''}) : entry.type %} {% if grouped[t] is not defined %}{% set grouped = grouped|merge({(t): []}) %}{% endif %} {% set grouped = grouped|merge({(t): grouped[t]|merge([entry])}) %} {% endfor %} {% if inventoryItems|length == 0 %}
L'inventaire est vide.
{% else %} {% for type, entries in grouped %}
{{ typeLabels[type] ?? type }}
{% for entry in entries %}
{% if entry.iconUrl %} {% else %} {% endif %}
{{ entry.name }} ×{{ entry.qty }} {% if entry.type == 'item' and entry.damageType in [2, 3] %} {% endif %}
{% endfor %}
{# /inv-group #} {% endfor %} {% endif %}
{# ── Quests tab ── #}
Chargement des quêtes…
{# /team-panel-inner #}
{# /team-panel #}
{{ map.name }} {% for zone in zones %} {% set zStyle = 'left:' ~ zone.x ~ 'px;top:' ~ zone.y ~ 'px;width:' ~ zone.width ~ 'px;height:' ~ zone.height ~ 'px' %} {% set zTitle = zone.name ~ (zone.description ? ' — ' ~ zone.description|slice(0,80) : '') %} {% set zLabel = zone.name ~ ' · ' ~ zone.type %} {% set zLocked = not player_meets_tier(app.user, zone.minSubscriptionTier) %} {% set zSubAttr = 'data-sub-required="' ~ (zLocked ? '1' : '0') ~ '"' %} {% set zSubCls = zLocked ? ' zone-locked' : '' %} {% if zone.onClickQuests and zone.onClickQuests|length > 0 %}
{% elseif zone.onClickDialog %}
{% elseif zone.onClickQuest %}
{% elseif zone.transportTarget %}
{% elseif zone.type == 'shop' %}
{% elseif zone.type == 'field' and zone.fieldEnemies %}
{% elseif zone.type == 'gather' and zone.gatherResources %}
{% elseif zone.type == 'craft' %}
{% elseif zone.type == 'quest_board' %}
{% elseif zone.type == 'event' and zone.eventFunction %} {% set eventPopupText = zone.popupText|default('') %} {% if zone.eventFunction == 'full_heal' and app.user %} {% set daysSince = (("now"|date("U")) - (app.user.createdAt|date("U"))) / 86400 %} {% if daysSince < 14 %} {% set pricingNote = "La cantine est gratuite pendant les 14 premiers jours. Au-delà de ça, vous devrez vous acquitter de 100 Dollawrs." %} {% set eventPopupText = eventPopupText ~ (eventPopupText ? "\n\n" : "") ~ pricingNote %} {% endif %} {% endif %}
{% else %} {% endif %} {% endfor %}
{# /.map-body #}
{% endblock %} {% block javascripts %} {% endblock javascripts %}