Contains a pssg that contains a dds. USe Ego PSSG Editor to extract the binary file of that DDS, copy it to a new HxD file, save it as a .txt, then use a python scrypt to create the final .dds : (requieres "pip install imageio")
import numpy as np import imageio def binary_to_dds(binary_file, width, height): # Load binary data from file with open(binary_file, 'rb') as f: binary_data = f.read() # Assuming each pixel is represented by 4 bytes (RGBA) # Modify this based on your actual pixel format pixel_size = 4 # Calculate total expected size of binary data expected_size = width * height * pixel_size # Check if the binary data size matches the expected size if len(binary_data) != expected_size: raise ValueError("Incorrect binary data size") # Reshape the binary data into a numpy array pixel_array = np.frombuffer(binary_data, dtype=np.uint8) pixel_array = pixel_array.reshape((height, width, pixel_size)) # Save the image as DDS imageio.imwrite('output.dds', pixel_array) def main(): # Specify the path to the binary data file binary_file = 'binary.txt' # Specify the dimensions of the image (width and height) width = 2048 # Replace with the actual width of your image height = 2048 # Replace with the actual height of your image # Convert binary data to DDS binary_to_dds(binary_file, width, height) if __name__ == "__main__": main()
Hi! Thank you a lot for these PSSG tools; they have worked excellently and they have helped me not only make some personal mods of my own but also to understand more about modding in general. For real, I've read the included guides from top to bottom at least thrice just for fun. You're awesome!
Hello! Could you please help? I am trying to not trigger MQ15(find Constantin with shaman) and to not fail sqau01(Private property(woodcutter_camp)) so I could talk to Courcellion. Mod + Save file
Take a look at the "IV.1 > > > > QuestGraph" section" of the Modding Tips. These things likely update when you enter a map or a trigger zone (Sometimes a dialogue graph. Depends on when/how MQ15 triggers). So you will need to grep the (xmlified) code for references to the quest/graph and try to short cut the trigger or level loader with some more conditions. Preventing something from firing is not so hard. Preventing the game from breaking as a result.. that is much harder =). Whatever you do not fire will need to be fired at a later time, so you will need to figure out how you want to handle it. For example, do you update the quest/quest log to direct them to Courcellion and then trigger MQ15?
Hey, I know this is a long shot, but do you think this might work on The Technomancer, too? Both games use the same engine (I think). I'm just curious.
Pssg is a compression format that is used by several games. So the pssg extraction/creation tools would probably work if Technomancer uses Pssg. However the Modding Tips may not apply as the details of the Spider Engine probably evolved between the games.
Hi, sorry to bother you, but i'm having an hard time making your scripts work... I installed Python 3, then I exctracted the pgz files I needed with 7zip, copyed your *.py files in the dragndrop folder and I tryed to convert them to pssg files, but every time i get this output without any result:
The same goes for every other cmd files, what am I doing wrong?
Then using Explorer, dragged "hea_hum_vasco_01_diff.pgz" ontop of "pssgConverterDragNDrop.cmd". It worked. I got the following:
Processing File [...datalocal\equipment\hum\hea\textures\tmp\hea_hum_vasco_02_diff.pgz] Extracting [hea_hum_vasco_02_diff.pgz] -> [hea_hum_vasco_02_diff.pgz.pssg] Converting [hea_hum_vasco_02_diff.pgz.pssg] -> [hea_hum_vasco_02_diff.pgz.xml] Press any key to continue . . .
I also erased the extracted files and did it again by dragging "hea_hum_vasco_01_diff.pgz" on top of "pssgConverter.py" and it also worked.
I'm not sure what is going on in your case, but my best guess is that an OS compatibility issue with the .cmd file. I use Windows 10.So maybe you are using a different version of windows and it is not passing the filename to the script correctly? Pretty simple to test. Just run it from command line. IE: Search for "cmd", Use "cd" to change to the directory manually and run it from command line: I walk through how to do this in the readme.
If Python is properly installed, you may also be able to simply drag the file onto the .py file instead of the .cmd.
It is also possible you didn't restart your computer after installing Python. But the message you are showing looks to me like python is running, which is why I don't think that is the issue.
I tryed to restart my PC as first option but it didn't help. I also followed your tips step by step, but nothing changed, then I tryed to to istall older versions of Phyton without any results. I have windows 10 too... the only ringhing bell that something is't working as expected is that I can't drag and drop directely on *.py file, but as I mentioned before, I installed more than one version of Phyton and none of them gave me that option. If you have any idea, please, share it with me. In any case i will try on a different PC when I will have the chance.
It appears (from your feedback) that the script is running. It is either not seeing the file you are passing in or some sort of exception is getting thrown when it tries to open the file or create the output files. First thing to do is make sure the directory you are operating in is NOT marked read-only. Go to the parent directory, right click the directory you are operating in and select properties. If the [X] read only flag is checks, the script is probably dying when it tries to create the output files. The read-only status of the input file shouldn't matter, but it doesn't hurt to check that as well.
If that does not appear to be the issue, try running it from command line. Only instead of running the script directly, try passing it into python as a parameter. IE:
Some computers maintain records on files that came from the internet and when they run, they run as a special user associated with internet files. A user with limited access rights. When you run the python script directly, it would run as that user. If you pass the python script into the python interpreter, it would run as the user who installed python. So if the above fixes it, you may need to rename the python file. Create a new file with the same name manually and copy the contents into it.
I am trying to learn some basic modding but it seems quite hard. My goal is to just make female and male armors look the same (with the shoulder-pads) but I am not sure how to go about doing that. Is it possible that there is a file somewhere where I can just change a statement from true to false, or something? :P If that is the case, do you maybe know what file that would be? xD (it's very hard to find anything in this mess, if you as me)
So the game defines items under the items directory. Then the items are assigned to NPCs using configuration files.. The items themselves point to a model. Gender sensitive items like armors typically point to a file that ends with _m. That means "male". At runtime, if the player is female, the game automatically searches for an _f counterpart and uses that if found. If not found, the players body would appear invisible. This is why some items have skeleton constrains defined in the item definition. If it is known that specific item does not have female support (or male support), they will constrain it. The player will see a message about the item not being compatible if they try to purchase or equip it.
The models themselves are defined in the directories:
within you will see subdirectories that divide the models up into categories:
acc = accessories (feathers, glasses, headbands) bod = body (armor) boo = boots (which includes the legs) clo = cloth (capes) cra = craft support (upgrades) hai = hair han = hands (gloves/forearm) hea = heads hel = helmets
The model data is stored in PSSG (binary XML) which is then compressed into PGZ. That is where pssgConverter comes in. You can convert the .pgz files to XML readable files and then play with the internals.
I haven't spent much time on the internal format of the model files. What I do know is that there is a header that defines the parts (mesh sets), then binary data for the mesh sets and material mapping data for the mesh sets and node/joint mapping data for the mesh sets. . The game seems to have 2 distinct skeletons for male and female, but I am pretty sure they have the same nodes/joints as I have forced male NPCs to wear clothing meant for females (See kurt in the screen shots for Naut-E wares).
So the simplest thing to do would be to take the _m version of a model and clobber the _f version with it. Then your female would have a male body (I guess, haven't tried it). But if your goal is to JUST change the shoulders, I don't know how well the mesh is divided up within the pssg. If I were trying to do it myself, I would probably take the _m and _f (xml) version of a model and diff them using windiff. However to make the diff useful, you may have to re-arrange the internals so that they line up as much as possible. That is what I had to do to figure out why the female prostitute heads had larger necklines than the player heads. It toook me about 3 hours to align the xml internals of 2 head models that were the same other than the neckline and then I could see that the primary difference was an opacity textures definition where one file pointed to a white texture and the other to a black. Turns out, all the female heads had the larger neckline, but they made it transparent with an opacity overlay. But I digress.
If you are looking for something along the lines of... how do I import this model into 3DS MAX or blender so I can nudge it in a tool I know and re-export it... that plugin doesn't exist yet. I talk a pssg blender plugin in the guide, but it hasn't been updated for GreedFall Good starting point for someone looking to write a model import/export plugin for this game, but no one has tackled it yet (that I am aware of).
38 comments
EDIT: Found. Greedfall\packs\datapc_initial.spk\gui\atlas\xui_skin.pgz
Contains a pssg that contains a dds. USe Ego PSSG Editor to extract the binary file of that DDS, copy it to a new HxD file, save it as a .txt, then use a python scrypt to create the final .dds :
(requieres "pip install imageio")
import numpy as np
import imageio
def binary_to_dds(binary_file, width, height):
# Load binary data from file
with open(binary_file, 'rb') as f:
binary_data = f.read()
# Assuming each pixel is represented by 4 bytes (RGBA)
# Modify this based on your actual pixel format
pixel_size = 4
# Calculate total expected size of binary data
expected_size = width * height * pixel_size
# Check if the binary data size matches the expected size
if len(binary_data) != expected_size:
raise ValueError("Incorrect binary data size")
# Reshape the binary data into a numpy array
pixel_array = np.frombuffer(binary_data, dtype=np.uint8)
pixel_array = pixel_array.reshape((height, width, pixel_size))
# Save the image as DDS
imageio.imwrite('output.dds', pixel_array)
def main():
# Specify the path to the binary data file
binary_file = 'binary.txt'
# Specify the dimensions of the image (width and height)
width = 2048 # Replace with the actual width of your image
height = 2048 # Replace with the actual height of your image
# Convert binary data to DDS
binary_to_dds(binary_file, width, height)
if __name__ == "__main__":
main()
can someone help me to convert font file .pgz to .dds file for editing??
Mod + Save file
I installed Python 3, then I exctracted the pgz files I needed with 7zip, copyed your *.py files in the dragndrop folder and I tryed to convert them to pssg files, but every time i get this output without any result:
The same goes for every other cmd files, what am I doing wrong?
Created the directory: ...\datalocal\equipment\hum\hea\textures\tmp\
Copied the .pgz there, the converter and the drag-n-drop file, so that the directory looked like:
...\datalocal\equipment\hum\hea\textures\tmp\hea_hum_vasco_01_diff.pgz
...\datalocal\equipment\hum\hea\textures\tmp\pssgConverter.py
...\datalocal\equipment\hum\hea\textures\tmp\pssgConverterDragNDrop.cmd
Then using Explorer, dragged "hea_hum_vasco_01_diff.pgz" ontop of "pssgConverterDragNDrop.cmd". It worked. I got the following:
Processing File [...datalocal\equipment\hum\hea\textures\tmp\hea_hum_vasco_02_diff.pgz]
Extracting [hea_hum_vasco_02_diff.pgz] -> [hea_hum_vasco_02_diff.pgz.pssg]
Converting [hea_hum_vasco_02_diff.pgz.pssg] -> [hea_hum_vasco_02_diff.pgz.xml]
Press any key to continue . . .
I also erased the extracted files and did it again by dragging "hea_hum_vasco_01_diff.pgz" on top of "pssgConverter.py" and it also worked.
I'm not sure what is going on in your case, but my best guess is that an OS compatibility issue with the .cmd file. I use Windows 10.So maybe you are using a different version of windows and it is not passing the filename to the script correctly? Pretty simple to test. Just run it from command line. IE: Search for "cmd", Use "cd" to change to the directory manually and run it from command line: I walk through how to do this in the readme.
If Python is properly installed, you may also be able to simply drag the file onto the .py file instead of the .cmd.
It is also possible you didn't restart your computer after installing Python. But the message you are showing looks to me like python is running, which is why I don't think that is the issue.
I also followed your tips step by step, but nothing changed, then I tryed to to istall older versions of Phyton without any results.
I have windows 10 too... the only ringhing bell that something is't working as expected is that I can't drag and drop directely on *.py file, but as I mentioned before, I installed more than one version of Phyton and none of them gave me that option.
If you have any idea, please, share it with me.
In any case i will try on a different PC when I will have the chance.
If that does not appear to be the issue, try running it from command line. Only instead of running the script directly, try passing it into python as a parameter. IE:
C:\Some\Path>python pssgConverter.py hea_hum_vasco_01_diff.pgz
Some computers maintain records on files that came from the internet and when they run, they run as a special user associated with internet files. A user with limited access rights. When you run the python script directly, it would run as that user. If you pass the python script into the python interpreter, it would run as the user who installed python. So if the above fixes it, you may need to rename the python file. Create a new file with the same name manually and copy the contents into it.
The models themselves are defined in the directories:
datalocal/equipment/hum/ (hum = male)
datalocal/equipment/huf/ (huf = female).
within you will see subdirectories that divide the models up into categories:
acc = accessories (feathers, glasses, headbands)
bod = body (armor)
boo = boots (which includes the legs)
clo = cloth (capes)
cra = craft support (upgrades)
hai = hair
han = hands (gloves/forearm)
hea = heads
hel = helmets
The model data is stored in PSSG (binary XML) which is then compressed into PGZ. That is where pssgConverter comes in. You can convert the .pgz files to XML readable files and then play with the internals.
I haven't spent much time on the internal format of the model files. What I do know is that there is a header that defines the parts (mesh sets), then binary data for the mesh sets and material mapping data for the mesh sets and node/joint mapping data for the mesh sets. . The game seems to have 2 distinct skeletons for male and female, but I am pretty sure they have the same nodes/joints as I have forced male NPCs to wear clothing meant for females (See kurt in the screen shots for Naut-E wares).
So the simplest thing to do would be to take the _m version of a model and clobber the _f version with it. Then your female would have a male body (I guess, haven't tried it). But if your goal is to JUST change the shoulders, I don't know how well the mesh is divided up within the pssg. If I were trying to do it myself, I would probably take the _m and _f (xml) version of a model and diff them using windiff. However to make the diff useful, you may have to re-arrange the internals so that they line up as much as possible. That is what I had to do to figure out why the female prostitute heads had larger necklines than the player heads. It toook me about 3 hours to align the xml internals of 2 head models that were the same other than the neckline and then I could see that the primary difference was an opacity textures definition where one file pointed to a white texture and the other to a black. Turns out, all the female heads had the larger neckline, but they made it transparent with an opacity overlay. But I digress.
If you are looking for something along the lines of... how do I import this model into 3DS MAX or blender so I can nudge it in a tool I know and re-export it... that plugin doesn't exist yet. I talk a pssg blender plugin in the guide, but it hasn't been updated for GreedFall Good starting point for someone looking to write a model import/export plugin for this game, but no one has tackled it yet (that I am aware of).