Procedurally generated trading card game
Project description
Proćemon is a procedurally-generated trading card game from the exceedingly popular Proćemon media franchise. I found the source code under a truck so I leaked it online. You can use it to create your own unique decks.
Installation
- Get Python3
pip3 install procemon
Usage
- Either clone this repo or download this file.
cd path/to/the/file
(Replacepath/to
with the actual path to the repo or the directory where the downloaded file is located.)- Windows:
py -3 create_dex.py
OS X and Linux:python3 create_dex.py
Result: You will create a unique deck of cards.
What it does
- Create a "Dex" of a given number of "types" of Proćemon. Choose those "types" randomly.
- Generate Proćemon and assign them moves.
- Save a JSON object describing the Dex to disk.
- Get a sprite image for each Proćemon.
- Generate a card image for each Proćemon and save it to disk.
- Generate a temporary image of the back of a card.
- Create a PDF zine of some of the images.
How it works
Read the API documentation here.
- A Dex is a compendium of MonsterTypes. Per MonsterType, the Dex generates a given number of Monsters.
- Each MonsterType is stored as a JSON object here. MonsterTypes are a few important keywords (such as the name of the type) as well as:
- A list of
nouns
which will be used to generate monster names. MonsterTypes and their nouns were collected in several ways:- Reorganized from a pycopora dictionary
- Scraped from Wikipedia using Beautiful Soup
- Extracted from ImageNet synset hierarchies
- A list of
verbs
and a list ofadjectives
. These are used to create names of moves. Seeprocemon/data/moves/srcs.txt
for a list of sources. Verbs and adjectives are assigned to each monster type by runningprocemon/wv.py
it loads a Word Vector file. It then loads a list of verbs and a list of adjectives. Words are assigned to monster types based on their distance to the type. For example, if the type isflower
and the adjective isfloral
, the distance will be really short, so now the adjectives dictionary will look something like:{"flower": ["floral"]}
- A list of
- A given number of Monsters are generated per MonsterType.
- Each Monster has 2 MonsterTypes. Each Monster's
name
is generated by combining part of a noun from the first MonsterType with part of a noun from the second MonsterType. - Each Monster has a
description
i.e. the flavor text at the bottom of the card. To generate the flavor text, it scrapes Wikipedia pages (with Beautiful Soup) using its MonsterType keywords (seeMonsterType.wikipedia
) and its constituent nouns. It then creates a Markov chain model (using Markovify) from this text and to generate a short sentence. - Each Monster has a
rarity
. This determines how "good" its stats are. In the Dex, each MonsterType has a certain percentage of card rarities (e.g. 20% of each monster type is Rare, and so on). - Each monster has a
strong_against
which is just the type one to the right of its "primary type" in the Dex array of MonsterTypes. For example if the array is["duck", "furniture", "fern"]
then all Monsters with the primary type"duck"
are strong against"furniture"
. (The order of this array is randomly shuffled whenever a new Dex is created.) - Each Monster has 2 Moves. Moves are generated using the Monster's first type (the "primary type").
- When the Dex is first created,
- There is also a list of generic "attack verbs" that any type can use and prefer if the move deals damage. These verbs are a very short distance away from the words like
"attack"
,"battle"
, etc. These are calculated and cached via a word vector model when you runprocemon/wv.py
(see above). - To get the
name
of a Move, a verb is first picked at random either from the "generic" verb list of the type-specific verb list. Then, sometimes a type-specific adjective is prepended to thename
. - A
Move
has a certaincost
. It might dealdamage
and it might have aspecial
effect. The odds for how this is generated depends on the Monster'srarity
.
- Once all of the monsters have been generated, the Dex can be saved as a JSON dictionary.
- Generate cards of each Monster by calling
Dex.create_cards()
- A color palette is loaded. This array was derived from this image of the NES palette. Each MonsterType is associated with a "color index" representing a column in the palette array.
- For every MonsterType, the Dex looks for image URLs. It uses this file to look up "synset IDs" in ImageNet using the
MonsterType.imagenet
andMonsterType.nouns
. It tests each URL.- If it's a "good" URL (if an image is successfully downloaded), the Dex processes the image using PIL to make it look like a sprite and then adds it as an option for the next Monster of this MonsterTtype. The sprite is colorized using the color index in the palette.
- If it's a "bad" URL (and they often are) it is added to a list of known bad URLs so it doesn't waste time trying again.
- Once the images have been selected, a card per Monster is created and saved to disk using PIL.
- The background is colorized using the color index in the palette.
- Some Perlin noise is applied to the background.
- This is the font. This is where it's from.
- Optionally, a zine can be created of some of the cards in the Dex. This script will:
- Generate an image of the back of the card to use as the front and back cover of the zine.
- Start creating a PDF using fpdf.
- Randomly select some cards and add them as pages.
- Write the PDF to disk.
Changelog
1.2.0
- Removed types: Antelope, Mollusk, Raptor
- Added MANY more adjectives and verbs.
- Move names tend to be much more closely associated with the primary monster type.
- Added
wv.py
. This script will pre-cache all of the verbs and adjectives per monster type rather than generating them at runtime with a word vector model.MonsterType
(and the associated .json files) now have pre-cachedverbs
andadjectives
lists.
- Moves that deal damage generally prefer attack verbs (see below).
- Fixed: Sometimes a move says that you should roll a die and on "1 or greater" the effect happens. Now, the minimum number is 2.
- Fixed: The first double-quotation marks in the monster flavor text at the bottom of the card is facing the wrong way.
- (Backend) Added:
attack_verbs.txt
Pre-cached attack verbs. - (Backend) Added:
src.txt
Sources for adjectives and verbs. - (Backend) Moved most of the code related to verbs and adjecives from
dex.py
towv.py
1.1.0
- Added a text file to the module to remember bad Wikipedia URLs so we don't test them again.
- Added monster types: Antelope, Antenna, Candy, Mollusk, Needlework, Sailor, Singer, Sphere, Tool, Tree.
- Fixed: Monster names sometimes end with
'S
. - Fixed: Getting Wikipedia pages for flavor text and images for sprites is slow and your router might complain. Now, the HEAD headers are tested before the GET headers, which is a lot faster.
- Fixed: Sometimes, images are marked as "bad" when they're actually valid.
- Backend: Moved image URL testing in
Dex
toget_image_from_url()
so that this function can be tested externally.
1.0.2
- Minor update to README.
1.0.1
- Fixed: Data files aren't included.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
procemon-1.2.0.tar.gz
(1.4 MB
view hashes)