Epic Tavern

Epic Tavern

Otillräckligt med betyg
Epic Tavern Modding Guide
Av SwissArmyKnife
A basic and advanced guide to modding Epic Tavern, save files and game files for adding new drinks, heroes and quests.
   
Utmärkelse
Favorit
Favoritmarkerad
Avfavoritmarkerad
Introduction
Note: This guide is a work-in-progress and I am still writing up and adding all of the planned sections.

Welcome reader and prepare to be overwhelmed as there is a lot of customization to be done right now and a great deal of it is up to change at any time due to Early Access. This guide will cover the save file and lightly touch on adding new names, goods, skills and traits to the randomized characters.

As with any changes to your save file and game files, please back up all files before editing.

Save File Editing Requirements:
  • An Epic Tavern save file (found in \Users\%username%\AppData\LocalLow\Hyperkinetic Studios\Epic Tavern\Profiles)
  • A text editor (Notepad or Notes will do, but Notepad++ is my preference)
  • Character values (updated in the spreadsheet here[docs.google.com] and linked below too)

Advanced Modding Requirements:
Save File Editing – Adding New Goods
Adding new goods to your own personal save game is straightforward. We’ll look at our the save file first, then an example with an explanation of the relevant pieces that should be changed to add your own and finally, I will provide a template for easy use.

To start, we’ll open our save file InstancesDB.json in our text editor and scroll down to "GoodInstances" : [ to find our first good. For Notepad++ users, you may also use Alt+2 to collapse all the sections and then click on the Plus sign to the left of GoodInstances to expand only that section. The first good listed will be the Orcish Grog and a quick look shows that much of the good template is written in plain English.

For a further understanding of it, let’s compare it to our examples and then read over the explanations:

Drink Example
{ "TotalServings" : 0, "Wholesale" : 4, "SellPrice" : 2, "RowID" : 35, "Timestamp" : "0", "goodID" : 35, "name" : "Netherwing Sour", "available" : true, "goodTypeID" : 1, "stockCost" : 50, "markUp" : 0.0, "markUpDefault" : 0.50, "priceTier" : 1, "inventoryPer" : 5, "inventoryName" : "Bottle", "storageType" : 2, "inventorySpace" : 1, "serveName" : "a glass", "resupplyable" : true, "valSoldThisTurn" : 0, "stockCount" : 0, "description" : "Made with raw netherwing eggs, it is a specialty of the lizardmen.", "iconIdx" : 0, "consumed" : 0 }

Food Example
{ "TotalServings" : 0, "Wholesale" : 3, "SellPrice" : 5, "RowID" : 36, "Timestamp" : "0", "goodID" : 36, "name" : "Netherling Legs", "available" : true, "goodTypeID" : 2, "stockCost" : 80, "markUp" : 0.75, "markUpDefault" : 0.5, "priceTier" : 1, "inventoryPer" : 10, "inventoryName" : "Package", "storageType" : 1, "inventorySpace" : 1, "serveName" : "an order", "resupplyable" : true, "valSoldThisTurn" : 0, "stockCount" : 0, "description" : "Freshly pulled from netherlings, it is a mythical taste rivaling sphinx meat.", "iconIdx" : 1, "consumed" : 0 }

In the following breakdown, we’ll only be referencing the values that should be changed from their defaults. Also, you will need to add a comma “,” after the ending brace “}” of the last good. Otherwise, your changes will result in the save file not loading properly.
  • TotalServings is the number of servings available in your tavern currently
  • The Wholesale value is the price of the food or drink before markup adjustments
  • The SellPrice is the price for tavern patrons to buy the food or drink and is determined by the Wholesale value X markUp; it is rounded down to the nearest whole integer.
  • The rowID must be a unique value and in order! All the food and drink items in your save file are listed in order starting at 1. As a result, your rowID should be the last rowID in your save file + 1.
  • Your goodID should match your rowID to maintain consistency.
  • The name value is going to be the name of the drink or food you are adding to your tavern.
  • Available should be set to true unless a quest is setup in advance with this good as a reward. Note: Quest setup and rewards is an advanced mod and by default, we’ll want to keep this value as true.
  • goodTypeID will be either 1 or 2. “1” will be for Beverages and “2” will be for Food.
  • stockCost is the cost of restocking the item in the tavern.
  • markUp values will be 0.0, 0.25, 0.50, 0.75 and 1.00 and applies to the Wholesale value to determine the SellPrice, which is the cost for patrons to buy your good.
  • markUpDefault is the default value set before markUp is changed in the Tavern Goods menu. Its value range is the same as markUp.
  • inventoryPer is the number of servings that will be restocked when buying from the Tavern Goods menu.
  • inventoryName will be the name of the good when buying in bulk from the Tavern Goods menu.
  • serveName will be the description when serving the good to patrons
  • The resupplyable value should always be set to true unless this is a good that you do not want to be restockable.
  • description will be the text displayed when selecting the good from the menu to serve to patrons

