Foundry:Converting from 5eTools Homebrew

From 5etools Community Wiki
Jump to: navigation, search

Conversion Process

The following is a general overview of the process taken to convert modules so that those looking to do this personally can do so on their own.
When working up worlds, its often best to work either from local session or ensure you have rapid access to the location's filestore to update and test.
Please note that in Foundry the general term for an adventure or Module, is called a WORLD; and the term MODULE in Foundry refers to an add-on; or extension. Plutonium is a Module, Curse of Strahd is a World. If you are coming from something other than Roll20/Fantasy Grounds or D&D Beyond, you likely are moving into Foundry hoping for something to help get your IRL campaign content into Foundry



Resources Used

Resources Used

JSON Editor:
You will need an editor for the code (often JSON); if you do not already have one - please keep it simple.


Image Tool:
To convert and work with the images


Macro Help:
Help converting R20 macros to Foundry VTT macros.
https://github.com/ASLopesJR/r20vttable


Add-On Modules for Foundry
Its advised to have these installed
  • Plutonium
  • The Furnace
  • Automatic Journal Icon Numbers
  • Better Text Drawings (For text labels/drawings multi-line (Effect doesn't require the world run the module but keeps the effect))
  • Context Convenience
  • Dancing Lights
  • Deselection
  • FXMaster
  • Laptop Form Fix (if working local from laptop or less than a 21" monitor)
  • libWrapper
  • TinyMCE toolbar config (easier editing options for Journal/text)
  • Merge Walls
  • Multi-Level Tokens
  • Parallaxia
  • Polyglot
  • Search Anywhere
  • Token HUD Wildcard (for multi-sided tokens)
  • Card Support (unoffical) (for Decks)


Prep Work

1) Read the Adventure and make a document to notate adventure details
what the general "mood" is of campaign is
Then break that down into the various scenes/maps;
Notate the environments : underwater/towns/forests/arctic/ships & ocean/caves etc
What are the Major NPCs & twists;
Do you find Merchants with specific goods for sale, and locations for Loot boxes (containers / caches)
What weather effects are helpful to consider (fog/rain/snow/sparks)
Reference the Music collection, found <here>
Reference the Weather/Effects patterns, found <here>
Reference supplemental Icons, found <here>
Does the Adventure use a Card Deck? If so ...
Find Music and Graphics to fill in the missing elements
  • Weather effects;
  • Landing Page (typically the cover art for the adventure)
  • Title Track(s)
  • Additional Sounds/Sound Effects
  • Item/Spell Icons
5eToolsPlutoniumConfirmation.png

In Foundry

2) Enter Foundry and create a new world with whatever name you'd like to use. Entering the description and putting data/worlds/<name>/cover.webp as the starting login graphic.
3) Import the adventure
4) Exit Foundry completely

File Browser

5) In a file browser open the directory for the world that was just made.
6) Copy of over the default files below into the root of the worlds/<world's_name_dir>/ directory (where you find the world.json
Readme.md
module.json
7) Create directories
audio
assets
scenes/backgrounds
8) place that landing Page graphic (typically the cover) and Title track
Save the cover track to worlds/<world's_name_dir>/audio/
Leave the window connection open or make shortcut to this location; and make note of the worlds/<world's_name_dir>/data directory - you'll be working with it and worlds/<world's_name_dir>/packs/ (which is likely not there yet) directory contents later
9) Open the Readme.md
10) Save the Map from the 5eTools adventure for the website into the scenes/backgrounds directory (converting them to webP and processing with Wifu2x(See resources))
50) Reduce / Remove bloated images
Time to convert the images within the directory this can be done two ways
  • CLI thru FFmpeg (unix/VPS)
CLI ffmpeg -framerate 60 -i filename_%d.png -c:v libvpx-vp9 -pix_fmt yuva420p -b:v 2M -maxrate 2M -bufsize 1M output.webm
  • UI thru XnConvert (for localhosting/windows)
Under Actions clear all metadata (enabled)
Under Output: Filename set to {Filename}
webP settings disable lossless
Convert all the *.JPG & .PNG art work to .webP removing prior images



In Foundry

11) Open Foundry Setup
12) Go to the world and define the world's description.
Here is the snippet used at the end of all converted worlds we've done.
World Description Template


 

 

 

Product Information

System: D&D 5E (WorldSetting)

Starting Level: #-#

