{"id":19798609,"url":"https://github.com/eriknyquist/text_game_maker","last_synced_at":"2025-09-06T08:42:10.288Z","repository":{"id":57474664,"uuid":"115672301","full_name":"eriknyquist/text_game_maker","owner":"eriknyquist","description":"Python framework for creating text-based games (interactive fiction)","archived":false,"fork":false,"pushed_at":"2020-04-11T03:42:14.000Z","size":1035,"stargazers_count":13,"open_issues_count":1,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-07-10T13:48:39.426Z","etag":null,"topics":["interactive-fiction","python","python3","text-adventure","text-adventure-game","text-game"],"latest_commit_sha":null,"homepage":"https://text-game-maker.readthedocs.io","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eriknyquist.png","metadata":{"files":{"readme":"README.rst","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-12-29T01:07:13.000Z","updated_at":"2024-11-11T10:25:06.000Z","dependencies_parsed_at":"2022-09-10T04:05:07.768Z","dependency_job_id":null,"html_url":"https://github.com/eriknyquist/text_game_maker","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/eriknyquist/text_game_maker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Ftext_game_maker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Ftext_game_maker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Ftext_game_maker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Ftext_game_maker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eriknyquist","download_url":"https://codeload.github.com/eriknyquist/text_game_maker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eriknyquist%2Ftext_game_maker/sbom","scorecard":{"id":381077,"data":{"date":"2025-08-11","repo":{"name":"github.com/eriknyquist/text_game_maker","commit":"429078b8f1119599398d182988ea3b56064ef30c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.9,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2022-42991 / GHSA-v3c5-jqr6-7qm8"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T15:28:40.915Z","repository_id":57474664,"created_at":"2025-08-18T15:28:40.916Z","updated_at":"2025-08-18T15:28:40.916Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273879240,"owners_count":25184427,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-06T02:00:13.247Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["interactive-fiction","python","python3","text-adventure","text-adventure-game","text-game"],"created_at":"2024-11-12T07:30:45.507Z","updated_at":"2025-09-06T08:42:10.264Z","avatar_url":"https://github.com/eriknyquist.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":".. |projectname| replace:: text_game_maker\n\nText Adventure Game Maker\n-------------------------\n\n.. contents:: Contents\n\n|projectname| is a framework for building simple text-based games. Supports\nPython 2 and 3 on Linux and Windows (tested on Debian and Windows 10).\n\nFeatures\n========\n\n* Builder API pattern that implements a 2D tile-based grid system for building\n  maps and creating game objects with a few lines of Python.\n\n* Flexible object model for defining game objects and NPCs. Many useful game\n  objects and behaviours are pre-defined so you can start making a game straight\n  away, but these classes are easy to extend if you need to implement your own\n  custom game objects.\n\n* NPCs that you can actually speak to, like a chatbot. ``text_game_maker``\n  NPCs allow you to define custom responses and contexts for discussions using\n  regular expressions, so you can build an NPC which responds with some\n  contextual awareness like a chatbot.\n\n* Arbitrary saving/loading of game states. All game objects can be serialized\n  to, or loaded from, JSON data.\n\n* Flexible and extensible parser. The parser that handles game input already\n  has a lot of useful commands and behaviours built-in. However, any of the\n  built-in commands can be disabled if necessary, and the parser provides\n  methods that allow new commands to be defined.\n\n* Configurable input/output streams. ``text_game_maker`` allows custom handlers\n  to be set for handling user input, and for displaying game output. By default,\n  ``text_game_maker`` will use a ``prompt-toolkit`` session that interacts with\n  ``stdin`` and  ``stdout`` of the process it is running in. Defining custom\n  input/output handlers allows you to run your game, for example, as a slack bot\n  instead (see ``scripts/text-game-slackbot-runner.py``).\n\n* ``text_game_maker`` has a music system that allows polyphonic music (not\n  fancy, just simple tones that sound like an old Nokia ringtone, but with full\n  polyphony) to be written as simple text files that can be loaded and played\n  during the game (see `PTTTL \u003chttps://github.com/eriknyquist/ptttl\u003e`_).\n  ``pygame`` is used for playback of the raw audio samples.\n  \n* Much more... check out the `API documentation! \u003chttps://text-game-maker.readthedocs.io\u003e`_\n\nGetting started\n===============\n\nInstall\n#######\n\n::\n\n    pip install text_game_maker\n\nRun the example map\n###################\n\n::\n\n    python -m text_game_maker.example\n\nWriting maps\n============\n\n#. Write a class that extends the text_game_maker.utils.runner.MapRunner class\n   and implements the ``build_map`` (and optionally ``build_parser``) methods.\n   See ``example-map/example_map.py`` and the\n   `API documentation \u003chttps://text-game-maker.readthedocs.io\u003e`_ for reference.\n\n#. Run ``text_game_maker.runner`` with the name of the ``.py`` file containing\n   your MapRunner class, e.g.:\n\n   ::\n\n       python -m text_game_maker.runner mymaprunner.py\n\n   In this example, ``text_game_maker.runner`` will import the\n   ``mymaprunner.py`` file and run the first instance it finds of a class\n   which is a subclass of text_game_maker.utils.runner.MapRunner\n\nTo run a MapRunner class as a slackbot to play your game over slack, the\nprocedure is the same, except use the ``text_game_maker.slackbot_runner``\nscript, e.g.:\n\n::\n\n    python -m text_game_maker.slackbot_runner mymaprunner.py\n\nNote that when using the slackbot runner you must have already created a\nbot user in your slack workspace, and the API token for the bot user must be\navailable in an environment variable named ``SLACK_BOT_TOKEN``.\n\nAPI Documentation\n=================\n\n`text-game-maker.readthedocs.io \u003chttps://text-game-maker.readthedocs.io\u003e`_\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feriknyquist%2Ftext_game_maker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feriknyquist%2Ftext_game_maker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feriknyquist%2Ftext_game_maker/lists"}