Skip to main content

Extract game data from the Caves of Qud roguelike

Project description

hagadias

Python package to extract game data from the Caves of Qud roguelike.

This library forms the base for several projects:

What does it do?

hagadias allows a user to read game data in the raw format used by the Caves of Qud roguelike RPG, including the object tree, fully colored tiles, and character data. It needs to be passed a path to a local installation of the game in order to do anything.

Installation

hagadias requires Python 3.10.

To install the package from this GitHub repository without a package manager, run
pip install git+https://github.com/trashmonks/hagadias@main#egg=hagadias
If you're using pipenv to manage dependencies,
pipenv install -e git+https://github.com/trashmonks/hagadias.git@main#egg=hagadias If you're using Poetry to manage dependencies, poetry add git+https://github.com/trashmonks/hagadias#main

Tile support

Tile support requires the texture files from Caves of Qud to be unpacked into a "Textures" directory under the working directory of your project that is importing hagadias. You can use the Brinedump game mod to export these textures from within the game.

Example usage

Startup

import hagadias
from pprint import pprint
GAMEPATH = 'C:\\Steam\\steamapps\\common\\Caves of Qud'  # Windows
# GAMEPATH = '~/.local/share/Steam/steamapps/common/Caves of Qud'  # Linux
# GAMEPATH = '~/Library/Application Support/Steam/steamapps/common/Caves of Qud'  # macOS
root = hagadias.gameroot.GameRoot(GAMEPATH)
print(root.gamever)  # output version of the game
2.0.203.56

Objects (Blueprints)

qud_object_root, qindex = root.get_object_tree()

# The above gives you two items:
# - a `qud_object_root` object of type `QudObjectProps` that is the root of the CoQ object hierarchy, allowing you to traverse the entire object tree and retrieve information about the items, characters, tiles, etc.
# - a `qindex` which is a dictionary that simply maps the Name (ingame object ID or wish ID) of each ingame object, as a string, to the Python object representing it.

# Example use of qud_object_root:
>>> qud_object_root.source
'<object Name="Object">\n    <part Name="Physics" Conductivity="0" IsReal="true" Solid="false" Weight="0"></part>\n  </object>'

# But what you really want is the qindex:
>>> snapjaw = qindex['Snapjaw']
>>> snapjaw.desc
'Tussocks of fur dress skin stretched over taut muscle. Upright =pronouns.subjective= =verb:stand:afterpronoun=, but =pronouns.subjective= =verb:look:afterpronoun= ready to drop onto fours. =pronouns.Possessive= snout snarls and =pronouns.possessive= ears twitch. =pronouns.Subjective= =verb:bark:afterpronoun=, and =pronouns.possessive= hyena tribesmen answer.'

>>> snapjaw.dv
6

>>> help(snapjaw)
# will give detailed help on all properties and methods, including a long list of properties that objects can have, like below:
...

 |  butcheredinto
 |      What a corpse item can be butchered into.
 |  
 |  canbuild
 |      Whether or not the player can tinker up this item.
 |  
 |  candisassemble
 |      Whether or not the player can disassemble this item.
 |  
 |  carrybonus
 |      The carry weight bonus.

# and so on.

# Tile support requires you to download the modding tile toolkit, described in the section above. But with it, you can do:

>>> youngivory = qindex['Young Ivory']

>>> youngivory.tile
<hagadias.qudtile.QudTile object at 0x0000018F898C3BA8>

>>> youngivory.tile.image
<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=16x24 at 0x18F890B3320>

# for a PIL library format PNG image. There are other methods for retrieving BytesIO PNG binary data, see
>>> help(youngivory.tile)
# for details.

Character codes

gamecodes = root.get_character_codes()
# A dictionary containing some helpful information used to calculate the results of character builds.
# `gamecodes` contains the following items:
# 'class_bonuses': a dictionary mapping castes+callings to lists of stat bonuses
# 'class_skills': a dictionary mapping castes+callings to lists of skills (e.g. 'Horticulturalist': ['Meal Preparation', ...]
# 'class_tiles': a dictionary mapping castes+callings to tuples of (tile path, detail color) for that caste/calling's art
print(hagadias.character_codes.STAT_NAMES)
print(gamecodes["class_bonuses"]["Horticulturist"])  # 3-point Intelligence bonus
print(gamecodes["class_skills"]["Horticulturist"])
print(gamecodes["class_tiles"]["Horticulturist"])
('Strength', 'Agility', 'Toughness', 'Intelligence', 'Willpower', 'Ego')
[0, 0, 0, 3, 0, 0]
['Meal Preparation', 'Harvestry', '(Axe)', '(Bow and Rifle)', 'Wilderness Lore: Jungles']
('creatures/caste_1.bmp', 'g')

Contributing

See CONTRIBUTING.md.

Contributors

Thank you to the following people who have contributed code to this project:

  • egocarib
  • Wreckstation
  • librarianmage
  • HeladoDeBrownie
  • elvres
  • robbyblum

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hagadias-1.1.2.tar.gz (97.5 kB view details)

Uploaded Source

Built Distribution

hagadias-1.1.2-py3-none-any.whl (102.7 kB view details)

Uploaded Python 3

File details

Details for the file hagadias-1.1.2.tar.gz.

File metadata

  • Download URL: hagadias-1.1.2.tar.gz
  • Upload date:
  • Size: 97.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.10.2 Windows/10

File hashes

Hashes for hagadias-1.1.2.tar.gz
Algorithm Hash digest
SHA256 2cb158693df43387dfc92007f4f64706c1f948fde1a46df2da796e465789e391
MD5 c3a27b116e36c92f723b3c60e2698272
BLAKE2b-256 49d24567efd38b6188592a8f7a5bba1fbc9f20768408ac5414d7eb27405e6a50

See more details on using hashes here.

File details

Details for the file hagadias-1.1.2-py3-none-any.whl.

File metadata

  • Download URL: hagadias-1.1.2-py3-none-any.whl
  • Upload date:
  • Size: 102.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.13 CPython/3.10.2 Windows/10

File hashes

Hashes for hagadias-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 37b97279ab5f9c1fd7a4c099c0942db0bbccd0b1ae657111e49f88f476a44e90
MD5 7edcb38ac41f0d55ff0bb6afde271664
BLAKE2b-256 f0579a7690c55a2963f1b8e218147e9c23f028abfef6c3e6312119f8f05bede4

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page