UWINE/uwine
2024-03-28 13:48:51 +01:00

185 lines
5.7 KiB
Python
Executable File

#!/bin/python
import os
import argparse
from tabulate import tabulate
import dotenv
import json
import libs.ids_loader as ids_loader
import libs.gameid_loader as gameid_loader
import libs.protonpath_loader as protonpath_loader
import libs.wineprefix_loader as wineprefix_loader
import libs.filepath_loader as filepath_loader
import libs.ulwgl_loader as ulwgl_loader
import libs.customvars_loader as customvars_loader
import libs.predirectives_loader as predirectives_loader
import libs.postdirectives_loader as postdirectives_loader
import libs.ulwlg_runner as ulwlg_runner
import libs.wine_runner as wine_runner
import libs.ulauncher_creator as ulauncher_creator
# SECTION Constants
LAUNCHDIR = os.getcwd()
print("[*] Launching in " + LAUNCHDIR)
UWINEDIR = os.path.dirname(os.path.realpath(__file__))
print("[*] UWINE is installed in " + UWINEDIR)
# SECTION Default values
ulwgl_dir = UWINEDIR + "/launcher"
proton_path = UWINEDIR + "/protons/current"
use_wine = False
wine_prefix = UWINEDIR + "/PREFIX"
ids_json_path = UWINEDIR + "/ids.json"
ids = {}
game_id = 0
filepath = ""
envfile = UWINEDIR + "/.env"
# NOTE Parsing the arguments
parser = argparse.ArgumentParser(
prog="uwine",
description="ULWGL Launcher Wrapper for human beings",
epilog="https://github.com/thecookingsenpai/UWINE",
)
parser.add_argument(
"filepath",
help="Path to the file to be launched",
type=str,
nargs="?",
default=None,
)
parser.add_argument(
"-l", "--load", help="Load a specific env file", type=str, dest="envfile"
)
parser.add_argument(
"-g", "--game-id", dest="gameid", help="Game ID to be used", type=int
)
parser.add_argument(
"-p", "--proton-path", dest="protonpath", help="Path to the Proton installation"
)
parser.add_argument("-i", "--ids-json", dest="ids", help="Path to the ids.json file")
parser.add_argument(
"-w", "--wine-prefix", dest="wineprefix", help="Path to the Wine prefix"
)
parser.add_argument(
"-u", "--ulwgl", dest="ulwlgdir", help="Path to the ULWGL installation"
)
parser.add_argument(
"-a",
"--additionalargs",
dest="additionalargs",
help="Additional arguments to be passed to the software (at the end, as a string)",
type=str,
default="",
)
parser.add_argument("-v", "--version", action="version", version="%(prog)s 0.1")
args = parser.parse_args()
print(args.ulwlgdir)
# Loading the .env file
if args.envfile:
envfile = args.envfile
print("[*] Loading the env file: " + envfile)
# Which is mandatory
if not os.path.isfile(envfile):
print(
"[FATAL] env file not found: "
+ envfile
+ "\nTry to copy env.example to .env in your UWINE installation directory."
)
exit(1)
dotenv.load_dotenv(dotenv_path=envfile)
# Ensuring we support either none or some customvars
if os.environ["CUSTOMVARS"]:
print("[INFO] [CUSTOMVARS] " + os.environ["CUSTOMVARS"])
env_defined_customvars = os.environ["CUSTOMVARS"]
else:
env_defined_customvars = {}
if "USE_WINE" not in os.environ:
use_wine = False
elif os.environ["USE_WINE"] == "True":
use_wine = True
else:
use_wine = False
print("[INFO] [USE_WINE] " + str(use_wine))
if __name__ == "__main__":
# SECTION Loading methods
ulwgl_dir = ulwgl_loader.set_ulwgldir(args.ulwlgdir, UWINEDIR)
ids, ids_json_path = ids_loader.load_ids(args.ids, ids, ids_json_path)
loaded_customvars = customvars_loader.set_customvars(env_defined_customvars, {})
os.environ["GAMEID"] = str(gameid_loader.load_gameid(args.gameid, game_id, ids))
os.environ["PROTONPATH"] = protonpath_loader.set_protonpath(
args.protonpath, proton_path, UWINEDIR
)
os.environ["WINEPREFIX"] = wineprefix_loader.set_wineprefix(
args.wineprefix, wine_prefix
)
original_filepath = args.filepath
filepath = filepath_loader.set_filepath(args.filepath, LAUNCHDIR)
# Directives support
predirectives = predirectives_loader.set_predirectives(
""
) # Future support for postdirectives in cli
postdirectives = postdirectives_loader.set_postdirectives(args.additionalargs)
# SECTION Launching the game
print("\n[*] Launching the game...")
# ANCHOR Recap
# Lets make a nice table to show the user what we are going to do
print(
tabulate(
[
["ULWGLDIR", ulwgl_dir],
["WINEPREFIX", os.environ["WINEPREFIX"]],
["PROTONPATH", os.environ["PROTONPATH"]],
["USE_WINE", use_wine],
["IDS_JSON", ids_json_path],
["GAMEID", os.environ["GAMEID"]],
["PREDIRECTIVES", predirectives],
["FILEPATH", filepath],
["POSTDIRECTIVES", postdirectives],
["CUSTOMVARS", loaded_customvars],
],
headers=["Variable", "Value"],
tablefmt="fancy_grid",
)
)
print("[+] Creating the launcher...")
# Creating a launcher with all the variables in the table above
ulauncher_creator.create_launcher(
os.environ["GAMEID"],
os.environ["PROTONPATH"],
os.environ["WINEPREFIX"],
ulwgl_dir,
predirectives,
original_filepath,
postdirectives,
loaded_customvars,
use_wine,
)
print("[+] Launcher created successfully at " + ulwgl_dir + "/launcher.uwine")
# Launching with ulwlg_runner or wine depending on the use_wine variable
if use_wine:
print("[*] Using Wine to launch the game")
wine_runner.wine_run(filepath, os.environ["PROTONPATH"])
else:
print("[*] Using ULWGL to launch the game")
ulwlg_runner.ulwlg_run(
filepath,
ulwgl_dir,
os.environ["PROTONPATH"],
os.environ["WINEPREFIX"],
os.environ["GAMEID"],
)