Completed writeout of class-based system.

This commit is contained in:
Chris Davoren 2023-06-30 14:59:23 +10:00
parent b00912b1e1
commit 23b6a09b2e
3 changed files with 23083 additions and 23 deletions

22957
analysis/game2.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@ import sys, argparse
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
char_skills = { char_skills = {
1 : "Piloting", 1 : "Piloting", # Likely deprecated
2 : "Mining", 2 : "Mining",
3 : "Botany", 3 : "Botany",
4 : "Construction", 4 : "Construction",
@ -12,10 +12,13 @@ char_skills = {
8 : "Shielding", 8 : "Shielding",
9 : "Operations", 9 : "Operations",
10 : "Weapons", 10 : "Weapons",
12 : "Logistics", 11 : "Unknown-1",
13 : "Unknown", 12 : "Logistics", # All characters seem to have this but it doesn't show up in the UI
13 : "Unknown-2-enigma", # All characters seem to have this skill but what is it for?
14 : "Navigation", 14 : "Navigation",
15 : "Unknown-3",
16 : "Research", 16 : "Research",
22 : "Piloting", # Appears to be the new piloting code?
} }
char_attributes = { char_attributes = {
@ -99,32 +102,53 @@ class StorageArea:
class Character: class Character:
# Will need an internal sense of what the codes mean for string output purposes
def __init__(self, name, tag): def __init__(self, name, tag):
self.name = name self.name = name
self.tag = tag self.tag = tag
self.skills = {} self.skills = []
self.attributes = {} self.attributes = []
def set_skills(self, skill_list): def set_skills(self, skill_list):
# Expected format is a list of dictionaries
# Each dictionary has keys id, mxn, exp, expd, level
self.skills = skill_list self.skills = skill_list
def set_attributes(self, attribute_list): def set_attributes(self, attribute_list):
# Expected format is a list of dictionaries
# Each dictionary has keys id, points
self.attributes = attribute_list self.attributes = attribute_list
def maximize_skills(self): def maximize_skills(self):
pass # Max LEVEL is 5
# Max MXN should be 8 for some reason
# Exp* keys are probably for a future experience system but I don't know how they work so I won't touch them
for skill in self.skills:
skill['level'] = 5
skill['mxn'] = 8
def maximize_attributes(self): def maximize_attributes(self):
pass # Max POINTS is 6
for attribute in self.attributes:
attribute['points'] = 6
def clone(self, new_name): def clone(self, new_name):
# How to deep copy the skills/attributes appropriately?
pass pass
def print_summary(self):
print("Name: {}".format(self.name))
print("Skills:")
for skill in self.skills:
print("{} : {}".format(char_skills[skill['id']], skill['level']))
print()
print("Attributes:")
for attribute in self.attributes:
print("{} : {}".format(char_attributes[attribute['id']], attribute['points']))
def __repr__(self): def __repr__(self):
return "{} - {} - {}".format(self.name, repr(self.skills), repr(self.attributes)) return "{} - Skills: {} - Attributes: {}".format(self.name, repr(self.skills), repr(self.attributes))
class Ship: class Ship:
@ -147,8 +171,9 @@ class Ship:
class Player: class Player:
def __init__(self, currency): def __init__(self, currency, tag):
self.currency = currency self.currency = currency
self.tag = tag
class GameData: class GameData:
@ -164,7 +189,7 @@ class GameData:
# Step 1 - Player data # Step 1 - Player data
char_tag = self.soup.find('playerBank') char_tag = self.soup.find('playerBank')
currency = char_tag['ca'] currency = char_tag['ca']
self.player = Player(currency) self.player = Player(currency, char_tag)
# Step 2 - Ship data # Step 2 - Ship data
ship_tags = self.soup.find_all('ship') ship_tags = self.soup.find_all('ship')
@ -181,7 +206,7 @@ class GameData:
# Step 3 - Storage area data # Step 3 - Storage area data
for inv_tag in ship_tag.find_all('feat', eatAllowed=True): for inv_tag in ship_tag.find_all('feat', eatAllowed=True):
storage_area = StorageArea(inv_tag) storage_area = StorageArea(inv_tag.find('inv'))
ship.add_storage_area(storage_area) ship.add_storage_area(storage_area)
# Items within storage area # Items within storage area
for s_tag in inv_tag.find_all('s'): for s_tag in inv_tag.find_all('s'):
@ -230,20 +255,51 @@ class GameData:
attributes.append(attribute_dict) attributes.append(attribute_dict)
character.set_attributes(attributes) character.set_attributes(attributes)
"""
Need to find player
Need to find ships
Within ships, need to find:
- Storage areas, then items within storage areas
- Characters, then names, skills, attributes etc
"""
pass
def writeback(self): def writeback(self):
def replace_id(dict, old_key, new_key):
dict_copy = dict.copy()
dict_copy[new_key] = dict_copy[old_key]
del dict_copy[old_key]
return dict_copy
# Purpose of this mission is to take all our data and replace the relevant parts of the soup # Purpose of this mission is to take all our data and replace the relevant parts of the soup
# Suspect this may be harder than it sounds - original saved game editor more or less deleted and rewrote some sections (e.g. item lists) # Suspect this may be harder than it sounds - original saved game editor more or less deleted and rewrote some sections (e.g. item lists)
pass
# Shouldn't need to update player tag as this will be done directly
# Only need to update things with structure / lists
"""
Step 1 - Update characters
Step 2 - Update storage areas
"""
# Step 1 - Update characters
# Names etc will be done automatically - just need to reconstruct skills and attributes
for ship in self.ships:
for character in ship.characters:
skill_tag = character.tag.find('skills')
skill_tag.clear()
for skill in character.skills:
skill_copy = replace_id(skill, 'id', 'sk')
new_tag = self.soup.new_tag('s', attrs=skill_copy)
skill_tag.append(new_tag)
attribute_tag = character.tag.find('attr')
attribute_tag.clear()
for attribute in character.attributes:
new_tag = self.soup.new_tag('a', attrs=attribute)
attribute_tag.append(new_tag)
for storage_area in ship.storage_areas:
area_tag = storage_area.tag
area_tag.clear()
for item in storage_area.items:
tag_dict = { 'elementaryId' : item.code, 'inStorage' : item.quantity, 'onTheWayIn' : 0, 'onTheWayOut' : 0}
new_tag = self.soup.new_tag('s', attrs=tag_dict)
area_tag.append(new_tag)
def print_summary(self): def print_summary(self):
print("Start game summary:") print("Start game summary:")
@ -258,7 +314,7 @@ class GameData:
print(" Has {} character(s):".format(len(ship.characters))) print(" Has {} character(s):".format(len(ship.characters)))
for char in ship.characters: for char in ship.characters:
print(" {}".format(char.name)) print(" {}".format(char.name))
print(" {}".format(repr(char))) char.print_summary()
def characters(soup): def characters(soup):
@ -442,6 +498,7 @@ def main():
game_data = GameData(soup, item_code_database) game_data = GameData(soup, item_code_database)
game_data.populate() game_data.populate()
game_data.print_summary() game_data.print_summary()
game_data.writeback()
text = soup.prettify() text = soup.prettify()
# Delete XML header - game doesn't have it # Delete XML header - game doesn't have it

46
replacetest.py Normal file
View File

@ -0,0 +1,46 @@
from bs4 import BeautifulSoup
markup = """
<!DOCTYPE>
<html>
<head><title>Example</title></head>
<body>
<div id="parent">
<p>
This is child of div with id = "parent".
<span>Child of "P"</span>
</p>
<div>
Another Child of div with id = "parent".
</div>
</div>
<p>
Piyush
</p>
</body>
</html>
"""
# parsering string to HTML
soup = BeautifulSoup(markup, 'html.parser')
# finding tag whose child to be deleted
div_bs4 = soup.find('div')
print(div_bs4)
print('-------')
# delete the child element
div_bs4.clear()
new_tag = soup.new_tag('s', attrs={'sk' : 2, 'level' : 5})
div_bs4.append(new_tag)
print(div_bs4)