:: a python gui to keep track of scores while playing Doomlings
Disclaimer: This is a private project and I took the liberty of borrowing the official icons from the Doomlings website. I hope that's ok with you guy's from Doomlings :) - and of course: go buy the game, it's super fun!
Ever since friends backed the original version on Kickstarter and the game finally arrived, we've been more than just addicted to Doomlings from the very first second. Unfortunately, we don't live too close to one another, so we only see each other every few weeks/months. But WHEN we do, it's set in stone that at least (!) one Doomlings session has to be played!
I guess anyone who knows the game knows how much you can annoy each other by stealing or swapping yet another trait from the trait pile. And sometimes you don't even want to, especially not to jeopardise the peace that has just been restored. But if it has to be done, we thought it would only be fair if the player in the lead becomes the target.
So we always tried to get a quick overview of the others' points. But with all the scoring rules, it's quite difficult to work out who's in the lead. Especially as we extended it to 4 catastrophes at some point.
After many years of MATLAB and several unsuccessful attempts to switch to Python, I finally started using Python at the end of 2023 and turned my back on MATLAB for good. And what's the best way to learn a programming language? Exactly: With an interesting project!
So it was only natural for my first python project to be a Doomlings live points counter. Consequently,
"Doomlings" + "Python" = "DoomPy"
was born. With DoomPy you can easily allocate the traits to the respective players trait piles, select catastrophes & MOLs, and thus see what the score looks like at any time.
If you take a look at my code, please keep in mind that I'm new to Python and forgive the, very likely little Pythonic, chaos.
In the past I've been coding mostly in academia, especially with MATLAB. Therefore my coding style is very procedural. I have never coded in an object-orientated way. So I'm sure that there would be a much more efficient OOP alternative, especially in this case where players/traits/MOLs/ages are predestined to be defined as a class
... but that might be a project for the future when I learn OOP.
As this is also the first time that I am sharing a Python project with the world, this also poses new challenges for me. I think (hope) it should be possible for anyone with the provided requirements.txt to set up a virtual environment in which DoomPy has to run.
Download the latest release (or the current repository) and unzip it. Or if you prefer to use the terminal, run
wget https://github.com/azabicki/DoomPy/archive/refs/heads/main.zip
or
curl -L -O https://github.com/azabicki/DoomPy/archive/refs/heads/main.zip
(see comment on curl)
Install the virtual environment with the tool of your choice. You find a requirements.txt
in the repo base folder
Finally, run
python /path/to/DoomPy/main.py
and have fun playing Doomlings!!
Display Resolution: This is a very important aspect, since the GUI takes a lot of space. Especially if you play with 4 catastrophes and many rounds. And depending on which traits are played, it may happen that the height of the trait pile is larger than the screen, making it impossible to select MOLs. With 4 players and 4 catastrophes and on a 1800 x 1200
display, we ocasionally run into problems.
Hence, if possible:
- use a higher vertical resolution as 1200 px if played with more than 3 catastrophes
- use a wider horizontal resolution as 1800 px if you play with more then 4 players.
Depending on your OS Dark-Mode, DoomPy looks like this:
The GUI consist of mainly two parts:
- The Control box on the left, where you
- set some options for the next game
- deal traits from the deck to the players trait piles
- select catastrophes world's end events
- turn some options for the current on and off
- and Trait Piles on the right, where you
- see the player's current score
- organize each player's trait pile (i.e. playing, attaching, swapping and discarding traits)
- select MOL(s)
I hope that the handling is self-explanatory. Especially if you've already played a round or two of Doomlings. But just in case, you can find more detailed explanations here.
(see short demo video at the bottom)
- Game Options:
- Set the amount of players, size of gene pool, amount of catastrophes & MOLs.
- Name the players, but keep the correct order at the table, because some effects affects the players to your left or right.
- The radiobutton to the right of the names defines the first player (name is green). It can be changed at any time during the game, and changes automatically after each catastrophe.
- Click on
start game
to clear the table and restart the game.
- Deck:
Search
for the name of aTrait
. As soon as there is only one possibility left, the cursor jumps automatically into the list.- Click on clr to clear the search field.
- You may also just use the down-arrow key or the mouse to select a trait.
- Click on the
player
-button to deal the selected trait into his/her trait pile. - Please note: If you play
Heroic
, a pop-up will be shown & asking ifHeroic
is played during theBirth of a Hero
age (to bypass the 2-dominant restrictions). - There are ambiguous traits in the deck! In these cases additions to the names should resolve any uncertainties:
{A}
: trait has an action(~)
: face value is variable(2)
: numbers in parenthesis show the face value(WE)
: trait has a world's end effect(b)
,(g)
,(p)
,(r)
or(c)
: color of trait is blue, green, purple, red or colorless
- Catastrophes & World's End:
- Every time a catastrophe is turned, select it from the dropdown box.
- First player is automatically changed.
- Since
Prepper
is able to choose theWorld's End
effect, you may need to change it manually. - As soon as every trait's world's end effects are resolved, click on th
GO!
button to activate the actualWorld's End
effect.
- Every time a catastrophe is turned, select it from the dropdown box.
- Settings:
- As a joke, we thought it could be funny to record our own little
Sound-Bites
of all the "quotes" on top of every trait. But until now, we only added some generic mp3's. Turn it on and be surprised π (or annoyed π) - You can change which
Trait Property
icons will be shown in the trait pile: - Select 'Scoring Mode', i.e. how the current scores are shown:
- As a joke, we thought it could be funny to record our own little
The Scoreboard
shows for each player all the relevant information.
- Dominants:
- Name:
- Is green if player is the current first player
- Gene Pool:
- Shows current
Gene Pool
of the player
- Shows current
- # of Colors:
- displays the current
Color Count
, as well as the complete trait count in the trait pile
- displays the current
- Total Points:
- Depending on
Settings
, you will see either the Total Score, the players current Rank, or a Star-Symbol hiding the current score.
- Depending on
- Points by Category:
Here is an example of a trait pile, showing many (hopefully almost all) possible situations that may happen:
- First, select any trait by the
Radiobutton
on the left (with exception of dominant traits and attachments). - Then, decide if you wnat to
move
this trait to another players trait pile, put it backto the hand
, ordiscard
it.
- Each Trait:
- Has an icon depicting its
Color
andFace Value
.- See
Wild
for a multi-color example.
- See
- A vertical line separates these properties from any effects.
- Has an icon depicting its
- Drop Effects:
- If a trait has a drop effect, it is indicated by a
Drop
and aValue
icon.- See
Backbiter
for an example: its drop effect is worth 3 points, sinceZombified
is in the trait pile.
- See
- If drop effects are based on the
player's hand
or thediscard pile
, they cannot be calculated automatically and need to be set manually. - This is only possible once
World's End
has been played- See
Serrated Teeth
as an example.
- See
- If a trait has a drop effect, it is indicated by a
- Attachments:
- Are indicated by an
Attachment
icon instead of the radiobutton on the left side (it cannot be discarded by its own). - Select the
Host
in the drop-down menu, which is then also marked by anAttachment
icon.- Ex. 1:
Lyonization
onDragon Heart
->Dragon Heart
s drop effect is now inactive, which is shown by theQuestion Mark
and theEffects inactive
icons - Ex. 2:
Nano
onMycotoxins
->Nano
has a drop effect, which is now worth as much as theHost
s face value
- Ex. 1:
- Are indicated by an
- Dominant Traits:
- Are indicated by a
Dominant
icon instead of the radiobutton on the left side (it cannot be discarded by its own), and a different font style.
- Are indicated by a
- World's End Effects:
- If a trait has a
World's End
effect which needs to be set by the player, a drop-down menu is shown. - This is only possible after the last
Catastrophe
happened.- See
Viral
for an example
- See
- If a trait has a
- If you are affected by another player's traits, these effects are listed under your own trait pile.
- See
Shiny
as an example.
- See
- Simply select the desired MOL at any time.
- This way it is possible to play with a common MOL and having it evaluated immediately.
- If a MOLs points cannot be calculated automatically, an entry field appears where the MOLs points can be set.
At the end of the game, certain steps need to be done in a order which is pretty much the same as the actual ones you perfom IRL.
- Once the last
Catastrophe
is played, you are able to select the traits world's end effect.- E.g. for
Viral
in the trait pile above.
- E.g. for
- And once every traits world's end effect is selected, the GO! button becomes enabled and you can go and trigger the
World's End
effect of the selectedCatastrophe
.- Note: Eventually you need to enter the world's end point manually.
- Then, you need to manually update
Drop
counts if certain traits are played.- E.g. for
Serrated Teeth
in the example above.
- E.g. for
- Maybe someone has
Neoteny
? - Finally, select each players
MOL
s.
And that's it. Have fun using it!
Important
Discard Dominants and Attachments!
Of course, there is a little back-door for you to remove dominant traits and attachment from your trait pile, in case you played them by mistake. Just click on the vertical line
separating the traits basic properties from effects.
Tip
Individual standard game settings!
You are always playing 4 catastrophes? With the same people? Two mols? Don't worry! You don't have to change the settings again and again. Just open the doompy/config.json
file and edit the defaults according to your playing style.
Tip
Use keyboard shortcuts!
I tried to design the handling of DoomPy as smooth as possible. For the major time of the game you do not need to use the mouse or trackpad, dealing trait into the different trait piles, changing focus to specific catastrophes, of bringing focus back to the seach field, you can use keyboard shortcuts for every one of these actions:
- as soon as a trait is selected in the deck:
- key 1 to deal it to player #1
- key 2 to deal it to player #2
- key 3 to deal it to player #3
- ... and so on
- switch to catastrophes:
- key F1 to catastrophe #1
- key F2 to catastrophe #2
- ... and so on
- key F7 to quickly jump into search entry
Tip
Customise the Deck!
You can customize which traits are in the deck by editing the ./doompy/files/cards.xlsx
file. Just change the in_game
column to no
to remove the trait from the deck, or edit the n_cards
columns to change the amount of traits in the deck.
Tip
Make your OWN sounds!
If you like the Music function, you can just record your own sound bites and add the to the doompy/sounds/
folder. It only has to be named like the corresponding trait, and it should be recognized & played by the script.
I have tested DoomPy quite intensively and we have also used it in several real games, which has also brought some bugs to light. Nevertheless, it is of course possible that some bugs have slipped through. If you find a bug, just open an issue! I will take care of it as soon as possible!
Do you have any suggestions for improvement? Have I forgotten to add a trait? Or any other ideas or criticism? Just create an issue and I'll get back to you :)