Hollow Knight: Custom Trial Data Loss - Troubleshooting
Hey everyone! Ever been there? You pour your heart and soul into a Hollow Knight custom trial, meticulously crafting waves of enemies, only to have the game wipe everything as soon as you boot it up? It's a frustrating experience, but don't worry, we're going to dive deep into this issue and get your custom trial back on track. We'll explore the common culprits behind this data loss and how to fix them.
The Problem: Instant Trial End and Data Wipe
So, the scenario is this: You've used a template as a starting point, made some tweaks to Hollow Knight's custom trial, and everything seemed fine. The trial starts, but it ends almost immediately. To add insult to injury, when you check the settings, all your hard work is gone, except for the geo reward and the wave structure. What gives, right?
This can be due to a multitude of reasons, ranging from errors in the code to compatibility issues with the current version of the game. Let's dig into some of the most likely causes and solutions.
Potential Causes
- Code Errors: Incorrect syntax, missing brackets, or improperly defined parameters in your JSON code can lead to unexpected behavior, including the trial ending prematurely and the data being reset. Typos are sneaky devils!
- Incompatible Game Version: Hollow Knight gets updates, and sometimes, custom content designed for an older version might not play well with the new one. This can cause various issues, including data loss.
- Mod Conflicts: If you're using other mods, there's a chance they might be interfering with your custom trial. They could be overriding or conflicting with the settings, causing them to reset.
- Incorrect File Paths or Structure: If the game can't locate the files or the file structure is off, it can lead to problems loading your custom content.
Deep Dive into the Code (and How to Fix It)
Let's meticulously review your provided code and identify potential issues. Your JSON structure defines the waves of enemies, their health, spawn positions, and other parameters. Any errors here can be a disaster.
{
"Waves": [
{
"Enemies": [
{
"Name": "CrystalHunter",
"Health": 100,
"SpawnPosition": {
"x": 90,
"y": 10
}
},
{
"Name": "BrokenVessel",
"Health": 500,
"SpawnPosition": {
"x": 118,
"y": 6
}
},
{
"Name": "BroodingMawlek",
"Health": 300,
"SpawnPosition": {
"x": 110,
"y": 10
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0.6,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "SoulWarrior",
"Health": 200,
"SpawnPosition": {
"x": 94,
"y": 8
}
},
{
"Name": "SoulMaster",
"Health": 550,
"SpawnPosition": {
"x": 95,
"y": 10
}
},
{
"Name": "PrimalAspid",
"Health": 100,
"SpawnPosition": {
"x": 87,
"y": 6
}
},
{
"Name": "SoulWarrior",
"Health": 200,
"SpawnPosition": {
"x": 112,
"y": 9
}
},
{
"Name": "PrimalAspid",
"Health": 100,
"SpawnPosition": {
"x": 110,
"y": 12
}
}
],
"CrowdAction": "Laugh",
"MusicLevel": "5",
"Cooldown": 1,
"DelayBetweenSpawns": 1,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "EnragedGuardian",
"Health": 400,
"SpawnPosition": {
"x": 110,
"y": 12
}
},
{
"Name": "EnragedGuardian",
"Health": 400,
"SpawnPosition": {
"x": 90,
"y": 12
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 110,
"y": 12
}
},
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 90,
"y": 12
}
},
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 95,
"y": 10
}
},
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 118,
"y": 9
}
}
],
"CrowdAction": "Gasp",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "MantisLord",
"Health": 150,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"Name": "MantisLord",
"Health": 150,
"SpawnPosition": {
"x": 90,
"y": 1
}
},
{
"Name": "MantisLord",
"Health": 150,
"SpawnPosition": {
"x": 110,
"y": 10
}
},
{
"Name": "BrokenVessel",
"Health": 200,
"SpawnPosition": {
"x": 90,
"y": 1
}
},
{
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
}
],
"Enemies": [
{
"Name": "Nosk",
"Health": 300,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"Name": "Nosk",
"Health": 300,
"SpawnPosition": {
"x": 90,
"y": 1
}
},
{
"Name": "Uumuu",
"Health": 400,
"SpawnPosition": {
"x": 110,
"y": 10
}
},
{
"Name": "VengeflyKing",
"Health": 200,
"SpawnPosition": {
"x": 90,
"y": 1
}
},
{
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
}
],
"Enemies": [
{
"Name": "GreyPrinceZote",
"Health": 300,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"Name": "NightmareKingGrimm",
"Health": 700,
"SpawnPosition": {
"x": 90,
"y": 1
}
},
{
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
}
],
"Enemies": [
{
"Name": "PureVessel",
"Health": 1200,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
}
],
"Enemies": [
{
"Name": "AbsoluteRadiance",
"Health": 2000,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
}
],
"GeoReward": 10000
}
Code Analysis and Corrections
- Nested Arrays: There seems to be an issue with nested arrays. You have an
Enemiesarray, and within that, you seem to have another one, which is incorrect. This might be a typo or an oversight when adapting the template. - Missing Closing Brackets: Ensure that all opening brackets
{have corresponding closing brackets}. JSON is very particular about this. A missing bracket can cause the entire file to be unreadable. - Redundant sections: There are multiple
Enemiessections, which is highly unusual and will cause errors. You are basically defining an enemies list, and then another one, in the same wave.
Here's a corrected version of the code. Important: Always test changes incrementally. Don't make a ton of changes at once; test after each minor edit to pinpoint the exact issue if something goes wrong.
{
"Waves": [
{
"Enemies": [
{
"Name": "CrystalHunter",
"Health": 100,
"SpawnPosition": {
"x": 90,
"y": 10
}
},
{
"Name": "BrokenVessel",
"Health": 500,
"SpawnPosition": {
"x": 118,
"y": 6
}
},
{
"Name": "BroodingMawlek",
"Health": 300,
"SpawnPosition": {
"x": 110,
"y": 10
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0.6,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "SoulWarrior",
"Health": 200,
"SpawnPosition": {
"x": 94,
"y": 8
}
},
{
"Name": "SoulMaster",
"Health": 550,
"SpawnPosition": {
"x": 95,
"y": 10
}
},
{
"Name": "PrimalAspid",
"Health": 100,
"SpawnPosition": {
"x": 87,
"y": 6
}
},
{
"Name": "SoulWarrior",
"Health": 200,
"SpawnPosition": {
"x": 112,
"y": 9
}
},
{
"Name": "PrimalAspid",
"Health": 100,
"SpawnPosition": {
"x": 110,
"y": 12
}
}
],
"CrowdAction": "Laugh",
"MusicLevel": "5",
"Cooldown": 1,
"DelayBetweenSpawns": 1,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "EnragedGuardian",
"Health": 400,
"SpawnPosition": {
"x": 110,
"y": 12
}
},
{
"Name": "EnragedGuardian",
"Health": 400,
"SpawnPosition": {
"x": 90,
"y": 12
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 110,
"y": 12
}
},
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 90,
"y": 12
}
},
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 95,
"y": 10
}
},
{
"Name": "WatcherKnight",
"Health": 250,
"SpawnPosition": {
"x": 118,
"y": 9
}
}
],
"CrowdAction": "Gasp",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "MantisLord",
"Health": 150,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"Name": "MantisLord",
"Health": 150,
"SpawnPosition": {
"x": 90,
"y": 1
}
},
{
"Name": "MantisLord",
"Health": 150,
"SpawnPosition": {
"x": 110,
"y": 10
}
},
{
"Name": "BrokenVessel",
"Health": 200,
"SpawnPosition": {
"x": 90,
"y": 1
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "Nosk",
"Health": 300,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"Name": "Nosk",
"Health": 300,
"SpawnPosition": {
"x": 90,
"y": 1
}
},
{
"Name": "Uumuu",
"Health": 400,
"SpawnPosition": {
"x": 110,
"y": 10
}
},
{
"Name": "VengeflyKing",
"Health": 200,
"SpawnPosition": {
"x": 90,
"y": 1
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "GreyPrinceZote",
"Health": 300,
"SpawnPosition": {
"x": 110,
"y": 1
}
},
{
"Name": "NightmareKingGrimm",
"Health": 700,
"SpawnPosition": {
"x": 90,
"y": 1
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "PureVessel",
"Health": 1200,
"SpawnPosition": {
"x": 110,
"y": 1
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
},
{
"Enemies": [
{
"Name": "AbsoluteRadiance",
"Health": 2000,
"SpawnPosition": {
"x": 110,
"y": 1
}
}
],
"CrowdAction": "Cheer",
"MusicLevel": "1",
"Cooldown": 1,
"DelayBetweenSpawns": 0,
"WallCDistance": 0,
"WallLDistance": 0,
"WallRDistance": 0,
"Spikes": false
}
],
"GeoReward": 10000
}
Troubleshooting Steps: From Basic to Advanced
Let's get your custom trial working correctly. Here's a breakdown of the steps to take, from the simplest checks to more advanced troubleshooting.
1. Verify Your Code (Again!)
- Use a JSON validator. There are online tools that will automatically check your code for syntax errors. This is the most important step, as even a single misplaced character can break everything.
- Pay close attention to brackets, commas, and colons. They need to be in the correct places.
- Double-check that all strings are enclosed in double quotes.
2. Game Version Compatibility
- Check the Mod's Compatibility: If you're using a mod, make sure it's compatible with your version of Hollow Knight. Check the mod's description or the mod's page for compatibility information.
- Update the Game: Make sure you're running the latest version of Hollow Knight. Outdated versions may not be compatible with certain mods or custom content.
3. Mod Conflict Resolution
- Disable Other Mods: Temporarily disable all other mods to see if the issue resolves. If it does, re-enable them one by one to find the culprit.
- Check Mod Load Order: Some mods might have specific load order requirements. Make sure your custom trial mod loads correctly in relation to any other mods you're using.
4. File Location and Structure
- Confirm File Paths: Ensure your custom trial files are in the correct directory. Check the mod's instructions or documentation for the precise file paths.
- File Naming: Ensure that the file name is correct and matches what the game expects.
5. Test Thoroughly
- Test After Each Change: Make one change at a time, and then test the trial to see if it works. This helps you pinpoint what's causing the problem.
- Restart the Game: After making changes to the files, restart the game to ensure the changes are applied.
6. Advanced Troubleshooting
- Debug Logs: If your mod has debug logs, enable them. These logs can provide detailed information about what's going wrong during the trial.
- Consult the Mod's Documentation/Community: If the mod has its own documentation or a community forum, check there for answers. Other players may have encountered the same problem.
- Reinstall the Mod: If all else fails, try reinstalling the mod. This will ensure that all the files are correct and that there aren't any corrupt files.
Conclusion: Persistence is Key
Troubleshooting issues like these can be time-consuming, but the feeling of successfully creating your custom trial in Hollow Knight is worth it. Go through these steps methodically, and you'll increase your chances of finding the root cause of the problem and getting your custom trial up and running. Good luck, and happy gaming!