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:
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,
"roms": rom_names,
"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],
"server_options": get_options()["server_options"],
"er_hint_data": er_hint_data,
"precollected_items": precollected_items
}).encode("utf-8"), 9)
with open(output_path('%s.multidata' % outfilebase), 'wb') as f:

View File

@ -3,6 +3,7 @@ import collections
from flask import render_template
from werkzeug.exceptions import abort
import datetime
import logging
import Items
from WebHost import app, cache, Room
@ -87,8 +88,17 @@ links = {"Bow": "Progressive Bow",
"Power Glove": "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")}
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",
"Hookshot", "Magic Mirror", "Flute",
@ -143,6 +153,13 @@ for item in tracking_names:
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>')
@cache.memoize(timeout=60) # update every minute
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}
for playernumber in range(1, len(team) + 1)}
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", {}):
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:
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]["Total"] += 1
for (team, player), game_state in room.multisave.get("client_game_state", []):