Skip to content

Commit 8d812c6

Browse files
Berserker66qwint
authored andcommitted
Webhost: Sphere Tracker (ArchipelagoMW#3412)
1 parent b109bb1 commit 8d812c6

File tree

3 files changed

+99
-1
lines changed

3 files changed

+99
-1
lines changed

WebHostLib/templates/hostRoom.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
<br />
2525
{% endif %}
2626
{% if room.tracker %}
27-
This room has a <a href="{{ url_for("get_multiworld_tracker", tracker=room.tracker) }}">Multiworld Tracker</a> enabled.
27+
This room has a <a href="{{ url_for("get_multiworld_tracker", tracker=room.tracker) }}">Multiworld Tracker</a>
28+
and a <a href="{{ url_for("get_multiworld_sphere_tracker", tracker=room.tracker) }}">Sphere Tracker</a> enabled.
2829
<br />
2930
{% endif %}
3031
The server for this room will be paused after {{ room.timeout//60//60 }} hours of inactivity.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{% extends "tablepage.html" %}
2+
{% block head %}
3+
{{ super() }}
4+
<title>Multiworld Sphere Tracker</title>
5+
<link rel="stylesheet" type="text/css" href="{{ url_for("static", filename="styles/tracker.css") }}" />
6+
<script type="application/ecmascript" src="{{ url_for("static", filename="assets/trackerCommon.js") }}"></script>
7+
{% endblock %}
8+
9+
{% block body %}
10+
{% include "header/dirtHeader.html" %}
11+
12+
<div id="tracker-wrapper" data-tracker="{{ room.tracker | suuid }}">
13+
<div id="tracker-header-bar">
14+
<input placeholder="Search" id="search" />
15+
16+
<div class="info">
17+
{% if tracker_data.get_spheres() %}
18+
This tracker lists already found locations by their logical access sphere.
19+
It ignores items that cannot be sent
20+
and will therefore differ from the sphere numbers in the spoiler playthrough.
21+
This tracker will automatically update itself periodically.
22+
{% else %}
23+
This Multiworld has no Sphere data, likely due to being too old, cannot display data.
24+
{% endif %}
25+
</div>
26+
</div>
27+
28+
<div id="tables-container">
29+
{%- for team, players in tracker_data.get_all_players().items() %}
30+
<div class="table-wrapper">
31+
<table id="checks-table" class="table non-unique-item-table">
32+
<thead>
33+
<tr>
34+
<th>Sphere</th>
35+
{#- Mimicking hint table header for familiarity. #}
36+
<th>Finder</th>
37+
<th>Receiver</th>
38+
<th>Item</th>
39+
<th>Location</th>
40+
<th>Game</th>
41+
</tr>
42+
</thead>
43+
<tbody>
44+
{%- for sphere in tracker_data.get_spheres() %}
45+
{%- set current_sphere = loop.index %}
46+
{%- for player, sphere_location_ids in sphere.items() %}
47+
{%- set checked_locations = tracker_data.get_player_checked_locations(team, player) %}
48+
{%- set finder_game = tracker_data.get_player_game(team, player) %}
49+
{%- set player_location_data = tracker_data.get_player_locations(team, player) %}
50+
{%- for location_id in sphere_location_ids.intersection(checked_locations) %}
51+
<tr>
52+
{%- set item_id, receiver, item_flags = player_location_data[location_id] %}
53+
{%- set receiver_game = tracker_data.get_player_game(team, receiver) %}
54+
<td>{{ current_sphere }}</td>
55+
<td>{{ tracker_data.get_player_name(team, player) }}</td>
56+
<td>{{ tracker_data.get_player_name(team, receiver) }}</td>
57+
<td>{{ tracker_data.item_id_to_name[receiver_game][item_id] }}</td>
58+
<td>{{ tracker_data.location_id_to_name[finder_game][location_id] }}</td>
59+
<td>{{ finder_game }}</td>
60+
</tr>
61+
{%- endfor %}
62+
63+
{%- endfor %}
64+
{%- endfor %}
65+
</tbody>
66+
</table>
67+
</div>
68+
69+
{%- endfor -%}
70+
</div>
71+
</div>
72+
{% endblock %}

WebHostLib/tracker.py

+25
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,11 @@ def get_room_videos(self) -> Dict[TeamPlayer, Tuple[str, str]]:
291291

292292
return video_feeds
293293

294+
@_cache_results
295+
def get_spheres(self) -> List[List[int]]:
296+
""" each sphere is { player: { location_id, ... } } """
297+
return self._multidata.get("spheres", [])
298+
294299

295300
@app.route("/tracker/<suuid:tracker>/<int:tracked_team>/<int:tracked_player>")
296301
def get_player_tracker(tracker: UUID, tracked_team: int, tracked_player: int, generic: bool = False) -> str:
@@ -414,6 +419,26 @@ def render_generic_multiworld_tracker(tracker_data: TrackerData, enabled_tracker
414419
)
415420

416421

422+
def render_generic_multiworld_sphere_tracker(tracker_data: TrackerData) -> str:
423+
return render_template(
424+
"multispheretracker.html",
425+
room=tracker_data.room,
426+
tracker_data=tracker_data,
427+
)
428+
429+
430+
@app.route("/sphere_tracker/<suuid:tracker>")
431+
@cache.memoize(timeout=TRACKER_CACHE_TIMEOUT_IN_SECONDS)
432+
def get_multiworld_sphere_tracker(tracker: UUID):
433+
# Room must exist.
434+
room = Room.get(tracker=tracker)
435+
if not room:
436+
abort(404)
437+
438+
tracker_data = TrackerData(room)
439+
return render_generic_multiworld_sphere_tracker(tracker_data)
440+
441+
417442
# TODO: This is a temporary solution until a proper Tracker API can be implemented for tracker templates and data to
418443
# live in their respective world folders.
419444

0 commit comments

Comments
 (0)