Skip to content

Commit

Permalink
sync with latest changes
Browse files Browse the repository at this point in the history
  • Loading branch information
BombasticTom committed Jun 1, 2024
2 parents 6dd8968 + 927e5fe commit 0354f6c
Show file tree
Hide file tree
Showing 9 changed files with 606 additions and 148 deletions.
4 changes: 3 additions & 1 deletion .github/ISSUE_TEMPLATE/error.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
name: Error
description: You need help resolving an error/crash in the converter
labels: ["bug"]
title: "[ERROR]: "
body:
- type: dropdown
attributes:
Expand Down Expand Up @@ -43,4 +45,4 @@ body:
- label: I have properly named the issue
- label: I looked in issues/discussions, if my question was previously anwsered

# based on https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/.github/ISSUE_TEMPLATE/api_error.yml
# based on https://github.com/LeleDerGrasshalmi/FortniteEndpointsDocumentation/blob/main/.github/ISSUE_TEMPLATE/api_error.yml
76 changes: 48 additions & 28 deletions psychtobase/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,16 @@
import time
from pathlib import Path
from PIL import Image
from src import Constants, log, Paths, Utils, files, window
from src import Constants, log, Paths, Utils, files, window, FileContents
from src.tools import ModConvertTools as ModTools
import threading

from src.tools.CharacterTools import CharacterObject
from src.tools.ChartTools import ChartObject
from src.tools.ChartTools import ChartObject
from src.tools import VocalSplit, WeekTools, StageTool, StageLuaParse
from src import Utils

if __name__ == '__main__':

log.setup()
window.init()

Expand All @@ -33,6 +32,8 @@ def folderMake(folder_path):
Path(folder_path).mkdir(parents=True, exist_ok=True)
except Exception as e:
logging.error(f'Something went wrong: {e}')
else:
logging.warn(f'{folder_path} already exists!')

def fileCopy(source, destination):
if Path(source).exists():
Expand All @@ -53,11 +54,9 @@ def treeCopy(source, destination):
logging.warn(f'Path {source} does not exist.')

def convert(psych_mod_folder, result_folder, options):
runtime = time.time()
runtime = time.process_time()

logging.info(Utils.coolText("NEW CONVERSION STARTED"))

logging.info('Converting started...')
logging.info(options)

modName = psych_mod_folder # MOD FOLDER PSYCH ENGINE
Expand Down Expand Up @@ -99,11 +98,11 @@ def convert(psych_mod_folder, result_folder, options):
else:
logging.warn('pack.png not found. Replacing it with default')
try:
_polyEncode = b'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'

polymodIconpath = f'{result_folder}/{modFoldername}/{polymodIcon}'
with open(polymodIconpath, 'wb') as output_file:
#cause the image wasnt working in the executable
output_file.write(b64decode(_polyEncode))
output_file.write(b64decode(Constants.BASE64_IMAGES.get('missingModImage')))
except Exception as e:
logging.error(f'Could not write default file: {e}')

Expand All @@ -120,8 +119,11 @@ def convert(psych_mod_folder, result_folder, options):
else:
logging.warn(f'Could not find {modName}{psychCredits}')

if options.get('charts', False):

chartOptions = options.get('charts', {
'songs': False,
'events':False
})
if chartOptions['songs']:
chartFolder = Constants.FILE_LOCS.get('CHARTFOLDER')
psychChartFolder = modName + chartFolder[0]

Expand All @@ -130,14 +132,13 @@ def convert(psych_mod_folder, result_folder, options):
songs = files.findAll(f'{psychChartFolder}*')

for song in songs:
logging.info(f'Checking if {song} is a valid chart directory...')
if Path(song).is_dir():
logging.info(f'Loading charts in {song}')

outputpath = f'{result_folder}/{modFoldername}'

try:
songChart = ChartObject(song, outputpath)
songChart = ChartObject(song, outputpath, chartOptions['events']) # The arg to specify events!
except FileNotFoundError:
logging.warning(f"{song} data not found! Skipping...")
continue
Expand All @@ -159,6 +160,16 @@ def convert(psych_mod_folder, result_folder, options):

logging.info(f'{song} charts converted, saving')
songChart.save()
if chartOptions['events']:
_pathsModRoot = Constants.FILE_LOCS.get('SCRIPTS_DIR')
baseGameModRoot = _pathsModRoot[1]

