Carsten Pfeffer

Software Developer, Musician, Game Developer, Podcaster, Cartoonist.

A cartoon horse face

Software Development

I am a professional software developer with a master's degree in computer science. My primary programming language at work is C#, but I am also experienced with other languages, such as Python, C++, Java and Typescript.

As a space- and scifi-enthusiastic person, I am very glad that I got a software engineering job in the space industry. As a child, I was always fascinated by Geordi LaForge modifying and repairing his friend Data on board of the Enterprise-D and today I think I am as close to this as I could get.

I also develop software in my spare-time. On the one hand, I am developing games (see below), on the other hand I like coding and designing web sites and small tools.

A screenshot of a node-based editor with the title 'Schnack Dialog Editor'

One of these tools is the Schnack dialog editor, which can be used in game development for narrative games. It is based on Electron and Javascript and provides a node-based editor for dialogs between players and non-player characters including Lua-based logic. It uses a JSON-based file format, which can be read by runtime libraries in several programming languages, including C++, C# and Javascript.

A stylized white rattlesnake on a green background

Another example is the static site generator Rattlesnake, which is inspired by the Ruby-based generator Jekyll. Since I wanted to switch from Ruby to a Python-based solution, I looked for alternatives, but there was no solution that worked with a recent Python version, so I wrote my own. Rattlesnake takes a directory containing HTML, CSS and Markdown files and transforms it into an actual website with nice-looking links. In fact, this website was generated from a Git repository using Rattlesnake. It is available in the Python package Index (PyPI)

A stylyzed coconut half on a green background, captioned with 'Monty'

My final project at university was the development of the prototype programming language Monty. The language aimed to provide the best of both worlds; the performance of traditional programming languages (like C++), combined with the comfort of modern scripting languages (like Python, hence the name "Monty"). Within one year, our team of approximately 10 students developed a language specification and a compiler for the fundamental language constructs. Although the compiler is not production-ready and the development of the language is not continued, I learned a lot about programming language internals, compiler design and the tradeoffs one has to do when introducing new concepts into an existing language. The logo of the language is a coconut, referring to the *horse* in the movie "Monty Python and the Holy Grail".

Another small library that I developed years ago is w3term, an implementation of a Unix-like terminal that runs in the browser and can be used for emulating a command-line interface in the browser: http://cpfr.github.io/w3term/. The code is not quite state-of-the-art Javascript code, but the terminal is still very useful from time to time.

Music

I have been loving music as long as I can think and already as a little child I always wanted to learn how to play the guitar. I started to take classical guitar lessons, bought my first electric guitar when I was older and founded a first punk rock band when I was 17. Later, I experimented with other instruments the keyboard, bass, accordion, bagpipes and drums. I also tried out other genres, like singer-songwriter and heavy metal.

A screenshot of a YouTube video, where I perform a song with the acoustic guitar A picture of the CD I recorded with my band 'Spade'

The images above are links to some YouTube videos. The first one is an acousic song written by me, recorded in 2015. The second one is a rock song, written by me, performed by my first band Spade in 2009, when we recorded a CD before splitting up and moving to different cities after finishing school.

Soundtracks

Besides making music with real instruments, I discovered that making music on the computer is also quite satisfying. I use the open source software LMMS for composing and arranging soundtracks for my other projects (such as games, pen and paper roleplaying adventures or my podcast).

Please note that the tracks below are released under a relatively restrictive CC-BY-NC-ND license. This means that you may download and share these tracks, as long as you point out that these were made by me. However, you are not allowed to create your own derivative works based on these tracks and share them. Further, you are not allowed to make money with them. If you are interested in using any of the material beyond these terms, please contact me.

CC-BY-NC-ND

Home Sweet Home

This track is part of the 2080 adventure game demo. It is the background music for the player's cabin room on the starship.

Curious

Here I tried to imitate these typical uplifting music tracks that are often used in a certain genre of YouTube videos...

Undead Patwah

This is a spooky raeggae track and part of the soundtrack of the ghost hunter pen and paper roleplaying adventure 'Geistreich' that I wrote in 2022.

Fighting a Ghost

This is an excerpt from a fighting background music which is part the soundtrack of the ghost hunter pen and paper roleplaying adventure 'Geistreich' that I wrote in 2022.

Visiting a Forlorn Place

This is a new track for the soundtrack of a new ghost hunter pen and paper roleplaying adventure I am currently writing.

