Properly implemented cargo rebalancing.

This commit is contained in:
Chris Davoren 2023-09-01 07:23:53 +10:00
parent f3dad818b2
commit aa5515701d
3 changed files with 93 additions and 32 deletions

View File

@ -5,25 +5,25 @@
2539 Botany 2539 Botany
2559 Medical Bed 2559 Medical Bed
2563 Arcade Machine 2563 Arcade Machine
2564 Unknown 2564 Jukebox
2565 Solar Panel 2565 Solar Panel
2566 X2 Power Generator 2566 X2 Power Generator
2567 Unknown 2567 X3 Power Generator
2568 Power Capacity Node 2568 Power Capacity Node
2569 Item Fabricator 2569 Item Fabricator
2570 Unknown 2570 Microweaver
2571 Assembler 2571 Assembler
2572 Unknown 2572 Energy Refinery
2573 Unknown 2573 Chemical Refinery
2575 Unknown 2575 Advanced Assember
2576 Unknown 2576 Composter
2577 Unknown 2577 Hypersleep Chamber
2589 Weapons Console 2589 Weapons Console
2590 Shields Console 2590 Shields Console
2591 Unknown 2591 Rocket Turret
2592 Unknown 2592 Energy Turret
2594 X1 Power Generator 2594 X1 Power Generator
2595 Unknown 2595 X1 Hyperdrive
2596 Unknown 2596 Unknown
2597 Unknown 2597 Unknown
2598 Unknown 2598 Unknown
@ -32,24 +32,24 @@
2601 Targeting Jammer 2601 Targeting Jammer
2602 Unknown 2602 Unknown
2604 Unknown 2604 Unknown
2605 Unknown 2605 Logistics Robot Station
2606 Unknown 2606 Plasma Weapons
2607 Unknown 2607 Unknown
2612 Metal Refinery 2612 Metal Refinery
2613 Unknown 2613 Unknown
2614 Unknown 2614 Unknown
2617 Unknown 2617 Unknown
2619 Unknown 2619 Fibres
2622 Unknown 2622 Bulletproof Vest
2623 Unknown 2623 Autopsy Table
2626 Unknown 2626 Advanced Nutrition
2628 Unknown 2628 Artificial Meat
2629 Alcoholic Bar Machine 2629 Alcoholic Bar Machine
2630 Unknown 2630 Grains and Hops
2694 Optotronics Fabricator 2694 Optotronics Fabricator
2847 Unknown 2847 Unknown
3024 Unknown 3024 Laser Weapons
3025 Unknown 3025 Salvage Robot Station
3114 Unknown 3114 Unknown
3115 Research Workbench 3115 Research Workbench
3116 Unknown 3116 Unknown
@ -57,16 +57,16 @@
3122 Operations Console 3122 Operations Console
3124 Unknown 3124 Unknown
3125 Unknown 3125 Unknown
3127 Unknown 3127 Robotics 01
3128 Industry 01 3128 Industry 01
3129 Industry 02 3129 Industry 02
3130 Unknown 3130 Botany 02
3417 Unknown 3417 Armored Vest
3420 Unknown 3420 Unknown
3421 Unknown 3421 Unknown
3422 Unknown 3422 Unknown
3423 Unknown 3423 Unknown
3464 Unknown 3464 Sentry Gun X1
3704 Unknown 3704 Unknown
3705 Unknown 3705 Unknown
3706 Unknown 3706 Unknown

Can't render this file because it has a wrong number of fields in line 3.

View File

