Multiple functions added.
This commit is contained in:
parent
57a9602856
commit
a99f66bbbe
|
@ -0,0 +1,6 @@
|
||||||
|
python sheditor.py %1 --replace-original --add-item-set pack_building.txt
|
||||||
|
python sheditor.py %1 --replace-original --add-item-set pack_food.txt
|
||||||
|
python sheditor.py %1 --replace-original --add-item-set pack_medical.txt
|
||||||
|
python sheditor.py %1 --replace-original --add-item-set pack_trade.txt
|
||||||
|
python sheditor.py %1 --replace-original --add-item-set pack_weapons_basic.txt
|
||||||
|
python sheditor.py %1 --replace-original --add-item-set pack_weapons_advanced.txt
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Advanced weapons pack
|
||||||
|
760 10 # Five-seven pistols
|
||||||
|
3069 10 # Laser Rifle
|
||||||
|
3070 10 # Laser Pistol
|
||||||
|
3071 10 # Plasma Clustergun
|
||||||
|
3072 10 # Plasma Rifle
|
||||||
|
3384 10 # Armored Vest
|
41
sheditor.py
41
sheditor.py
|
@ -7,6 +7,8 @@ from bs4 import BeautifulSoup
|
||||||
|
|
||||||
import rich.console
|
import rich.console
|
||||||
|
|
||||||
|
DEFAULT_SAVEGAMEPATH = "c:\\Program Files (x86)\\GOG Galaxy\\Games\\SpaceHaven\\savegames\\"
|
||||||
|
|
||||||
# Only "normal storage" is used to insert requested items
|
# Only "normal storage" is used to insert requested items
|
||||||
normal_storage_ids = [82, 632]
|
normal_storage_ids = [82, 632]
|
||||||
|
|
||||||
|
@ -146,7 +148,7 @@ class Character:
|
||||||
# Max MXN should be 8 for some reason
|
# 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
|
# 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:
|
for skill in self.skills:
|
||||||
skill['level'] = 5
|
skill['level'] = 7
|
||||||
skill['mxn'] = 8
|
skill['mxn'] = 8
|
||||||
|
|
||||||
def maximize_attributes(self):
|
def maximize_attributes(self):
|
||||||
|
@ -156,6 +158,7 @@ class Character:
|
||||||
|
|
||||||
def clone(self, new_name):
|
def clone(self, new_name):
|
||||||
# How to deep copy the skills/attributes appropriately?
|
# How to deep copy the skills/attributes appropriately?
|
||||||
|
print("Cloning character {}".format(self.name))
|
||||||
new_char = Character(new_name, copy.copy(self.tag))
|
new_char = Character(new_name, copy.copy(self.tag))
|
||||||
new_char.is_clone = True
|
new_char.is_clone = True
|
||||||
new_char.tag['name'] = new_name
|
new_char.tag['name'] = new_name
|
||||||
|
@ -214,6 +217,13 @@ class Ship:
|
||||||
min_occupancy = min_storage_area.get_total_occupancy()
|
min_occupancy = min_storage_area.get_total_occupancy()
|
||||||
min_storage_area.add_item(item)
|
min_storage_area.add_item(item)
|
||||||
|
|
||||||
|
def redistribute_storage(self):
|
||||||
|
normal_storage_areas = [sa for sa in self.storage_areas if sa.is_normal_storage]
|
||||||
|
total = 0
|
||||||
|
for area in normal_storage_areas:
|
||||||
|
total += area.get_total_occupancy()
|
||||||
|
print(total)
|
||||||
|
|
||||||
|
|
||||||
class Player:
|
class Player:
|
||||||
|
|
||||||
|
@ -224,11 +234,12 @@ class Player:
|
||||||
|
|
||||||
class GameData:
|
class GameData:
|
||||||
|
|
||||||
def __init__(self, soup):
|
def __init__(self, soup, item_database):
|
||||||
self.player = None
|
self.player = None
|
||||||
self.ships = []
|
self.ships = []
|
||||||
|
|
||||||
self.soup = soup
|
self.soup = soup
|
||||||
|
self.item_database = item_database
|
||||||
|
|
||||||
def populate(self):
|
def populate(self):
|
||||||
# Step 1 - Player data
|
# Step 1 - Player data
|
||||||
|
@ -335,8 +346,9 @@ class GameData:
|
||||||
for ship in self.ships:
|
for ship in self.ships:
|
||||||
for character in ship.characters:
|
for character in ship.characters:
|
||||||
# Cloned character tags have to be added to the list
|
# Cloned character tags have to be added to the list
|
||||||
|
print('Doing chars...')
|
||||||
if character.is_clone:
|
if character.is_clone:
|
||||||
console.print("ADDING CLONED CHARACTER")
|
print("ADDING CLONED CHARACTER")
|
||||||
charlist_tag = ship.tag.find('characters')
|
charlist_tag = ship.tag.find('characters')
|
||||||
charlist_tag.append(character.tag)
|
charlist_tag.append(character.tag)
|
||||||
|
|
||||||
|
@ -380,9 +392,12 @@ class GameData:
|
||||||
self.player.currency += amount
|
self.player.currency += amount
|
||||||
|
|
||||||
def clone_character(self, character_name, new_name):
|
def clone_character(self, character_name, new_name):
|
||||||
|
print("Clone char method called")
|
||||||
|
print("Warning names are case sensitive!")
|
||||||
for ship in self.ships:
|
for ship in self.ships:
|
||||||
for character in ship.characters:
|
for character in ship.characters:
|
||||||
if character.name == character_name:
|
if character.name == character_name:
|
||||||
|
print("Found char to clone")
|
||||||
new_char = character.clone(new_name)
|
new_char = character.clone(new_name)
|
||||||
ship.characters.append(new_char)
|
ship.characters.append(new_char)
|
||||||
return
|
return
|
||||||
|
@ -451,6 +466,10 @@ class GameData:
|
||||||
console.print(" {}".format(char.name))
|
console.print(" {}".format(char.name))
|
||||||
# char.print_summary()
|
# char.print_summary()
|
||||||
|
|
||||||
|
def redistribute(self):
|
||||||
|
for ship in self.ships:
|
||||||
|
ship.redistribute_storage()
|
||||||
|
|
||||||
|
|
||||||
def parse_item_file(filename):
|
def parse_item_file(filename):
|
||||||
|
|
||||||
|
@ -481,6 +500,7 @@ def main():
|
||||||
parser.add_argument('--add-item-set', required=False, type=str, nargs=1, metavar='PACK_FILENAME', help="Takes a file containing a list of item codes and quantities (whitespace separated) and adds all of these to player storage")
|
parser.add_argument('--add-item-set', required=False, type=str, nargs=1, metavar='PACK_FILENAME', help="Takes a file containing a list of item codes and quantities (whitespace separated) and adds all of these to player storage")
|
||||||
parser.add_argument('--detailed-items', required=False, action='store_true', help='Print a detailed item listing from player inventory')
|
parser.add_argument('--detailed-items', required=False, action='store_true', help='Print a detailed item listing from player inventory')
|
||||||
parser.add_argument('--detailed-chars', required=False, action='store_true', help='Print a comprehensive listing of player character details')
|
parser.add_argument('--detailed-chars', required=False, action='store_true', help='Print a comprehensive listing of player character details')
|
||||||
|
parser.add_argument('--redistribute', required=False, action='store_true', help='Redistribute internal storage')
|
||||||
parser.add_argument('--replace-original', required=False, action='store_true', help='Replace original file instead of creating edited alternative. Renames original for backup, but USE WITH CAUTION')
|
parser.add_argument('--replace-original', required=False, action='store_true', help='Replace original file instead of creating edited alternative. Renames original for backup, but USE WITH CAUTION')
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
@ -489,7 +509,7 @@ def main():
|
||||||
console.print("--- Space Haven Saved Game Inspector ---")
|
console.print("--- Space Haven Saved Game Inspector ---")
|
||||||
console.print()
|
console.print()
|
||||||
|
|
||||||
filename = args.filename
|
filename = os.path.join(DEFAULT_SAVEGAMEPATH, args.filename, "save", "game")
|
||||||
# console.print(filename)
|
# console.print(filename)
|
||||||
|
|
||||||
full_text = ""
|
full_text = ""
|
||||||
|
@ -508,7 +528,7 @@ def main():
|
||||||
console.print("Character code database successfully loaded.")
|
console.print("Character code database successfully loaded.")
|
||||||
console.print()
|
console.print()
|
||||||
|
|
||||||
game_data = GameData(soup)
|
game_data = GameData(soup, Item)
|
||||||
game_data.populate()
|
game_data.populate()
|
||||||
|
|
||||||
edits_made = False
|
edits_made = False
|
||||||
|
@ -516,6 +536,7 @@ def main():
|
||||||
if args.buff_chars:
|
if args.buff_chars:
|
||||||
game_data.buff_characters()
|
game_data.buff_characters()
|
||||||
edits_made = True
|
edits_made = True
|
||||||
|
print("Buffed chars")
|
||||||
|
|
||||||
if args.add_item:
|
if args.add_item:
|
||||||
game_data.add_item(args.add_item[0], args.add_item[1])
|
game_data.add_item(args.add_item[0], args.add_item[1])
|
||||||
|
@ -529,6 +550,7 @@ def main():
|
||||||
game_data.print_summary()
|
game_data.print_summary()
|
||||||
|
|
||||||
if args.clone_character:
|
if args.clone_character:
|
||||||
|
print("Clone char requested.")
|
||||||
game_data.clone_character(args.clone_character[0], args.clone_character[1])
|
game_data.clone_character(args.clone_character[0], args.clone_character[1])
|
||||||
edits_made = True
|
edits_made = True
|
||||||
|
|
||||||
|
@ -547,6 +569,9 @@ def main():
|
||||||
if args.detailed_chars:
|
if args.detailed_chars:
|
||||||
game_data.print_detailed_character_summary()
|
game_data.print_detailed_character_summary()
|
||||||
|
|
||||||
|
if args.redistribute:
|
||||||
|
game_data.redistribute()
|
||||||
|
|
||||||
game_data.writeback()
|
game_data.writeback()
|
||||||
|
|
||||||
if args.test_gamedata:
|
if args.test_gamedata:
|
||||||
|
@ -567,14 +592,16 @@ def main():
|
||||||
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 = args.filename + "-" + datetime_suffix
|
||||||
# console.print(datetime_suffix)
|
# console.print(datetime_suffix)
|
||||||
os.rename(args.filename, new_filename)
|
# os.rename(args.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:])
|
||||||
|
|
||||||
f = open(args.filename, 'w')
|
filename = os.path.join(DEFAULT_SAVEGAMEPATH, args.filename, "save", "game")
|
||||||
|
|
||||||
|
f = open(filename, 'w')
|
||||||
f.write(sansfirstline)
|
f.write(sansfirstline)
|
||||||
f.close()
|
f.close()
|
||||||
console.print('Complete.')
|
console.print('Complete.')
|
||||||
|
|
Loading…
Reference in New Issue