Length:  One Shot/Campaign

Language:  IETF language tag (ex: en-US)

 


DISCLAIMER: The use of this is meant for use for your personal use, and only if you legally possess such in accordance with your local laws.


13) Check the Installed Modules
Suggested Add-On Modules
  • Plutonium
  • The Furnace
  • Better Text Drawings (For text labels/drawings multi-line (Effect doesn't require the world run the module but keeps the effect))
  • Dancing Lights [Likely to be phased out in 0.7.x]
  • Deselection
  • Laptop Form Fix (if working local from laptop or less than a 21" monitor)
  • libWrapper
  • TinyMCE toolbar config (easier editing options for Journal/text)
  • Merge Walls
  • Multi-Level Tokens
  • Parallaxia
  • Search Anywhere


  • Token HUD Wildcard (for multi-sided tokens)
  • Card Support (unofficial) (for Decks)
  • Soundboard



Game Settings

14) Open Foundry and Launch the World.
If the world is not listed you will need to fix the world.json (See JSONlint.com)
14) Head to Game Settings -> Manage Modules and enable
  • Plutonium
  • The Furnace
  • Adventure Importer/Exporter
  • Automatic Journal Icon Number
  • Better Text Drawings (For text labels/drawings multi-line (Effect doesn't require the world run the module but keeps the effect))
  • Context Convenience
  • Dancing Lights
  • Deselection
  • Laptop Form Fix (if working local from laptop or less than a 21" monitor)
  • libWrapper
  • Loot Sheet NPC 5e
  • TinyMCE toolbar config (easier editing options for Journal/text)
  • Merge Walls
  • Multi-Level Tokens
  • Parallaxia
  • Permission Viewer
  • Search Anywhere
  • Vehicles and Mechanisms (for Ships/Vehicles/rotating tiles/rooms)
  • Token HUD Wildcard (for multi-sided tokens)
  • Card Support (unoffical) (for Decks)
  • Roofs & Overhead Tiles (For Towns/Villages)
15) Disable Modules listed in Plutonium Know compatibility issues



Compendium Packs

17) Make a Compendium Pack for each of the following entries:
Actor; Item; Scene; Journal Entry; RollTable; Playlist;
Which, should be simply named Actor; Item; Scene; Journal Entry; Table; or Playlist to start. (You're welcome to add Macro as well, but currently there are no included macros)
(you may want additional version of Actor for Monsters



Playlists

18) Head to the Playlist Sidebar
19) Make a START play and add the track you placed previously to worlds/<world's_name_dir>/audio.
20) From the Notes make a playlist for each setting you discovered during reading.
If you are ready go ahead and define the play lists; its helpful to choose the playlists as generic terms so it is reusable, but if you want to go selective use the scene names please for such.
21) Note each used Track used in the Readme.md



RollableTables

22) Unless you're sure of its use; remove the Card Deck
23) Add to your notes any Tokens/Actors that have tables for Multi-sided tokens



5eToolsPlutoniumConfirmation.png

Configure Plutonium

24) Click upon the (SettingsConfigEditorIcon.png) Settings
  • Click UI in the left pane:
Enable Streamer Mode;
Disable Name Browser Tab After Active Scene and Display Detected Backend
(this prevents myTab from causing problems)
  • Click Journal Entries in the left pane:
Enable Enable URL Embed and Enable Journal Embed
  • Click Actors in the left pane:
Enable Auto-Roll Multiattacks



Import Foundations 5e Documents

Not publicly available as yet
25) Enter Configure Settings -> Module Settings
  • Adventure Importer [Not implemented Publicly]
  • Click Adventure Importer
  • Download Foundations (5e or 5ePE depending upon target) from here
http://foundry.5e.tools/Foundations/5e.fvttadv
http://foundry.5e.tools/FoundationPE/5ePE.fvttadv
  • Import Adventure



Actors

26) Create a Temp/Test Character with Vision settings for Dim/Bright
27 ) Note which are without Avatar or Tokens (imports do not always have defined art assigned to them)



Scenes

Here comes the big work.


Create Start Scene
28) Create a scene and name it Start, modifying the configuration
APPEARANCE:
  • Set the Background Graphic to worlds/<json_name>/cover.webp and Backgroundcolor to something (Darker is better)
GRID:
  • Gridless
LIGHTING and VISION
  • Disable Token Vision & Fog Exploration
  • Enable Global Illumination
