From f96a7d1d7ea33670d6cd3ae257bf5c8d62a8a243 Mon Sep 17 00:00:00 2001 From: Chris Davoren Date: Sat, 2 Sep 2023 13:58:46 +1000 Subject: [PATCH] Added research writeback (not fully tested). --- sheditor.py | 56 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/sheditor.py b/sheditor.py index e92bfe5..22fa8df 100644 --- a/sheditor.py +++ b/sheditor.py @@ -77,12 +77,13 @@ class ResearchRequirement: name = row[1] workbench_items = None if row[2] != '-': - workbench_items = {} + workbench_items = [] wb_items = row[2].split(',') for wbi in wb_items: quantity = int(wbi[0]) 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 second_level_research = row[4] if row[4] != '-' else None 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(): console.print("{} : {} : {} : {}".format(k, v.name, v.first_level_research, v.second_level_research)) if v.workbench_items is not None: - for x, y in v.workbench_items.items(): - console.print("{} : {}".format(x, y)) + for item_set in v.workbench_items: + 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): self.id = id @@ -125,18 +126,19 @@ class ResearchItem: # Do not forgot the which appears to be related to the state of research workbench pre-research requirements 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: - def __init__(self, done, stage, blocksdone): + def __init__(self, done, stage, blocksdone, workbench_items): self.done = done self.stage = int(stage) self.blocksdone = blocksdone + self.workbench_items = workbench_items 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) @@ -490,7 +492,16 @@ class GameData: blocksdone = None if blocksdone_tag is not None: 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) ri = ResearchItem(techId, len(stages), active_stage, paused, stages, item) self.research.append(ri) @@ -572,8 +583,29 @@ class GameData: area_tag.append(new_tag) # Step 3 - Update research - for research_item in self.research: - pass + console.print('Updating research') + 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): item_name = self.item_database.get_name_from_code(item_code) @@ -677,7 +709,6 @@ class GameData: ship.redistribute_storage() def list_research(self): - return for research in sorted(self.research, key=lambda item: item.id): console.print(research) for ris in research.stage_states: @@ -806,7 +837,7 @@ def main(): if args.list_research: console.print("Listing research status...") - # game_data.list_research() + game_data.list_research() console.print(len(ResearchRequirement.requirements)) if args.consolidate_weapons: @@ -841,7 +872,6 @@ def main(): # Delete XML header - game doesn't have it sansfirstline = '\n'.join(text.split('\n')[1:]) - f = open(filename, 'w') f.write(sansfirstline) f.close()