try:
folderMake(f'{result_folder}/{modFoldername}{baseGameModRoot}')
with open(f'{result_folder}/{modFoldername}{baseGameModRoot}{FileContents.CHANGE_CHARACTER_EVENT_HXC_NAME}', 'w') as scriptFile:
scriptFile.write(FileContents.CHANGE_CHARACTER_EVENT_HXC_CONTENTS)
except Exception as e:
logging.error("Failed creating the scripts folder: " + e)

if options.get('characters', {
'assets': False
Expand Down Expand Up @@ -225,7 +236,7 @@ def convert(psych_mod_folder, result_folder, options):
folderMake(f'{result_folder}/{modFoldername}{bgCharacterAssets}')
folderMake(f'{result_folder}/{modFoldername}{freeplayDir}')

for character in files.findAll(f'{psychCharacterAssets}*'):
for character in files.findAll(f'{psychCharacterAssets}*.png'):
if Path(character).is_file():
logging.info(f'Copying asset {character}')
try:
Expand Down Expand Up @@ -259,8 +270,6 @@ def convert(psych_mod_folder, result_folder, options):
logging.error(f"Failed to create character {keyForThisIcon}'s freeplay icon: {___exc}")
except Exception as e:
logging.error(f'Could not copy asset {character}: {e}')
else:
logging.warn(f'{character} is a directory, not a file! Skipped')

songOptions = options.get('songs', {
'inst': False,
Expand All @@ -274,7 +283,8 @@ def convert(psych_mod_folder, result_folder, options):
psychSongs = modName + dir[0]
bgSongs = dir[1]

folderMake(f'{result_folder}/{modFoldername}{bgSongs}')
#folderMake(f'{result_folder}/{modFoldername}{bgSongs}') fix for #50, why?
# During the other folderMake calls, we absolutely check if the parent folder 'songs' exist to create it blah blah.

_allSongFiles = files.findAll(f'{psychSongs}*')

Expand Down Expand Up @@ -457,18 +467,29 @@ def convert(psych_mod_folder, result_folder, options):
logging.info('Copying level titles...')

dir = Constants.FILE_LOCS.get('WEEKIMAGE')
psychWeeks = modName + dir[0]
psychWeeks = f'{modName}{dir[0]}'
baseLevels = dir[1]

allPng = files.findAll(f'{psychWeeks}*.png')
for asset in allPng:
logging.info(f'Copying {asset}')
try:
folderMake(f'{result_folder}/{modFoldername}{baseLevels}')
fileCopy(asset,
f'{result_folder}/{modFoldername}{baseLevels}{Path(asset).name}')
except Exception as e:
logging.error(f'Could not copy asset {asset}: {e}')
if Path(psychWeeks).exists(follow_symlinks=False):
allPng = files.findAll(f'{psychWeeks}*.png')
for asset in allPng:
logging.info(f'Copying week: {asset}')
try:
folderMake(f'{result_folder}/{modFoldername}{baseLevels}')
fileCopy(asset,
f'{result_folder}/{modFoldername}{baseLevels}{Path(asset).name}')
except Exception as e:
logging.error(f'Could not copy asset {asset}: {e}')
#else:
# logging.info(f'A week for {modName} has no story menu image, replacing with a default.')
# with open(f'week{modName}.png', 'wb') as fh:
# #id be surprised if this works
# try:
# folderMake(f'{result_folder}/{modFoldername}{baseLevels}')
# Image.open(base64.b64decode(data[Constants.BASE64_IMAGES.get('missingWeek')]))
# Image.save(f'{result_folder}/{modFoldername}{baseLevels}')
# except Exception as e:
# logging.error(f"Couldn't generate week image to {modFoldername}/{baseLevels}: {e}")

if options.get('stages', False):
logging.info('Converting stages...')
Expand Down Expand Up @@ -535,6 +556,5 @@ def convert(psych_mod_folder, result_folder, options):
except Exception as e:
logging.error(f'Failed to copy {asset}: {e}')

#convlen = Utils.getRuntime(runtime)
logging.info(Utils.coolText("CONVERSION COMPLETED"))
logging.info(f'Conversion done: Took {int(time.time() - runtime)}s')
logging.info(f'Conversion done: Took {runtime}s')
20 changes: 17 additions & 3 deletions psychtobase/src/Constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
"""

DEFAULT_OPTIONS = {
'charts': False,
'charts': {
'songs': False, # Chart supremacy!
'events': False
},
'songs': { # Technically "audios", but whatever
'inst': False,
'voices': False,
Expand Down Expand Up @@ -82,6 +85,14 @@
"generatedBy": "FNF Porter (by Gusborg, tposejank, BombasticTom & VocalFan)"
}

BASE64_IMAGES = {
#to view these: https://base64.guru/converter/decode/image/png
"windowIcon": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAFVBMVEX/////3fv/fdtsPpT/LDdYtf8AKUvOkdnQAAAACXBIWXMAAC4jAAAuIwF4pT92AAABRUlEQVRIx73UQbLCIAwAUJzWvf03EC/gNBdgEfcuLDco9z/CB0JLgQDq/PlZ1clrkoZWIf4mTpcemLpg6oKpCy490BZTT5wm2QWyOWgf/Eh5bTUBC1oCQLqoN4HZA1sC7lx+oHwd3GQIC4ArIPe4fgnmKHgA8iC+AAPA3AOxxA24Pb8B5j1/bwJ75QAiqgzAlrdgREzFDoAAYiYGHmABgMCIRQlaFeUhjIDLsjzfB1ufDTwWime5D/eUW9oGcyqiCXzwYORBHCJuRZxDUtfAljcpULGA8cDUgLCp1RVY0yExTqrdzXpdPgVWjCo8hBUmA8KfLgagjS6AL+EQPaLhAPoyfk8mzKCSHvQWVUF4UcIqCLyUKAQtW9O6UYlcqHgYLDiepu2QA/p9jvlPAXXYwev4cSVBIv36sgj314Eo/wJ4If4nfgHb6rE0etNCVQAAAABJRU5ErkJggg==",
"missingWeek": "iVBORw0KGgoAAAANSUhEUgAAADAAAAAYAQMAAACGM+yfAAAAA1BMVEX///+nxBvIAAAACXBIWXMAAAsSAAALEgHS3X78AAAADElEQVQI12NgGBoAAACoAAHA+4ZOAAAAAElFTkSuQmCC",
"missingModImage": "iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEX///8AAABVwtN+AAAACXBIWXMAAAsSAAALEgHS3X78AAAAyUlEQVQoz2NgoBlghlAGDMwz0BnsSAwmdIYF838w40YN8/8DQAYbkCH/4AOQ8cOHmefjDiCjAsgoltzAwFKRw8xjLG3AwCJRw8xgPBvIYLBgBDMg4PcGKKP4A5TB+IEINwMZzZhCMJ0gZ4GNapY9+AHC4Dn8xwbCeNxTbwdi8D3mO2wPZhTzNZeDGGxARnIDiGHc1w5hGN77Xw9mGPyrrwepYWAoswe6nbGJgYGNzQLIAAYKGx/IQKDpEjx8EIb8D6hL+H8wDDAAAEa9OlI0tsK2AAAAAElFTkSuQmCC",
"errorIcon": "iVBORw0KGgoAAAANSUhEUgAAACAAAAAgAQMAAABJtOi3AAAABlBMVEX/////ADNUioaFAAAACXBIWXMAAC4jAAAuIwF4pT92AAAAeklEQVQI1zWOsQ3DMAwEX1AhF0bUJkBgruEqWkywvVk0ikZQ6ULQm3SQ5vAAn+QB0gGQBxxZEMiGSJ54GZ7kG6v0BVm6IMeWsHnFcGUHUQhdUlT/R7tTsIGlwymc9oavO7ZQE3KoduqM+Eh/YEljhnwV+nf6GdwuZnUBR3pJi8fgcMIAAAAASUVORK5CYII="
}

CHARACTER = {
"version": "1.0.0",
"name": None,
Expand Down Expand Up @@ -395,8 +406,8 @@
'WEEKCHARACTERJSON':
['/images/menucharacters/', ''], # Embedded directly to the level.json

'WEEKIMAGE':
['/images/storymenu/','/images/storymenu/titles/'],
'WEEKIMAGE':
['/images/storymenu/', '/images/storymenu/titles/'],

'WEEKIMAGE_WEEKJSON':
['', 'storymenu/titles/'],
Expand All @@ -409,6 +420,9 @@

'FREEPLAYICON':
['/images/icons/','/images/freeplay/icons'],

'SCRIPTS_DIR':
['/scripts/', '/scripts/'] # Do we need this? YES!
}

VERSION = "0.2"
Loading

0 comments on commit 0354f6c

Please sign in to comment.