{# ══════════════════════════════════════════════ MACROS — must come before first use in Jinja2 ══════════════════════════════════════════════ #} {# 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, collector_id) %} {% 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 %} {% if qid != collector_id %}{% 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 }} {% if cid != collector_id %}{% endif %}
{% else %} {{ render_list_item(cid, quest_by_id, children, visible, collector_prereqs, child_stack, child_last, collector_id) }} {% endif %} {% endfor %} {% endmacro %} OnlyScavs – Collector Checklist

Collector Checklist

{{ done }} / {{ total }} quests completed

Flow List |
Required for Collector Marked done ← Trader Cross-trader dependency
{% macro render_node(qid, quest_by_id, children, visible, collector_prereqs, collector_id, is_root=False) %} {% 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 qid in collector_prereqs %}{% endif %} {{ q.name }} {% if q.wiki_link %}wiki{% endif %} {% if qid != collector_id %} {% endif %}
{% if visible_kids %}
{% 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 }} {% if cid != collector_id %} {% endif %}
{% else %} {{ render_node(cid, quest_by_id, children, visible, collector_prereqs, collector_id, false) }} {% endif %} {% endfor %}
{% endif %}
{% endmacro %} {# ── FLOW VIEW ── #}
{% for trader in traders %} {% set roots = trader_roots[trader] %} {% set total_trader = namespace(n=0) %} {% set done_trader = namespace(n=0) %} {% for qid in visible %} {% if quest_by_id[qid].trader == trader and qid in collector_prereqs %} {% set total_trader.n = total_trader.n + 1 %} {% if quest_by_id[qid].done %}{% set done_trader.n = done_trader.n + 1 %}{% endif %} {% endif %} {% endfor %}
{{ trader }} {{ done_trader.n }} / {{ total_trader.n }}
{% for root_id in roots %} {{ render_node(root_id, quest_by_id, children, visible, collector_prereqs, collector_id, true) }} {% endfor %}
{% endfor %}
{# ── LIST VIEW ── #}
{% for trader in traders %} {% set roots = trader_roots[trader] %} {% set total_trader = namespace(n=0) %} {% set done_trader = namespace(n=0) %} {% for qid in visible %} {% if quest_by_id[qid].trader == trader and qid in collector_prereqs %} {% set total_trader.n = total_trader.n + 1 %} {% if quest_by_id[qid].done %}{% set done_trader.n = done_trader.n + 1 %}{% endif %} {% endif %} {% endfor %}
{{ trader }} {{ done_trader.n }} / {{ total_trader.n }}
{% for root_id in roots %} {{ render_list_item(root_id, quest_by_id, children, visible, collector_prereqs, [], loop.last, collector_id) }} {% endfor %}
{% endfor %}