With those values in mind, here is a template for food and drinks! “#” will be used in places of number values and “X” will be used in place of text values for the template
{ "TotalServings" : #, "Wholesale" : #, "SellPrice" : #, "RowID" : ##, "Timestamp" : "0", "goodID" : ##, "name" : "XXXXXXXXXXXXXXXXX", "available" : true/false, "goodTypeID" : 1/2, "stockCost" : ##, "markUp" : 0.0/0.25/0.5/0.75/1.0, "markUpDefault" : 0.0/0.25/0.5/0.75/1.0, "priceTier" : 1, "inventoryPer" : ##, "inventoryName" : "XXXXXXX", "storageType" : 1, "inventorySpace" : 1, "serveName" : "XXXXX", "resupplyable" : true/false, "valSoldThisTurn" : 0, "stockCount" : 0, "description" : "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "iconIdx" : 1, "consumed" : 0 }
Save File Editing – Adding A New Character
Adding new characters to your own personal save game is less straightforward simply because their template is much longer. Once again, we’ll dive back into the save file first to see where our characters are located and follow up with an example character with explanations, then we’ll end with the template.

To start, we’ll open our save file InstancesDB.json in our text editor and scroll down to " IngameCharacters" : [ to find our first good. For Notepad++ users, you may also use Alt+2 to collapse all the sections and then click on the Plus sign to the left of IngameCharacters to expand only that section. The first character listed likely won’t make be decipherable as its name is referenced by numbers only.

For characters, we’re going to be referencing external Google Sheets documents because the number of characters, traits and skills is too high to list in this guide.

Let’s look at our example character, break it down and then we’ll grab the Google Sheets and the template.

Character Example
{ "RowID" : 31, "Timestamp" : "0", "templateHasBeenUsed" : false, "givenNameID" : 261, "leadingSurnameID" : 319, "trailingSurnameID" : 379, "raceID" : 10, "sex" : "FEMALE", "portraitID" : -1, "canQuest" : true, "canStaff" : false, "questIntro" : "Hey, you got any quests that need a hero?", "staffIntro" : "", "characterIntro" : "\"I like you. If you need anything at all, just say the word! Assuming there's treasure and glory to be had, that is.\"", "bio" : " After being raised by wild animals, Draak struck out on his own seeking vengeance ", "skills" : [ { "skillLevel" : 5, "skillID" : 117 }, { "skillLevel" : 6, "skillID" : 166 }, { "skillLevel" : 4, "skillID" : 175 }, { "skillLevel" : 3, "skillID" : 76 }, { "skillLevel" : 8, "skillID" : 66 } ], "traits" : [ { "traitLevel" : 1, "traitID" : 92 }, { "traitLevel" : 1, "traitID" : 35 } ], "effects" : [ ], "equipment" : [ ], "classID" : 22, "tavernRelationship" : 0, "hasSpecialQuest" : false, "thresholdAdventurer" : 8, "thresholdQuestGeneral" : 0, "thresholdQuestSpecial" : 0, "adventurerStatus" : 2, "xp" : 0, "currentLevel" : 1, "affinityTalkPositive" : 2, "affinityTalkNegative" : -6, "goodsAffinities" : [ { "goodID" : 5, "affinity" : 22 }, { "goodID" : 8, "affinity" : 2 }, { "goodID" : 14, "affinity" : -15 } ], "affinityGiftRoom" : 8, "affinityGiftItem" : 8, "affinityGiftGold" : 8, "sobrietyThresholds" : [ 3, 5, 7 ], "sobrietyInteractBonus" : [ 0, 1, 2 ], "drinkRate" : [ 35 ], "actionPointsStarting" : 10, "specialQuestID" : -1, "outfitIdx" : 22, "generalQuestID" : -1, "sobrietyState" : 0, "drinkIndex" : 0, "drinkScheduleIndex" : 0, "attributes" : { "Str" : 0, "Dex" : 0, "Con" : 0, "Int" : 0, "Wis" : 0, "Cha" : 0 }, "biodata" : [ { "bioStatement" : "I've heard great things about [TAVERNNAME]. Glad to finally make it in. The name's [HERO:NAME].", "affinityValUnlock" : 0, "isUnlocked" : true, "isReadyToUnlock" : false, "bioStoryType" : 0 }, { "bioStatement" : "Has anyone been asking about me lately? There may have been a misunderstanding earlier.", "affinityValUnlock" : 20, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "It wasn’t my fault that she was so young! Elves all look the same age to me and she said she was already 152.", "affinityValUnlock" : 30, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "Did you know that in Elven society they consider the age of consent to be 75? Me neither.", "affinityValUnlock" : 40, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "Her father was making a real ruckus when he found us in bed together. Something about his daughter only being 72 and how I had damaged her honor. ", "affinityValUnlock" : 50, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "He really blew up when I told him that her honor was gone long before I slept with her. I barely managed to escape with me life and he’s been chasing me ever since…", "affinityValUnlock" : 60, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 } ], "personalTavernDialogue" : [ ], "reminisceStrings" : [ ], "attributeHidingData" : [ ], "history" : [ ], "templateID" : -1, "fDefer" : 0, "postQuestFChange" : 0, "hasBeenViewed" : true, "classKnown" : true, "unlocked" : true, "hasHadInteraction" : true, "hasHadFood" : false, "hungerState" : 1, "summonses" : [ ], "schedule" : [ ], "bonusPoints" : 0 },
Save File Editing - Adding A New Character (cont)
In the following breakdown, we’ll only be referencing the values that should be changed from their defaults. Also, you will need to add a comma “,” after the ending brace “}” of the last good. Otherwise, your changes will result in the save file not loading properly.
  • The rowID must be a unique value and in order! All the food and drink items in your save file are listed in order starting at 1.
  • givenNameID will range from 1-821 and are the character's first names. In our example, the first name of our character is Evelyn
  • leadingSurnameID will range from 1-507 and are all or part of the character's last names. In our example, the leading surname name of our character is Frost
  • trailingSurnameID will range from 1-507 and is the second half of a character’s last name. If you do not want to have a trailing surname, use “-1” as the value here. In our example, “fire” is the second half of Evelyn’s last name, giving her a full name of Evelyn Frostfire.
  • raceID will always be 2, 3 or 10 for Dwarf, Orc and Human, respectively. Evelyn Frost is assigned as a Human currently.
  • questIntro will be the text provided when the character has a quest
  • characterIntro will be the starting conversational phrase when a new patron is discovered.
  • bio will be the text displayed on their Bio in the Adventurer screen in the bottom right when selecting the patron
  • Every skillID is assigned to a skill, the skillID range is 1-194. In our example character, their skills are:
    • Sex Appeal (skillID 117)
    • Underworld Survival (skillID 166)
    • Acting (skillID 175)
    • Throwing Knives (skillID 76)
    • Persuasion (skillID 66)
  • Every traitID is assigned to a trait, the traitID range is 1-102. In the example, this adventurer is Sociopathic (traitID 92) and Foul-Mouthed (traitID 35)
  • Every classID is assigned to a class, the classID range is 1-36. In the example, this adventurer is a Night Stalker (classID 22)
  • tavernRelationship is the current friendship of the character in relation to your tavern, also noted as affinity in the character template
  • adventurerStatus should always be 2 when adding a character
  • xp is the current XP of this character
  • currentLevel is the current level of this character
  • goodsAffinities: All goodIDs listed in this area will present how much the character appreciates a certain food or drink; goodID range is 1-36 and affinity range is -100 to 100. Each affinity value details how high of a chance they have for a positive experience with the food or drink. Our example adventurer has the following affinities for these goods:
    • Orphanage Porridge +22% chance for success
    • Skeleton Brew +35% chance for success
    • Stale Bread -15% chance for success
  • biodata contains the unlockable history of the character and is broken down into the following sections
    • bioStatement is the lines the character will say when unlocked through friendship
    • affinityValUnlock sets the requirement for how much friendship is required to unlock the biostatement, the range is 1-999
    • isUnlocked and isReadyToUnlock should be set to false by default, they will automatically update as your affinity (friendship) meter fills up.

With those values in mind, here is a template for food and drinks! “#” will be used in places of number values and “X” will be used in place of text values for the template. Values for Names, Classes, Traits and Skills can be found here: https://redd.it7kbx95

Character Template
{ "RowID" : ##, "Timestamp" : "0", "templateHasBeenUsed" : false, "givenNameID" : ###, "leadingSurnameID" : ###, "trailingSurnameID" : ###, "raceID" : ##, "sex" : "XXXXXX", "portraitID" : -1, "canQuest" : true, "canStaff" : false, "questIntro" : "XXXXX", "staffIntro" : "", "characterIntro" : "\"XXXXX\"", "bio" : "XXXXX", "skills" : [ { "skillLevel" : ###, "skillID" : ### }, { "skillLevel" : ###, "skillID" : ### }, { "skillLevel" : ###, "skillID" : ### }, { "skillLevel" : ###, "skillID" : ### }, ], "traits" : [ { "traitLevel" : 1, "traitID" : ### }, { "traitLevel" : 1, "traitID" : ### } ], "effects" : [ ], "equipment" : [ ], "classID" : ##, "tavernRelationship" : 0, "hasSpecialQuest" : false, "thresholdAdventurer" : 8, "thresholdQuestGeneral" : 0, "thresholdQuestSpecial" : 0, "adventurerStatus" : 3, "xp" : ########, "currentLevel" : ##, "affinityTalkPositive" : 2, "affinityTalkNegative" : -6, "goodsAffinities" : [ { "goodID" : ##, "affinity" : ## }, { "goodID" : ##, "affinity" : ## }, { "goodID" : ##, "affinity" : ## } ], "affinityGiftRoom" : 8, "affinityGiftItem" : 8, "affinityGiftGold" : 8, "sobrietyThresholds" : [ 3, 5, 7 ], "sobrietyInteractBonus" : [ 0, 1, 2 ], "drinkRate" : [ 35 ], "actionPointsStarting" : 10, "specialQuestID" : -1, "outfitIdx" : 22, "generalQuestID" : -1, "sobrietyState" : 0, "drinkIndex" : 0, "drinkScheduleIndex" : 0, "attributes" : { "Str" : 0, "Dex" : 0, "Con" : 0, "Int" : 0, "Wis" : 0, "Cha" : 0 }, "biodata" : [ { "bioStatement" : "XXXX", "affinityValUnlock" : #, "isUnlocked" : true, "isReadyToUnlock" : false, "bioStoryType" : 0 }, { "bioStatement" : "XXXX", "affinityValUnlock" : ##, "isUnlocked" : false, "isReadyToUnlock" : false, "bioStoryType" : 0 }, { "bioStatement" : "XXXX", "affinityValUnlock" : ##, "isUnlocked" : false, "isReadyToUnlock" : false, "bioStoryType" : 0 }, ], "personalTavernDialogue" : [ ], "reminisceStrings" : [ ], "attributeHidingData" : [ ], "history" : [ ], "templateID" : -1, "fDefer" : 0, "postQuestFChange" : 0, "hasBeenViewed" : true, "classKnown" : true, "unlocked" : true, "hasHadInteraction" : true, "hasHadFood" : false, "hungerState" : 1, "summonses" : [ ], "schedule" : [ ], "bonusPoints" : 0 },
Save File Editing: Editing Existing Characters
Now that we know how to add customized characters based on the existing values. We can also expand our work to include editing existing characters in your tavern roster. After all, sometimes you don’t want to add a whole new character but want to just change the stats of an existing team member.

For our example, we’ll use Emilia Mortalis as our edited character. We know this is Emilia Mortalis because her givenNameID is 792 and her leadingSurnameID is 477; values that we can double check in the spreadsheet. Note: This is my personal game’s Emilia so spoilers ahead!
{ "RowID" : 26, "Timestamp" : "0", "templateHasBeenUsed" : false, "givenNameID" : 792, "leadingSurnameID" : 477, "trailingSurnameID" : -1, "raceID" : 10, "sex" : "FEMALE", "portraitID" : -1, "canQuest" : true, "canStaff" : false, "questIntro" : "Sometimes you work backwards from death to solve problems.", "staffIntro" : "", "characterIntro" : "I am Emilia Mortalis. Don't mind the aura of darkness, it is a side effect of my habits.", "bio" : "After being raised by ♥♥♥♥♥♥♥, Ugor struck out on her own seeking adventure", "skills" : [ { "skillLevel" : 34, "skillID" : 141 }, { "skillLevel" : 27, "skillID" : 155 }, { "skillLevel" : 35, "skillID" : 102 }, { "skillLevel" : 24, "skillID" : 103 }, { "skillLevel" : 15, "skillID" : 131 }, { "skillLevel" : 15, "skillID" : 101 } ], "traits" : [ { "traitLevel" : 1, "traitID" : 1 } ], "effects" : [ { "duration" : 6, "effectID" : 1, "isFresh" : true }, { "duration" : 3, "effectID" : 8, "isFresh" : false } ], "equipment" : [ { "slotLimiterID" : -1, "qualityModifierID" : -1, "makeModifierID" : -1, "leadingModifierID" : -1, "itemID" : 747, "trailingModifierID" : -1, "materialID" : -1 }, { "slotLimiterID" : -1, "qualityModifierID" : -1, "makeModifierID" : -1, "leadingModifierID" : -1, "itemID" : 810, "trailingModifierID" : -1, "materialID" : -1 }, { "slotLimiterID" : -1, "qualityModifierID" : -1, "makeModifierID" : -1, "leadingModifierID" : -1, "itemID" : 428, "trailingModifierID" : -1, "materialID" : -1 } ], "classID" : 1, "tavernRelationship" : 74, "hasSpecialQuest" : true, "thresholdAdventurer" : 8, "thresholdQuestGeneral" : 0, "thresholdQuestSpecial" : 39, "adventurerStatus" : 3, "xp" : 8777, "currentLevel" : 7, "affinityTalkPositive" : 2, "affinityTalkNegative" : -4, "goodsAffinities" : [ { "goodID" : 4, "affinity" : 21 }, { "goodID" : 5, "affinity" : 19 }, { "goodID" : 29, "affinity" : 15 }, { "goodID" : 3, "affinity" : 20 }, { "goodID" : 1, "affinity" : -60 } ], "affinityGiftRoom" : 7, "affinityGiftItem" : 7, "affinityGiftGold" : 6, "sobrietyThresholds" : [ 2, 4, 8 ], "sobrietyInteractBonus" : [ 0, 1, 2 ], "drinkRate" : [ 24, 34, 44, 57, 80, 90 ], "actionPointsStarting" : 10, "specialQuestID" : 367, "outfitIdx" : 3, "generalQuestID" : -1, "sobrietyState" : 0, "drinkIndex" : 0, "drinkScheduleIndex" : 0, "attributes" : { "Str" : 100, "Dex" : 100, "Con" : 100, "Int" : 100, "Wis" : 100, "Cha" : 100 }, "biodata" : [ { "bioStatement" : "Remember me? I am Emilia Mortalis. Don't mind the aura of darkness, it is a side effect of my habits.", "affinityValUnlock" : 0, "isUnlocked" : true, "isReadyToUnlock" : false, "bioStoryType" : 1 }, { "bioStatement" : "I've always been more comfortable around the dead.", "affinityValUnlock" : 12, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "Still-living people, running around breathing all willy nilly, are way creepier than corpses. It's not just me. Heartbeats are weird, right?", "affinityValUnlock" : 14, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "I learned about my gift for necromancy after my father and dog, Fiasco, were killed by raiders. Fortunately, I was able to bring Fiasco back as a zombie, so it all worked out okay.", "affinityValUnlock" : 22, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "After reanimating my dead dog, Fiasco, I realized there were lots of other people I could help with my gift.", "affinityValUnlock" : 34, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "Turns out, some folks don't appreciate when a skeletal version of their pet shows up at their doorstep. I know. Crazy, right?", "affinityValUnlock" : 36, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "I once animated General Valtoit's prized horse as a zombie, but did he thank me? Not even a little. Sure, it tried to kill him, but it's the thought that counts.[GV:55]", "affinityValUnlock" : 38, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 },
Save File Editing: Editing Existing Characters (cont)
{ "bioStatement" : "I thought about joining the Necromancer Academy, but their focus is entirely on animating humanoids. Do we really need more people shuffling about?", "affinityValUnlock" : 60, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 }, { "bioStatement" : "I don't know what happened. I was just trying to re-animate a dead squirrel like normal, and something went wrong. I need your help.", "affinityValUnlock" : 62, "isUnlocked" : true, "isReadyToUnlock" : true, "bioStoryType" : 0 } ], "personalTavernDialogue" : [ { "dialogue" : "I've never much liked people. Thanks for reminding me why.", "sequenceIndex" : -1, "dialogueType" : 1 }, { "dialogue" : "I'm happier than a re-animated bunny corpse.", "sequenceIndex" : -1, "dialogueType" : 0 }, { "dialogue" : "Why would you bring me this?", "sequenceIndex" : -1, "dialogueType" : 19 }, { "dialogue" : "What's the least awful item on your menu?", "sequenceIndex" : -1, "dialogueType" : 7 }, { "dialogue" : "Ooh, you have [GOODS:DRINK]? My favorite.", "sequenceIndex" : -1, "dialogueType" : 14 }, { "dialogue" : "I'm not much of a drinker. What would you recommend?", "sequenceIndex" : -1, "dialogueType" : 10 }, { "dialogue" : "Worth a shot, I suppose. Bottoms up!", "sequenceIndex" : -1, "dialogueType" : 11 }, { "dialogue" : "What sort of return policy do you have?", "sequenceIndex" : -1, "dialogueType" : 12 }, { "dialogue" : "I think I may have found a new favorite.", "sequenceIndex" : -1, "dialogueType" : 15 }, { "dialogue" : "But enough about you. Let's talk about me.", "sequenceIndex" : -1, "dialogueType" : 3 }, { "dialogue" : "I hope you have another necromancer on standby to animate me after I die of hunger.", "sequenceIndex" : -1, "dialogueType" : 6 }, { "dialogue" : "Remember me? I am Emilia Mortalis. Don't mind the aura of darkness, it is a side effect of my habits.", "sequenceIndex" : -1, "dialogueType" : 36 } ], "reminisceStrings" : [ "Remember those goblins that were attacking caravans. Didn't solve our problems with violence that time, which was a new experience for us.", "Mess with the Marrowsucker Sisters and you may end up like Mafalda.", "I've seen some things in my day, but being chased down the street by naked pirates is an experience I won't soon forget.", "It appears Lucius can even shape reality with finger paintings in blood. Yikes.", "Finding a prisoner in a basement right next door makes me wonder what the rest of the neighborhood is up to.", "Greija Stonemaw's methods are a bit unorthodox, but the infirmary is definitely more effective with her at the helm.", "I think we made some new friends by saving that little unicorn. Hopefully, we'll see them again one day." ], "attributeHidingData" : [ { "attributeID" : 101, "friendshipVisabilityThreshold" : 0, "attributeType" : 0 } ], "history" : [ "Gained effect Protected From Harm (Duration 3)", "Gained effect Blessed (Duration 1)", "Became Lightly Wounded", "Gained effect Inspired (Duration 3)", "Gained effect Inspired (Duration 5)", "Gained effect Tired (Duration 3)", "Gained effect Inspired (Duration 5)", "Gained effect Blessed (Duration 3)", "Gained effect Inspired (Duration 5)", "Gained effect Inspired (Duration 7)", "Gained effect Inspired (Duration 4)", "Became Lightly Wounded", "Gained effect Poisoned (Duration 4)", "Gained effect Hungover (Duration 1)", "Became Lightly Wounded", "Became Lightly Wounded", "Gained effect Rested (Duration 2)", "Became Moderately Wounded" ], "templateID" : 9996, "fDefer" : 0, "postQuestFChange" : 0, "hasBeenViewed" : true, "classKnown" : true, "unlocked" : true, "hasHadInteraction" : true, "hasHadFood" : false, "hungerState" : 0, "summonses" : [ { "summons" : 7, "priority" : 2 }, { "summons" : 5, "priority" : 6 }, { "summons" : 4, "priority" : 6 } ], "schedule" : [ { "summons" : 7, "scheduleState" : 1 }, { "summons" : 5, "scheduleState" : 1 }, { "summons" : 4, "scheduleState" : 1 } ], "bonusPoints" : 0 },

Looking at Emilia’s current skill list, we decide that her skill with Summon Skeleton is too low so we can add some points to it and Forest Survival is too high for a Necromancer so we’ll deduct points from there too. Her Beast Lore could also be higher since she is a Necromancer and is resurrecting skeletons of different beasts.

Her current skill list is:
  • Sense Magic with 34 points
  • Forest Survival with 27 points
  • LifeSteal with 35 points
  • Darken Soul with 24 points
  • Beast Lore with 15 points
  • Summon Skeleton with 15 points

The goal for our changes is:
  • Sense Magic with 34 points
  • Forest Survival with 7 points
  • LifeSteal with 35 points
  • Darken Soul with 24 points
  • Beast Lore with 25 points
  • Summon Skeleton with 35 points

To make the changes, we’ll drop into the save file, find Emilia Mortalis and make the following changes:
"skills" : [ { "skillLevel" : 34, "skillID" : 141 }, { "skillLevel" : 7, "skillID" : 155 }, { "skillLevel" : 35, "skillID" : 102 }, { "skillLevel" : 24, "skillID" : 103 }, { "skillLevel" : 25, "skillID" : 131 }, { "skillLevel" : 35, "skillID" : 101 } ],
Then we’ll save the file again and load up Epic Tavern. Looking at our roster, we should now see that Emilia’s changes have taken effect. These same changes can be done to add/remove skills to adventurers and applies to traits, names and classes as well.
Editing Game Files - Creating Custom Names
Note: This mod type is only temporary and new patches will overwrite our changes so keep this in mind when modding the names.

This tutorial will be a bit more advanced than the previous ones, only because we need to extract files, edit them and then push them back into our original game file. We will be using the Unity Assets Bundle Extractor (UABE, from here out) downloaded from the introduction.

Export GS_Names to a .txt file
  1. We want to copy out the Resources.assets file from \steamapps\common\Epic Tavern\EpicTavern_Data first to somewhere easy to reach, such as the Desktop or Downloads folder.
  2. Then we will open UABE and open the copied resources.assets file.
  3. With the file open, we want to sort by the Size (bytes) column.
  4. We should see the files listed in the screenshot below and the file we want to look at for character names is GS_Names.
  5. Select GS_Names and click on Plugins.
  6. Then Export to .txt and save the file in a place that you can find it easily again, such as the Desktop or Downloads folder.

Edit the extracted GS_Names text file:
Next, we will open the file in our text editor of choice. The GS_Names file is laid out in sections of each names, in the following manner:
  • RacialNames
  • GivenNames
  • FamilyNames
  • TavernDialogue
  • ReminisceDialogue
  • ReminisceJTStages
  • CharacterUnlockConditionals
  • ClassUnlockConditionals

For the purposes of our guide, we are only interested in GivenNames and FamilyNames. We know GivenNames have a default range of 1-821 and FamilyNames have a default range of 1-507.

The last name in the GivenNames is row 821, so we can find our last entry as “RowID”: 821
{ "RowID" : 821, "Timestamp" : "1504471657393", "name" : "Klegor", "race" : "Orc", "sex" : "Male" }

Looking at our template from our last GivenNames entry, we can fill out our custom character name template. Then we add it to the end of the GivenNames list.
{ "RowID" : 822, "Timestamp" : "1504471657393", "name" : "Dorei", "race" : "Orc", "sex" : "Female" }

For FamilyNames, our last entry is listed as 507 so we can search for “RowID”: 507.
{ "RowID" : 507, "Timestamp" : "1504471691254", "name" : "Stonemaw", "race" : "Orc", "affix" : "StandAlone" }

Looking at our template again, we can fill out our customer character name template again. Then we’ll add it to the end of the GivenNames list. Note the affixes on the FamilyNames.

There are three affixes:
  • Standalone - used for names that are not meant to be mixed together
  • Primary - intended to be used for the first half of a last name
  • Secondary - intended to be used for the second half of a last name

Examples are below:
{ "RowID" : 508, "Timestamp" : "1504471691254", "name" : "Razorjaw", "race" : "Orc", "affix" : "StandAlone" } { "RowID" : 509, "Timestamp" : "1504471691254", "name" : "Dread", "race" : "Orc", "affix" : "Primary" } { "RowID" : 510, "Timestamp" : "1504471691254", "name" : "glass", "race" : "Orc", "affix" : "Secondary" }

With the examples from our GivenNames and FamilyNames, we get the following two results: Dorei Razorjaw and Dorei Dreadglass.

Import the GS_Names text file back:
  1. With our custom names set, we still need to import the GS_Names file back into our Resources.assets to load in our changes.
  2. We will reopen UABE and then the resources.assets file.
  3. We want to sort by Size (bytes) column again and select GS_Name.
  4. Click on Plugins and select Import from .txt
  5. Select our updated GS_Names.txt file
  6. Save the resources.assets file
  7. Drop the updated resources.assets file back into the original directory. Overwrite when prompted.
1 kommentarer
eddieballgame 21 jun, 2019 @ 11:13 
Excellent guide, thank you.