Added research writeback (not fully tested).

This commit is contained in:
Chris Davoren 2023-09-02 13:58:46 +10:00
parent e0ffb4aa7b
commit f96a7d1d7e
1 changed files with 43 additions and 13 deletions

View File

@ -77,12 +77,13 @@ class ResearchRequirement:
name = row[1] name = row[1]
workbench_items = None workbench_items = None
if row[2] != '-': if row[2] != '-':
workbench_items = {} workbench_items = []
wb_items = row[2].split(',') wb_items = row[2].split(',')
for wbi in wb_items: for wbi in wb_items:
quantity = int(wbi[0]) quantity = int(wbi[0])
code = int(wbi[2:]) code = int(wbi[2:])
workbench_items[Item.get_name_from_code(code)] = quantity # Items are expected to be in a specific order by the game
workbench_items.append((code, quantity))
first_level_research = row[3] if row[3] != '-' else None first_level_research = row[3] if row[3] != '-' else None
second_level_research = row[4] if row[4] != '-' else None second_level_research = row[4] if row[4] != '-' else None
req = ResearchRequirement(id, name, workbench_items, first_level_research, second_level_research) req = ResearchRequirement(id, name, workbench_items, first_level_research, second_level_research)
@ -97,8 +98,8 @@ class ResearchRequirement:
for k, v in cls.requirements.items(): for k, v in cls.requirements.items():
console.print("{} : {} : {} : {}".format(k, v.name, v.first_level_research, v.second_level_research)) console.print("{} : {} : {} : {}".format(k, v.name, v.first_level_research, v.second_level_research))
if v.workbench_items is not None: if v.workbench_items is not None:
for x, y in v.workbench_items.items(): for item_set in v.workbench_items:
console.print("{} : {}".format(x, y)) console.print("{} : {}".format(Item.get_name_from_code(item_set[0]), item_set[1]))
def __init__(self, id, name, workbench_items, first_level_research, second_level_research): def __init__(self, id, name, workbench_items, first_level_research, second_level_research):
self.id = id self.id = id
@ -125,18 +126,19 @@ class ResearchItem:
# Do not forgot the <benchTaskStates> which appears to be related to the state of research workbench pre-research requirements # Do not forgot the <benchTaskStates> which appears to be related to the state of research workbench pre-research requirements
def __str__(self): def __str__(self):
return "{} : {} : {} : {}".format(self.id, self.name, self.num_stages, self.active_stage) return "{} : {} : {} : {} : {}".format(self.id, self.name, self.paused, self.num_stages, self.active_stage)
class ResearchItemState: class ResearchItemState:
def __init__(self, done, stage, blocksdone): def __init__(self, done, stage, blocksdone, workbench_items):
self.done = done self.done = done
self.stage = int(stage) self.stage = int(stage)
self.blocksdone = blocksdone self.blocksdone = blocksdone
self.workbench_items = workbench_items
def __str__(self): def __str__(self):
return " {} : {} : {}".format(self.done, self.stage, self.blocksdone) return " {} : {} : {} : {}".format(self.done, self.stage, self.blocksdone, self.workbench_items)
# A single storage area, with a list of contents (Items) # A single storage area, with a list of contents (Items)
@ -490,7 +492,16 @@ class GameData:
blocksdone = None blocksdone = None
if blocksdone_tag is not None: if blocksdone_tag is not None:
blocksdone = [int(blocksdone_tag['level1']), int(blocksdone_tag['level2']), int(blocksdone_tag['level3'])] blocksdone = [int(blocksdone_tag['level1']), int(blocksdone_tag['level2']), int(blocksdone_tag['level3'])]
ris = ResearchItemState(done, stage_no, blocksdone) workbench_items = None
workbench_items_tag = stage.find('benchTaskStates')
if workbench_items_tag is not None:
workbench_items = []
wbis = workbench_items_tag.find_all('l')
for wbi in sorted(wbis, key=lambda x: int(x['taskId'])):
# console.print(wbi)
workbench_items.append(wbi['done'])
ris = ResearchItemState(done, stage_no, blocksdone, workbench_items)
stages.append(ris) stages.append(ris)
ri = ResearchItem(techId, len(stages), active_stage, paused, stages, item) ri = ResearchItem(techId, len(stages), active_stage, paused, stages, item)
self.research.append(ri) self.research.append(ri)
@ -572,8 +583,29 @@ class GameData:
area_tag.append(new_tag) area_tag.append(new_tag)
# Step 3 - Update research # Step 3 - Update research
for research_item in self.research: console.print('Updating research')
pass top_research_tag = self.soup.find('research', treeId=True)
top_research_tag.clear()
for research_item in sorted(self.research, key=lambda x:x.id):
base_tag = self.soup.new_tag('l', attrs={'techId':research_item.id, 'paused':research_item.paused, 'activeStageIndex':research_item.active_stage})
stage_states_tag = self.soup.new_tag('stageStates')
base_tag.append(stage_states_tag)
console.print(len(research_item.stage_states))
for i, stage_state in enumerate(research_item.stage_states):
state_tag = self.soup.new_tag('l', attrs={'stage':i+1, 'done':stage_state.done})
stage_states_tag.append(state_tag)
if stage_state.blocksdone is not None:
blocks_tag = self.soup.new_tag('blocksDone', attrs={'level1':stage_state.blocksdone[0], 'level2':stage_state.blocksdone[1], 'level3':stage_state.blocksdone[2]})
state_tag.append(blocks_tag)
if stage_state.workbench_items is not None:
bench_task_tag = self.soup.new_tag('benchTaskStates')
for x, item in enumerate(stage_state.workbench_items):
# console.print(item)
item_tag = self.soup.new_tag('l', attrs={'taskId':x+1, 'scheduled':'0', 'done':item})
bench_task_tag.append(item_tag)
state_tag.append(bench_task_tag)
console.print(base_tag)
top_research_tag.append(base_tag)
def add_item(self, item_code, item_quantity): def add_item(self, item_code, item_quantity):
item_name = self.item_database.get_name_from_code(item_code) item_name = self.item_database.get_name_from_code(item_code)
@ -677,7 +709,6 @@ class GameData:
ship.redistribute_storage() ship.redistribute_storage()
def list_research(self): def list_research(self):
return
for research in sorted(self.research, key=lambda item: item.id): for research in sorted(self.research, key=lambda item: item.id):
console.print(research) console.print(research)
for ris in research.stage_states: for ris in research.stage_states:
@ -806,7 +837,7 @@ def main():
if args.list_research: if args.list_research:
console.print("Listing research status...") console.print("Listing research status...")
# game_data.list_research() game_data.list_research()
console.print(len(ResearchRequirement.requirements)) console.print(len(ResearchRequirement.requirements))
if args.consolidate_weapons: if args.consolidate_weapons:
@ -841,7 +872,6 @@ def main():
# Delete XML header - game doesn't have it # Delete XML header - game doesn't have it
sansfirstline = '\n'.join(text.split('\n')[1:]) sansfirstline = '\n'.join(text.split('\n')[1:])
f = open(filename, 'w') f = open(filename, 'w')
f.write(sansfirstline) f.write(sansfirstline)
f.close() f.close()