-
Notifications
You must be signed in to change notification settings - Fork 10
Character Files
Character files are built as Deli mods, so you'll want to get comfortable with how Deli mods are created and formatted. You can find some information on building Deli mods here
Here is an example of what a characters Deli manifest file can look like:
{
"guid": "h3vr.tnhtweaker.comradekolbasa",
"version": "1.1.0",
"require": "0.3.0",
"dependencies": {
"h3vr.tnhtweaker.deli": "1.6.0"
},
"name": "Comrade Kolbasa",
"description": "A character with Russian and Czech weaponry",
"authors": [
"Devyn Myers"
],
"assets": {
"patcher": {},
"setup": {
"ComradeKolbasa/*sosig*.json": "h3vr.tnhtweaker.deli:sosig",
"ComradeKolbasa/*vault*.json": "h3vr.tnhtweaker.deli:vault_file",
"ComradeKolbasa/": "h3vr.tnhtweaker.deli:character"
},
"runtime": {}
}
}
Another useful resource for building you first character is by looking at existing characters. Here you can find one of my own characters to use as reference.
Finally, you will want to set the config option BuildCharacterFiles to true, which allows TNH Tweaker to generate additional files within the TNH_Tweaker folder inside of the main H3VR folder.
Characters have two base requirements, a character.json file containing information about the character, and a thumb.png file which will appear in the TNH menu.
The character.json file can be made in several different ways. One option is to use one of generated default character files found in the TNH_Tweaker/DefaultCharacters folder, and change the properties to your liking.
Another option is to build a character file from the provided CustomCharacterSchema.json using JSON editors such the Visual JSON Editor
You can find more info about making the character.json file here [INSERT LINK TO CHARACTER FILE WIKI PAGE]
Once you have your character.json and thumb.png files together in a folder, that folder must be referenced in the Deli manifest file, with the tag h3vr.tnhtweaker.deli:character
There are two ways to set icons for equipment pools. The first, is to use one of the pre-existing icons for TNH. The names of these icons can be found inside TNH_Tweaker/IconIDs.txt. Simply use those icon IDs in the IconName field for each equipment pool
The other option for equipment pool icons is using custom icons, which must be placed in the same folder as the character.json file. In this case, you would put the full name (including .png) of the icon into the IconName fields
Sosig templates allow you to create custom sosigs. Making these files is very similar to how character.json files are made. You can find template files for default sosigs in the TNH_Tweaker/DefaultSosigTemplates folder. I highly recommend using these files as a base for your custom sosigs, and editing the values. You can find more info about sosig files here [INSERT LINK TO SOSIG PAGE]
If you're using a JSON editor, the schema for sosig files can be found here
Once you have your custom sosig files made, you must reference them in the Deli manifest file. Sosig files should be referenced in the setup section of the Deli manifest assets list, followed by the tag h3vr.tnhtweaker.deli:sosig
With TNH Tweaker, vaulted guns can be spawned at object constructors or dropped as sosig loot. Simply build the guns you want to spawn, vault them in the item spawner, and then enter the TNH Menu scene (only works for the first time entering for now). All vaulted gun files will appear in the TNH_Tweaker/VaultFiles folder. You can find more info about vault files here [INSERT LINK TO VAULT FILE WIKI PAGE]
Once you have your desired vault files, you must reference them in the Deli manifest file with the tag h3vr.tnhtweaker.deli:vault_file
DisplayName=Type: String
Sets what the characters name is in the TNH menu
Group=Type: Int
Sets what category the character shows up in, with 0 being daring defaults
StartingTokens=Type: Int
Sets the number of tokens a character starts with
ForceAllAgentWeapons=Type: Bool
Unkown what this does, but is normally set to false
Description=Type: String
This is the text that appears below the characters name in the TNH menu
UsesPurchasePriceIncrement=Type: Bool
If true, then when the player purchases an item it costs one more token to purchase that item again
Has_Weapon_Primary=Type: Bool
If true, the player will spawn with an item chosen from the
Weapon_Primary{ }object
Has_Weapon_Secondary=Type: Bool
If true, the player will spawn with an item chosen from the
Weapon_Secondary{ }object
Has_Weapon_Tertiary=Type: Bool
If true, the player will spawn with an item chosen from the
Weapon_Tertiary{ }object
Has_Item_Primary=Type: Bool
If true, the player will spawn with an item chosen from the
Item_Primary{ }object
Has_Item_Secondary=Type: Bool
If true, the player will spawn with an item chosen from the
Item_Secondary{ }object
Has_Item_Tertiary=Type: Bool
If true, the player will spawn with an item chosen from the
Item_Tertiary{ }object
Has_Item_Shield=Type: Bool
If true, the player will spawn with an item chosen from the
Item_Shield{ }object
EquipmentPool{ }Type: EquipmentPoolDef
An object which contains all of the equipment pools that can spawn at a TNH item spawner
Progressions[ ]Type: List<TNH_Progression>
A list of progressions that this character can go through
NOTE: Most characters will only have one entry in this list
Progressions_Endless[ ]Type: List<TNH_Progression>
Currently un-tested where this slots into progression (at start of run or after last level of normal progression?)
Starting loadouts are objects which decide what weapons and items the player starts with. These objects are properties of the character, just like the properties listed above. You can have the following starting loadout objects:
Weapon_Primary{ }Weapon_Secondary{ }Weapon_Tertiary{ }Item_Primary{ }Item_Secondary{ }Item_Tertiary{ }Item_Shield{ }
Below are the properties of a starting loadout:
ListOverride[]Type: List<FVRObject>
This is currently unused (for now), but must still be declared in the character file
Num_Mags_SL_Clips=Type: Int
Sets the number of magazines or speed loaders the weapon starts with
Num_Rounds=Type: Int
Sets the number of bullets a weapon starts with (possibly unused if spawned weapon takes magazines)
TableDefs[ ]Type: List<ObjectTableDef>
A list of object tables which are used to determine what equipment could possibly spawn
Equipment pools are objects which contain an ObjectTableDef for spawnable weapons, and also has the properties which decide purchase cost and the levels when the pool appears in the TNH item spawner. Each character has one EquipmentPool object, which has a list of pool entries inside it.
Entries[ ]Type: List<PoolEntry>
This is a list of all possible pools that can show up in the TNH item spawner
Type=Type: String (Enum)
This determines where a pool will show up in the item spawner. Firearms show up on the left-most side, Equipment in the middle, and Consumables on the right
Options:
- Firearm
- Equipment
- Consumable
TokenCost=Type: Int
Cost of purchasing an item from this pool at the TNH item spawner
TokenCost_Limited=Type: Int
Cost of purchasing an item from this pool at the TNH item spawner (When playing on limited ammo mode)
MinLevelAppears=Type: Int
The level that this pool can start appearing at. TNH starts at level 0, so if set to 0, this pool will appear on the first level
MaxLevelAppears=Type: Int
The highest level that this pool can appear at
Rarity=Type: Int
Sets how likely this pool is to appear. Default is usually 1, and smaller values represent rarer pools
TableDef{ }Type: ObjectTableDef
The object table which determines what kinds of weapons can spawn from this pool entry
Object tables are essentially loot pools, which can either be automatically generated based on set parameters, or manually created using IDOverrides. Below is a list of properties for the ObjectTableDef object
Icon=Type: String
This is the name of the icon (in your character file) that will be displayed in the TNH item spawner
Category=Type: String (Enum)
Set this to whatever category of item you want to spawn in this pool
Options:
- Uncategorized
- Firearm
- Magazine
- Clip
- Cartridge
- Attachment
- SpeedLoader
- Thrown
- MeleeWeapon
- Explosive
- Powerup
- Target
- Tool
- Firework
- Ornament
MinAmmoCapacity=Type: Int
This is the minimum ammo capacity of weapons that will be added to the table
NOTE: If you are spawning something other than weapons in this pool, set this to
-1
MaxAmmoCapacity=Type: Int
This is the maximum ammo capacity of weapons that will be added to the table
NOTE: If you are spawning something other than weapons in this pool, set this to
-1
IsBlanked=Type: Bool
Unknown what this does, but set to false by default
SpawnsInSmallCase=Type: Bool
If true, items from this object pool will spawn in a small case when purchased at the TNH item spawner
SpawnsInLargeCase=Type: Bool
If true, items from this object pool will spawn in a large case when purchased at the TNH item spawner
UseIDListOverride=Type: Bool
If true, this object pool will use items from the
IDOverridelist instead of automatically generating
IDOverride=Type: List<String>
A list of ObjectIDs that will be added to this pool. ObjectIDs can be found in the "ObjectIDs.txt" file generated in the CustomCharacter folder
Eras=Type: List<String>
Set this to the eras of weaponry you want to spawn in this pool
Options:
- None
- Colonial
- WildWest
- TurnOfTheCentury
- WW1
- WW2
- PostWar
- Modern
- Futuristic
- Medieval
Sets=Type: List<String>
Set this to the object set of weaponry you want to spawn in this pool
Options:
- Real
- GroundedFictional
- SciFiFictional
- Meme
- MF
- Holiday
- TNH
Sizes=Type: List<String>
Set this to the sizes of weaponry you want to spawn in this pool
Options:
- None
- Pistol
- Compact
- Carbine
- FullSize
- Bulky
- Oversize
Actions=Type: List<String>
Set this to the action types on the weaponry you want to spawn in this pool
Options:
- None
- BreakAction
- BoltAction
- Revolver
- PumpAction
- LeverAction
- Automatic
- RollingBlock
- OpenBreach
- Preloaded
- SingleActionRevolver
Modes=Type: List<String>
Set this to the firing modes on the type of weaponry you want to spawn in this pool
Options:
- None
- SemiAuto
- Burst
- FullAuto
- SingleFire
ExcludeModes=Type: List<String>
Set this to the firing modes you don't want on the weaponry you want to spawn in this pool
Options:
- None
- SemiAuto
- Burst
- FullAuto
- SingleFire
Feedoptions=Type: List<String>
Set this to the feed options of weaponry you want to spawn in this pool
Options:
- None
- BreachLoad
- InternalMag
- BoxMag
- StripperClip
- EnblocClip
MountsAvailable=Type: List<String>
Set this to the mounting types on the weaponry you want to spawn in this pool
Options:
- None
- Picatinny
- Russian
- Muzzle
- Stock
- Bespoke
RoundPowers=Type: List<String>
Set this to the round powers of the weaponry you want to spawn in this pool
Options:
- None
- Tiny
- Pistol
- Shotgun
- Intermediate
- FullPower
- AntiMaterial
- Ordnance
- Exotic
- Fire
Features=Type: List<String>
Set this to the types of attachment features for the attachments you want to spawn in this pool
NOTE: I'm pretty sure this is only used if the pool is for attachments, not weapons
Options:
- None
- IronSight
- Magnification
- Reflex
- Suppression
- Stock
- Laser
- Illumination
- Grip
- Decoration
- RecoilMitigation
- BarrelExtension
- Adapter
- Bayonet
- ProjectileWeapon
- Bipod
MeleeStyles=Type: List<String>
Set this to the types of melee styles for melee weapons you want to spawn in this pool
Options:
- None
- Tactical
- Tool
- Improvised
- Medieval
- Shield
- PowerTool
MeleeHandedness=Type: List<String>
Set this to the handedness (number of hands used to hold) for melee weapons you want to spawn in this pool
Options:
- None
- OneHanded
- TwoHanded
MountTypes=Type: List<String>
Set this to the types of mounts that can be attached to for attachments you want to spawn in this pool
Options:
- None
- Picatinny
- Russian
- Muzzle
- Stock
- Bespoke
PowerupTypes=Type: List<String>
Set this to the types of powerups you want to spawn in this pool
Options:
- None
- Health
- QuadDamage
- InfiniteAmmo
- Invicibility
- GhostMode
- FarOutMeat
- MuscleMeat
- HomeTown
- SnakeEye
- Blort
- Regen
- Cyclops
- WheredIGo
- ChillOut
ThrownTypes=Type: List<String>
Set this to the types of throwables you want to spawn in this pool
Options:
- None
- ManualFuse
- Pinned
- Strange
ThrownDamageTypes=Type: List<String>
Set this to the damage types of throwables you want to spawn in this pool
Options:
- None
- Kinetic
- Explosive
- Fire
- Utility
Objs[]Type: List<FVRObject>
Unused, but still must be declared in the character file
Progressions contain properties relating to the holds, supply points, and patrols of each level. Generally, there is only one progression entry in the Progressions[ ] list, and then entries in the Levels[ ] list is where the actual level-by-level properties are set.
Levels[ ]Type: List<Level>
The list of levels that the character will go through (in order)
NumOverrideTokensForHold=Type: Int
The number of tokens the character is rewarded for completing the levels
TakeChallenge{ }
@AdditionalSupplyPoints=Type: Int
The number of additional supply points that will be spawned on top of the normal amount
TakeChallenge{ }Type: TNH_TakeChallenge
An object with properties for the defenses that are spawned at a hold point
HoldChallenge{ }Type: TNH_HoldChallenge
An object with properties for holding the hold point, such as encryptions and attacking waves
SupplyChallenge{ }Type: TNH_TakeChallenge
An object with properties for defenses spawned at supply points
PatrolChallenge{ }Type: TNH_PatrolChallenge
An object with properties for patrols that spawn
TrapsChallenge{ }Type: TNH_TrapsChallenge
An object with properties for... traps? I didn't know TNH had traps, but it's here, and you should still declare it just in case
The TakeChallenge{ } object is used for both defenses spawned at hold points, as well as defenses spawned at supply points.
It has the following properties:
NumGuards=Type: Int
Sets the number of defending sosigs that will spawn
NumTurrets=Type: Int
Sets the number of defending turrets that will spawn
IFFUsed=Type: Int
Sets the team that spawned defenders will be on. Default is 1, and the players IFF is 0.
TurretType=Type: String (Enum)
Sets the type of turrets that will spawn as defenses
Options:
- SMG
- FLAK
- Machinegun
- Flamethrower
- Suppression
GID=Type: String (Enum)
Sets the type of sosig defenders that will spawn
Options:
The HoldChallenge{ } object holds properties such as what encryptions spawn, how many encryptions spawn, and what the attacking waves are. The hold challenge object itself only has one property: a list called Phases[ ]. The player will go on to complete each phase in order to complete the hold challenge.
Phases[ ]Type: List<Phase>
The list of hold phases the character will go through (in order)
Encryption=Type: String (Enum)
The type of encryption that will spawn during this phase
Options:
- Static
- Hardened
- Swarm