Compare commits

...
21 Commits
Author SHA1 Message Date
Mark Bools 135d53bae6 Add ground up part 2 2024-08-27 18:43:52 +01:00
Mark Bools 0e62bf8c60 part 3 of mod dev series 2024-08-27 17:04:55 +01:00
Mark Bools 981e63fcb8 Adding supporter buttons to footer 2024-08-25 10:49:40 +01:00
Mark Bools d1b01fb422 Add articles associated with module development youtube 2024-08-24 18:52:24 +01:00
Mark Bools 88af3553b4 Add github to social links 2024-08-24 18:51:42 +01:00
Mark Bools 3a7d376e95 Minor typo 2024-08-24 18:50:31 +01:00
Mark Bools 4d5044a4ee Couple of typos 2024-08-21 13:06:28 +01:00
Mark Bools ec28babb7b Added finding a game 2024-08-21 12:54:46 +01:00
Mark Bools 505e573d60 Add start of FVTT GroundUp 2024-08-21 12:08:45 +01:00
Mark Bools d37798b21c Start of module dev series 2024-08-17 16:35:37 +01:00
Mark Bools 047302c94a Allow HTML in markdown (to allow <sup> in the first instance) 2024-08-17 16:33:59 +01:00
Mark Bools 632e55e73f Typo and image fix 2024-08-07 09:40:20 +01:00
Mark Bools de7e077565 Article starting deep dive into FoundryVTT 2024-07-30 15:55:27 +01:00
Mark Bools dcef48441e Add URL to Discord channel advisor text 2024-07-30 15:54:50 +01:00
Mark Bools e7fb1ea552 Start of technical articles stream 2024-07-29 16:09:30 +01:00
Mark Bools 555d6d1594 Add new article 2024-07-29 16:08:48 +01:00
Mark Bools e6b5dcd19c Typo corrections and adding Key Takeawayr section 2024-07-29 16:08:06 +01:00
Mark Bools 8e7d782a3c Add more details to my GM profile 2024-07-29 16:06:58 +01:00
Mark Bools 18b8d339f8 Tidy up gitignore 2024-07-29 16:05:57 +01:00
Mark Bools c9e59e86e3 Typo corrections 2024-07-29 15:59:06 +01:00
Mark Bools d5721545d9 Updates to theme 2024-07-29 15:55:01 +01:00
35 changed files with 682 additions and 17 deletions
+2 -1
View File
@@ -1,5 +1,6 @@
site
data/
tags
nginx/**/*.sample
nginx/dns-conf/
mondarth*.tar.gz
public/
+27
View File
@@ -1,5 +1,6 @@
---
title: MarkB
draft: false
---
I am a greybeard GM looking to establish a series of interesting tables and campaigns.
@@ -25,3 +26,29 @@ If you are a more experienced player you may still want to familiarise yourself
I take a relaxed attitude to the rulebook at my tables, I firmly believe in fun over rules lawyering. That said I strive for consistency in rulings to keep things fair (nothing worse that capricious or inconsistent rulings).
My GM style is best summed up as "benign dictator". I'm happy to debate rulings away from the table but expect players to respect rulings at the table. Feel free to challenge my ruling but I limit at table debates to two minutes, after that my ruling stands for the session. We can then debate rulings at length after the session and I will happily revise the outcomes in subesquent sessions (assuming we are in a campaign). I do this to keep the session moving while providing opportunity for players to challenge my rulings.
## My tables
Please note carefully:
**All my tables are run on Foundry VTT** and I make extensive use of modules to enhance the basic Foundry experience.
### Minimum Machine Specifications
Generally any modern (2015 or later) computer (desktop or laptop) will be fine, but...
Experience has shown that your PC will need *at least*
* A modern browser (preferably Chromium or Mozilla based)
Tested:
* [Brave](https://brave.com/download/) (version 1.567.119)
* [Vivaldi](https://vivaldi.com/download/) (version 6.8.3381.46)
* [Chrome](https://www.google.com/intl/en_uk/chrome/) (version 119.0.6045.199)
Should work:
* [Firefox](https://www.mozilla.org/en-GB/firefox/new/)
* 8Gb of RAM
* 4 core processor
It is also preferable, though not essential, if your machine has a good graphics card.
@@ -0,0 +1,37 @@
+++
title = 'Danger of Using a VTT'
date = 2024-07-21T09:00:00Z
draft = false
summary="A virtual table top (VTT) is a useful tool but there is a danger to using them."
+++
Before getting in to this let me be clear, virtual table tops (VTT) are awesome! They can add a new dimension to the game with graphics, they can help players by taking the burden of calculation for rolls, they can provide players with quick access to many details such as spell descriptions, and they can provide player and GM with support tools like online journals. At their best VTT are a great tool for player and GM.
That said...
The more enhanced a VTT becomes the more like a video game it can seem and this can lead to players treating the game like a video game. And RPGs are *not* video games.
For example, it is very easy for combat on a VTT to become a click slogfest. The VTT does much of the 'thinking' for players, calculating and executing the various dice rolls. This is great, but it also risks turning combat into a sort of Final Fantasy turn based combat; select action, click to execute, wait for resolution, repeat.
This means players are missing out on what makes TTRPG combat to much bettenr than a video game, the out-of-the-box move, the unanticipated combination of characters abilities that no video game can possibly account for.
Case in point. I recently had a player falling in to the clickfest trap so I suggested their character, seeing a dragon near death hovering only ten feet above the ground at the foot of some stairs, might (rather than another round of crossbow fire) try a running leap, swinging their bastard sword at the creatures head. This prompted an epic description of the move with an equally epic outcome. Sure, nothing cunning or complex, but so much better than "I fire my crossbow", click, for the tenth time.
It is easy to forget to role play if it is as simple as 'click' to cast a spell, fire a volley of crossbow bolts, or strike with a sword.
For the GM it is easy to tire of narrating the same "swing, hit, swing, miss" if players are just clicking away on screen.
One obvious solution to this problem is to remove all the distractions, use minimal VTT support. This strikes me as cutting of your nose to spite your face.
A better solution is to encourage narrative combat (in my experience it is in combat that this problem most often occurs). As with all things, this starts with the GM.
When planning your session, try thinking through your creatures motivation and possible battle plan. I recommend Keith Ammann's books, start with [The Monsters Know What They're Doing](https://www.amazon.co.uk/Monsters-Know-What-Theyre-Doing/dp/1982122668), for inspiration on imbuing your creatures with more than a simple "stand and fight until one side is dead" combat style. This advice, at its most basic, is "your monsters are not crash-test dummies". Creatures, even the most stupid, have at least a desire to survive (possible exceptions being undead) and most have a motivation for a fight; "protect the clan", "protect the treasure/icon/hostage", "protect territory". Their motives drive their willingness to fight and their nature and training infuence how they fight; pack tactics, military unit. and so on. All of these considerations add colour to your narration and make your creature more than simple targets for characters. Hopefully when players see your creatures doing more than simply offering a target they will respond by being more creative with their combat.
And if they don't. Well, you can just suggest a few things they "might like to try" until they get the message that they can try pretty much anything (especially true for players new to RPGs).
To reinforce this behaviour I try to reward immaginative combat tactics. Sure, the ranger leaping from the top of the stairs to strike the death blow to the dragon *might* fail but I decided that providing they made a fairly achievable DC12 athletics check they would kill the dragon outright.
> With a lithe rolling leap Springthorn somersaults from the top of the stairs arcing over the head of Sentof the cleric. Light glints from the razor edge of his Bastard Sword as, at the height of his leap, he twists to plunge it into the dragon's skull. The dragon screams in pain, eyes rolling in its head as it plunges to the ground. Springthorn releases his sword, tucks and rolls to the ground next to the mortally wounded dragon. As the dragon feebly tries to rise Springthorn reaches for his sword, now embedded in the dragon's skull, and draws it out. Brainmatter and blood fountain from the jagged hole and the dragon collapses to the ground lifeless.
Now, I don't know about you, but *that* was way more epic than "crossbow, click".
@@ -8,9 +8,9 @@ categories = ['Player', 'Game Master']
Role playing games are great fun and Dungeons & Dragons is the OG. If you are coming to D&D with no (or very little) experience or if you are simply overwhelmed by the torrent of advice online, then this series is ideal for you. In this series I will take you through the basics of role playing (and D&D specifically) introducing more complexity as you 'level up' your game.
These articles are arranged in the manner of those old "Choose Your Own Adventure" books where you read a page and then at the bottom of the page you can select from several options where to go next. In the same way at the bottom of each article you will see choices for where to go next. These are marked with flags ('P' for player focussed articles, 'GM' fo game master focussed articles, and 'T' fo technical articles---these tend to be about the Foundry Virtual Table Top system, more on this later). Articles may be marked with multiple flags, don't panic, just follow the ones that interest you, you can always circle back.
These articles are arranged in the manner of those old "Choose Your Own Adventure" books where you read a page and then at the bottom of the page you can select from several options where to go next. In the same way at the bottom of each article you will see choices for where to go next. These are marked with flags ('P' for player focussed articles, 'GM' for game master focussed articles, and 'T' for technical articles---these tend to be about the Foundry Virtual Table Top system, more on this later). Articles may be marked with multiple flags, don't panic, just follow the ones that interest you, you can always circle back.
A lot of material online can be overwhelming. It is easy to be distracted by (even put off by) weird, arcane discussions about the game system, how spells combine, the problems with class 'A' of ability 'B', and so on. None of that in this series.
A lot of material online can be overwhelming. It is easy to be distracted by (even put off by) weird, arcane discussions about the game system, how spells combine, the problems with class 'A' or ability 'B', and so on. None of that in this series.
Let's start at the beginning (generally a good place to start) with a few questions...
@@ -20,7 +20,7 @@ No. At least not all of them and not all at once. This series will introduce the
**Those books are *way expensive* do I need to buy them?**
No. The core rules are available for free at https://dnd.wizards.com/resources/systems-reference-document. These are the 'Systems Reference Documents' (SRD). There's still a *LOT* of content in these and it is presented in a less than helpful order fo new players. But, it is there, it is free, and it is everything you need to get started (and more).
No. The core rules are available for free at https://dnd.wizards.com/resources/systems-reference-document. These are the 'Systems Reference Documents' (SRD). There's still a *LOT* of content in these and it is presented in a less than helpful order for new players. But, it is there, it is free, and it is everything you need to get started (and more).
**Holy Cow! That's a 400 page PDf!**
@@ -114,14 +114,20 @@ And so play proceeds.
Don't panic. Your GM will help guide you through what dice to roll and when. You'll soon be anticipating what to roll and when.
Okay, how does the GM decide on the target number for these dice rolls? Well, they make it up. If the GM is running a pre-made module the type of roll and the target number will be specifed in the module, but often your character will be trying something the module does not provide information for, so the GM will make something up on the spot. The harder the thing you are trying to do, the higher the target will be. Sometimes the GM will tell you the target but often they will not. It depends on the GM and whether they feel it will add to the fun if the player knows the target number. If you are planning on being a GM we will cover how we go about deciding this later. Sometimes the rules offer guidance, but the GM can ignore or modify this as they wish. For example, the Dungeon Master's Guide (DMG) says that a character can jump horizontally up to their Strength (one of your characters attributes) in feet if theyy have a run up of at least ten feet. Say Thrud had strength of 17 they can jump 17 feet horizontally. Why did the GM make the player roll a dice then? Perhaps they decided Thrud was tired as it was late in the day, or they had just been in combat. Perhaps the GM decided the terrain was unven warranting the roll. Whatever the reason the DMG says that a DC 10 Athletices check is apporiate for tricky situations. Is this wnat the GM was using? Who knows. Again it is up to the GM to decide the DC for the specific situation.
Okay, how does the GM decide on the target number for these dice rolls? Well, they make it up. If the GM is running a pre-made module the type of roll and the target number will be specifed in the module, but often your character will be trying something the module does not provide information for, so the GM will make something up on the spot. The harder the thing you are trying to do, the higher the target will be. Sometimes the GM will tell you the target but often they will not. It depends on the GM and whether they feel it will add to the fun if the player knows the target number. If you are planning on being a GM we will cover how we go about deciding this later. Sometimes the rules offer guidance, but the GM can ignore or modify this as they wish. For example, the Dungeon Master's Guide (DMG) says that a character can jump horizontally up to their Strength (one of your characters attributes) in feet if they have a run up of at least ten feet. Say Thrud had strength of 17 they can jump 17 feet horizontally. Why did the GM make the player roll a dice then? Perhaps they decided Thrud was tired as it was late in the day, or they had just been in combat. Perhaps the GM decided the terrain was uneven warranting the roll. Whatever the reason the DMG says that a DC 10 Athletices check is apporiate for tricky situations. Is this what the GM was using? Who knows. Again it is up to the GM to decide the DC for the specific situation.
Offsetting the difficulty of the roll target, your character has innate abilities, skills, magic items, and other effects that make the task easier (or harder). All of these effects are represented by roll modifiers that you add to or subtract from the actual dice roll. The final number is then compared with the target and the GM narrates your success or failure.
Why all the dice?
It would be perfectly possible for the GM to run this encounter without rolling any dice at all. Ther narrative would be identical, just no one would roll dice, the GM simply decides on the outcome of each action. If fact, this will happen a lot when the GM is trying to keep the story moving forward. As a player this should not concern you.
It would be perfectly possible for the GM to run this encounter without rolling any dice at all. Their narrative would be identical, just no one would roll dice, the GM simply decides on the outcome of each action. If fact, this will happen a lot when the GM is trying to keep the story moving forward. As a player this should not concern you.
Dice are a mechanism to introduce chance into the resolution of actions. They can be used to build tension into the story.
# Key takeaways
* You don't need to be an expert to start playing (as a player or a GM).
* There are three phases to a TTRPG 'turn': Situate, act, and resolve.
* The game system (rules) inform the 'resolve' phase.
* The GM can choose to ignore, modify, or create rulings in order to make the game session flow and maintain the fun at the table.
* Dice add a random element (fate, if you prefer).
@@ -0,0 +1,26 @@
+++
title = "Finding a Game Online"
date = 2024-08-21T09:00:00Z
draft = false
summary="You want to try RPG but how do you find a game online?"
categories = ['Player']
prev = ['/post/do-you-want-to-play-a-game/']
+++
Role Playing Games sound fun? How do you find a game?
Play online or in person? Back-in-the-day most people met in person (sat around a table) to play table-top RPGs (the name kinda gives this away). A common experience though was for groups to break apart as players had to move because of "life" (kids grow up and go to separate colleges, college students graduate and take jobs in different locales, etc.). This sucks and players then either quit the hobby, played infrequently (when the old group could assemble), or found new groups. Whichever, it was dissruptive and often difficult.
Now we can play online. Some folk find this an inferior experience to playing around a table and I sympathise with this view. There is little better than sitting round a table with a group of friends to while away a few hours in epic battle, crawling a dungeon, or investigating a new world. That said, it can be a challenge to all gather like this, especially as people grow older and accumulate responsiblilities with family, work, etc. In these circumstances playing online is, in my opinion, no only a practical solution but often a superior experience as one can play with people all over the world, playing in multilpe games is as simple as loggin in, and therre is always a game to play in when you find yourself with a few spare hours to play.
How the do we find an online game? There are endless possibilities, here are just a few...
The "big dog" is [Start Playing Games](https://startplaying.games/). Here you will almost always find a game to play. Most games are pay-to-play and vary widely in price (the average seems to be around $18 US as I write this).
An alternative is [Tabletop Wizard](https://www.rpgtablefinder.com). A small collection of RPG tables, but you may find something to your taste.
If you have more lead time, try the following:
* On Reddit:
* [r/Foundry LFG](https://www.reddit.com/r/FoundryLFG/) for Foundry VTT groups.
* [r/lfg](https://www.reddit.com/r/lfg/) for more general "Looking For Group"
@@ -0,0 +1,18 @@
+++
title = "Github Repository Setup"
date = 2024-08-22T09:00:00Z
draft = false
summary="Learning Foundry VTT Module Development from the very start"
categories = ['Technical', 'FoundryVTT', 'Foundry VTT for Module Developers']
prev = ['/post/lets-build-a-module/']
+++
In the [previous post]({{< ref "/post/lets-build-a-module/" >}}) I proposed we build a couple of Foundry modules. This post starts that process, looking at Github to hold our module code.
{{< youtube nXZ-fwcygYk >}}
Although not a detailed lesson on Github, this session covers:
* Setting up your account to use SSH keys.
* Creating a repository to hold our module.
* Cloning that repository to our local development machine so we can work on the module.
@@ -0,0 +1,41 @@
+++
title = "Local Project Documentation Setup"
date = 2024-08-24T09:00:00Z
draft = false
summary="Learning Foundry VTT Module Development from the very start. In this session: setting up the local project dcumentation system."
categories = ['Technical', 'FoundryVTT', 'Foundry VTT for Module Developers']
prev = ['/post/fvtt-mod-dev-local-project-setup/']
+++
Continuing our Foundry VTT module development journey. Having set up some basic tooling on our project we now want to keep our project well documented.
{{< youtube _p_1ItoDo8U >}}
In this session we set up a system for creating a documentation website. We cover:
* Creating a 'starter' set of documentation'
* Create a system for transforming that source into a web site.
* Putting all this into our project version control system.
# Why go to all this trouble?
## For users...
Firstly, our users will likely want some documentation helping them to use the module.
It make sense to keep this alongside the module code to make it easier to keep the documentation in line with each release of the module. (There is little more annoying, as a user, than checking documentation to find it is only relevant to some version of the module that you are not, or worse cannot, use.)
## For Foundry administrators/game masters...
Adminstrators will appreciate it if we produce clear, concise release notes explaining changes we make to the module. This is especially true if the changes are likely to change their players' experience (or worse, break their current setup).
The objective here is to provide just enough infomation so that administators can make the decision about updating a module (and what work might be involved to adopt a more complex update).
## For developers...
Finally, it is nice for developers to have docmentation for our code. While I believe that code should be (so far as practicable) self-documenting there is certainly a need in anything but the most trivial module, for documentation that:
* orients the developer, letting them know the broad architecture and function of the module, and
* documents *why* certain design decisions where taken.
While some of this can, and should, be in comments in the code, there is a lot of useful information that belongs in external documentation.
@@ -0,0 +1,25 @@
+++
title = "Local Project Setup"
date = 2024-08-23T09:00:00Z
draft = false
summary="Learning Foundry VTT Module Development from the very start. In this session: setting up the local project."
categories = ['Technical', 'FoundryVTT', 'Foundry VTT for Module Developers']
prev = ['/post/fvtt-mod-dev-github-repository-setup/']
+++
Having cloned our Github repository to our local development machine we now set up some basic tooling that will help later as we develop our module.
{{< youtube 8Qm0XJSWqYU >}}
In this session we set up:
* [`npm`](https://www.npmjs.com/), initialising our project.
* [`husky`](https://typicode.github.io/husky/) to marshal our `git` hook scripts.
* [`commitizen`](https://github.com/commitizen/cz-cli) to enforce standard `git` log messages.
These tools provide some 'guardrails' on our project that, although they may seem onerous now, will pay dividends later by facilitating:
* The production of consistent a changlog for our release notes (poviding users and other developers with timely and accurate details of what changes occur to our module).
* Management of our release versioning.
A few minutes of setup now will save hours over the life of our module.
@@ -0,0 +1,22 @@
+++
title = "Foundry VTT Ground Up Part 1"
date = 2024-08-21T09:00:00Z
draft = false
summary="Learning Foundry VTT from the very start"
categories = ['Game Master', 'FoundryVTT', 'FoundryVTT Ground Up']
prev = ['/post/setup-a-local-foundryvtt/']
+++
Having set up a Foundry Virtual Table Top (VTT) (locally, on your own server, or on one of the cloud services) you, the Game/Dungeon Master (GM), are confronted with the task of setting up your VTT. In a series of articles we will step through setting up Foundry VTT for Dungeons & Dragons 5e (although a lot of this material will apply no matter your chosen game system).
{{< youtube kJh_fkLvtVM >}}
In this first installment we look at:
* Installing the game system (this is essentially the 'DM Guide' and 'Players Handbook' for FVTT)
* Create an empty world
* A lightning fast tour of the standard interface
* Add Users/Players
* Create an empty Scene
* Create Actors (player characters) and let Players access them
* Create Tokens to represent Actors on our Scenes
@@ -0,0 +1,23 @@
+++
title = "Foundry VTT Ground Up Part 2: Basic scenes"
date = 2024-08-27T09:00:00Z
draft = false
summary="Going from grey background to interesting scene"
categories = ['Game Master', 'FoundryVTT', 'FoundryVTT Ground Up']
prev = ['/post/fvtt-v12-ground-up-part-one/']
+++
Last time we looked at the Foundry VTT interface. We left our world with two scenes, but these were rather dull as they were just gridded grey backgrounds. In this session we introduce basic scene setup.
{{< youtube ADf2Vvu0wpI >}}
In this installment we look at:
* Adding a background.
* Adding a foreground.
* The relationship between layers.
* How elevation effects tokens and layers.
The diagram below shows the layers we use in this session and their relationship to one another.
![Basic Scene Layers](layers-diagram.png)
Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

@@ -0,0 +1,125 @@
+++
title = 'Investigating a FoundryVTT Install'
date = 2024-07-30T09:00:00Z
draft = false
summary="Layout of a new Foundry Install"
categories = ['Technical', 'Game Master', 'FoundryVTT']
prev = ['/post/setup-a-local-foundryvtt/']
+++
In the [previous post]({{< ref "/post/setup-a-local-foundryvtt" >}}) we installed FoundryVTT using Docker (if you used another method then you will need to locate the `data` directory for your installation). In this article we will take a quick tour of the filesystem created and some of the Foundry VTT user interface (UI).
If you left your Foundry instance running then skip this step, but if not we should restart it. Assuming you used Docker simply
```bash
cd ~/foundryvtt
docker compose up -d
```
To restart the Foundry server. (To stop the server `docker compose stop` in that same directory. Stopping the server like this will not lose any data.)
Move in to the `data` directory and look at the files Foundry has created.
```bash
cd data
tree
.
├── Config
│   ├── admin.txt
│   ├── license.json
│   ├── options.json
│   └── options.json.lock
├── Data
│   ├── modules
│   │   └── README.txt
│   ├── systems
│   │   └── README.txt
│   └── worlds
│   └── README.txt
├── Logs
│   ├── debug.log
│   ├── diagnostics.json
│   ├── error.log
│   └── news.json
└── container_cache
└── foundryvtt-11.315.zip
9 directories, 11 files
```
As mentioned in the last post the `container_cache` is used by the Docker image and is not part of Foundry itself. The other directories are though.
In `Config/admin.txt` you will find a long string of characters, this is an encrypted form of the `foundry_admin_key` we set in `docker-compose.yaml`. On a normal installation you can reset your administrator password by deletind this file. On a Docker installation like ours you can look in `vttsecrets.json` to see the password, or simply change the password in `vttsecrets.json`, then delete `Config/admin.txt`, and restart Foundry using `docker compose restart`.
In ` Config/license.json` is, unsuprisingly, your license.
In `Config/options.json` are Foundry server options. We will take a look at these one day, for now just note they are here. The `Config/options.json.lock` is an empty directory used internally by Foundry, ignore it for now.
Various log files live under `Logs`. These can be useful if we have issues and we may need to supply these to developers, so it is as well to know they are here. The `Logs/news.json` is actually displayed on the right side of the Foundry setup screen.
The directory we are most interested in is `Data`.
## Data
Under `Data` we have three top-level directories.
1. `modules`---Contains all of the extension/add-on modules we insstall.
2. `systems`---Contains all the game systems we install.
3. `worlds`---Contains the worlds we create and install.
Currently each of these contains only a `README.txt` file that explains what the directory is for.
We will be revisiting the `Data` directory often.
## Foundry VTT Setup
Switching our attention now to Foundry VTT. Fire up your browser and visit [http://localhost](http://localhost). Depending on where you left off previously you may need to accept the license etc. but assuming you are continuing on from the previous post you should be looking at the Foundry Setup Screen.
![Foundry Setup Screen](foundry-setup-1.png)
### Installing the D&D 5e game system
Before anything else let's tell Foundry we want the D&D5e system installed. If it is not already selected click on `Game Systems`. Then click `Install System` to open the `Install System` dialog.
![Install System Dialog](install-system-dialog-1.png)
Into the search bar at the top, enter `dnd5e`. This will filter the list of available game systems (when I did this I ended up with just one, the one we want). Find `Dungeons & Dragons Fifth Edition` and click the `Install` button on the right.
![Install DnD System Dialog](install-system-dialog-2.png)
Close the `Install System` dialog (click `Close` in the top right of the dialog).
Foundry will move you on to installing a `Game World`, but click back to `Game System` and you should see the D&D Fifth Edition game system.
![Installed DnD System](install-system-3.png)
Jump back to look at the file system. Under `Data/systems`, in addition to the `README.txt` we now have a `dnd5e` directory. Under this `dnd5e` directory are many files and directories that contain details of the D&D5e game system along with helpful assets and content from the D&D Standard Reference Document made easily accessible within Foundry.
In order to check out this game system we need a "world", so let's set one up now.
### Creating a world
Click on the `Game Worlds` header of the Foundry Setup screen and then click `Create World`
![Game Worlds](create-world-1.png)
This will open the `Create World` dialog.
![Create Game World](create-world-2.png)
We will do the minimum setup for now. Just enter a `World Title` "TEST" and select `Dungeons & Dragons Fifth Edition` from the `Game System` dropdown. (**Note** that the `Data Path` is set to a default name---lowercase version of the `World Title`---under the `/Data/worlds` directory. We could change this, but don't.)
![Create TEST Game World](create-world-3.png)
Click the large `CREATE WORLD` button.
You will now see your new `TEST` world listed on the `Game Worlds` tab of the Foundry Setup screen.
![Game Worleds](create-world-4.png)
Skip back and look at the file system. Under `/Data/worlds` you now see `test`. This directory holds all the data specific to the `TEST` world. We will revisit this later.
What about modules? We will circle back to modules later but for now this is all we need to finally investigate Foundry VTT itself. We begin this in our next session.
For help with this post please use the [Discord channel](https://discord.com/channels/1226222567292145786/1267486648011329576) and be sure to refer to this post's link ({{< permalink >}})
Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 115 KiB

@@ -0,0 +1,161 @@
+++
title = "Let's build a module"
date = 2024-08-17T09:00:00Z
draft = false
summary="Starting to build custom modules"
categories = ['Technical']
prev = ['/post/investigating-a-foundryvtt-install/']
+++
If you are like me you like to spend time getting your setup "just so". This often means using add-on modules to extend Foundry VTT. There are many modules available ranging from relatively simple interface changes (like [My Tab](https://foundryvtt.com/packages/mytab/)) through sophisticated extensions to Foundry's game management (like [Midi Quality of Life Improvements](https://foundryvtt.com/packages/midi-qol)).
Sooner or later one of three things will happen:
1. One of the modules you want to use will not be updated to be compatible with your version of Foundry.
1. You will find an existing module that *almost* does what you want, but not quite (or it does it in a way you think can be improved).
1. You cannot find a module to do what you want.
In these cases (and assuming you have the time, energy, and know-how---or can learn how) you can:
* Create your own version of an existing module.[^1]<sup>,</sup>[^2]
* Write a new module.
Either way there are some barriers to doing this. Principal among these issues is the lack of coherent documentation for anyone coming new to Foundry development. There is plenty out there but it tends to be a bit out of date, or written with the assumption you already know a fair bit about how Foundry works. As for documentation of existing module code, well I've yet to stumble on any that is helpful to newbies. This series is aimed at addressing these shortcomings.
# The Plan
I have two modules I want to develop.
1. A control panel for Theatre of the Mind (TotM) style play.
1. A way to embed macro triggers into journal entries.
Addressing the first. The existing module [Theatre of the Mind Manager](https://foundryvtt.com/packages/totm-manager) is fine but limited for what I want to do. The approach most GMs seem to take is using [Monk's Active Tile Triggers](https://foundryvtt.com/packages/monks-active-tiles/), placing "control tiles" on a scene and setting them to 'invisible' so they can be seem by the GM only. This approach works, but means the GM needs to find those control tiles, moving focus from the players. This may be okay for TotM, but I'd rather be able to set up a management console that I can choose to put it anywhere I please (or dismiss when it is not required).
There are many things one can do to embed game mechanics into a journal entry using [enrichers](https://github.com/foundryvtt/dnd5e/wiki/Enrichers). The module [Dynamic Macro Links](https://foundryvtt.com/packages/dynamic-macro-links) offers a generic way to extend these dynamic links using macros (pretty much exactly what I want), unfortunately there is a conflict between this module and [Monk's Enhanced Journal](https://foundryvtt.com/packages/monks-enhanced-journal)---and I like Monk's Enhanced Journal---so let's see if we can fix that. In addition Dynamic Macro Links seems limited to passing static parameters, perhaps we can improve this?
I am starting pretty much from scratch in terms of my knowledge of Foundry and my Javascript is pretty non-existent too. Not to worry, this will mean we can learn together.
## Warning
Although I will try to explain things as I go my background is pretty technical (so I may assume too much of the reader, feel free to reach out (details at end of this post) if I do and I will try to clarify) and, in the interests of brevity, I will likely skip a lot of detail not directly related to Foundry module development. (Case in point, installing `NodeJS`, `Docker`, etc. are skipped assuming you will follow the instructions on the relevant websites.)
This is a series on developing modules for Foundry VTT, not a course on Javascript development. If you are new to writting code then I suggest you first master the basics of developing Javascript web products, then come back to this series.
# Setting up a Development Environment
The main things we need are:
* A way to run Foundry VTT so we can see our module working.
* A way to view our Foundry VTT (this is simply a browser).
* A way to view our running code (we will use the developer tools in our browser---I will be using Chromium browsers, specifically Brave and Vivaldi).
* A way to version, build, and publish our module for others.
* A way to edit our module's code.
## Running Foundry VTT for development
You can run Foundry directly (see the [FoundryVTT instructions](https://foundryvtt.com/article/installation/)---use the "Hosting a Dedicated Server with Node.js" instructions), or you can run it in a controlled "virtual" environment (this is basically the same as "Hosting a Dedicated Server with Node.js" but using [`nvm`](https://github.com/nvm-sh/nvm)---this method is not one I would encourage), or (and this is my preferred approach) you can use `Docker`.
I will be using the Docker approach.
1. It is the simplest to manage.
1. It plays into later stages of development (stay tuned, it gets funky).
### Install Docker
I'm going to assume you are working on a graphical interface (most likely Windows) so you will probably want to install the Docker Desktop using the instructions from the [Docker website](https://docs.docker.com/desktop/install/windows-install/).
### Running Foundry VTT in Docker
Fortunately [Mark Fedhousen](https://github.com/felddy) has done the heavy lifting for us. Once you have Docker installed just open a terminal window, create a directory to contain your Foundry data, and run up Docker.
```bash
mkdir myfoundry
docker run \
-d \
--name foundrydev \
--env FOUNDRY_USERNAME='<your_username>' \
--env FOUNDRY_PASSWORD='<your_password>' \
--publish 30000:30000/tcp \
--volume /the/full/path/to/myfoundry:/data \
felddy/foundryvtt:release
```
Replace `<your_username>` and `<your_pasword>` with your account username/password on https://foundryvtt.com where you purchased your Foundry license.[^3]
The `/the/full/path/to/myfoundry` should be the path to the `myfoundry` directory you created to hold your Foundry data.
The `-d` tells Docker to run Foundry in the background. Without this the terminal must remain open all the time Foundry is running.
Once you have run this you will be able to use your browser to visit `http://localhost:30000` where you will find your new Foundry VTT running.
You can see your instance running in the Docker desktop. From the command line use `docker ps` to view the running Docker containers (you will have only one unless you use Docker for other things---in which case this section is probably not for you).
```bash
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ff6b3bc2a3db felddy/foundryvtt:release "./entrypoint.sh res…" 6 seconds ago Up 6 seconds (health: starting) 0.0.0.0:30000->30000/tcp foundrydev
```
To stop the Foundry instance use `docker stop`
```bash
docker stop foundrydev
```
Bonus round. Install `Python`, we're going to need it to procees documentation very shortly.
* Python
Bonus round. Install `Python`, we're going to need it to procees documentation very shortly.
* Python
You can restart this instance of Foundry using `docker start`
```bash
docker start foundrydev
```
## Using the browser for development
Okay, we have Foundry running and can see it with our browser at `http://localhost:30000`. This is great for checking our module working as a user will see it but as a developer we want to see the code running, be able to stop the code, look at variable values, etc.
Fortunately the browser has "Developer Tools" built in. On Chromium based browsers press `F12` or `alt+ctl+I` or (on MacOS) `alt+cmd+I` to open the developer tools. These are a suite of sophisticated tools we will use to monitor and debug our code. Covering anything but the basics of these tools is a whole series in itself, I recommend you browse the [Chrome DevTools](https://developer.chrome.com/docs/devtools/) site to see what these tools can do.
## Version control, build, and publish
This is another big topic. We will use `git` so get that [installed](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git). I prefer the command line (CLI) but if you prefer a graphical interface there are plenty to choose from (that said, you will need to use the CLI a lot in this process, so probably best to learn it). Most modules are published through [GitHub](https://github.com) so go ahead and set up an account on there too.
We are going to be using [GitHub workflows](https://docs.github.com/en/actions/writing-workflows) to build and publish our modules. This facility is free and comes along with GitHub, more on this later.
We will cover all the local tooling in the next few posts. Some will require local installations but so far as possible we will keep everything local to the project. Most of the development tooling we will use relies on a local `NodeJS` installation. While we could use a Docker container to provide this, fankly it is easier for most purposes to install a local NodeJS (see above). Trust me, ngs can get complicated getting your IDE (say VSCode) to interact with `NodeJS` running in a container to provide language server services. Okay, that may be word salad at the moment. Suffice to say, install `NodeJS` locally, this will all make sense as we progress.
## Editing the code
This one is a matter of personal preference. You will need to be able to edit text files, beyond that it is up to you. One popular choice is [VSCode](https://code.visualstudio.com/download) which has a lot of additional tooling to help you editing code.
FWIW, I use [NeoVim](https://github.com/neovim/neovim/releases/).
# Technology Stack Summary
Install this lot locally to get started (there will be more to come).
* NodeJS
* Docker
* A browser
* Git
* A GitHub account
Bonus round. Install `Python`, we're going to need it to procees documentation very shortly.
* Python
For help with this post please use the [Discord channel](https://discord.com/channels/1226222567292145786/1267486648011329576) and be sure to refer to this post's link ({{< permalink >}})
[^1]: Assuming the license on the module allows for this.
[^2]: If you do this you may also want to contribute your change back to the original module.
[^3]: Foundry VTT licensing allows you to use your "play" license for package development (see [FoundryVTT Software License](https://foundryvtt.com/article/license/)).
Binary file not shown.

After

Width:  |  Height:  |  Size: 494 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 KiB

@@ -0,0 +1,139 @@
+++
title = 'Set Up a Local FoundryVTT'
date = 2024-07-29T09:00:00Z
draft = false
summary="To start learning Foundry VTT 'inside and out' we create a local development server."
categories = ['Technical', 'Game Master', 'FoundryVTT']
prev = ['/post/do-you-want-to-play-a-game/']
+++
I am a great believer in learning *how* things work 'inside' in order to better deal with them day-to-day. Could we just *use* Foundry? Sure, but I want to understand the details so I can figure out what to do when things go wrong.
If you don't want to dive into the details, that's fine, the Game Master track will avoid all the techno-babble. However, I would still advise you to install a local copy of Foundry to learn with because:
1. The only cost is a Foundry license (which you can use with online sevices like [The Forge](https://forge-vtt.com/)---more on this later).
2. Having a local server means you do not need an internet service all the time (you still need it to download and install modules, etc.)
3. Using a local server (separate from the one you play on with others) for learning, development, or experimentation means less worry about screwing things up just before that big game night.
4. Thanks to Foundry's license terms you can use the same license key for your "play" server (on The Forge, for example) and on your local development server (see [Foundry FAQ](https://foundryvtt.com/article/faq)).
>It is acceptable to run two (or more) instances of Foundry Virtual Tabletop using a single license if only one of those is accessible for player use by clients who are not the software license owner.
We could just install Foundry locally, but instead we will do something a little more complicated.
## Docker
We are going to use a technology call *containerisation*. You don't need to worry about all the technical details, just understand that this will allow us to run one or more copies of Foundry (possibly at different versions, which will be useful when we test upgrades).
The first step is to install a program called 'Docker' (again, don't worry about all the technical details, for our purposes this is just 'the system that runs Foundry'). For instructions on downloading and installing Docker I suggest a quick search on YouTube. I won't cover it here as this post is not a Docker tutorial.
**Note** If you need only one simple installation then Foundry provide [installation instructions](https://foundryvtt.com/article/installation/). Most of the technical posts on this site apply to any Foundry installation and I will note when a post relies heavily on a Docker installation.
I prefer using Docker because:
1. It takes away some of the complexity of setting up Foundry (at the cost of setting up Docker)
2. It keeps my Foundry installs isolated from all the other things going on in my computer.
## Foundry
Now the neat part. First we create a directory to hold our Foundry setup. I'm on MacOS so these instructions are for that platform, you will need to adjust the paths for your situation.
```bash
cd ~
mkdir foundryvtt
cd foundryvtt
```
In this directory we create two files. The first `vttsecrets.json` will contain our secrets; specifically our logon credentials for` foundryvtt.com` (so we can download FoundryVTT) and the license we want to use.
```json
{
"foundry_admin_key": "supersecret",
"foundry_password": "5jSb&MQdnFNdc#akj",
"foundry_username": "myfoundry",
"foundry_license_key": "YNTD-MF2Q-W94E-FMLL-A4UT-XUTZ"
}
```
Obviously you need to replace these values. `foundry_admin_key` is the password that will be set in your Foundry instance (the one you will use to access the Foundry Administration screen). `foundry_username` and `foundry_password` are the username and password you use to accees https://foundryvtt.com (where you purchase your Foundry Licence---see [Foundry FAQ](https://foundryvtt.com/article/faq/)). Finally, `foundry_license_key` it the license you want to use for this installation (you find this under your https://foundryvtt.com account).
The second file is the one that will create and run your Foundry server, name it `docker-compose.yaml`.
```yaml
secrets:
config_json:
file: /Users/myaccount/foundryvtt/vttsecrets.json
services:
foundryvtt:
image: felddy/foundryvtt:11
volumes:
- /Users/myaccount/foundryvtt/data:/data:rw
ports:
- 80:30000
environment:
- CONTAINER_PRESERVE_CONFIG=true
secrets:
- source: config_json
target: config.json
restart: unless-stopped
```
The paths (starting `/Users/myaccount` will need to be changed to match the paths to your installation).
**Note** that this setup will install the latest `v11` installation of Foundry. If you want to use another version change the end of the `image:` line, e.g. for the latest `v12` use `image: felddy/foundryvtt:12`. If you want to always start with the latest release version of Foundry use `image: felddy/foundryvtt:release`. For a complete list of all available Foundry images check https://hub.docker.com/r/felddy/foundryvtt/tags.
Also, we need to create the directory to hold our Foundry data.
```bash
mkdir data
```
And now the magic.
```bash
docker compose up -d
```
If all goes well then after a few seconds you will be able to open your browser and visit [http://localhost](http://localhost) and see a fresh Foundry installation. You should see end `End User License Agreement`.
![End User License Agreement](EULA.png)
Check the `I agree to these terms` box (bottom right) and then click the `Agree` button.
You will now see the `Administrator Access Required` screen.
![Administrator Access Required](AdminAccess.png)
Enter the `foundry_admin_key` password you provided in the `vttsecrets.json` file. You should now be on the initial setup screen.
![Intial Setup Screen](initialsetup.png)
Looking in your `foundryvtt/data` directory you should now see a set of data created by Foundry.
```bash
ls /Users/myaccount/foundryvtt/data
Config container_cache Data Logs
```
The `container_cache` is created and maintained by the Docker image and is not a Foundry directory.
`Config` contains Foundry configuration files.
`Logs` contains Foundry log files (useful fo debuging and diagnosing problems, we won't often refer to these).
`Data` this is the one we will most often refer to, it contains all of the data used by Foundry. If we look in that directory now we see.
```bash
ls /Users/myaccount/foundryvtt/data/Data
modules systems worlds
```
These three directories correspond to the `Add-on Modules`, `Game Systems`, and `Game Worlds` we see on the Foundry setup screen. We will be digging around these directories a lot (especially `modules`).
Before wrapping up this session, let's complete the setup screens. In your browser, either `Allow Sharing` or `Decline Sharing` (either is fine, whether you share usage data or not is a personal choice and does not limit your use of Foundry).
Next you will be invited to tour the Foundry backup functionality. Feel free to follow along (using the tiny arrow in the bottom right) or ship it (close with the `x` at the top right).
With that we are ready to start setting up Foundry.
For help with this post please use the [Discord channel](https://discord.com/channels/1226222567292145786/1267486648011329576) and be sure to refer to this post's link ({{< permalink >}})
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

@@ -4,6 +4,6 @@ title: Full Campaign
---
These are full-fat campaigns and take part over many gaming sessions.
Each sessions is typically 3 to 4 hours long.
Each session is typically 3 to 4 hours long.
Although full campaigns require considierable commitment they are also more rewarding. You have the opportunity to develop your character through many adventures, investigating an interesting world curated by your GM.
@@ -5,7 +5,7 @@ These are between a [one shot](/session-type/one-shot) and a [full campaign](/se
Mini campaigns are typically spread over 3 to 5 sessions.
Each sessions is typically 3 to 4 hours long.
Each session is typically 3 to 4 hours long.
While one shots allow casual players to indulge in role play (or simply scratch that role playing itch) and full campaigns provide on-going and (hopefully) deep involving worlds, the mini campaign provides more depth than the one shot without the commitment of a full campaign.
@@ -1,6 +1,6 @@
---
title: One Shot Session
---
Short adventures completed in a single session. Ideal for new players wanting to try out a GM's style, learn to use the VTT, of simply try role playing.
Short adventures completed in a single session. Ideal for new players wanting to try out a GM's style, learn to use the VTT, or simply try role playing.
These sessions are typically 3 to 4 hours long.
+9
View File
@@ -13,6 +13,12 @@ timeZone = "Europe/London"
favicon = "ulenar.png"
cyoa = ["Player", "Game Master", "Technical"]
[markup]
[markup.goldmark]
[markup.goldmark.renderer]
unsafe = true
[menus]
[[menus.main]]
name = 'Home'
@@ -34,3 +40,6 @@ timeZone = "Europe/London"
[[params.ananke_socials]]
name = 'youtube'
url = 'https://www.youtube.com/channel/UCbpj4ryAcG1eIVXHuRSDRXw'
[[params.ananke_socials]]
name = 'github'
url = 'https://github.com/Mondarth'
@@ -35,7 +35,7 @@ nav .fancy-title{
text-shadow: none;
}
article>div p:not(.nodrop):first-of-type::first-letter {
article>div>p:not(.nodrop):first-of-type::first-letter {
color: firebrick;
padding: 0 .3rem;
margin: 0 .3rem 0 0;
@@ -2,6 +2,7 @@
{{- $cp := where .Site.RegularPages ".Params.categories" "intersect" site.Params.cyoa -}}
{{- $np := where $cp ".Params.prev" "intersect" (slice $pageRel ) }}
{{if or (isset .Params "prev") $np }}
<div class="bg-white br3 mb3 pa4 gray">
<h1 class="f3 near-black">Choose Your Own Adventure<h1>
@@ -11,9 +12,9 @@
{{ range $np }}
<li class="list pa0">
<a href="{{ .RelPermalink }}" class="link f5 grow no-underline ph3 pv0 mb2 dib black sans-serif">
{{if in .Params.categories "Player"}}<img src="/images/PF.svg" alt="Player Forward" height="16px">{{end}}
{{if in .Params.categories "Game Master"}}<img src="/images/GMF.svg" alt="Game Master Forward" height="16px"> {{end}}
{{if in .Params.categories "Technical"}}<img src="/images/TF.svg" alt="Technical Forward" height="16px"> {{end}}
{{if and (in .Params.categories "Player") (in $.Params.categories "Player")}}<img src="/images/PF.svg" alt="Player Forward" height="16px">{{end}}
{{if and (in .Params.categories "Game Master") (in $.Params.categories "Game Master")}}<img src="/images/GMF.svg" alt="Game Master Forward" height="16px"> {{end}}
{{if and (in .Params.categories "Technical") (in $.Params.categories "Technical")}}<img src="/images/TF.svg" alt="Technical Forward" height="16px"> {{end}}
{{- .LinkTitle -}}
</a>
</li>
@@ -25,9 +26,9 @@
{{ with $.GetPage .}}
<li class="list pv0 mv0">
<a href="{{ .RelPermalink }}" class="link f5 grow no-underline ph3 pv0 mb2 dib black sans-serif">
{{if in .Params.categories "Player"}}<img src="/images/PB.svg" alt="Player Back" height="16px">{{end}}
{{if in .Params.categories "Game Master"}}<img src="/images/GMB.svg" alt="Game Master Back" height="16px"> {{end}}
{{if in .Params.categories "Technical"}}<img src="/images/TB.svg" alt="Technical Back" height="16px"> {{end}}
{{if and (in .Params.categories "Player") (in $.Params.categories "Player") }}<img src="/images/PB.svg" alt="Player Back" height="16px">{{end}}
{{if and (in .Params.categories "Game Master") (in $.Params.categories "Game Master")}}<img src="/images/GMB.svg" alt="Game Master Back" height="16px"> {{end}}
{{if and (in .Params.categories "Technical") (in $.Params.categories "Technical")}}<img src="/images/TB.svg" alt="Technical Back" height="16px"> {{end}}
{{- .LinkTitle -}}
</a>
</li>
@@ -3,6 +3,7 @@
<a class="f4 fw4 hover-white no-underline white-70 dn dib-ns pv2 ph3" href="{{ .Site.Home.Permalink }}" >
&copy; {{ with .Site.Copyright | default .Site.Title }} {{ . | safeHTML }} {{ now.Format "2006"}} {{ end }}
</a>
<div>{{ partial "supporter.html" . }}</div>
<div>{{ partial "social-follow.html" . }}</div>
</div>
</footer>
@@ -0,0 +1,2 @@
<a href="https://www.patreon.com/bePatron?u=125162698" data-patreon-widget-type="become-patron-button">Become a member!</a><script async src="https://c6.patreon.com/becomePatronButton.bundle.js"></script>
<script type='text/javascript' src='https://storage.ko-fi.com/cdn/widget/Widget_2.js'></script><script type='text/javascript'>kofiwidget2.init('Support Me on Ko-fi', '#29abe0', 'E1E012BACV');kofiwidget2.draw();</script>
@@ -0,0 +1 @@
{{ .Page.Permalink }}
@@ -8,7 +8,7 @@
<div class="nested-links f5 lh-copy nested-copy-line-height">
{{ $gm := or .Params.GM .Parent.Params.GM }}
<ul class="list">
<li>Game Master: <a href='/gmprofile/{{ $gm }}' class="link">{{ $gm }}</a></li>
<li>Game Master: <a href='/gmprofile/{{ lower $gm }}' class="link">{{ $gm }}</a></li>
{{ partial "session-type.html" . }}
<li>Seat reservation fee<a href="/reservation-fee" ><img src="/info.png" class="w100 mw5-ns" style="width: 16px" alt="Info on seat reservation fees" /></a>: ${{ .Params.seat_fee }} {{- if ne nil .Params.patreon.seat_fee }} (Patreons<a href="/patreon-reservation-fee" ><img src="/info.png" class="w100 mw5-ns" style="width: 16px" alt="Info on Patreon seat reservation fees" /></a> {{if .Params.patreon.seat_fee}}${{ .Params.patreon.seat_fee }}{{else}}FREE{{- end}}){{else}}NON {{ .Params.patreon.seat_fee }}{{- end}}</li>
</ul>