@ -78,12 +78,13 @@ class ResearchItem:
def get_name_from_code(cls, code): def get_name_from_code(cls, code):
return cls.research_ids.get(code, None) if cls.research_ids is not None else None return cls.research_ids.get(code, None) if cls.research_ids is not None else None
def __init__(self, id, active_stage, paused, states): def __init__(self, id, active_stage, paused, states, tag):
self.id = id self.id = id
self.name = ResearchItem.get_name_from_code(id) self.name = ResearchItem.get_name_from_code(id)
self.paused = paused self.paused = paused
self.active_stage = active_stage self.active_stage = active_stage
self.stage_states = states self.stage_states = states
self.tag = tag
def __str__(self): def __str__(self):
return "{} : {} : {}".format(self.id, self.name, self.active_stage) return "{} : {} : {}".format(self.id, self.name, self.active_stage)
@ -112,6 +113,9 @@ class StorageArea:
def add_item(self, item): def add_item(self, item):
self.items.append(item) self.items.append(item)
def get_capacity(self):
return storage_ids[self.type_id]['capacity']
# Returns how full the storage area is based on its contents # Returns how full the storage area is based on its contents
def get_total_occupancy(self): def get_total_occupancy(self):
total_quantity = 0 total_quantity = 0
@ -279,6 +283,53 @@ class Ship:
console.print("Total used: {}".format(total)) console.print("Total used: {}".format(total))
console.print("Total actual capacity: {}".format(area_capacity)) console.print("Total actual capacity: {}".format(area_capacity))
# Consolidate items
console.print("Consolidating items for {}".format(self.name))
unique_codes = []
new_items = []
for area in normal_storage_areas:
console.print("----- New storage area")
for item in area.items:
if item.code not in unique_codes:
unique_codes.append(item.code)
console.print("Considering item with code {}".format(item.code))
old_item_found = False
for new_item in new_items:
if new_item.code == item.code:
new_item.quantity += item.quantity
old_item_found = True
# console.print("Adding new item with code {}".format(item.code))
if old_item_found is False:
new_items.append(item)
console.print("Total number of new items: {}".format(len(new_items)))
console.print("Total number of unique codes: {}".format(len(unique_codes)))
new_amount = 0
for item in new_items:
new_amount += item.quantity
console.print(new_amount)
for area in normal_storage_areas:
area.items = []
for item in new_items:
console.print("{} : {} : {}".format(item.code, item.name, item.quantity))
min_occupancy = 2000
min_area = None
for area in normal_storage_areas:
if area.get_total_occupancy() < min_occupancy:
min_area = area
min_area.items.append(item)
item_number = 0
for area in normal_storage_areas:
for item in area.items:
item_number += 1
console.print("{} : {} : {}".format(item.code, item.name, item.quantity))
console.print("Item number: {}".format(item_number))
def consolidate_weapons(self): def consolidate_weapons(self):
normal_storage_areas = [sa for sa in self.storage_areas if sa.is_normal_storage] normal_storage_areas = [sa for sa in self.storage_areas if sa.is_normal_storage]
for area in normal_storage_areas: for area in normal_storage_areas:
@ -403,7 +454,7 @@ class GameData:
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) ris = ResearchItemState(done, stage_no, blocksdone)
stages.append(ris) stages.append(ris)
ri = ResearchItem(techId, active_stage, paused, stages) ri = ResearchItem(techId, active_stage, paused, stages, item)
self.research.append(ri) self.research.append(ri)
""" """
@ -579,9 +630,9 @@ class GameData:
def redistribute(self): def redistribute(self):
for ship in self.ships: for ship in self.ships:
if ship.owner != 'Player': if ship.owner != 'Player' or ship.state != 'Normal':
continue continue
console.print(ship.name) console.print(ship.name, ship.state)
ship.redistribute_storage() ship.redistribute_storage()
def list_research(self): def list_research(self):
@ -735,17 +786,17 @@ def main():
if edits_made: if edits_made:
if args.replace_original: if args.replace_original:
console.print('Renaming original file') console.print('Renaming original file')
filename = os.path.join(DEFAULT_SAVEGAMEPATH, args.filename, "save", "game")
datetime_suffix = datetime.datetime.now().strftime('%Y-%m-%d-%H%M_%S_%f') datetime_suffix = datetime.datetime.now().strftime('%Y-%m-%d-%H%M_%S_%f')
new_filename = args.filename + "-" + datetime_suffix new_filename = os.path.join(DEFAULT_SAVEGAMEPATH, args.filename, "save", "game" + '-' + datetime_suffix)
# console.print(datetime_suffix) # console.print(datetime_suffix)
# os.rename(args.filename, new_filename) os.rename(filename, new_filename)
console.print('Now rewriting game file with new information') console.print('Now rewriting game file with new information')
text = soup.prettify() text = soup.prettify()
# 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:])
filename = os.path.join(DEFAULT_SAVEGAMEPATH, args.filename, "save", "game")
f = open(filename, 'w') f = open(filename, 'w')
f.write(sansfirstline) f.write(sansfirstline)

10
weapons_list.txt Normal file
View File

@ -0,0 +1,10 @@
725 # Assault Rifle
728 # SMG
729 # Shotgun
760 # Five-Seven Pistol
3069 # Laser Rifle
3070 # Laser Pistol
3071 # Plasma Clustergun
3072 # Plasma Rifle
3383 # Bulletproof Vest
3384 # Armored Vest