Code Jam for creating a text-based adventure game engine and custom worlds

Overview

Text Based Adventure Jam

Author: Devin McIntyre

Our goal is two-fold:

  1. Create a text based adventure game engine that can parse a standard file format
  2. Create a text based adventure game using the standardized file format

We'll be looking to implement a very, very basic engine that includes support for rooms, items, doors, commands, and effects, as well as an inventory system.

What you need to build

Provided below is a definition for a text based adventure game configuration. The configuration contains a list of items, the commands they take, the effects they can have, the rooms that hold them, the doors that connect those rooms, the starting position and the final room. Your goal is to build an engine that can parse this defintion, and any definition matching the standard, into a playable text based adventure game.

The basics of the game are as follows:

  1. Players always start in the room defined by startingRoomId.
  2. Players have an inventory of infinite size and space, which they can fill with items.
    • Items that are used for a task can be used ONLY ONCE. After use they should be removed from a players inventory
  3. Players can interact with the world by use of text commands.
    • The expected commands are
      • LOOK
      • TAKE
      • READ
      • USE $A ON $B
      • GO $DIRECTION
      • INVENTORY
    • What these commands should do is outlined below
  4. Using commands on items can produce effects
    • Expected effects are
      • UNLOCK_DOOR
      • LOCK_DOOR
      • CHANGE_ITEM_TEXT
    • What these effects should do is outlined below
  5. A player's goal is to arrive at the room defined with the endingRoomId property

File Format Breakdown

Commands:

Commands are the building block of a users interaction with the world. Users issue commands with or without targets, and are given feedback resulting from the command. These are verbs, specifying an action, such as "GO", "READ" and "TAKE".

Command structure

{
    "command" : string,
    "text" : string,
    "acceptedItems" : [
        {
            "itemId" : string,
            "text" : string,
            "effectIds" : string[]
        }
    ]
}

Commands to implement:

LOOK - displays the text of the LOOK command for the specified object. Valid objects are any visible objects in a room, and any object in a users inventory. If no object given, instead display text of the current room, along with any doors and visible items.

  • Use
    • Looking at an item : "LOOK book"
    • Looking at a room : "LOOK"

TAKE - adds item to inventory if available, hides item when looking at the room. If no item provided, prompt for an item. If item provided is invalid, display error message

  • Use
    • Specifying no item: "TAKE"
    • Specifying item : "TAKE pizza box"

READ - displays the text of the READ command for the specified object. If no object is given, prompt for an object. If object is invalid, or object lacks read command, display error message

  • Use
    • Specifying object : "READ cheese"

USE $A ON $B - Takes two objects and applies any effects if the object $A is allowed to be used on the object $B. If objects are missing or the combination is invalid, display error message

  • Use
    • Specifying objects : "USE book ON book shelf"

GO $DIRECTION - Attempts to move the player to the next room in the direction they specify. If a door exists in the direction, and the door is unlocked, the player is moved to the next room. If the door exists but is locked, display an error message about the doors status. If the door doesn't exist, display an error message.

  • Use
    • Specifying a direction : "GO north"

INVENTORY - Displays any items by name in the users inventory.

Effects

Effects give us the ability to have latent actions following a users input. Actions take 0 or more items or doors, specify an effect type, and can provide contextual text to accompany the effect (either by displaying the text to the user, or modifying existing text). Examples of effects are "UNLOCK_DOOR" and "CHANGE_ITEM_TEXT"

Effect Structure

{
    "id" : string,
    "type" : string,
    "doorIds" : string[],
    "itemIds" : string[],
    "text" : string
}

Effects to implement

UNLOCK_DOOR - Unlocks any provided door IDs. If text is provided, display the text to the user.

LOCK_DOOR - Locks any provided door IDs. If text is provided, display the text to the user.

CHANGE_ITEM_TEXT - Updates the descriptive text of an item to the provided text.

Items

Items provide the user with tools to solve puzzles between rooms. Items contain lists of valid commands, an ID, a visibility state, and a name.

Item Structure

{
    "id" : string,
    "name" : string,
    "commands" : Command[],
    "visible" : boolean
}

Doors

Doors are used to signify a transition point between rooms. They may be locked or unlocked by effects, a state that is global to the door, and contain an id.