AMBIENCE and ATMOSPHERE
  • Audio Playlist - Choose the Start Playlist
ACCESS
  • Set Accessibility to All Players
29) Save Changes
30) Adjust the Scene's zoom and location
31) Configure Start (again) -
AMBIENCE and ATMOSPHERE
  • Initial View Position - click the Capture Current View (CaptureCurrentView.png)
32) Save Changes


33) Open 5eTools into the adventure or open the adventure locally for comparison to the resulting export.
34) Create a scene for each map from the adventure
[a] Align Grid to the background and assign the correct background type.
[b] Check Map/Grid alignment & Scale (see step #41 if adjustments are needed)
[c] Mark any difficult terrain. (update dependencies if used)
[d] Click the Effects Control and Define the Effects (if any) you wish to use (update dependencies if used)
Underwater; Fog; Embers;
[e] Click upon Wall Controls (<image for it>) then using a standard wall type, define the walls the entire Scene (we'll go back later and set wall types afterwards - you may choose to do each wall type separately - but its often faster (and easier to get alignment for secret doors/ethereal and terrain walls if you do them all at the same time.)
  • Try to avoid making walls that are under 2ft (in relative scale) in length. ie make changes that have GAME mechanical impact, but avoid minutia configuration - remember that the lower end computers are more commonly used and more lights, more walls mean more work for those computers.)
example of simplification being sought
Here is a handy macro that will help you. Go back through and with shift + click or elastic select you can define the various wall segments and the macro will prompt you on how to convert them.
Macro Helper for working with Walls
function wallUpdate(data) {
  canvas.walls.controlled.map(wall => wall.update(data));
}

let dialogEditor = new Dialog({
 title: `Wall Type Picker`,
 content: `Pick the type of wall to change the selected wall to.`,
 buttons: {
   blockMove: {
     label: `Block Movement`,
     callback: () => {
       wallUpdate({"move": CONST.WALL_MOVEMENT_TYPES.NORMAL});
       dialogEditor.render(true);
     }
   },
   allowMove: {
     label: `Allow Movement`,
     callback: () => {
       wallUpdate({"move": CONST.WALL_MOVEMENT_TYPES.NONE});
       dialogEditor.render(true);
     }
   },
   blockPer: {
     label: `Block Perception`,
     callback: () => {
       wallUpdate({"sense": CONST.WALL_SENSE_TYPES.NORMAL});
       dialogEditor.render(true);
     }
   },
   limitPer: {
     label: `Limited Perception`,
     callback: () => {
       wallUpdate({"sense": CONST.WALL_SENSE_TYPES.LIMITED});
       dialogEditor.render(true);
     }
   },
   allowPer: {
     label: `Allow Perception`,
     callback: () => {
       wallUpdate({"sense": CONST.WALL_SENSE_TYPES.NONE});
       dialogEditor.render(true);
     }
   },
   isDoor: {
     label: `Make Door`,
     callback: () => {
       wallUpdate({"door": CONST.WALL_DOOR_TYPES.DOOR});
       dialogEditor.render(true);
     }
   },
   close: {
     icon: "",
     label: `Close`
    },
  },
  default: "close",
  close: () => {}
});

dialogEditor.render(true)
  • Check each map's doors. (in general a door should only be one segement in length, redefining them as needed. Setting each door as locked, closed or open as is needed)
  • Define the Secret Doors, and simplify those where possible - locking them if needed (if you are using "i see you" A door token with the attribute for its DC value should be placed)
  • Convert standard walls that are better turned into Terrain walls where needed (Columns; Trees; Boulders; objects which are 8ft of more in height) and long stairwells or sets of elevation changes (to mirror loss of vision from elevation changes)
  • Add Invisible walls for Portcullis; Jails; Windows; etc.
  • Add Ethereal walls for Illusionary walls; Tapestries; etc
[f] Define Audio Sources
  • Fires: Fireplaces; campfires;
  • Water: Waterfalls; Rivers; Streams; Fountains; Sewers
  • Inn/Taverns: Common room; or noise banquet hall
[g] Review Define Light Sources
  • Check if the global lighting token vision or fog of war are needed for that scene.
  • Define Candle/Torches with Dynamic Lighting's FIRE [THIS WILL BE REPLACED LARGELY IN 0.7.x]
  • Colored lights (Glyphs; Lava; Magical lights
[h] Define [Multi-Level Token]
  • Level where the scene has multiple levels on the same scene
  • In/Out where it moves between scenes
  • Clone where one layer overlooks or below another map layer's overwatch position / mezzanine.
[i] [1] to add visual effects (rolling waves/train moving/fog rolling in).
  • Water/Wave - (and underwater)
  • Snow -
  • Rain -
  • Train/Flying/ travel scenes (areas where the background moving will generate the sense of travel and speed)

PROPERTIES

Field Function
Alpha Set's opacity 1 = 100%
X Scale & Y Scale 1=100% scale; use fractions to reduce scale
ΔX & ΔY Rate of change along that axis
X-Offset & Y-Offset Example
ΔX & ΔY Offset Movement : values
down or right +;
up or left -

CUSTOM SCRIPTs: For rotation: next.rotation.z += 0.1; (change value increase; decrease spin speed)

[j] Using the reference Adventure place the creatures about the space.
[k] Refer to the notes for "sneaky" creatures (werebeasts; dopplegangers; spys; etc) if one such NPC appears on the map/scene - set the HUD wildcard for the sides, if the token is a random table you'll need to set the directory for the token (typically worlds/<json_name>/scenes/tokens/<###-<name>> if you want variety in the creatures use the wildcard * solution and then pull the creatures to the scene.
[l] If you have chosen to - your notes about merchants or containers/stashes - add the Loot NPCs for such. Update the Readme.md with the LootNPC 5e if so.


35) Go into the the Scene's configuration;
  • If adjustments were needed for scale or alignment you hopefully fixed that in 40b, if not you'll likely have to rebuild the scene once updates are applied as sounds/lights/tile/walls/tokens etc locations may shift relative to the background or tiles and no longer align as intended.
  • Link the Journal Notes.
  • Change the background color to a neutral background
  • Review and change the Lighting and Vision as needed
  • Set the Playlist & Weather effect as needed
  • Change Accessibility / Navigation name as needed
36) Drop your Test User onto the map and test the settings, lighting, sound events, check walls and doors; and check Multilevel token areas (remembering where it occurs - to double check that your token was deleted when it moves to another scene and back.)
37) Fix any issues that were discovered
38) Update Readme with any notes about dependencies used etc.
39) Delete the Test user token


