WebHost: add game and Factorio to multitracker (#1526)

Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
This commit is contained in:
Fabian Dill 2023-03-12 12:38:13 +01:00 committed by GitHub
parent 54cce4c392
commit 39563cc347
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 126 additions and 27 deletions

View File

@ -0,0 +1,44 @@
{% extends "multiTracker.html" %}
{% block custom_table_headers %}
<th class="center-column">
<img src="https://wiki.factorio.com/images/thumb/Logistic_science_pack.png/32px-Logistic_science_pack.png"
alt="Logistic Science Pack">
</th>
<th class="center-column">
<img src="https://wiki.factorio.com/images/thumb/Military_science_pack.png/32px-Military_science_pack.png"
alt="Military Science Pack">
</th>
<th class="center-column">
<img src="https://wiki.factorio.com/images/thumb/Chemical_science_pack.png/32px-Chemical_science_pack.png"
alt="Chemical Science Pack">
</th>
<th class="center-column">
<img src="https://wiki.factorio.com/images/thumb/Production_science_pack.png/32px-Production_science_pack.png"
alt="Production Science Pack">
</th>
<th class="center-column">
<img src="https://wiki.factorio.com/images/thumb/Utility_science_pack.png/32px-Utility_science_pack.png"
alt="Utility Science Pack">
</th>
<th class="center-column">
<img src="https://wiki.factorio.com/images/thumb/Space_science_pack.png/32px-Space_science_pack.png"
alt="Space Science Pack">
</th>
{% endblock %}
{% block custom_table_row scoped %}
{% if games[player] == "Factorio" %}
<td class="center-column">{% if inventory[team][player][131161] or inventory[team][player][131281] %}✔{% endif %}</td>
<td class="center-column">{% if inventory[team][player][131172] or inventory[team][player][131281] > 1%}✔{% endif %}</td>
<td class="center-column">{% if inventory[team][player][131195] or inventory[team][player][131281] > 2%}✔{% endif %}</td>
<td class="center-column">{% if inventory[team][player][131240] or inventory[team][player][131281] > 3%}✔{% endif %}</td>
<td class="center-column">{% if inventory[team][player][131240] or inventory[team][player][131281] > 4%}✔{% endif %}</td>
<td class="center-column">{% if inventory[team][player][131220] or inventory[team][player][131281] > 5%}✔{% endif %}</td>
{% else %}
<td class="center-column"></td>
<td class="center-column"></td>
<td class="center-column"></td>
<td class="center-column"></td>
<td class="center-column"></td>
<td class="center-column"></td>
{% endif %}
{% endblock%}

View File

@ -30,6 +30,10 @@
<tr> <tr>
<th>#</th> <th>#</th>
<th>Name</th> <th>Name</th>
<th>Game</th>
{% block custom_table_headers %}
{# implement this block in game-specific multi trackers #}
{% endblock %}
<th class="center-column">Checks</th> <th class="center-column">Checks</th>
<th class="center-column">&percnt;</th> <th class="center-column">&percnt;</th>
<th class="center-column hours">Last<br>Activity</th> <th class="center-column hours">Last<br>Activity</th>
@ -41,6 +45,10 @@
<td><a href="{{ url_for("get_player_tracker", tracker=room.tracker, <td><a href="{{ url_for("get_player_tracker", tracker=room.tracker,
tracked_team=team, tracked_player=player)}}">{{ loop.index }}</a></td> tracked_team=team, tracked_player=player)}}">{{ loop.index }}</a></td>
<td>{{ player_names[(team, loop.index)]|e }}</td> <td>{{ player_names[(team, loop.index)]|e }}</td>
<td>{{ games[player] }}</td>
{% block custom_table_row scoped %}
{# implement this block in game-specific multi trackers #}
{% endblock %}
<td class="center-column">{{ checks["Total"] }}/{{ checks_in_area[player]["Total"] }}</td> <td class="center-column">{{ checks["Total"] }}/{{ checks_in_area[player]["Total"] }}</td>
<td class="center-column">{{ percent_total_checks_done[team][player] }}</td> <td class="center-column">{{ percent_total_checks_done[team][player] }}</td>
{%- if activity_timers[(team, player)] -%} {%- if activity_timers[(team, player)] -%}

View File

@ -2,11 +2,8 @@
<div id="tracker-navigation"> <div id="tracker-navigation">
{% for enabled_tracker in enabled_multiworld_trackers %} {% for enabled_tracker in enabled_multiworld_trackers %}
{% set tracker_url = url_for(enabled_tracker.endpoint, tracker=room.tracker) %} {% set tracker_url = url_for(enabled_tracker.endpoint, tracker=room.tracker) %}
{%- if enabled_tracker.current -%} <a class="tracker-navigation-button{%- if enabled_tracker.current -%} selected{% endif %}"
<a class="tracker-navigation-button selected" href="{{ tracker_url }}">{{ enabled_tracker.name }}</a> href="{{ tracker_url }}">{{ enabled_tracker.name }}</a>
{%- else -%}
<a class="tracker-navigation-button" href="{{ tracker_url }}">{{ enabled_tracker.name }}</a>
{%- endif -%}
{% endfor %} {% endfor %}
</div> </div>
{%- endif -%} {%- endif -%}

View File

@ -666,7 +666,6 @@ def __renderOoTTracker(multisave: Dict[str, Any], room: Room, locations: Dict[in
} }
for item_name, item_id in multi_items.items(): for item_name, item_id in multi_items.items():
base_name = item_name.split()[-1].lower() base_name = item_name.split()[-1].lower()
count = inventory[item_id]
display_data[base_name+"_count"] = inventory[item_id] display_data[base_name+"_count"] = inventory[item_id]
# Gather dungeon locations # Gather dungeon locations
@ -1323,24 +1322,22 @@ def get_enabled_multiworld_trackers(room: Room, current: str):
"current": current == "Generic" "current": current == "Generic"
} }
] ]
for game_name, endpoint in multi_trackers.items():
if any(slot.game == "A Link to the Past" for slot in room.seed.slots) or current == "A Link to the Past": if any(slot.game == game_name for slot in room.seed.slots) or current == game_name:
enabled.append({ enabled.append({
"name": "A Link to the Past", "name": game_name,
"endpoint": "get_LttP_multiworld_tracker", "endpoint": endpoint.__name__,
"current": current == "A Link to the Past"} "current": current == game_name}
) )
return enabled return enabled
@app.route('/tracker/<suuid:tracker>') def _get_multiworld_tracker_data(tracker: UUID) -> typing.Optional[typing.Dict[str, typing.Any]]:
@cache.memoize(timeout=60) # multisave is currently created at most every minute
def get_multiworld_tracker(tracker: UUID):
room: Room = Room.get(tracker=tracker) room: Room = Room.get(tracker=tracker)
if not room: if not room:
abort(404) return None
locations, names, use_door_tracker, seed_checks_in_area, player_location_to_area, \
locations, names, use_door_tracker, checks_in_area, player_location_to_area, \
precollected_items, games, slot_data, groups, saving_second, custom_locations, custom_items = \ precollected_items, games, slot_data, groups, saving_second, custom_locations, custom_items = \
get_static_room_data(room) get_static_room_data(room)
@ -1366,7 +1363,9 @@ def get_multiworld_tracker(tracker: UUID):
continue continue
player_locations = locations[player] player_locations = locations[player]
checks_done[team][player]["Total"] = sum(1 for loc in locations_checked if loc in player_locations) checks_done[team][player]["Total"] = sum(1 for loc in locations_checked if loc in player_locations)
percent_total_checks_done[team][player] = int(checks_done[team][player]["Total"] / seed_checks_in_area[player]["Total"] * 100) if seed_checks_in_area[player]["Total"] else 100 percent_total_checks_done[team][player] = int(checks_done[team][player]["Total"] /
checks_in_area[player]["Total"] * 100) \
if checks_in_area[player]["Total"] else 100
activity_timers = {} activity_timers = {}
now = datetime.datetime.utcnow() now = datetime.datetime.utcnow()
@ -1386,15 +1385,61 @@ def get_multiworld_tracker(tracker: UUID):
for (team, player), data in multisave.get("video", []): for (team, player), data in multisave.get("video", []):
video[(team, player)] = data video[(team, player)] = data
enabled_multiworld_trackers = get_enabled_multiworld_trackers(room, "Generic") return dict(player_names=player_names, room=room, checks_done=checks_done,
percent_total_checks_done=percent_total_checks_done, checks_in_area=checks_in_area,
return render_template("multiTracker.html", player_names=player_names, room=room, checks_done=checks_done, activity_timers=activity_timers, video=video, hints=hints,
percent_total_checks_done=percent_total_checks_done, checks_in_area=seed_checks_in_area, long_player_names=long_player_names,
activity_timers=activity_timers, video=video, hints=hints, multisave=multisave, precollected_items=precollected_items, groups=groups,
long_player_names=long_player_names, enabled_multiworld_trackers=enabled_multiworld_trackers) locations=locations, games=games)
@app.route('/tracker/<suuid:tracker>/lttp') def _get_inventory_data(data: typing.Dict[str, typing.Any]) -> typing.Dict[int, typing.Dict[int, int]]:
inventory = {teamnumber: {playernumber: collections.Counter() for playernumber in team_data}
for teamnumber, team_data in data["checks_done"].items()}
groups = data["groups"]
for (team, player), locations_checked in data["multisave"].get("location_checks", {}).items():
if player in data["groups"]:
continue
player_locations = data["locations"][player]
precollected = data["precollected_items"][player]
for item_id in precollected:
inventory[team][player][item_id] += 1
for location in locations_checked:
item_id, recipient, flags = player_locations[location]
recipients = groups.get(recipient, [recipient])
for recipient in recipients:
inventory[team][recipient][item_id] += 1
return inventory
@app.route('/tracker/<suuid:tracker>')
@cache.memoize(timeout=60) # multisave is currently created at most every minute
def get_multiworld_tracker(tracker: UUID):
data = _get_multiworld_tracker_data(tracker)
if not data:
abort(404)
data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Generic")
return render_template("multiTracker.html", **data)
@app.route('/tracker/<suuid:tracker>/Factorio')
@cache.memoize(timeout=60) # multisave is currently created at most every minute
def get_Factorio_multiworld_tracker(tracker: UUID):
data = _get_multiworld_tracker_data(tracker)
if not data:
abort(404)
data["inventory"] = _get_inventory_data(data)
data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Factorio")
return render_template("multiFactorioTracker.html", **data)
@app.route('/tracker/<suuid:tracker>/A Link to the Past')
@cache.memoize(timeout=60) # multisave is currently created at most every minute @cache.memoize(timeout=60) # multisave is currently created at most every minute
def get_LttP_multiworld_tracker(tracker: UUID): def get_LttP_multiworld_tracker(tracker: UUID):
room: Room = Room.get(tracker=tracker) room: Room = Room.get(tracker=tracker)
@ -1518,3 +1563,8 @@ game_specific_trackers: typing.Dict[str, typing.Callable] = {
"Super Metroid": __renderSuperMetroidTracker, "Super Metroid": __renderSuperMetroidTracker,
"Starcraft 2 Wings of Liberty": __renderSC2WoLTracker "Starcraft 2 Wings of Liberty": __renderSC2WoLTracker
} }
multi_trackers: typing.Dict[str, typing.Callable] = {
"A Link to the Past": get_LttP_multiworld_tracker,
"Factorio": get_Factorio_multiworld_tracker,
}