In this video I’ve added something I’ve been thinking of doing since the first one, which is to have little animations when a unit acts or a SOUL ability is being used. These appear as little animations on the bottom of each side acting.
The process to create these was fairly straightforward. First step was the place the unit art on a “green screen” background, since the model is not capable of generating transparent backgrounds. Then I used the open weights Wan2.2 model on ComfyUI, and prompted it to perform the animation that fits the act. Finally I added the finished result in kdenlive with a chroma key effect for green which allowed the unit to have a transparent background again.
Now the animations are not incredible as the model is not that capable of complex movements, especially for weird designs like these, but they give a little extra action on the side which doesn’t interfere with the main game-play.
I did try to make some animations involving multiple units (you’ll see like 3) by combining two units in the same image. But it was both very complex to arrange (I had to ask the model to first make the character face each other for example and then use the final frame from that as the next frame for the next), and also the result were pretty bad. Most of the time, one character wouldn’t animate at all, and the whole thing was very basic. So ultimately I scrapped that idea and stayed with a single unit. If a more capable open-weights model appears in the future I’ll give this another go.
This post will detail the creation steps, but first and without further ado, here’s my first battle report.
I made a quick Youtube channel just to host these, so as to keep things nicely separated. I wanted to post on pixelfed as well, but I couldn’t find a relevant instance for this content with open registrations. If you have one suggestion like this, lemme know.
Now that’s out of the way, lemme write down the process for making this video.
The first step is of course the recording. I bought a cheap table mount where I could put my smartphone on, and it’s a bit short but fortunately just enough for the Maleghast playmat I have. I also bought some Lavalier microphones but sadly those didn’t seem to work right this time so it ended up using my phone mic.
For recording software I used Open Camera which provides a lot of control on recording. Unfortunately since I didn’t quite know what I’m doing, I ended up recording is way too high bitrate, getting massive files. It also recorded in portrait. But nothing a quick ffmpeg command can’t fix:
Once I had my video recorded, I then had a good idea on how to edit it. The main idea is to display the units interacting and their stats, as well as the abilities they’re using and any conditions they have accumulated.
Initially I tried using G.I.M.P. to create the various templates I wanted, but manually tweaking all the elements was taking entirely too much time and it was also not looking that great. I decided to pivot and with some LLM help I had the initial skeleton for a python script which could compose a unit card from its component elements. Of course the LLM choked once the script became even mildly complex so after a point I just took over on my own.
The way it works is that I use kdenlive to go through the video. Every time a unit ability is activated, I set a guide at that timestamp. The name of the timestamp then contains all the info I need to generate the unit card at that point. The ability used, the current health, and any tokens assigned to that unit. Example: “bolides_3_vitality3+weak” will generate a Holy Body unit card with 3 health, and with 3x Vitality and 3x Weak condition tokens assigned.
At the same time I’m also trimming “thinking stretches” from the timeline, and generally trying to shorten the video if possible. For my first video I wasn’t very strict about this though, so it ended up 1.5 hours long. Given that it was a beginner game and we both had a few rules questions, I’m expecting this time to rapidly drop in newer videos. I’ve managed to play games in less than 1 hour already. I’m not quite sure if in future videos I will try to completely cut away all silence/thinking times as it allows the video to be a more chill-affair to have running in the background, which could be nice for ADHDers like myself. Tell me what you think.
Anyway, once I have all the Guides places, I used the very useful function of kdenlive to export all guides in this format “{{category}} - {{timecode}} - {{comment}}” and place them as a text file along with my script which then parses the guides to create all the images that I’ll use for the video and names them according to their timestamp. Then it’s just a matter of drag and dropping them into the timeline on the two tracks I added for this, adjusting their duration according to how long the action took, and finally adding the custom effects I created which made them fade in/out and place them on the left/right of the screen.
In python I’m utilizing badgepy to create badges for the tokens to attack to the unit cards. Simple, albeit not particularly pretty. I’m planning to add maybe some icons to the badges, but if you have some ideas on how to make this look better, send them my way.
Finally I go through the video at real-time to see if all looks correct. If any unit card is wrong (say, wrong HP or tokens), all I need to do is edit the guide at that timestamp, export guides and rerun the script and since kdenlive is loading the files dynamically from the hard disk, this is enough to update all the unit cards in my existing video. This will also mean that if in the future I come up with a different unit card design, it should be trivial to update everything, or even go back and update my old videos.
Whenever I notice mistakes in the play, I then use the subtitles track of kdenlive to quickly mention the mistake so that people watching know.
And that’s pretty much it. After that I only need to upload to youtube and figure out a thumbnail. For the first video I just used the Gemini GenAI as I couldn’t figure out a way to create an image containing the two primary necromancers from the factions and the images contained in the book where way out of my skill-set to shop into a good-looking image (and frankly I had had enough “cooking”, and I was just eager to publish). I’m looking how to do something similar using local diffusion models in the future, so when I do I’ll post that process here as well.
Hope you found this process useful, and let me know what you think of my first Battle Report!
After I prepared the unit chips, I wasn’t sure how to handle conditions. Initially I planned to use a dice to track them per unit, but after bringing the game on the table, I quickly realized this is an untenable solution. The game just has too many status effects and things to keep track of, per unit
First game played using dice and whatever tokens I had available, for conditions and status effects
Unless you have a hundred colored dice of different colors and designs, it becomes impossible to keep track of everything, and it’s very easy to jostle dice and lose track of things. Not to mention that they end up covering the unit itself and its printed stats, so you end up having to lift the tokens to see.
Instead I decided to design custom poker chips which I would place below the unit chip, just before their hit points. Using different color chips per condition, should make it easy to track what affects each unit, without even having to lift the unit chip to inspect them after a while. The original plan was to buy the same sort of chips I used for the units, just in different colors, but after realizing the breadth and quantity of chips that would be required, I quickly discarded that plan as there wouldn’t be enough variation for color coding and it would require too much money.
Instead I decided to switch to my 3D printer to print my own condition chips. They wouldn’t have the same weight as the units, but that’s a trivial issue which in practice doesn’t bother anyone. However the benefits would be massive. Not only can I design chips in any color combination I want, but I can also etch specific symbols on them, and the name of the condition itself, ensuring that it’s trivial to keep track of what’s going on, on the board, at minimum hassle.
As I don’t own a multi-color printer, I decided to find poker chips designs that works with a monofilament printer. This is the only 3D-printed poker chips model I could find that doesn’t rely on an AMS, and it prints out very well.
Initially I was printing these on the basic texture plate of the printer, but it was very fault-prone as the models kept disconnecting from the plate and ruining the whole batch. I then switched to putting wide brims on everything to ensure adhesion and this worked very well, but the downside is that afterwards I had a significant amount of fine effort to do on the chip “pips” to remove the extra filament. I would have to literally sit there for half an hour, cutting away the brims from each pip with a cutter.
I decided to switch to a cool plate instead and while I was afraid it would not work well due to how notoriously hard it is to remove flat models from these plates after printing, my concerns turned out to be unfounded as the chips easily popped out with some bending, and their pips can quickly be removed with some light tapping from the side. The cool plate also helps the text engrave better on the bottom.
For the customization, I used OpenSCAD as it’s Linux native and it works programmatically, which means I could use an LLM to help me quickly cook up a script to engrave the art and letters I need. I provide my script here in case it can be useful to others.
// ==========================================================// USER SETTINGS // ==========================================================
use_svg_icon = true; // True: Top is SVG | False: Top is Text
emoji_svg_file = "MAGNAGOTHICA/3D tokens/health.svg";
engraving_text = "Health"; // The text is placed on the bottom of the chip
top_text_y_position = 19; // Change this to 22 if you use engraving_text2
engraving_text2 = ""; // More text for the bottom of the chip. Used when the label is too long.
top_size = 1; // Font size OR SVG scale factor for top side
bottom_text_size = 5; // Font size for bottom text. 5 for 4-5 letters, reduced progressively for longer words
font_style = "Liberation Sans:style=Bold";
// ==========================================================// MODEL GENERATION// ==========================================================
difference() {
// 1. Import original STL file
import("obj_1_poker chip p2_1.stl");
// 2. Top Side Engraving (Can toggle between SVG or Text)
translate([19.5, 19.0, 2.5]) {
linear_extrude(height = 1.1) {
if (use_svg_icon) {
// The offset() function cleans up self-intersections in the SVG path
offset(delta = 0.001) {
scale([top_size / 10, top_size / 10, 1])
import(emoji_svg_file, center = true);
}
} else {
text(engraving_text, font = font_style, size = top_size, halign = "center", valign = "center");
}
}
}
// 3. Bottom Side Engraving (Always Text, Mirrored)
translate([19.5, top_text_y_position, -0.5]) {
linear_extrude(height = 1.2) {
mirror([1, 0, 0]) {
text(engraving_text, font = font_style, size = bottom_text_size, halign = "center", valign = "center");
}
}
}
translate([19.5, 16, -0.5]) {
linear_extrude(height = 1.2) {
mirror([1, 0, 0]) {
text(engraving_text2, font = font_style, size = bottom_text_size, halign = "center", valign = "center");
}
}
}
}Code language:PHP(php)
For the chip icons, I used the ole-reliable https://game-icons.net/ and found some appropriate icons for each condition and downloaded their SVGs to feed to OpenSCAD. Some of them faulted when OpenSCAD tried to render them to I added an offset workaround in my code which seems to fix them.
These chips take a surprising amount of printing time, particularly the pips. A full set of 15 tokens and their corresponding 90 pips take a full 6 hours of print time! So it was a a whole week of work before I had enough to cover everything. As I’m a bit perfectionist I not only want chips for the basic conditions and the faction conditions, but I also want custom chips for each special condition that some units and SOUL abilities would inflict. If one wants to save time, theoretically one can get away by just printing the basic conditions, then something like 4-5 colors of “generic conditions” which they would re-use each game based on their factions abilities. I.e. a token would be Plague in one game, but Berserk in another. But I’m a bit perfectionist with my boardgames, so I wanted unique color combinations and icons.
That of course means, a whole lot of chips, which quickly overwhelmed my table. I urgently needed a storage and organization solution. 3D printer once again to the rescue! Fortunately there’s no shortage poker chip storage solutions online. I just needed something that can handle the sheer amount of variety in my chips while still making it easy to use them during the game.
So I landed on this poker chip holder model which provides 10 unique spaces for chips which allows me plenty of space to organize and has the added benefit of being stackable and providing a convenient space for unit cards and the larger tyrant units. Unfortunately even after printing 3 of these, they were still not enough to handle everything, so now I am also printing this model to store things like hit points on the side, or maybe a way to transport just a single faction and their unique tokens only.
I’ve already played a game using these chips and it was a massive improvement over the dice. It was a breeze to keep track of everything and it actually helped a lot with the speed of the playthrough.
Next post I’m going to elaborate on the solution I came up for the unit cards
In the past month I’ve been trying to get Maleghast on the tabletop. The game was designed for the Virtual Tabletop but I don’t particularly like playing boardgames online as for me the social aspect is an implicit draw of the genre. So my plan was to translate the game components in a way to play them on the tabletop in a easy manner.
Initially I was planning to simply create 3D-printable miniatures for each unit in the game as I’ve done for Last Light but then the inspiration struck me after playing Chip Theory games like Cloudspire; to convert the miniatures into poker chips instead.
I went with chips because it allows me to display unit information for the opponent directly on the table, rather than having to remember everything or refer to the unit cards all the time. For this purpose, I used G.I.M.P. to add the basic unit information directly on each unit image. Now it becomes very easy when you’re deciding what to target to easily view all most relevant information such as the defense of the unit (which is the target number you want to hit with your attack)
As a sidebonus to that, the other side of each unit has a corpse image, so when a unit dies, all I have to do is flip it upside down, and it becomes a corpse on the battlefield. And if I need more corpses, I can use some of the unused unit chips.
For the poker chip creation, I used the process described here. For reference, these are the supplies I bought from German Amazon given that this guide was built for the USA market.
Poker Chips: These chips are very affordable and have satisfying weight. You need to remove their internal label to allow proper adhesion of the unit labels, but that’s easily done with an x-acto knife.
Hole Puncher: The poker chips have a 2.9cm diameter internal space so this one works best, but I’ve found you’re better off printing the units at 2.8cm to avoid cutting off some edge art.
Tweezers: To pick up unit labels without getting fingers sticky.
Glue Spray: This is the one suggested by the original guide. Loos like it works well enough as I can variate the spray strength as as to not send the card pieces flying.
However through trial and error I’ve discovered that it’s actually easier to spray the poker chip directly with the minimum amount of glue, and then press the unit art onto it. Spraying the unit paper makes things way messier. What I do I spray very very lightly on the chip, offset towards one side of the radius. Then I place the cutout unit art onto it, starting from the side I placed the glue, then gradually “tipping” it over, so that as it lays flat, it pushes the glue towards the rest of the area. This allows better coverage, without having the glue squish over the rim. Even then, it’s very easy to put too much glue on the chip, which still results in residue on the raised chip sides. I’ve tried cleaning that residue with paper and alcohol, but unfortunately it still remains sticky, which results in the chips sticking together when stuck and feeling sticky on the fingers.
To combat this, I got me this residue remover which is very good at getting rid of this glue. If I get some spillage, I immediately wipe it away with a rag infused with it, and there’s no residue left and in my experiments it’s not wiping the art either like alcohol does.
After I finished all the units, it occurred to me that I could have printed my own poker chips with the 3D printer, which should have allowed me a smaller “raised” radius on the chip, and therefore more space for art, but I already did all the work. And plus, the purchased chips have a more satisfying weight as well.
For the unit art printing, I created a custom python script with the help of an LLM, which takes all the images in a directory, resizes them and places them in A4 PDFs, which I can then send to my printer.
import os
from fpdf import FPDF
from PIL import Image
# Create A4 page (210mm x 297mm)
pdf = FPDF(orientation="P", unit="mm", format="A4")
pdf.set_margin(0) # Remove default margins to prevent shifting
pdf.add_page()
# Hard coordinates in millimeters
X_START, Y_START = 15, 15# Outer margins
x, y = X_START, Y_START
IMG_SIZE = 29
GAP = 0
PAGE_WIDTH = 210
PAGE_HEIGHT = 297
DIR = "all_units"# Filter and sort your images
files = sorted([f for f in os.listdir(DIR) if f.lower().endswith(('.png', '.jpg', '.jpeg'))])
for file in files:
img_path = f"{DIR}/{file}"# Open the image to check its pixel dimensions and aspect ratio
with Image.open(img_path) as img:
p_width, p_height = img.size
# Calculate dimensions while maintaining aspect ratio within the IMG_SIZE boxif p_width >= p_height:
# Landscape or Square: Width is the limiting factor
w_mm = IMG_SIZE
h_mm = (p_height / p_width) * IMG_SIZE
else:
# Portrait: Height is the limiting factor
h_mm = IMG_SIZE
w_mm = (p_width / p_height) * IMG_SIZE
# Check if the next image fits horizontally, if not wrap to next rowif x + w_mm > PAGE_WIDTH - X_START:
x = X_START
y += IMG_SIZE + GAP # Moves down by the maximum box height + gap# Check if the next row fits vertically, if not create a new A4 pageif y + h_mm > PAGE_HEIGHT - Y_START:
pdf.add_page()
x, y = X_START, Y_START
# Place image with its calculated proportional width and height
pdf.image(img_path, x=x, y=y, w=w_mm, h=h_mm)
# Move cursor to the next column based on the bounding box size to keep a uniform grid
x += IMG_SIZE + GAP
pdf.output(f"{DIR}_perfect_{IMG_SIZE}mm_grid.pdf")
print(f"Done! '{DIR}_perfect_{IMG_SIZE}mm_grid.pdf' generated with aspect-ratio preserved images.")Code language:PHP(php)
Then it’s just a matter of cutting them out with the hole puncher
Initially I had the tyrants as a poker chip as well, but this was clearly never going to work as they’re meant to take 4 times the space as a 2v2 unit. So I instead converted them into square images which I can print on a chipboard as per this guide. All you need are
Straight Ruler
Utility knife
Paper Glue (I prefer this over spray glue, but that can work as well)
I decided to print the max amount of units for each faction, so that each player also has the capacity to craft the warband they want. That means 3xScions, 3x Thralls (i.e. 6 chips), 1x Tyrant&Necro and 2xEverything else. I stayed with only 3x thralls instead of 5x, as it’s unlikely someone want to do that except for the memes, and it saves me the extra work and storage for the extra ~30 unit chips this would need. I also only printed 1x of each Necromancer, not really expecting to play mirror matches a lot.
With this approach, I now have a complete print of all Maleghast which are compact and can easily be stored due to the chip stack-ability. Also instead of expecting each player to have their own copies, I can simply provide everything and even carry it with me.
In the next guides I’m going to elaborate on the the 3D-printed poker chips I modified to serve as condition tokens, the 3D-printed terrain I designed for walls and elevation, and the printed terrain I designed for hazards, ladders and adverse terrain, so keep an eye for future blogposts on this.
I’ve already managed to bring the game to the table with all these components and I’m quite happy with both the flow and the time it takes to play. I’m leaving you with a photo of the last game I’ve managed to bring to the table
A week ago or so, a new game came out from the creator of Kill Six Billion Demons (one of my most favourite webcomics that you should all go to read right now): Magnagothica: Maleghast
It’s a great world-building and incidentally it’s an idea for a type of setting that I have been thinking to make myself for years, and now someone plucked it straight out of my mind and made a really great version of it which just oozes style!
I have been enamored with this game since I first saw it. It hits ALL my buttons! Heavy Metal, Fantasy, Aesthetics, Boardgames. Only thing it could have done more is include even more metal genres as I’m not too keen on the extreme stuff and I’d love to see styles on Power or Prog Metal etc. But nothing we can’t extend ourselves!
But ye, as I mentioned, I’ve been hyperfocusing on it a bit too much. First I created a lemmy community for it. Then I started extending the music playlists for each house. And lastly I wanted to find a way to be able to not only create my own warband, but also to give individual art to each of my units. And for this, I finally had some necessary skills and hardware. It was time to train my first LoRa!
It took me a good 3 days to figure out how things work, create the necessary datasets, experiment with creation and retry until I got the hang of it. It didn’t help that the original artwork was, let’s say, challenging to work with. But I think in the end I am very proud to have managed to make something which seems to be capable of following the style well enough to create leaders and units.
I’ve found the best use of this lora is for Leader illustrations. To create a leader simply use the “necromancer, leader” tokens in your prompt. For leaders I suggest you set your Lora strength between 0.5 and 0.8. Remember to mention which house you want the leader to be in. The LoRa is pretty decent at copying the style of each house.
magnagothica maleghast, gargamox, drawing, necromancer, male, skinny leader, plain background, toxic green highlights, by tom bloom, sidecut haircut, chains, dripping, white coat###halftone
To generate units, you can choose to either generate unit portraits styles, or full unit illustrations. You can try to replicate the maleghast style with the halftone, or put “halftone” in the negative prompt to get a more sharp result. Personally I prefer to avoid the halftone look and try to make them look more full. You can also use the name of the unit to try to lead the lora to draw something like that unit. You can also use “ghoul” for humanoid undead and “abomination” for more monstrous looking units. For units I suggest you use model strength between 0.3 and 0.6
magnagothica maleghast, abhorrers drawing, full unit illustration, penitent, ghoul, scarred, spiky flail, plain white background, ochre highlights, by tom bloom###halftonemagnagothica maleghast, C.A.R.C.A.S.S., drawing, unit portrait, enforcer, ghoul, plain black background, fuchsia highlights, by tom bloom###halftone
You can check out the new LoRa on CivitAI, and as you’d expect you can also just try it out directly on the AI Horde!
Try it out and let me know what other uses you can find using this style. I think it has plenty of potential.
Close
Ad-blocker not detected
Consider installing a browser extension that blocks ads and other malicious scripts in your browser to protect your privacy and security. Learn more.