Hobby-Spieleentwickler-Podcast Intro

This is the title melody of our Hobby Game Developer Podcast.

Game Development

I alwas wanted to make games, made my first steps with different game making tools of the time in the late 90s and early 2000s, and finally learned proper programming. I tried out many tools, libraries and engines for game development, from Klik and Play to 3D Gamestudio, Irrlicht Engine (C++), Ogre3D (C++), Marmelade SDK (C++), Panda3D (Python), Three.js (Javascript), LibGDX (Java) or even SDL (C/C++) and JNGL (C++).

As for so many others like me, most of the projects remain unfinished, but fortunately, some others are quite presentable in my opinion. One game I made in a team of three people was RageTracks (short for 'randomly generated race tracks'). We used the Panda3D engine and the Python programming language. The game was a local-multiplayer racing game with randomly generated tracks. We were able to get a playable prototype working and (due to fortune curcumstances) to present the game on the 2010's CeBit, a computer expo in north Germany. Unfortunately, we stopped the development of this game in order to focus on our next game Somyeol, which won a competition at the Global Game Jam 2011, wherefore we decided to transform the game jam version into a fully-fletched mobile game using the Marmelade SDK and the C++ programming language.

Screenshot of a futuristic 3D racing game in a glowing, colorful space-setting A purple-haired, green-skinned alien with only one eye and the caption 'Somyeol'

During another Global Game Jam, I participated in a group of four people. We wanted to try out the LibGDX framework for Java. We developed the multiplayer shooter ColorFoool, where players in three different colors (red, green and blue) spray-paint each other in order to adopt the opponents into the own team.

Screenshot of a grayscale world with a red stick-figure spraying color and the caption 'ColorFoool'

Star Trek always inspired me and when I found out that there was a game that allowed you to collaboratively control a starship, I was hooked. This game was called Artemis Spaceship Bridge Simulator (there is also an open-source clone of this game, called Empty Epsilon). In this type of game, you and your friends control a starship - together. Each person has an own computer that controls one station of the ship (e.g., helm, communications, engineering, weapons, etc.). Since I am easily attracted by new ideas, I started to implement my own variant of the game concept: Critical Mission. It is based on web technology, in order to make the game setup as easy as possible: One person brings the server, all others can connect via their phone or tablet browser. The game is still in development, although other projects currently have a higher priority.

A screenshot of a planet and several small starships and the caption 'Critical Mission'

When I was younger, I stumbled across an article about the rendering technique that was used in order to create the old 3D games from the early 90s: Raycasting. I started to implement an own raycasting renderer. The first version was written in Python and the performance was horrible. Then, I started to port it to C++. Finally, I integrated it into Python using the Cython glue language and called it the Chroniton Engine, a small game engine with a raycasting renderer, collision and UI system, based on SDL2.

When the website gamedev.net organized a dungeon crawler challenge, I used the engine to create my most-recent game The Fire of Ardor - Quest for the Soul Stone. It is a first-person RPG-like game that takes place in a fantasy setting and has a playing time of 30 - 60 minutes. You can think of it as an old-school version of an Elder Scrolls game that has only one dungeon.

Screenshot of a raycasting-rendered scifi-scene with an hourglass-radiation symbol Screenshot of a raycasting-rendered game, showing a first-person view of a character with a sword in a town with a red sky

Finally, Kolja (the co-host of my podcast) and I looked for a new challenge. We figured out that we wanted to create a point and click adventure game. The story takes place in the year 2080, when climate change disastrously hits humankind and a small group of astronauts is sent to space in order to place a giant umbrella at the Lagrange Point L1 in order to protect earth from even more sun radiation. The game tries to accomplish a humoristic discussion of a serious topic.

The game itself is built on-top of the library JNGL, which provides low-level video and audio capabilities for a lot of platforms (including desktop, mobile and consoles). As another layer of abstraction, we started to implement what we call the ALPACA engine ("A Library for Point and Click Adventures"). It uses the Spine 2D animation framework and the Schnack dialog editor (see above) and provides the necessary features for creating graphical adventure games, such as scene and inventory management.

Screenshot of a female astronaut standing next to a hologram of an umbrella. The caption is '2080'

For a long time I have been thinking about how a parser-based text adventures work (also known as interactive fiction). I have some experience with programming language parsers (including the development of the Monty programming language), but the nature of this kind of games fascinated me, so I started to play around developing a small system for interactive fiction writing.

