128 lines
4.2 KiB
Python
Executable File

import vdf
import sys
import os
import json
import copy
STAT_TYPE_INT = '1'
STAT_TYPE_FLOAT = '2'
STAT_TYPE_AVGRATE = '3'
STAT_TYPE_BITS = '4'
def generate_stats_achievements(
schema, config_directory
) -> tuple[list[dict], list[dict], bool, bool]:
schema = vdf.binary_loads(schema)
# print(schema)
achievements_out : list[dict] = []
stats_out : list[dict] = []
for appid in schema:
sch = schema[appid]
stat_info = sch['stats']
for s in stat_info:
stat = stat_info[s]
if stat['type'] == STAT_TYPE_BITS:
achs = stat['bits']
for ach_num in achs:
out = {}
ach = achs[ach_num]
out['hidden'] = 0
for x in ach['display']:
value = ach['display'][x]
if x == 'name':
x = 'displayName'
elif x == 'desc':
x = 'description'
elif x == 'Hidden' or f'{x}'.lower() == 'hidden':
x = 'hidden'
try:
value = int(value)
except Exception as e:
pass
out[x] = value
out['name'] = ach['name']
if 'progress' in ach:
out['progress'] = ach['progress']
achievements_out += [out]
else:
out = {}
out['default'] = 0
out['name'] = stat['name']
if stat['type'] == STAT_TYPE_INT:
out['type'] = 'int'
elif stat['type'] == STAT_TYPE_FLOAT:
out['type'] = 'float'
elif stat['type'] == STAT_TYPE_AVGRATE:
out['type'] = 'avgrate'
if 'Default' in stat:
out['default'] = stat['Default']
elif 'default' in stat:
out['default'] = stat['default']
stats_out += [out]
#print(stat_info[s])
copy_default_unlocked_img = False
copy_default_locked_img = False
output_ach = copy.deepcopy(achievements_out)
for out_ach in output_ach:
icon = out_ach.get("icon", None)
if icon:
out_ach["icon"] = f"img/{icon}"
else:
out_ach["icon"] = r'img/steam_default_icon_unlocked.jpg'
copy_default_unlocked_img = True
icon_gray = out_ach.get("icon_gray", None)
if icon_gray:
out_ach["icon_gray"] = f"img/{icon_gray}"
else:
out_ach["icon_gray"] = r'img/steam_default_icon_locked.jpg'
copy_default_locked_img = True
icongray = out_ach.get("icongray", None)
if icongray:
out_ach["icongray"] = f"{icongray}"
output_stats : list[str] = []
for s in stats_out:
default_num = 0
if f"{s['type']}".lower() == 'int':
try:
default_num = int(s['default'])
except ValueError:
default_num = int(float(s['default']))
else:
default_num = float(s['default'])
output_stats.append(f"{s['name']}={s['type']}={default_num}\n")
# print(output_ach)
# print(output_stats)
if not os.path.exists(config_directory):
os.makedirs(config_directory)
if output_ach:
with open(os.path.join(config_directory, "achievements.json"), 'wt', encoding='utf-8') as f:
json.dump(output_ach, f, indent=2)
if output_stats:
with open(os.path.join(config_directory, "stats.txt"), 'wt', encoding='utf-8') as f:
f.writelines(output_stats)
return (achievements_out, stats_out,
copy_default_unlocked_img, copy_default_locked_img)
if __name__ == '__main__':
if len(sys.argv) < 2:
print("format: {} UserGameStatsSchema_480.bin".format(sys.argv[0]))
exit(0)
with open(sys.argv[1], 'rb') as f:
schema = f.read()
generate_stats_achievements(schema, os.path.join("{}".format( "{}_output".format(sys.argv[1])), "steam_settings"))