diff --git a/WebHostLib/templates/multiFactorioTracker.html b/WebHostLib/templates/multiFactorioTracker.html
index e8fa7b15..faca756e 100644
--- a/WebHostLib/templates/multiFactorioTracker.html
+++ b/WebHostLib/templates/multiFactorioTracker.html
@@ -27,14 +27,14 @@
{% endblock %}
{% block custom_table_row scoped %}
{% if games[player] == "Factorio" %}
-{% set player_inventory = inventory[team][player] %}
-{% set prog_science = player_inventory[custom_items["progressive-science-pack"]] %}
-
{% if player_inventory[custom_items["logistic-science-pack"]] or prog_science %}✔{% endif %} |
-{% if player_inventory[custom_items["military-science-pack"]] or prog_science > 1%}✔{% endif %} |
-{% if player_inventory[custom_items["chemical-science-pack"]] or prog_science > 2%}✔{% endif %} |
-{% if player_inventory[custom_items["production-science-pack"]] or prog_science > 3%}✔{% endif %} |
-{% if player_inventory[custom_items["utility-science-pack"]] or prog_science > 4%}✔{% endif %} |
-{% if player_inventory[custom_items["space-science-pack"]] or prog_science > 5%}✔{% endif %} |
+{% set player_inventory = named_inventory[team][player] %}
+{% set prog_science = player_inventory["progressive-science-pack"] %}
+{% if player_inventory["logistic-science-pack"] or prog_science %}✔{% endif %} |
+{% if player_inventory["military-science-pack"] or prog_science > 1%}✔{% endif %} |
+{% if player_inventory["chemical-science-pack"] or prog_science > 2%}✔{% endif %} |
+{% if player_inventory["production-science-pack"] or prog_science > 3%}✔{% endif %} |
+{% if player_inventory["utility-science-pack"] or prog_science > 4%}✔{% endif %} |
+{% if player_inventory["space-science-pack"] or prog_science > 5%}✔{% endif %} |
{% else %}
❌ |
❌ |
diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py
index 80ccc720..5b89495e 100644
--- a/WebHostLib/tracker.py
+++ b/WebHostLib/tracker.py
@@ -11,7 +11,7 @@ from werkzeug.exceptions import abort
from MultiServer import Context, get_saving_second
from NetUtils import SlotType, NetworkSlot
from Utils import restricted_loads
-from worlds import lookup_any_item_id_to_name, lookup_any_location_id_to_name, network_data_package
+from worlds import lookup_any_item_id_to_name, lookup_any_location_id_to_name, network_data_package, games
from worlds.alttp import Items
from . import app, cache
from .models import GameDataPackage, Room
@@ -1423,9 +1423,12 @@ def _get_multiworld_tracker_data(tracker: UUID) -> typing.Optional[typing.Dict[s
)
-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()}
+def _get_inventory_data(data: typing.Dict[str, typing.Any]) \
+ -> typing.Dict[int, typing.Dict[int, typing.Dict[int, int]]]:
+ inventory: typing.Dict[int, typing.Dict[int, typing.Dict[int, int]]] = {
+ teamnumber: {playernumber: collections.Counter() for playernumber in team_data}
+ for teamnumber, team_data in data["checks_done"].items()
+ }
groups = data["groups"]
@@ -1444,6 +1447,17 @@ def _get_inventory_data(data: typing.Dict[str, typing.Any]) -> typing.Dict[int,
return inventory
+def _get_named_inventory(inventory: typing.Dict[int, int], custom_items: typing.Dict[int, str] = None) \
+ -> typing.Dict[str, int]:
+ """slow"""
+ if custom_items:
+ mapping = collections.ChainMap(custom_items, lookup_any_item_id_to_name)
+ else:
+ mapping = lookup_any_item_id_to_name
+
+ return collections.Counter({mapping.get(item_id, None): count for item_id, count in inventory.items()})
+
+
@app.route('/tracker/')
@cache.memoize(timeout=60) # multisave is currently created at most every minute
def get_multiworld_tracker(tracker: UUID):
@@ -1455,18 +1469,22 @@ def get_multiworld_tracker(tracker: UUID):
return render_template("multiTracker.html", **data)
+if "Factorio" in games:
+ @app.route('/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)
-@app.route('/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["named_inventory"] = {team_id : {
+ player_id: _get_named_inventory(inventory, data["custom_items"])
+ for player_id, inventory in team_inventory.items()
+ } for team_id, team_inventory in data["inventory"].items()}
+ data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Factorio")
- data["inventory"] = _get_inventory_data(data)
- data["enabled_multiworld_trackers"] = get_enabled_multiworld_trackers(data["room"], "Factorio")
-
- return render_template("multiFactorioTracker.html", **data)
+ return render_template("multiFactorioTracker.html", **data)
@app.route('/tracker//A Link to the Past')
@@ -1596,5 +1614,7 @@ game_specific_trackers: typing.Dict[str, typing.Callable] = {
multi_trackers: typing.Dict[str, typing.Callable] = {
"A Link to the Past": get_LttP_multiworld_tracker,
- "Factorio": get_Factorio_multiworld_tracker,
}
+
+if "Factorio" in games:
+ multi_trackers["Factorio"] = get_Factorio_multiworld_tracker