{# ══════════════════════════════════════════════ MACROS — must come before first use in Jinja2 ══════════════════════════════════════════════ #} {# Flow view: depth-indented vertical chain with connector lines #} {% macro render_chain(qid, quest_by_id, children, visible, collector_prereqs, depth) %} {% set q = quest_by_id[qid] %} {% set visible_kids = [] %} {% for cid in children.get(qid, []) %} {% if cid in visible %}{% set _ = visible_kids.append(cid) %}{% endif %} {% endfor %} {% if depth > 0 %}
{% endif %}
{% if qid in collector_prereqs %}{% endif %} {{ q.name }} {% if q.wiki_link %}wiki{% endif %}
{% for cid in visible_kids %} {% set child = quest_by_id[cid] %} {% if child.trader != q.trader %}
{% if cid in collector_prereqs %}{% endif %} {{ child.name }} {% if child.wiki_link %}wiki{% endif %}
{{ child.trader }}
{% else %} {{ render_chain(cid, quest_by_id, children, visible, collector_prereqs, depth + 1) }} {% endif %} {% endfor %} {% endmacro %} {# List view: indented tree with ├── / └── connector lines. open_stack: list of booleans — True = ancestor has more siblings (draw vert), False = last (draw blank). is_last: whether this node is the last sibling among its parent's children. #} {% macro render_list_item(qid, quest_by_id, children, visible, collector_prereqs, open_stack, is_last) %} {% set q = quest_by_id[qid] %} {% set visible_kids = [] %} {% for cid in children.get(qid, []) %} {% if cid in visible %}{% set _ = visible_kids.append(cid) %}{% endif %} {% endfor %}
{% for open in open_stack %}
{% endfor %} {% if open_stack %}
{% endif %}
{% if qid in collector_prereqs %}{% endif %} {{ q.name }} {% if q.wiki_link %}wiki{% endif %}
{% set child_stack = open_stack + [not is_last] %} {% for cid in visible_kids %} {% set child = quest_by_id[cid] %} {% set child_last = loop.last %} {% if child.trader != q.trader %}
{% for open in child_stack %}
{% endfor %}
{% if cid in collector_prereqs %}{% endif %} {{ child.name }} {% if child.wiki_link %}wiki{% endif %} {{ child.trader }}
{% else %} {{ render_list_item(cid, quest_by_id, children, visible, collector_prereqs, child_stack, child_last) }} {% endif %} {% endfor %} {% endmacro %} OnlyScavs – Quest Trees

Quest Trees

All quests ★ Collector only | Flow List |
Collector req Done cross Other trader
{# ── FLOW VIEW ── #}
{% for trader in traders %} {% set roots = trader_roots[trader] %} {% set total_t = namespace(n=0) %} {% set done_t = namespace(n=0) %} {% for qid in visible %} {% if quest_by_id[qid].trader == trader %} {% set total_t.n = total_t.n + 1 %} {% if quest_by_id[qid].done %}{% set done_t.n = done_t.n + 1 %}{% endif %} {% endif %} {% endfor %}
{{ trader }} {{ done_t.n }} / {{ total_t.n }}
{% for root_id in roots %} {{ render_chain(root_id, quest_by_id, children, visible, collector_prereqs, 0) }} {% endfor %}
{% endfor %}
{# ── LIST VIEW ── #}
{% for trader in traders %} {% set roots = trader_roots[trader] %} {% set total_t = namespace(n=0) %} {% set done_t = namespace(n=0) %} {% for qid in visible %} {% if quest_by_id[qid].trader == trader %} {% set total_t.n = total_t.n + 1 %} {% if quest_by_id[qid].done %}{% set done_t.n = done_t.n + 1 %}{% endif %} {% endif %} {% endfor %}
{{ trader }} {{ done_t.n }} / {{ total_t.n }}
{% for root_id in roots %} {{ render_list_item(root_id, quest_by_id, children, visible, collector_prereqs, [], loop.last) }} {% endfor %}
{% endfor %}