Rule a kingdom across a rich, non-linear orgy of timelines and causality. Chronomancer sits the player between past, present, and future, commanding history across real cities reborn as medieval kingdoms. Through a gameplay style that sits between COMP3008 and https://apps.apple.com/us/app/reigns/id1114127463, Chronomancer achieves the following:

  • Implements a (toy) strategy game played across non-linear, acyclic time with interval-order events.
  • Derives in-game kingdoms from real UK cities, with notable locations transformed into faction outposts.
  • Verification of win/loss conditions (satisfiability) using fun, SMT-decidable first order logic.
  • Visually intuitive interface built on interval-constrained event series, inspired by real horologes!
  • Narrative arcs derived from symbolic constraints, with clankers (AI) acting them out!

What is that purple thing?

We wanted to make the player feel like a real chronomancer when playing the game. We ran to Hobbycraft last night (during the Notts County vs Cambridge game) and bought their cheapest purple fabric to fashion into a mystic lectern on which you can play the game. It's entirely controlled by touch (as of 11:45, 15mins prior to handin) - so we wanted to try and make a more mystical experience, compared to the average gaming environment.

What is the game?

Chronomancer is a strategy game where you can make decisions in the past that affect the future, or the other way around. The aim is to avoid creating time paradoxes, such as scheduling the execution of a gnome before his birthday party (which he attends).

The core gameplay loop (non-linear strategy) works using Satisfiability Modulo Theories (or SMT logic, for non-🤓's). Events correspond to mathematical constraints, which are 'verified' using Z3 Theorem Prover (our SMT solver of choice for this hackathon, although we pose it could be solved in pure LP).

How does it all work?

The majority of Chronomancer is programmed in Rust (Blazingly Fast), with the frontend developed in Gamemaker. This has been our largest hackathon undertaking in Rust (so far) and was a great choice!

  • We interfaced with a hat-trick of Google APIs (Directions, Routes, Places) to translate modern cities into medieval gameworlds (translating geographical coordinates into a unit circle).
  • These are assigned into initial factions (Gnomes, Centaurs and Trolls) using simple k-means clustering, and then rendered inside of the game, with custom emblems!
  • Events are stored as a directed-acyclic graph inside of the controller, converting to interval order to display, circularly on the GUI.
  • Decisions/ledgers (events) are generated symbolically (in terms of their effects), then clanker-fied by the OpenAI API to give better natural language description.
  • If the player chooses to accept a ledger, the map-time formulation is encoded into SMT-decidable logic, and a potential, valid, timeline is proven against the generated constraints - if not, game over!

The future (or past) of Chronomancer

We'll assume this has already been decided...

Built With

Share this project:

Updates