Door Structure

{
    "id" : string,
    "locked" : boolean
}

Rooms

Rooms represent areas of the world. Each room may have up to 4 doors (One in each cardinal direction), descriptive text, zero or more items, and can be marked as the victory condition. Reaching the room marked as the victory condition should end the game after printing the descriptive text.

Room Structure

{
    "id" : string,
    "text" : string,
    "itemIds" : string[],
    "doors" : [
        {
            "doorId" : string,
            "direction" : string,
            "connectedRoomId" : string
        }
    ]
}

Full Game Format Structure

{
    "items" : Item[],
    "effects" : Effect[],
    "doors" : Door[],
    "rooms" : Room[],
    "startingRoomId" : string,
    "endingRoomId" : string
}

Example of a valid adventure (3 rooms, 2 items, 3 effects, and one simple puzzle):

{
    "items" : [
        {
            "id" : "1",
            "name" : "Book",
            "commands" : [
                {
                    "command" : "LOOK",
                    "text" : "An old book, worn with time."
                },
                {
                    "command" : "TAKE"
                },
                {
                    "command" : "READ",
                    "text" : "The old book is filled with mostly useless, outdated information"
                }
            ],
            "visible" : true
        },
        {
            "id" : "2",
            "name" : "Book Shelf",
            "commands" : [
                {
                    "command" : "LOOK",
                    "text" : "An old dusty bookshelf full of tomes.  One seems to be missing."
                },
                {
                    "command" : "USE",
                    "acceptedItem" : [
                        {
                            "itemId" : "1",
                            "text" : "You place the book into it's place on the shelf",
                            "effectIds" : ["1", "2", "3"]
                        }
                    ]
                }
            ],
            "visible" : true
        }
    ],
    "effects" : [
        {
            "id" : "1",
            "type": "UNLOCK_DOOR",
            "doorIds" : ["2"],
            "text": "The door to the east makes a satisfying click."
        },
        {
            "id" : "2",
            "type": "LOCK_DOOR",
            "doorIds" : ["1"],
            "text": "The door to the south makes a unsatisfying click."
        },
        {
            "id" : "3",
            "type" : "CHANGE_ITEM_TEXT",
            "itemIds" : ["2"],
            "text" :"An old dusty bookshelf full of tomes."
        }
    ],
    "doors" : [
        {
            "id" : "1",
            "locked" : false 
        },
        {
            "id" : "2",
            "locked" : true
        }
    ], 
    "rooms" : [
        {
            "id": "1",
            "text" : "A simple room with a bed and a side table.",
            "itemIds" : ["1"],
            "doors" : [
                {
                    "doorId" : "1",
                    "direction" : "NORTH",
                    "connectedRoomId" : "2"
                }
            ]
        },
        {
            "id" : "2",
            "text" : "A simple room with some furniture.",
            "itemIds" : ["2"],
            "doors" : [
                {
                    "doorId" : "2",
                    "direction" : "EAST",
                    "connectedRoomId" : "3"
                },
                {
                    "doorId" : "1",
                    "direction" : "SOUTH",
                    "connectedRoomId" : "1"
                }
            ]
        },
        {
            "id" : "3",
            "text" : "The world outside is bright, you have escaped the dungeon!"
        }
    ],
    "startingRoomId" : "1",
    "endingRoomId" : "3"
}
Owner
HTTPChat
HTTPChat
Word and phrase lists in CSV

Word Lists Word and phrase lists in CSV, collected from different sources. Oxford Word Lists: oxford-5k.csv - Oxford 3000 and 5000 oxford-opal.csv - O

Anton Zhiyanov 14 Oct 14, 2022
Word-Generator - Generates meaningful words from dictionary with given no. of letters and words.

Meaningful Word Generator Generates meaningful words from dictionary with given no. of letters and words. This might be useful for generating short li

Mohammed Rabil 1 Jan 01, 2022
Compute distance between sequences. 30+ algorithms, pure python implementation, common interface, optional external libs usage.

TextDistance TextDistance -- python library for comparing distance between two or more sequences by many algorithms. Features: 30+ algorithms Pure pyt

Life4 3k Jan 02, 2023
Migrates translations to the REDCap native Multi-Language Management system

