From 925ff3e2a270190ac5fcaf909b04a5f022a96dce Mon Sep 17 00:00:00 2001 From: Krzyhau Date: Thu, 19 Jan 2023 16:35:01 +0100 Subject: [PATCH] update docs --- Dependencies/README.md | 1 + Docs/additional.md | 8 ++++++ Docs/createmods.md | 59 +++++++++++++++++++++++++++++++++++++++++ Docs/thumbnail.png | Bin 0 -> 41974 bytes README.md | 54 +++++++++++++------------------------ 5 files changed, 86 insertions(+), 36 deletions(-) create mode 100644 Docs/additional.md create mode 100644 Docs/createmods.md create mode 100644 Docs/thumbnail.png diff --git a/Dependencies/README.md b/Dependencies/README.md index 8a5638e..31e9c50 100644 --- a/Dependencies/README.md +++ b/Dependencies/README.md @@ -10,3 +10,4 @@ Please use your own copies of FEZ's binaries. This directory should contain the - FNA.dll - MonoMod.exe - MonoMod.Utils.dll +- MonoMod.RuntimeDetour.dll diff --git a/Docs/additional.md b/Docs/additional.md new file mode 100644 index 0000000..95f8673 --- /dev/null +++ b/Docs/additional.md @@ -0,0 +1,8 @@ +# Additional HAT behaviour + +Apart from loading mods, HAT does some additional internal behaviour worth mentioning. Here's a full list: + +- `FezLogo` class has been patched in order to draw HAT logo and mod loader tooltip. +- Several methods in `Logger` class have been hooked to override location of debug log files (they're now stored in `%appdata%/FEZ/Debug Logs` directory) and to show an error with stack trace on fatal error. +- `StaticText` class used to fetch localized text has been patched to return a raw string if it's prefixed by `@`. This is useful when you want to create your own menus where you have limited control over how text is displayed. +- `Menu Base` class' `Initialize` method has a hook which adds an additional `MODS` menu, where you can preview a list of currently installed modifications. diff --git a/Docs/createmods.md b/Docs/createmods.md new file mode 100644 index 0000000..5f2cc97 --- /dev/null +++ b/Docs/createmods.md @@ -0,0 +1,59 @@ +# Create your own HAT modifications + +## Basic mod architecture + +Start by creating a mod's directory within `FEZ/Mods` directory. You can name it whatever you'd like, as the mod loader doesn't actually use it for mod identification, but it would be nice if it at least contained the actual mod's name to avoid confusion. + +Mod loader expects `Metadata.xml` file in the mod's directory. Create one in a directory you've just made. Its content should look roughly like this: + +```xml + + YourModName + Short description of your mod. + YourName + 1.0 + + + + + +``` + +`Name` tag is required and is treated as an unique case-sensitive identifier of your mod - mod loader will load only one mod with the same name (it'll choose the one with the most recent version). + +`Version` tag is also required. Mod loader compares two version strings by putting them in an alphanumberical order, however, each number is treated as a separate token, which order is determined by numberical value (this means `1.2beta` will be treated as older version to `1.11`). + +`LibraryName` is used to determine a DLL library with C# assembly the mod loader will load. The library should end with `.dll` extension and should be placed in your mod's directory. This tag is optional, as your mod doesn't have to add any new logic. + +`Dependencies` is a list of `DependencyInfo` tags. If your mod requires a specific version of HAT mod loader or relies on another mod, your can use these tags to prevent mod loader from loading this mod if given dependencies aren't present. It's entirely optional. + +All other fields are purely informational. + +## Creating asset mod + +If you want to add new assets or override existing ones, create `Assets` directory within your mods directory. All valid files within it will be loaded as game assets with path relative to the `Assets` directory. Currently, the only supported format is `.xnb`, but in the future, a conversion from popular file formats will be implemented, allowing much easier modding process (for isntance, PNG files will be automatically converted to Texture2D assets). As of right now, there isn't really a good way of creating `.xnb` assets and you have to rely on [FEZRepacker](https://github.com/Krzyhau/FEZRepacker). + +As an example, here's an instruction on how to change Gomez's house background plane. Keep in mind that right now this process is unnecessarily convoluted and will definitely be simplified with the next FEZRepacker update: + +1. Use FEZRepacker to unpack game's `Other.pak` archive. +2. Find `background planes/gomez_house_a.png` file and copy it. +3. Create directory, name it something like `Export`. In it, create `background planes` directory and put a copy of PNG file there. +4. Edit the image however you'd like. +5. Use FEZRepacker to pack the `Export` directory into a PAK package. +6. Use FEZRepacker to unpack previously packed PAK file into XNB files. You should have a modified `gomez_house_a.xnb` file. +7. In your mod's `Assets` directory, create `background planes` directory and put your XNB file there. +8. From now on Gomez's house should have your modified texture. + +## Creating custom logic mod + +Mod loader loads library file given in metadata as an assembly, then attempts to create instances of every public class inheriting from game's `IGameComponent` interface before initialization (before any services are created). After the game has been initialized (that is, as soon as all necessary services are initiated), it adds created instances into the list of game's components and initializes them, allowing their `Update` and `Draw` (use `DrawableGameComponent`) to be properly executed within the game's loop. + +In order to create a HAT-compatible library, start by creating an empty C# library project. Then, add `FEZ.exe`, `FezEngine.dll` and all other needed game's dependencies as references - make sure to set "Copy Local" to "False" on all of those references, otherwise you will ship your mod with copies of those files. + +Once you have your project done, create a public class inheriting from either `GameComponent` or `DrawableGameComponent` and add your logic there. Once that's done, build it and put it in the mod's directory. + +For help, you can see an example of already functioning custom logic mod: [FEZUG](https://github.com/Krzyhau/FEZUG). + +## Distributing your mod + +Mod loader is capable of loading ZIP archives the same way directories are loaded. Simply pack all contents of your mod's directory into a ZIP file. In order for other people to use it, they simply need to put the archive in the `FEZ/Mods` directory and it should work right off the bat. diff --git a/Docs/thumbnail.png b/Docs/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..c4d8a87e7456de80eb4e29da7a34077fac9d21e1 GIT binary patch literal 41974 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 - YourModName - Short description of your mod. - YourName - 1.0 - - -``` +## Building HAT -3. If you want to add new assets or override existing ones, create `Assets` directory within your mods directory. All valid files within it will be loaded as game assets with path relative to the `Assets` directory. Currently, the only supported format is `.xnb`. As of right now, there isn't really a good way of creating `.xnb` assets and you have to rely on [FEZRepacker](https://github.com/Krzyhau/FEZRepacker). - -4. If you want to append a library with a custom logic, put it in your mod's directory and put its name with extension into the `LibraryName` property in mod's metadata. The library will be loaded only if its extension ends with `.dll`. - -## Creating custom logic - -Mod loader loads library file given in metadata as an assembly, then attempts to create instances of every public class inheriting from game's `IGameComponent` interface before initialization (before any services are created). After the game has been initialized, it adds created instances into the list of game's components and initializes them, allowing their `Update` and `Draw` (use `DrawableGameComponent`) to be properly executed within the game's loop. - -In order to create a HAT-compatible library, start by creating an empty C# library project. Then, add `FEZ.exe`, `FezEngine.dll` and all other needed game's dependencies as references - make sure to set "Copy Local" to "False" on all of those references, otherwise you will ship your mod with copies of those files. +1. Clone repository. +2. Copy all dependencies listed in `Dependencies` directory and paste them into said directory. +3. Build it. idk. it should work. -Once you have your project done, create a public class inheriting from either `GameComponent` or `DrawableGameComponent` and add your logic there. Once that's done, build it and put it in the mod's directory. +## "Documentation" +- [Create your own HAT modifications](/Docs/createmods.md) +- [Additional HAT behaviour](/Docs/additional.md) -For help, you can see an example of already functioning mod: [FEZUG](https://github.com/Krzyhau/FEZUG). +## Mods created for HAT +- [FEZUG](https://github.com/Krzyhau/FEZUG) - a power tool for speedrun practicing and messing with the game (NOT PORTED YET) +- [FezSonezSkin](https://github.com/Krzyhau/FezSonezSkin) - mod replacing Gomez skin with Sonic-like guy seen in Speedrun Mode thumbnail (NOT PORTED YET)