Add Python script to bootstrap modules from other modules
[ci skip]
This commit is contained in:
parent
6386c5e61c
commit
fc066f743d
1 changed files with 158 additions and 0 deletions
158
scripts/bootstrap_mod.py
Normal file
158
scripts/bootstrap_mod.py
Normal file
|
@ -0,0 +1,158 @@
|
|||
# Copyright (c) 2020-2021 The reone project contributors
|
||||
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
"""Script to bootstrap module from existing modules."""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
|
||||
extract_dir = r"D:\OpenKotOR\Extract\KotOR"
|
||||
if not os.path.exists(extract_dir):
|
||||
raise RuntimeError("Extraction directory not found")
|
||||
|
||||
data_dir = os.path.join(extract_dir, "data")
|
||||
if not os.path.exists(data_dir):
|
||||
raise RuntimeError("Data directory not found")
|
||||
|
||||
modules_dir = os.path.join(extract_dir, "modules")
|
||||
if not os.path.exists(modules_dir):
|
||||
raise RuntimeError("Modules directory not found")
|
||||
|
||||
bootstrap_dir = r"D:\OpenKotOR\Mods"
|
||||
if not os.path.exists(modules_dir):
|
||||
raise RuntimeError("Bootstrap directory not found")
|
||||
|
||||
tools_dir = r"D:\Source\reone\build\bin\RelWithDebInfo"
|
||||
if not os.path.exists(modules_dir):
|
||||
raise RuntimeError("Tools directory not found")
|
||||
|
||||
|
||||
def fetch_module_names():
|
||||
global modules_dir
|
||||
names = []
|
||||
for entry in os.listdir(modules_dir):
|
||||
module_dir = os.path.join(modules_dir, entry)
|
||||
if os.path.isdir(module_dir):
|
||||
names.append(entry.lower())
|
||||
|
||||
return names
|
||||
|
||||
|
||||
def create_build_script(module_dir, mod_name):
|
||||
bat_path = os.path.join(module_dir, "build.ps1")
|
||||
with open(bat_path, "w") as f:
|
||||
lines = [
|
||||
"$env:PATH+=\";{}\"\n".format(tools_dir),
|
||||
"reone-tools --to-gff {}\\module.ifo.json\n".format(mod_name),
|
||||
"reone-tools --to-gff {0}\\{0}.are.json\n".format(mod_name),
|
||||
"reone-tools --to-gff {0}\\{0}.git.json\n".format(mod_name),
|
||||
"reone-tools --to-mod {}".format(mod_name)
|
||||
]
|
||||
f.writelines(lines)
|
||||
|
||||
|
||||
def determine_actual_module_name(name):
|
||||
global modules_dir
|
||||
|
||||
module_dir = os.path.join(modules_dir, name)
|
||||
for entry in os.listdir(module_dir):
|
||||
filename, ext = os.path.splitext(entry)
|
||||
if ext == ".are":
|
||||
return filename
|
||||
|
||||
return name
|
||||
|
||||
|
||||
def copy_module_files(mod_name_from, mod_name_from_actual, mod_name_to, module_dir_out, unpack_dir):
|
||||
global extract_dir
|
||||
global data_dir
|
||||
|
||||
# Copy IFO, ARE and GIT
|
||||
module_dir = os.path.join(modules_dir, mod_name_from)
|
||||
ext_to_copy = [".ifo", ".are", ".git"]
|
||||
for entry in os.listdir(module_dir):
|
||||
path = os.path.join(module_dir, entry)
|
||||
filename, ext = os.path.splitext(entry)
|
||||
if ext == ".json" and list(filter(lambda x: x in filename, ext_to_copy)):
|
||||
filename = filename.replace(mod_name_from_actual, mod_name_to)
|
||||
dest = os.path.join(unpack_dir, filename + ext)
|
||||
print("Copying {} to {}...".format(path, dest))
|
||||
try:
|
||||
shutil.copy(path, dest)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
# Copy PTH
|
||||
module_tpl_dir = os.path.join(modules_dir, mod_name_from + "_s")
|
||||
for entry in os.listdir(module_tpl_dir):
|
||||
path = os.path.join(module_tpl_dir, entry)
|
||||
filename, ext = os.path.splitext(entry)
|
||||
if ext == ".pth" and not "-ascii" in filename:
|
||||
filename = filename.replace(mod_name_from_actual, mod_name_to)
|
||||
dest = os.path.join(unpack_dir, filename + ext)
|
||||
print("Copying {} to {}...".format(path, dest))
|
||||
try:
|
||||
shutil.copy(path, dest)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
# Copy LYT and VIS
|
||||
for entry in os.listdir(data_dir):
|
||||
path = os.path.join(data_dir, entry)
|
||||
filename, ext = os.path.splitext(entry)
|
||||
if filename == mod_name_from_actual and (ext == ".lyt" or ext == ".vis"):
|
||||
filename = filename.replace(mod_name_from_actual, mod_name_to)
|
||||
dest = os.path.join(module_dir_out, filename + ext)
|
||||
print("Copying {} to {}...".format(path, dest))
|
||||
try:
|
||||
shutil.copy(path, dest)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
module_names = fetch_module_names()
|
||||
|
||||
while True:
|
||||
mod_name_from = input("Existing module name: ")
|
||||
mod_found = mod_name_from.lower() in module_names
|
||||
if mod_found:
|
||||
break
|
||||
else:
|
||||
print("Variants:")
|
||||
for name in module_names:
|
||||
print(name)
|
||||
|
||||
while True:
|
||||
mod_name_to = input("New module name: ")
|
||||
if mod_name_to.lower() in module_names:
|
||||
print("Duplicate module name!")
|
||||
continue
|
||||
elif mod_name_to:
|
||||
break
|
||||
|
||||
print("Bootstrapping module {} from {}...".format(mod_name_to, mod_name_from))
|
||||
|
||||
module_dir_out = os.path.join(bootstrap_dir, mod_name_to)
|
||||
if not os.path.exists(module_dir_out):
|
||||
os.mkdir(module_dir_out)
|
||||
|
||||
create_build_script(module_dir_out, mod_name_to)
|
||||
|
||||
unpack_dir = os.path.join(module_dir_out, mod_name_to)
|
||||
if not os.path.exists(unpack_dir):
|
||||
os.mkdir(unpack_dir)
|
||||
|
||||
mod_name_from_actual = determine_actual_module_name(mod_name_from)
|
||||
copy_module_files(mod_name_from, mod_name_from_actual, mod_name_to, module_dir_out, unpack_dir)
|
Loading…
Reference in a new issue