Automates much of the process of moving translations from the old Multilingual external module to the newer built-in Multi-Language Management (MLM) page.

UCI MIND 3 Sep 27, 2022
Python Q&A for Network Engineers

Q & A I am often asked questions about how to solve this or that problem, and I decided to post these questions and solutions here, in case it is also

Natasha Samoylenko 30 Nov 15, 2022
知乎评论区词云分析

zhihu-comment-wordcloud 知乎评论区词云分析 起源于:如何看待知乎问题“男生真的很不能接受彩礼吗?”的一个回答下评论数超8万条,创单个回答下评论数新记录? 项目代码说明 2.download_comment.py 下载全量评论 2.word_cloud_by_dt 生成词云 2

李国宝 10 Sep 26, 2022
Free & simple way to encipher text

VenSipher VenSipher is a free medium through which text can be enciphered. It can convert any text into an unrecognizable secret text that can only be

3 Jan 28, 2022
Question answering on russian with XLMRobertaLarge as a service

QA Roberta Ru SaaS Question answering on russian with XLMRobertaLarge as a service. Thanks for the model to Alexander Kaigorodov. Stack Flask Gunicorn

Gladkikh Prohor 21 Jul 04, 2022
The bot creates hashtags for user's texts in Russian and English.

telegram_bot_hashtags The bot creates hashtags for user's texts in Russian and English. It is a simple bot for creating hashtags. NOTE file config.py

Yana Davydovich 2 Feb 12, 2022
Translate .sbv subtitle files

deepl4subtitle Deeplを使って字幕ファイル(.sbv)を翻訳します。タイムスタンプも含めて出力しますが、翻訳時はタイムスタンプは文の一部とは切り離されるので、.sbvファイルをそのまま翻訳機に突っ込むよりも高精度な翻訳ができるはずです。 つかいかた 入力する.sbvファイルの前処理

Yasunori Toshimitsu 1 Oct 20, 2021
An extension to detect if the articles content match its title.

Clickbait Detector An extension to detect if the articles content match its title. This was developed in a period of 24-hours in a hackathon called 'H

Arvind Krishna 5 Jul 26, 2022
CowExcept - Spice up those exceptions with cowexcept!

CowExcept - Spice up those exceptions with cowexcept!

James Ansley 41 Jun 30, 2022
PyNews 📰 Simple newsletter made with python 🐍🗞️

PyNews 📰 Simple newsletter made with python Install dependencies This project has some dependencies (see requirements.txt) that are not included in t

Luciano Felix 4 Aug 21, 2022
Convert ebooks with few clicks on Telegram!

E-Book Converter Bot A bot that converts e-books to various formats, powered by calibre! It currently supports 34 input formats and 19 output formats.

Youssif Shaaban Alsager 45 Jan 05, 2023
A slugifier that works in unicode

Unicode Slugify Unicode Slugify is a slugifier that generates unicode slugs. It was originally used in the Firefox Add-ons web site to generate slugs

Mozilla 315 Nov 21, 2022
box is a text-based visual programming language inspired by Unreal Engine Blueprint function graphs.

Box is a text-based visual programming language inspired by Unreal Engine blueprint function graphs. $ cat factorial.box ┌─ƒ(Factorial)───┐

Pranav 104 Dec 24, 2022
Correcting typos in a word based on the frequency dictionary

Auto-correct text Correcting typos in a word based on the frequency dictionary. This algorithm is based on the distance between words according to the

Anton Yakovlev 2 Feb 05, 2022
This repos is auto action which generating a wordcloud made by Twitter.

auto_tweet_wordcloud This repos is auto action which generating a wordcloud made by Twitter. Preconditions Install Python dependencies pip install -r

tubone(Yu Otsubo) 0 Apr 29, 2022
Hotpotato is a recipe portfolio App that assists users to discover and comment new recipes.

Hotpotato Hotpotato is a recipe portfolio App that assists users to discover and comment new recipes. It is a fullstack React App made with a Redux st

Nico G Pierson 13 Nov 05, 2021
Convert English text to IPA using the toPhonetic

Installation: Windows python -m pip install text2ipa macOS sudo pip3 install text2ipa Linux pip install text2ipa Features Convert English text to I

Joseph Quang 3 Jun 14, 2022