David Cornelson

From IFWiki

David Cornelson, 2024

David Cornelson once tried to build an IF publishing company called Textfyre That endeavor is now closed. Some of the remnants of Textfyre include web-based platform tools for Inform 7 using Glulx-TypeScript, FyreVM-Web, and TypeScript, and ReactJS. As of January 1, 2024 David is now a Board Member of the IFTF and is spending more time on a .NET based IF platform.

Note: David 's nickname is Dave on ifMUD; formerly, it was Jarb.

Author Credits

Tech Credits

Review and Article Credits

Organizational Credits

  • Original host/maintainer of plover.net and IFLibrary.com. Plover was maintained by Peter Seebach from 2005 to 2007 and in September of 2007, plover.net returned to David's basement. In 2013, Plover was moved to the cloud on linode.com. IFLibrary.com was retired in favor of Baf's Guide.
  • Creator of this IFWiki.
  • Owner/CEO of Textfyre.

Game Appearances

As an NPC:

As a cameo appearance:

IF Platform C#/.NET Core

I mostly play with C# and building a parser-based platform on top of .NET Core. I've iterated through the development process using ChatGPT and have the ongoing results in a public GitHub repository (chatgpt-ifplatform).

Some of the things I've set as requirements include:

  • In-Memory Graph Data Structure to store and manage the World Model
    • Includes Edges and Nodes, both with dynamic properties

Here are working Edge.cs and Node.cs classes:

    public class Edge
    {
        public string StartNodeId { get; private set; }
        public string EndNodeId { get; private set; }
        public List<GraphProperty> StartProperties { get; set; }
        public List<GraphProperty> EndProperties { get; set; }

        public Edge(string startNodeId, string endNodeId, GraphProperty startProperty, GraphProperty endProperty)
        {
            StartNodeId = startNodeId;
            EndNodeId = endNodeId;
            StartProperties = new List<GraphProperty>();
            StartProperties.Add(startProperty);
            EndProperties = new List<GraphProperty>();
            EndProperties.Add(endProperty);
        }
    }

    public class Node
    {
        public string Id { get; private set; }
        public object Data { get; private set; }
        public List<Edge> Edges { get; private set; }
        public List<GraphProperty> Properties { get; set; }

        public Node(string id, object data, GraphProperty defaultProperty)
        {
            Id = id;
            Data = data;
            Edges = new List<Edge>();
            Properties = new List<GraphProperty>();
            Properties.Add(defaultProperty);
        }

        public Node(string id, object data, List<GraphProperty> defaultProperties)
        {
            Id = id;
            Data = data;
            Edges = new List<Edge>();
            Properties = new List<GraphProperty>();
            Properties.AddRange(defaultProperties);
        }
    }

    public class GraphProperty
    {
        public string Key { get; set; }
        public object Value { get; set; }

        public GraphProperty(string key, object value)
        {
            Key = key;
            Value = value;
        }

        public static GraphProperty Create(string key, object value)
        {
            return new GraphProperty(key, value);
        }
    }
  • All text emission is contextual through a service
    • This means text is never "printed" but slotted for structured emitting at the end of the turn. This will require language emission rules to allow the author to construct output how they want. We'll create standard patterns, but this will be wide open for customization.
  • Save state will be a serialized version of the World Model in-memory graph.
  • The player will have a built-in dynamic memory.
  • The Grammar definitions will look familiar to anyone familiar with Inform 6 or TADS (see the in-progress StandardLibrary in the codebase).
  • I'm starting with a traditional footprint (Locations, Compass Movement), but I plan to spin off a Scene-based platform afterwards where the concepts of locations and movement don't exist.
  • I might delve into the idea of a pluggable movement system and not default to compass directions. This is not trivial.
  • I plan to implement an event management system where the author can define World Model states as triggers for activities.
  • Activities will be similar to Inform 6 daemons, but explicitly rule-based.
  • A lot of built-in meta data. Every time a player sees, hears, smells, arrives at, carries, or encounters something, the system will automatically tally statistics. "You've traversed the winding path many times." > HOW MANY TIMES? "Seven."
  • Every action and reaction will be stored in a transaction log.

Collaboration

I love monkeying around with IF platform concepts, but it would be nice to have others join in the fun. Feel free to ping me if you want to help out and I'll add you to the repo and I have a Mattermost (Slack twin) server to have discussions. (Plover Mattermost Server) and GitHub.

Links

Interviews