40) Repeat steps 40-45 until all scenes have been done.


41) If you find a
  • Search for a copy of the Maps/Tiles from the Art Repo or pull from the website. (Try to use maps images that don't have tokens or secret doors marking clearly included, instead try to find DM versions of the maps without any tokens/locations).
  • Save and convert it to a .webp type in the worlds/<world's_name_dir>/scenes/backgrounds


42) Exit Game & Navigate to the game's directory worlds/
43) Make a backup zip of the <world's_name_dir> directory (This next part is potentially destructive) - calling it <world's_name_dir>-v001.zip.



File Manipulation

Time to get a bit crazy.
44) Open and Edit world.json
The world.json should already have updated Core and System versions from being opened, but check and if not replace as needed.
	"coreVersion": "0.7.9",
	"minimumCoreVersion": "0.7.9,
	"compatibleCoreVersion": "0.7.9",
	"system": "dnd5e",
	"systemVersion": 1.2.4,
	"minimumSystemVersion": "1.2.4",
	"compatibleSystemVersion": "1.2.4",


Replace the
"script": ["./checkdependencies.js"],
line with
scripts": [],


Replace the languages array (if its empty)
	"languages": [
		{
			"lang": "en",
			"name": "English",
			"path": "lang/en.json"
		}
	],


update the urls

Please note that the discord invite link you use should also be added to the Creators Dashboard.

"url": "",
"manifest": "",
"download": "https://foundry.5e.tools/plutonium/#/#.zip",
"license": "https://foundry.5e.tools/plutonium/#/LICENSE.md",
"readme": "https://foundry.5e.tools/plutonium/#/README.md",
"bugs": "https://discord.gg/<unique discord invite link>",
"changelog": "https://foundry.5e.tools/plutonium/#/CHANGELOG.md",
"background": "worlds/brw-tdt/scenes/backgrounds/start.webp",


and id
	"id": "#",
replacing # with the world's abbreviation

update the authors with whomever wrote or published the adventure

If your world has module dependencies, copy and add this section to the world.json json -- with the notes you've taken keep the ones that were used, remove the ones that were not. Make sure the final entry doesn't have a comma at the closing } (last element in the array of objects).