This little framework was almost forgotten in a forsaken sector of my file system, until the start of the Interactive Fiction Grand Prix 2024 was announced. I thought that this was the opportunity to have a real deadline for proving that this framework was usable for an actual text adventure. The framework is implemented in Typescript and utilizes the Fengari library for Lua support. The whole game is written in YAML and Lua, while the interpreter runs in the browser.

The game is called "Der Turm des Hexenmeisters" ("The Sorcerer's Tower"). You play a person who breaks into the home of a mysterious sorcerer in order to steal a dragon egg. It is available on Itch.io and the ifwizz interactive fiction database (only in German language).

Screenshot of a female astronaut standing next to a hologram of an umbrella. The caption is '2080'

Pen and Paper

I stared to play pen and paper roleplaying games with some of my colleagues and in 2022 I started to write an own adventure for playing it with these people. The plot is about a ghost hunting agency in the late 1990s in Germany. The title of this scenario is called Geistreich, which is a wordplay that could either mean "witty" or "Realm of Ghosts".

The scenario is designed to be episodic, where the players have to fight ghosts for a different customer each session. It is written in German and can be played with either the "How to be a Hero" rulebook or "Rookie's Die".

Title page of my pen and paper adventure 'Geistreich'

If you understand German, you can also play it. The PDFs are available for download here:

Rookie's Die

How to be a Hero

We also recorded a session playing this adventure and produced an audio drama from it (again, only available in German language). It takes three and a half hours and features ambient noises, sound effects and a custom soundtrack, composed just for this purpose (see also the Music section of this website).
You can listen to it here.

Podcasting

After developing many game prototypes and finishing some games, I asked my friend Kolja whether he would like to start a new podcast related to game development. We were inspired by the GameDev Podcast, the first German podcast focused on professional game development, but with an emphasis on game art. As a fan of the podcast, We wanted to start our own one that was on the one hand more focused on programming and tools, but on the other hand also focued on game development as a hobby (since we both don't work in the game industry).

Cover image of my podcast. It shows a game controller and the title 'Hobby Spieleentwickler Podcast' (hobby game developer podcast)

The result is the Hobby-Spieleentwickler-Podcast ("Hobby Game Developer Podcast"). We talk about the different aspects of creating a game either alone or in a small team and on a low budget. Further, each episode focuses on a particular topic, such as multiplayer games, artificial intelligence for NPCs or game audio.

Finally, we also developed our own podcast-hosting solution using Gitlab Pages and its CI pipeline in order to have a version-controlled source for our website and episode feed. This includes a plugin for the open source recording software Audacity which simplifies the workflow for removing breathing noises in the recording (thus, we call it the De-breather). Further, the website is generated by a static-site-generator (Rattlesnake, see above), the episode descriptions and metadata are extracted from a JSON file and inserted to the MP3 files, together with the cover image of each episode. This is all being done by the CI pipeline. There is also a template repository on GitLab which shows how this is done.

Drawing

I always liked drawing and painting. I am doing this either for fun (drawing cartoons) or for any of my other projects (e.g., game development). You can see a small selection of my latest paintings below. Click on an image to get a bigger version and a short description.

Please note that the images below are released under a relatively restrictive CC-BY-NC-ND license. This means that you may download and share the images, as long as you point out that these were made by me. However, you are not allowed to create your own derivative works based on these images and share them. Further, you are not allowed to make money with them. If you are interested in using any of the material beyond these terms, please contact me.

CC-BY-NC-ND

A cartoon chicken with a long neck and big eyes A cartoon horse with big eyes A smirking cartoon shark with big eyes A crying unicorn. The tears are flowing like a fountain to the left and right A unicorn in an armchair with a glass of wine A pig with a shiny horn on its forehead. A cartoony rabbit. An elephant with a party hat and a party horn, captioned: 'Elefun' An elephant with a mohawk haircut, earrings and a boombox on the shoulder An angry-looking elephant with an old red telephone, captioned: 'Telephant' An alpaca that friendly smiles into the camera. A screaming face with web-call buttons over his mouth. A smiling, red, daemonic creature with horns attached to the head and a trident in its hand, partly covered by yellow clouds. A grey panel that shows a low battery on the left side and a bio reactor container on the right side. On the bottom, there is a button with the label 'Manual Reset' A collection of 5 outlined portraits: One sailor, one old woman, a police officer, a young man in a hoodie and an old man wearing a waistcoat.