track precollected items after first location check and add some non-progressive item handling

This commit is contained in:
Fabian Dill 2020-06-23 23:50:37 +02:00
parent 8c358a449b
commit 8367351c62
2 changed files with 28 additions and 1 deletions

View File

@ -253,6 +253,10 @@ def main(args, seed=None):
if lookup_vanilla_location_to_entrance[location.address] != main_entrance.name: if lookup_vanilla_location_to_entrance[location.address] != main_entrance.name:
er_hint_data[region.player][location.address] = main_entrance.name er_hint_data[region.player][location.address] = main_entrance.name
precollected_items = [[] for player in range(world.players)]
for item in world.precollected_items:
precollected_items[item.player - 1].append(item.code)
multidata = zlib.compress(json.dumps({"names": parsed_names, multidata = zlib.compress(json.dumps({"names": parsed_names,
"roms": rom_names, "roms": rom_names,
"remote_items": [player for player in range(1, world.players + 1) if "remote_items": [player for player in range(1, world.players + 1) if
@ -263,6 +267,7 @@ def main(args, seed=None):
type(location.address) is int], type(location.address) is int],
"server_options": get_options()["server_options"], "server_options": get_options()["server_options"],
"er_hint_data": er_hint_data, "er_hint_data": er_hint_data,
"precollected_items": precollected_items
}).encode("utf-8"), 9) }).encode("utf-8"), 9)
with open(output_path('%s.multidata' % outfilebase), 'wb') as f: with open(output_path('%s.multidata' % outfilebase), 'wb') as f:

View File

@ -3,6 +3,7 @@ import collections
from flask import render_template from flask import render_template
from werkzeug.exceptions import abort from werkzeug.exceptions import abort
import datetime import datetime
import logging
import Items import Items
from WebHost import app, cache, Room from WebHost import app, cache, Room
@ -87,8 +88,17 @@ links = {"Bow": "Progressive Bow",
"Power Glove": "Progressive Glove", "Power Glove": "Progressive Glove",
"Titans Mitts": "Progressive Glove" "Titans Mitts": "Progressive Glove"
} }
levels = {"Fighter Sword": 1,
"Master Sword": 2,
"Tempered Sword": 3,
"Golden Sword": 4,
"Power Glove": 1,
"Titans Mitts": 2}
multi_items = {get_id(name) for name in ("Progressive Sword", "Progressive Bow", "Bottle", "Progressive Glove")} multi_items = {get_id(name) for name in ("Progressive Sword", "Progressive Bow", "Bottle", "Progressive Glove")}
links = {get_id(key): get_id(value) for key, value in links.items()} links = {get_id(key): get_id(value) for key, value in links.items()}
levels = {get_id(key): value for key, value in levels.items()}
tracking_names = ["Progressive Sword", "Progressive Bow", "Book of Mudora", "Hammer", tracking_names = ["Progressive Sword", "Progressive Bow", "Book of Mudora", "Hammer",
"Hookshot", "Magic Mirror", "Flute", "Hookshot", "Magic Mirror", "Flute",
@ -143,6 +153,13 @@ for item in tracking_names:
from MultiServer import get_item_name_from_id from MultiServer import get_item_name_from_id
def attribute_item(inventory, team, recipient, item):
target_item = links.get(item, item)
if item in levels: # non-progressive
inventory[team][recipient][target_item] = max(inventory[team][recipient][target_item], levels[item])
else:
inventory[team][recipient][target_item] += 1
@app.route('/tracker/<int:room>') @app.route('/tracker/<int:room>')
@cache.memoize(timeout=60) # update every minute @cache.memoize(timeout=60) # update every minute
def get_tracker(room: int): def get_tracker(room: int):
@ -159,11 +176,16 @@ def get_tracker(room: int):
checks_done = {teamnumber: {playernumber: {loc_name: 0 for loc_name in default_locations} checks_done = {teamnumber: {playernumber: {loc_name: 0 for loc_name in default_locations}
for playernumber in range(1, len(team) + 1)} for playernumber in range(1, len(team) + 1)}
for teamnumber, team in enumerate(multidata["names"])} for teamnumber, team in enumerate(multidata["names"])}
precollected_items = room.seed.multidata.get("precollected_items", None)
for (team, player), locations_checked in room.multisave.get("location_checks", {}): for (team, player), locations_checked in room.multisave.get("location_checks", {}):
if precollected_items:
precollected = precollected_items[player - 1]
for item_id in precollected:
attribute_item(inventory, team, player, item_id)
for location in locations_checked: for location in locations_checked:
item, recipient = locations[location, player] item, recipient = locations[location, player]
inventory[team][recipient][links.get(item, item)] += 1 attribute_item(inventory, team, recipient, item)
checks_done[team][player][location_to_area[location]] += 1 checks_done[team][player][location_to_area[location]] += 1
checks_done[team][player]["Total"] += 1 checks_done[team][player]["Total"] += 1
for (team, player), game_state in room.multisave.get("client_game_state", []): for (team, player), game_state in room.multisave.get("client_game_state", []):