"dependencies": [

   {
     "name": "plutonium",
     "manifest": "https://get.5e.tools/plutonium/module.json",
     "version": "1.27.1",
     "author": "Giddy"
   },
   {
     "name": "multilevel-tokens",
     "manifest": "https://raw.githubusercontent.com/grandseiken/foundryvtt-multilevel-tokens/master/module.json",
     "version": "1.4.1",
     "author": "grandseiken"
   },
   {
     "name": "fxmaster",
     "manifest": "https://gitlab.com/mesfoliesludiques/foundryvtt-fxmaster/-/raw/master/module.json",
     "version": "1.0.3",
     "author": "U~man"
   },
   {
     "name": "token-hud-wildcard",
     "manifest": "https://raw.githubusercontent.com/javieros105/FVTT-TokenHUDWildcard/master/token-hud-wildcard/module.json",
     "version": "1.2.0",
     "author": "Javieros"
   }

],

Check code through JSONonlint. Fix any errors that appear.
Save the file when done.
45) Edit module.json for editing
(This is preparatory work; this won't (as yet) enable the module - but it lays the groundwork for such... and you're here anyway)
44) As with world.json Replace # with world's abbreviation wherever it appears (Ctrl+H) Find: # ; Replace with: <type-abbreviation-suffix(es)>
45) Type in the Project's Long Name. Replace ~ with the name of the project's Title wherever it appears (Ctrl+H) Find: ~ ; Replace with: <Title>
46) Pack data should have been copied over, if so you can save the file. (You will be touching it once more)
Check code through JSONonlint. Fix any errors that appear.
Save the file when done.
46) Open README.md and CHANGELOG.md for editing
Modify the version of the README listing.
Make sure that the CHANGELOG.md includes all of the changes you have made, organized by release tag.
Check the README's accuracy for the content you've worked upon.
Save the file when done.
47) Launch Foundry (this reloads the World index)
If the world does not show up in the listing, you may have an issue with the JSON's structure - review and revise it, looking at JSONlint.



In Foundry

Scenes

Revisit the scenes and see if there are any broken graphics (Scene/Actor/Token/Tiles/Drawings)
Check linked Journals
Check Music and lighting
Check permissions
Check Multi-Level tokens

Actor

Now for some Fine Tuning
Open each actor; if they have the Spellcasting trait, open the actor's spellbook (this SHOULDN'T be an issue, but if the creature is only defined in the adventure it does happen) update their stated casting level and then the slots they have available.
SOME CASTERS IN THE ADVENTURE ARE "NERF'D" to lower their DCs for a balanced combat - so reference the adventure to confirm. Do NOT add slots if they don't have them.
Check Actor's weapons (specifically for versatile weapons (spear being the most common one) make sure they list both attack options.
If they have a ranged weapon, give them ammo of the appropriate sort (personal choice - you can ignore that if you wish)

Decks

Pending

Compendium

Backing up the data to Compendium
Grab THIS js Macro and execute it.
Move all Actor; Scene; Item; JournalEntries; Rollable Tables and Playlist (if any) to their respective comendia you made back in step 20.



Delete the Tools macros you used during setup
Exit the world and Foundry.

File Manipulation

Making the Compendium work as a module (but from a single file)
You should have access to and the data/worlds/<directory_name> folder
Open all the files in the data/worlds/<directory_name>/packs/ directory in an editor
#) In the data/worlds/
Finishing the Module.
Find and Replace all instances of /data/worlds/ with /data/modules/ that appear across all those files.
Save the file
Open the world.json (if its not already open)
Replace the
 "packs": [ 

with

 "packs": [],
Copy the the directory to data/modules/
Relaunch Foundry (will reload the indexes)
Open a game (any)
Edit Finishing the module.json
(This is preparatory work; this won't (as yet) enable the module - but it lays the groundwork for such... and you're here anyway)
#) As with world.json Replace # with the name of the project (the directory name) wherever it appears (Ctrl+H) Find: # ; Replace with: <world's_directory_name>
#) Type in the Project's Long Name. Replace ~ with the name of the project's Title wherever it appears (Ctrl+H) Find: ~ ; Replace with: <Title>
data/games/<>/data delete the session's
  • sessions.db
  • users.db
  • chat.db
  • fog.db
  • combat.db