<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>termplay.dev</title>
  <description>Blog by Septinel</description>
  <item>
    <title>Byte Hopper: A Terminal Frogger Built from Scratch</title>
    <pubDate>Thu, 19 Mar 2026 00:00:00 +0000</pubDate>
    <description><![CDATA[<p><img src="/assets/games/byte_hopper.png" alt="Byte Hopper Game Image"></p>
<p>Few game concepts are as immediately readable as Frogger. You look at it for three seconds and you know exactly what to do. Cross the road, don't get hit. Cross the river, don't fall in. Make it home. <strong>Byte Hopper</strong> is a terminal reimagining of that idea — written in C with ncurses, playable in your terminal, and just as punishing as you remember.</p>
<h2>The Original: A Brief History of Frogger</h2>
<p>Frogger was released to arcades in 1981, developed by Konami and distributed in North America by Sega/Gremlin. The designer was <strong>Akira Hashimoto</strong>, and the concept was deceptively simple: guide a frog across five lanes of traffic, then across five lanes of river, and land safely in one of five lily pad homes at the top.</p>
<p>What made it stand out in 1981 wasn't just the gameplay — it was the <em>tone</em>. Arcades at the time were dominated by shooters: Space Invaders, Galaga, Defender. Frogger brought no weapons, no aliens, no lasers. Just a frog, a road, and a river. It was immediately approachable and quietly brutal, and players responded to it. Within a year it had become one of the highest grossing arcade games of the era.</p>
<p>The game was also technically notable for being one of the first arcade titles to use <strong>stereo sound</strong>, with separate audio channels driving left and right speaker outputs. The music — a looping, slightly manic march — became one of the more recognizable earworms of the arcade generation.</p>
<h3>The Home Port Era</h3>
<p>Parker Brothers licensed Frogger for home consoles and computers starting in 1982, and the ports landed everywhere: Atari 2600, Atari 8-bit, ColecoVision, Intellivision, Apple II, Commodore 64, TRS-80, and IBM PC. The <strong>Atari 2600 version</strong> alone sold over four million copies, making it one of the best selling cartridges of that generation. The <strong>ColecoVision port</strong> was widely considered the most faithful to the arcade original.</p>
<p>A sequel, <em>Frogger II: Threedeep!</em>, arrived in 1984, adding underwater and sky zones to the classic crossing formula. But the original structure never needed much improving. The &quot;cross the obstacle field&quot; mechanic was already complete.</p>
<h3>The Long Shadow</h3>
<p>Frogger's influence on game design is hard to overstate. The game essentially defined a genre: take a fixed grid, populate it with hazards moving on fixed paths, and make the player navigate through them without being destroyed. Dozens of games borrowed from this template across the following decades, including the mobile hit <strong>Crossy Road</strong> in 2014, which runs the same concept in an endless procedurally generated world.</p>
<p>In 1998, Frogger made a brief cultural cameo in the Seinfeld episode <em>&quot;The Frogger&quot;</em>, in which George Costanza attempts to preserve a high score on an arcade machine by transporting it across a New York street — recreating, in real life, the exact scenario the game is built around.</p>
<p>Konami has revisited the IP several times over the years, with the most recent major release being <em>Frogger in Toy Town</em> for Apple Arcade in 2020. The core idea, though, remains unchanged from 1981.</p>
<h2>What is Byte Hopper?</h2>
<p>Byte Hopper is a from scratch terminal implementation of the Frogger concept, written in C using the <strong>ncurses</strong> library. It runs entirely in the terminal, targets a minimal 80×15 screen, and reconstructs the classic two-zone crossing structure: a road to dodge, a river to cross, and five lily pads to fill.</p>
<p>It's a clean, self contained project — four source files, a header, and a Makefile — built with the kind of simplicity that makes it easy to read and easy to extend.</p>
<h2>Gameplay</h2>
<p>The board is divided into four distinct zones, read bottom to top:</p>
<ul>
<li><strong>Starting zone</strong> — safe ground where the frog spawns</li>
<li><strong>Road zone</strong> — five lanes of cars and trucks moving at different speeds in alternating directions</li>
<li><strong>Median strip</strong> — safe ground between the two hazard zones</li>
<li><strong>River zone</strong> — five lanes of logs and turtles; the frog must ride platforms or it drowns</li>
<li><strong>Home row</strong> — five lily pads at the top; fill all five to complete the level</li>
</ul>
<p>The road is a test of timing. The river is a different kind of problem — you're not just avoiding obstacles, you're riding them. Logs and turtles drift continuously, and the frog drifts with them. Ride something off the edge of the screen and you're gone. Stand in the water for a single frame and you're gone. The river is where Frogger's design is most interesting, and Byte Hopper preserves that faithfully.</p>
<p><strong>Scoring:</strong></p>
<table>
<thead>
<tr>
<th>Action</th>
<th>Points</th>
</tr>
</thead>
<tbody>
<tr>
<td>Each step forward</td>
<td>+10</td>
</tr>
<tr>
<td>Reaching a lily pad</td>
<td>+50 × level</td>
</tr>
<tr>
<td>Filling all 5 pads</td>
<td>+200 × level</td>
</tr>
</tbody>
</table>
<h2>Progressive Difficulty</h2>
<p>Byte Hopper scales with each level cleared. Vehicle and platform speeds increase by <strong>12% per level</strong>, capped at 2.5× the base speed. Every three levels, additional obstacles spawn into each lane. The game gets meaningfully harder without becoming chaotic — by level five or six you'll be working for every crossing.</p>
<h2>Building Byte Hopper</h2>
<p>The project requires a C compiler (clang or gcc), ncurses, and make.</p>
<h3>Install ncurses</h3>
<pre><code class="language-bash"># macOS
brew install ncurses

# Debian / Ubuntu / Mint
sudo apt install libncurses-dev

# Fedora / RHEL / Rocky
sudo dnf install ncurses-devel

# Arch Linux
sudo pacman -S ncurses
</code></pre>
<h3>Build and Run</h3>
<pre><code class="language-bash">git clone &lt;repo&gt;
cd c_frogger

# Debug build (default)
make

# Optimized release build
make release

# Run directly
./build/byte-hopper

# Or build and run in one step
make run
</code></pre>
<p>The binary lands in <code>build/</code>. The game requires a terminal at least <strong>80 columns wide and 15 rows tall</strong>.</p>
<h3>Install System-Wide</h3>
<pre><code class="language-bash"># Install to /usr/local/bin
sudo make install

# Or install to a custom prefix
make install PREFIX=$HOME/.local

# Uninstall
sudo make uninstall
</code></pre>
<h2>Controls</h2>
<table>
<thead>
<tr>
<th>Key</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>W</code> / <code>UP</code></td>
<td>Move up</td>
</tr>
<tr>
<td><code>S</code> / <code>DOWN</code></td>
<td>Move down</td>
</tr>
<tr>
<td><code>A</code> / <code>LEFT</code></td>
<td>Move left</td>
</tr>
<tr>
<td><code>D</code> / <code>RIGHT</code></td>
<td>Move right</td>
</tr>
<tr>
<td><code>P</code></td>
<td>Pause / Resume</td>
</tr>
<tr>
<td><code>R</code></td>
<td>Restart (after game over)</td>
</tr>
<tr>
<td><code>Q</code></td>
<td>Quit</td>
</tr>
</tbody>
</table>
<h2>A Few Technical Details</h2>
<p>Byte Hopper uses <strong>fractional position accumulation</strong> to handle platform drift. Because log and turtle speeds are sub integer (values like 0.2 or 0.35 columns per tick), the frog's horizontal offset accumulates as a float and only commits to a whole column when the fractional part crosses a threshold. This means the frog stays glued to its platform smoothly even at slow speeds, without any snapping or jitter.</p>
<p>Wrapping collision detection handles objects that span the screen edge — a log that's half off the right side is checked as continuing from the left, which keeps the river zone consistent as platforms cycle endlessly through.</p>
<p>When the frog is killed, a <strong>death animation</strong> runs for a brief window: the frog sprite flashes as a red <code>*</code> while the rest of the board keeps moving. The hazards don't pause for you, which adds a small additional tension to every respawn.</p>
<p>High scores are <strong>persistent</strong>, stored in <code>~/.local/share/byte_hopper/highscores.dat</code> (respecting <code>XDG_DATA_HOME</code> if set). The top 10 scores are shown on the start screen. When you earn a spot, the game prompts for a name — up to 15 characters, no spaces. If you skip it, the entry saves as <code>ANON</code>.</p>
<h2>Why Play Byte Hopper?</h2>
<p>Frogger's design has aged remarkably well, and Byte Hopper is a good argument for why. There's nothing to learn beyond the first ten seconds, but there's plenty to get better at. The road zone rewards patience. The river zone rewards spatial awareness. Filling all five lily pads cleanly — before the timer, without trapping yourself in a bad position — feels satisfying every time.</p>
<p>It also runs in a terminal, which means it's available everywhere and launches in under a second. That's the whole pitch.</p>
<p><strong>Source:</strong> <a href="https://github.com/termplay/byte-hopper">github.com/termplay/byte-hopper</a></p>
]]></description>
  </item>
  <item>
    <title>ATC: The Terminal Air Traffic Control Game That Never Lets Up</title>
    <pubDate>Sun, 15 Mar 2026 00:00:00 +0000</pubDate>
    <description><![CDATA[<p><img src="/assets/games/atc.png" alt="ATC Game Image"></p>
<p>There is a particular kind of pressure that only real-time terminal games can generate. No graphics, no sound design, just a grid of letters crawling across a screen and the growing certainty that you are about to cause a mid-air collision. <strong>atc</strong> (Air Traffic Controller) is that game. It has been running on Unix systems since the late 1980s, and it remains as stressful and as good as it ever was.</p>
<h2>What is atc?</h2>
<p>atc is a real-time air traffic control simulation for the terminal. You manage a radar screen full of aircraft: jets and propeller planes entering from the edges of the map, heading for destinations (other exits or airports), and depending entirely on you to get them there safely. You issue commands to change their altitude and heading. The game never pauses. Planes pile up. Fuel runs out. Two letters converge on the same cell.</p>
<p>There is no winning state. The goal is simply to keep going as long as possible, to safely direct as many aircraft as possible before something goes wrong.</p>
<h2>History and Background</h2>
<p>atc was written by <strong>Ed James</strong> at the <strong>University of California, Berkeley</strong> in the late 1980s (copyright 1990). James described it as an adaptation of an unknown PC game he'd encountered, rewritten as a Unix terminal game. His contact at the time was <code>edjames@ucbvax.berkeley.edu</code>  the classic UCB VAX address.</p>
<p>The game was distributed as part of <strong>BSD Unix</strong> and has been carried forward ever since through the <strong>bsd-games</strong> (also packaged as <strong>bsdgames</strong>) collection, a set of around 50 classic text-mode games originally from NetBSD, now maintained and ported to Linux. The Linux port used in most distributions is maintained in the <a href="https://github.com/vattam/BSDGames">vattam/BSDGames</a> GitHub repository. The canonical BSD version continues in OpenBSD's and NetBSD's game trees.</p>
<p>The bsd-games package has been around in Linux distributions since at least the mid-1990s. Current versions are <strong>2.17</strong> (the long-standing Linux port, found in Debian/Ubuntu/Fedora) and <strong>3.3</strong> (a newer revision found in Arch, Alpine, and MacPorts).</p>
<h2>Installing atc</h2>
<h3>Linux</h3>
<p>atc ships inside the bsd-games (or bsdgames) package on virtually every major Linux distribution.</p>
<pre><code class="language-bash"># Debian / Ubuntu / Raspbian / Kali
sudo apt install bsdgames

# Fedora / RHEL / Rocky / AlmaLinux
sudo dnf install bsd-games

# Arch Linux / Manjaro / Artix / Parabola
sudo pacman -S bsd-games

# Alpine Linux
apk add bsd-games

# Gentoo
emerge games-misc/bsd-games

# openSUSE
sudo zypper install bsd-games

# Void Linux
xbps-install bsd-games

# Slackware
# Available from SlackBuilds.org as bsd-games
</code></pre>
<p>After installing, run it with:</p>
<pre><code class="language-bash">atc
</code></pre>
<h3>macOS</h3>
<p>The easiest route is MacPorts, which carries bsd-games 3.3:</p>
<pre><code class="language-bash">sudo port install bsd-games
</code></pre>
<p>Alternatively, you can build from source. The game depends on ncurses, which is present on macOS.</p>
<h3>From Source</h3>
<pre><code class="language-bash">git clone https://github.com/vattam/BSDGames
cd BSDGames
./configure
make
sudo make install
</code></pre>
<p>On OpenBSD and NetBSD, atc is part of the base system and requires no installation.</p>
<h2>The Display</h2>
<p>When you start atc, the screen is divided into four areas:</p>
<p><strong>1. Radar Display</strong> (the large grid on the left)
This is the main playing field. It shows the airspace as a 2D overhead view. On it you will see:</p>
<ul>
<li><strong>Planes</strong>: a letter (uppercase = prop, lowercase = jet) followed by a single digit indicating altitude in thousands of feet. Example: <code>A7</code> is prop plane A at 7,000 ft; <code>b4</code> is jet b at 4,000 ft.</li>
<li><strong>Airports</strong>: a digit (the airport number) followed by a directional symbol (<code>^</code> <code>&gt;</code> <code>v</code> <code>&lt;</code>) indicating the required approach direction. Example: <code>0&gt;</code> is airport 0, approached from the west (landing heading east).</li>
<li><strong>Beacons</strong>: an asterisk or circle character followed by a number. Example: <code>*1</code> is beacon 1.</li>
<li><strong>Exit points</strong>: numbers along the border of the map, each representing an entry/exit point.</li>
<li><strong>Lines</strong>: drawn segments (horizontal, vertical, and exactly diagonal) that serve as visual reference guides for routing aircraft. They represent suggested airways.</li>
</ul>
<p><strong>2. Information Area</strong> (right side, upper)
A live list of all active planes. Each line shows:</p>
<pre><code>&lt;plane-id&gt;&lt;altitude&gt;[*] &lt;destination&gt;: &lt;current command&gt;
</code></pre>
<p>The <code>*</code> after the altitude means the plane is low on fuel. Example:</p>
<pre><code>B4*A0: Circle @ b1
</code></pre>
<p>This reads: Prop plane B, at 4,000 ft, low on fuel, destination is airport 0, currently circling at beacon 1.</p>
<p>Also shown: elapsed game time and the count of planes safely directed out.</p>
<p><strong>3. Input Area</strong> (bottom)
Echoes your current command as you type it.</p>
<p><strong>4. Author Area</strong> (small credit section)</p>
<h2>Aircraft: Jets vs. Props</h2>
<p>There are two types of aircraft, and the distinction matters for timing:</p>
<ul>
<li><strong>Prop planes</strong>: identified by <strong>uppercase letters</strong> (A, B, C…). They move <strong>every other game update</strong> - slower.</li>
<li><strong>Jets</strong>: identified by <strong>lowercase letters</strong> (a, b, c…). They move <strong>every game update</strong> - faster.</li>
</ul>
<p>Both types:</p>
<ul>
<li><strong>Enter the airspace at 7,000 feet</strong></li>
<li><strong>Must reach 9,000 feet to exit through an exit point</strong></li>
<li><strong>Must descend to 0 feet to land at an airport</strong> (and be directly over it)</li>
<li><strong>Can turn a maximum of 90 degrees per move</strong></li>
</ul>
<p><strong>Fuel</strong>: every plane has a fuel supply that depletes each turn. When fuel runs low, an asterisk appears next to the plane's altitude in the info panel. If fuel hits zero, the plane is lost. You must keep planes moving toward their destination.</p>
<p><strong>Collision</strong>: two planes are considered to have collided if they occupy <strong>adjacent cells in three dimensions</strong>, horizontally adjacent on the grid <em>or</em> within one altitude level of each other. This is stricter than it might look. Two planes at the same (x,y) position but at altitudes 4 and 5 are colliding. Two planes at different altitudes but adjacent grid squares can also collide.</p>
<h2>Destinations and Safe Handling</h2>
<p>Every plane that enters has a destination, either an <strong>exit point</strong> or an <strong>airport</strong>. The destination is shown in the info panel. A plane is safely handled when it reaches its destination correctly:</p>
<ul>
<li><strong>Exit point</strong>: the plane must pass through the correct exit at <strong>exactly 9,000 feet</strong> (altitude 9). The direction it's heading when it crosses the exit boundary doesn't matter, only that it exits through the <em>right</em> numbered exit at the <em>right</em> altitude.</li>
<li><strong>Airport</strong>: the plane must be at <strong>altitude 0</strong> and positioned <strong>directly over the airport</strong>, moving in the <strong>correct landing direction</strong> (shown by the directional arrow on the airport).</li>
</ul>
<p><strong>Losing conditions</strong>:</p>
<ul>
<li>A plane collides with another plane</li>
<li>A plane runs out of fuel</li>
<li>A plane is sent to the wrong destination (lands at the wrong airport, exits from the wrong exit)</li>
<li>A plane drops to altitude 0 while not directly over an airport</li>
<li>A plane exceeds altitude 9 (ceiling violation)</li>
<li>A plane drifts off the map without going through its correct exit</li>
</ul>
<p>Planes that are <strong>on the ground at an airport</strong> (altitude 0) are waiting for takeoff. The only valid command for a grounded plane is to increase its altitude, this is how you launch it.</p>
<h2>Command Syntax</h2>
<p>This is where atc gets interesting. Commands follow a strict hierarchical syntax with a state-machine parser. The input area shows your command as you build it character by character. Pressing <code>?</code> at any point lists valid next characters. Pressing backspace erases the last character. Pressing Return submits the command.</p>
<p>Commands are rejected if they are semantically invalid (e.g., telling a plane to climb to its current altitude, or giving an airport command to a plane that's already airborne in normal mode).</p>
<h3>Step 1: Select a Plane</h3>
<p>Type the plane's letter. Uppercase for props, lowercase for jets. Example: <code>A</code> selects prop plane A, <code>b</code> selects jet b.</p>
<h3>Step 2: Choose a Command</h3>
<p>After selecting a plane, type one of:</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Command</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>a</code></td>
<td><strong>Altitude</strong></td>
<td>Adjust altitude (immediate only)</td>
</tr>
<tr>
<td><code>t</code></td>
<td><strong>Turn</strong></td>
<td>Change heading (can be delayed)</td>
</tr>
<tr>
<td><code>c</code></td>
<td><strong>Circle</strong></td>
<td>Enter a holding pattern (can be delayed)</td>
</tr>
<tr>
<td><code>m</code></td>
<td><strong>Mark</strong></td>
<td>Highlight the plane on display</td>
</tr>
<tr>
<td><code>u</code></td>
<td><strong>Unmark</strong></td>
<td>Remove highlight; auto-remark when delayed command fires</td>
</tr>
<tr>
<td><code>i</code></td>
<td><strong>Ignore</strong></td>
<td>Suppress highlighting (useful for planes on long straight routes)</td>
</tr>
</tbody>
</table>
<h3>Altitude Command (<code>a</code>)</h3>
<p>Altitude commands are <strong>immediate only</strong>, they take effect on the next update. After <code>a</code>, type one of:</p>
<table>
<thead>
<tr>
<th>Next Key</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>[0-9]</code></td>
<td>Set absolute altitude to N thousand feet</td>
</tr>
<tr>
<td><code>c</code> or <code>+</code></td>
<td>Climb (relative), then type number of thousands</td>
</tr>
<tr>
<td><code>d</code> or <code>-</code></td>
<td>Descend (relative), then type number of thousands</td>
</tr>
</tbody>
</table>
<p>Examples:</p>
<ul>
<li><code>Aa9</code> — Set plane A to altitude 9,000 ft</li>
<li><code>Aa0</code> — Set plane A to altitude 0 (land, if over an airport)</li>
<li><code>Aac2</code> — Climb plane A by 2,000 ft</li>
<li><code>Aad3</code> — Descend plane A by 3,000 ft</li>
</ul>
<h3>Turn Command (<code>t</code>)</h3>
<p>Turns are <strong>delayable</strong> (more on delay below). After <code>t</code>, type one of:</p>
<table>
<thead>
<tr>
<th>Next Key</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>w</code></td>
<td>Turn to heading 0° (North)</td>
</tr>
<tr>
<td><code>e</code></td>
<td>Turn to heading 45° (Northeast)</td>
</tr>
<tr>
<td><code>d</code></td>
<td>Turn to heading 90° (East)</td>
</tr>
<tr>
<td><code>c</code></td>
<td>Turn to heading 135° (Southeast)</td>
</tr>
<tr>
<td><code>x</code></td>
<td>Turn to heading 180° (South)</td>
</tr>
<tr>
<td><code>z</code></td>
<td>Turn to heading 225° (Southwest)</td>
</tr>
<tr>
<td><code>a</code></td>
<td>Turn to heading 270° (West)</td>
</tr>
<tr>
<td><code>q</code></td>
<td>Turn to heading 315° (Northwest)</td>
</tr>
<tr>
<td><code>l</code></td>
<td>Turn left 45° (relative)</td>
</tr>
<tr>
<td><code>L</code></td>
<td>Turn left 90° (hard left, relative)</td>
</tr>
<tr>
<td><code>r</code></td>
<td>Turn right 45° (relative)</td>
</tr>
<tr>
<td><code>R</code></td>
<td>Turn right 90° (hard right, relative)</td>
</tr>
<tr>
<td><code>t</code></td>
<td>Turn towards a target (beacon, airport, or exit)</td>
</tr>
</tbody>
</table>
<p>The direction keys (<code>w e d c x z a q</code>) are arranged around the <code>s</code> key on a QWERTY keyboard to form a compass rose:</p>
<pre><code>q w e
a   d
z x c
</code></pre>
<p>The <strong>&quot;turn towards&quot;</strong> sub-command (<code>tt</code>) is very useful. After <code>tt</code>, type:</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Target type</th>
<th>Then type</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>b</code> or <code>*</code></td>
<td>Beacon</td>
<td>beacon number</td>
</tr>
<tr>
<td><code>a</code></td>
<td>Airport</td>
<td>airport number</td>
</tr>
<tr>
<td><code>e</code></td>
<td>Exit</td>
<td>exit number</td>
</tr>
</tbody>
</table>
<p>Example: <code>Attb1</code> — turn plane A towards beacon 1.</p>
<h3>Circle Command (<code>c</code>)</h3>
<p>Puts the plane into a circular holding pattern. After <code>c</code>, optionally type:</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>l</code></td>
<td>Circle counterclockwise</td>
</tr>
<tr>
<td><code>r</code></td>
<td>Circle clockwise (default)</td>
</tr>
</tbody>
</table>
<p>If you just type <code>c</code> and hit Return, the plane circles clockwise.</p>
<h3>Delay Modifier (<code>@</code> or <code>a</code>)</h3>
<p>This is the most powerful feature of the command system. Any <strong>delayable</strong> command (<code>t</code>, <code>c</code>, and the &quot;towards&quot; variants) can include a delay that tells the plane to wait until it reaches a specific beacon before executing.</p>
<p>After typing a delayable command (but before pressing Return), type <code>@</code> or <code>a</code>, then <code>b</code> (for beacon), then the beacon number.</p>
<p>Syntax: <code>[plane][command][@/a][b][beacon-number]</code></p>
<p>Examples:</p>
<ul>
<li><code>Atlab1</code> — Plane A: turn left, but do it when reaching beacon 1</li>
<li><code>Bcrab2</code> — Plane B: circle (clockwise), execute at beacon 2</li>
<li><code>gtte4ab2</code> — Plane g: turn towards exit 4, execute at beacon 2</li>
</ul>
<p>The delayed command appears in the information panel next to the plane's status. When the plane reaches the specified beacon, the command fires automatically.</p>
<h3>Mark, Unmark, Ignore</h3>
<ul>
<li><code>[plane]m</code> — <strong>Mark</strong>: highlights the plane prominently in the display. Useful to keep an eye on a specific aircraft.</li>
<li><code>[plane]i</code> — <strong>Ignore</strong>: de-emphasizes the plane (shown with dashed representation). Good for planes that are on a clear, safe path and don't need attention.</li>
<li><code>[plane]u</code> — <strong>Unmark</strong>: like ignore, but the plane becomes highlighted again automatically when a delayed command fires — a useful combination with delay.</li>
</ul>
<h3>Special Keys (Outside Commands)</h3>
<table>
<thead>
<tr>
<th>Key</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>?</code></td>
<td>Show valid next characters at current input position</td>
</tr>
<tr>
<td><code>Backspace</code></td>
<td>Erase last character of current command</td>
</tr>
<tr>
<td><code>Return</code> (empty)</td>
<td>Skip ahead one update immediately</td>
</tr>
<tr>
<td><code>Ctrl-L</code></td>
<td>Redraw the screen if it gets garbled</td>
</tr>
<tr>
<td><code>!</code></td>
<td>Shell escape (forks a child shell)</td>
</tr>
<tr>
<td><code>-l</code> flag</td>
<td>List available games</td>
</tr>
<tr>
<td><code>-s</code> / <code>-t</code> flag</td>
<td>Show high scores</td>
</tr>
</tbody>
</table>
<p>Note: <strong>suspending the game (<code>Ctrl-Z</code>) is disabled</strong>. The game runs in real time and can't be paused.</p>
<h2>Full Command Examples</h2>
<table>
<thead>
<tr>
<th>Command</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>Aa7</code></td>
<td>Set plane A altitude to 7,000 ft</td>
</tr>
<tr>
<td><code>Aa0</code></td>
<td>Land plane A (must be over airport)</td>
</tr>
<tr>
<td><code>Aac3</code></td>
<td>Climb plane A by 3,000 ft</td>
</tr>
<tr>
<td><code>Atd</code></td>
<td>Turn plane A to heading East (90°)</td>
</tr>
<tr>
<td><code>Atl</code></td>
<td>Turn plane A left 45°</td>
</tr>
<tr>
<td><code>AtR</code></td>
<td>Turn plane A hard right (90°)</td>
</tr>
<tr>
<td><code>Attb1</code></td>
<td>Turn plane A towards beacon 1</td>
</tr>
<tr>
<td><code>Atta0</code></td>
<td>Turn plane A towards airport 0</td>
</tr>
<tr>
<td><code>Atte2</code></td>
<td>Turn plane A towards exit 2</td>
</tr>
<tr>
<td><code>Atlb2</code></td>
<td>Turn plane A left, at beacon 2</td>
</tr>
<tr>
<td><code>Atlab1</code></td>
<td>Turn plane A left, when it reaches beacon 1</td>
</tr>
<tr>
<td><code>Ac</code></td>
<td>Plane A: circle (clockwise)</td>
</tr>
<tr>
<td><code>Acl</code></td>
<td>Plane A: circle counterclockwise</td>
</tr>
<tr>
<td><code>Aclb3</code></td>
<td>Plane A: circle counterclockwise, at beacon 3</td>
</tr>
<tr>
<td><code>Am</code></td>
<td>Mark plane A</td>
</tr>
<tr>
<td><code>Ai</code></td>
<td>Ignore plane A</td>
</tr>
<tr>
<td><code>Au</code></td>
<td>Unmark plane A</td>
</tr>
<tr>
<td><code>Atqb1</code></td>
<td>Turn plane A to NW heading, at beacon 1</td>
</tr>
</tbody>
</table>
<h2>Scoring</h2>
<p>The score system is straightforward:</p>
<ul>
<li><strong>Primary metric</strong>: number of planes <strong>safely directed</strong> out of the airspace. A plane counts as &quot;safe&quot; when it correctly reaches its destination (right exit at altitude 9, or correct airport with correct approach direction).</li>
<li><strong>Tiebreaker</strong>: if two players have the same number of planes saved, the one who ran the game <strong>longer</strong> (in real time and game time) wins.</li>
<li>Other statistics (radar updates, wall-clock time) are displayed but are &quot;merely for fun&quot; per the man page.</li>
</ul>
<p>High scores are stored in <code>/var/games/atc_score</code> (Linux) or <code>$HOME/.atc.scores</code> depending on the system. The scoreboard records player name, hostname, game scenario played, number of planes saved, and both game duration and real elapsed time.</p>
<p>To view the high score table:</p>
<pre><code class="language-bash">atc -s
</code></pre>
<h2>Game Scenarios / Maps</h2>
<p>atc ships with a set of built-in game scenarios, each defining a different map with different airport counts, beacon placements, exit positions, dimensions, and difficulty tuning. The available games are listed in <code>/usr/share/games/atc/Game_List</code> (or the equivalent path on your system).</p>
<p>To list available games:</p>
<pre><code class="language-bash">atc -l
</code></pre>
<p>To play a specific game:</p>
<pre><code class="language-bash">atc -g default
atc -f OHare
</code></pre>
<h3>Built-in Scenarios</h3>
<table>
<thead>
<tr>
<th>Scenario</th>
<th>Grid</th>
<th>Update</th>
<th>New Plane Rate</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>easy</strong></td>
<td>15×15</td>
<td>7s</td>
<td>every 12</td>
<td>Small map, 1 airport, 1 beacon, 4 exits. Ideal starting point.</td>
</tr>
<tr>
<td><strong>novice</strong></td>
<td>30×21</td>
<td>6s</td>
<td>every 6</td>
<td>Two symmetric runways, 2 beacons, 4 exits. Clean X-pattern layout.</td>
</tr>
<tr>
<td><strong>default</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 10</td>
<td>2 airports, 2 beacons, 8 exits. The standard scenario.</td>
</tr>
<tr>
<td><strong>game_2</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 8</td>
<td>1 airport, 7 beacons, 8 exits. Dense beacon coverage.</td>
</tr>
<tr>
<td><strong>game_3</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 5</td>
<td>1 airport, 1 beacon, 4 exits. Sparse, fast.</td>
</tr>
<tr>
<td><strong>game_4</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 5</td>
<td>2 airports, 10 beacons, 4 exits. Complex routing.</td>
</tr>
<tr>
<td><strong>crossover</strong></td>
<td>29×21</td>
<td>5s</td>
<td>every 5</td>
<td>No airports, 4 beacons in diamond, 8 exits. Pure exit routing.</td>
</tr>
<tr>
<td><strong>crosshatch</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 5</td>
<td>3 airports, 4 beacons, 8 exits. Dense grid of airways.</td>
</tr>
<tr>
<td><strong>Tic-Tac-Toe</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 5</td>
<td>4 beacons in rectangle, 6 exits, grid corridors.</td>
</tr>
<tr>
<td><strong>two-corners</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 5</td>
<td>1 airport, 2 beacons, 6 exits. Diagonal-heavy routes.</td>
</tr>
<tr>
<td><strong>Atlantis</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 5</td>
<td>2 airports, 7 beacons, 4 exits. Rich beacon network.</td>
</tr>
<tr>
<td><strong>OHare</strong></td>
<td>30×21</td>
<td>5s</td>
<td>every 5</td>
<td>Named after O'Hare International. 1 airport, 3 beacons, 6 exits.</td>
</tr>
<tr>
<td><strong>airports</strong></td>
<td>30×21</td>
<td>6s</td>
<td>every 6</td>
<td>7 airports, 9 beacons, 2 exits. Airport-heavy.</td>
</tr>
<tr>
<td><strong>box</strong></td>
<td>29×21</td>
<td>5s</td>
<td>every 6</td>
<td>4 airports, 9 beacons, 9 exits. Large and complex.</td>
</tr>
<tr>
<td><strong>Killer</strong></td>
<td>30×21</td>
<td>1s</td>
<td>every 4</td>
<td>Updates every 1 second, new plane every 4 updates. Extremely fast.</td>
</tr>
</tbody>
</table>
<p><strong>Killer</strong> deserves a special mention: with a 1-second update rate and new planes arriving constantly, it is brutally difficult. The standard difficulty range runs from <code>easy</code> up through <code>default</code>, with <code>Killer</code> at the extreme end.</p>
<h3>Custom Scenarios</h3>
<p>You can write your own scenario files. A game file has two sections: a parameters block and an elements block.</p>
<p><strong>Parameter syntax</strong> (semicolon-terminated):</p>
<pre><code>update = 5;
newplane = 10;
width = 30;
height = 21;
</code></pre>
<p><strong>Element syntax</strong> (semicolon-terminated, <code>#</code> for comments):</p>
<pre><code>exit: ( x y direction ) ... ;
beacon: ( x y ) ... ;
airport: ( x y direction ) ... ;
line: [ ( x1 y1 ) ( x2 y2 ) ] ... ;
</code></pre>
<p>Direction codes use the same compass-key layout as commands (<code>w</code>=N, <code>e</code>=NE, <code>d</code>=E, <code>c</code>=SE, <code>x</code>=S, <code>z</code>=SW, <code>a</code>=W, <code>q</code>=NW).</p>
<p><strong>Constraints</strong>:</p>
<ul>
<li>Exits must be on the border of the map</li>
<li>Airports and beacons must be inside the borders</li>
<li>Lines must be horizontal, vertical, or exactly 45-degree diagonal</li>
<li>Coordinates range from 0 to width−1 and 0 to height−1</li>
</ul>
<p>To use a custom scenario, add it to <code>Game_List</code>, otherwise it won't be tracked in the high score file.</p>
<h2>Command-Line Options</h2>
<pre><code>atc           Start with the default game
atc -l        List all available game scenarios
atc -g NAME   Play the named game scenario
atc -f NAME   Same as -g
atc -r SEED   Set random seed (for replay / reproducibility)
atc -s        Display the high score list
atc -t        Same as -s
atc -p        Print the path to the game data directory
atc -q        Play without sound (on systems that have it)
atc -?        Print usage / help
</code></pre>
<h2>Game Files Location</h2>
<table>
<thead>
<tr>
<th>File</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>/usr/share/games/atc/Game_List</code></td>
<td>List of available scenarios</td>
</tr>
<tr>
<td><code>/usr/share/games/atc/&lt;scenario&gt;</code></td>
<td>Individual scenario definition files</td>
</tr>
<tr>
<td><code>/var/games/atc_score</code></td>
<td>High score file (Linux, shared)</td>
</tr>
<tr>
<td><code>$HOME/.atc.scores</code></td>
<td>High score file (some BSD builds)</td>
</tr>
</tbody>
</table>
<p>The man page is at <code>man 6 atc</code> on most systems. Read it with:</p>
<pre><code class="language-bash">man 6 atc
</code></pre>
<h2>Tips and Strategies</h2>
<p><strong>Start with <code>easy</code> or <code>novice</code>.</strong> The small map on <code>easy</code> gives you time to learn the command syntax without being overwhelmed. Novice has a clean symmetric layout that makes routing intuitive.</p>
<pre><code class="language-bash">atc -g easy
atc -g novice
</code></pre>
<p><strong>Use the delay system heavily.</strong> The <code>@</code>/<code>a</code> delay modifier is what separates casual play from effective play. Instead of watching a plane and manually turning it when it reaches a beacon, you can issue the turn command in advance: <code>Atlab1</code> (turn A left at beacon 1). This frees your attention for other aircraft.</p>
<p><strong>Use circle to buy time.</strong> When you have a plane that's converging toward a conflict and you can't sort it out immediately, put it in a circle (<code>Ac</code>). It'll hold in place, burning fuel but not crashing. Use this as a stall tactic while you handle higher-priority traffic.</p>
<p><strong>Altitude is your primary separation tool.</strong> Two planes can safely occupy the same grid square if they're more than one altitude unit apart. When two planes are converging on the same path, stagger their altitudes rather than trying to route them around each other. A two-unit altitude difference is safe.</p>
<p><strong>Watch the fuel indicators.</strong> The <code>*</code> in the info panel means a plane is at low fuel (below 15 units). Prioritize those planes immediately. Route them directly to their destination without delays.</p>
<p><strong>Use mark/ignore to manage attention.</strong> Mark (<code>m</code>) planes that need watching. Ignore (<code>i</code>) planes that are safely on course. The visual de-emphasis helps you focus on what matters. Use unmark (<code>u</code>) with a delayed command so the plane re-highlights when the command fires.</p>
<p><strong>Jets are harder to manage.</strong> Because jets move every update while props move every other update, jets cross the map faster, arrive at conflicts sooner, and give you less time to react. Pay closer attention to lowercase-letter aircraft.</p>
<p><strong>Don't let planes exit through the wrong exit.</strong> This is an immediate game-over condition. Make sure you know each plane's destination before routing it. The destination is always shown in the info panel.</p>
<p><strong>Landing requires exact positioning.</strong> A plane must be at altitude 0 AND directly over the airport AND moving in the correct approach direction all at once. Set up the approach from a distance, descend gradually and align with the runway heading well before the airport. Landing in the wrong direction at the right airport is still a loss.</p>
<p><strong>Empty Return = time skip.</strong> If you need to quickly advance to the next update (e.g., to see where a fast-moving situation goes), press Return with no command typed. Use sparingly.</p>
<p><strong><code>Ctrl-L</code> fixes screen corruption.</strong> If your display gets garbled (which happens in some terminal emulators), <code>Ctrl-L</code> forces a full redraw.</p>
<h2>Known Bugs</h2>
<p>The BUGS file in the source records a few known issues:</p>
<ul>
<li>The log file restarts if interrupted</li>
<li>The screen sometimes refreshes after you have quit (the original author's own note)</li>
<li><code>Ctrl-Z</code> (suspend) is disabled but the behavior of this may vary by system</li>
<li>The process doesn't exit cleanly after a <code>SIGHUP</code></li>
</ul>
<p>These are minor and don't affect normal gameplay.</p>
<h2>Why atc Holds Up</h2>
<p>atc is an old game in every sense. Its author's email address ended in <code>.berkeley.edu</code>. Its graphics are ASCII characters. Its sound support is a terminal bell. It has one known bug that the original author documented himself in 1990 and which still ships in the BUGS file today.</p>
<p>And yet it's a genuinely difficult, genuinely interesting real-time management game. The command syntax, while initially cryptic, is actually efficient once internalized. The delay system in particular is elegant design: it lets you think ahead and pre-program aircraft behavior, which is exactly the kind of forward planning that real traffic management requires.</p>
<p>It also scales naturally in difficulty through its scenarios and update rate. <code>easy</code> is forgiving enough to learn on. <code>Killer</code> is punishing enough that achieving any meaningful score on it is an accomplishment.</p>
<p>If you have bsd-games installed, atc is already on your system. It's worth at least one session.</p>
<hr>
<p><strong>Man page:</strong> <code>man 6 atc</code>
<strong>Source:</strong> <a href="https://github.com/vattam/BSDGames/tree/master/atc">https://github.com/vattam/BSDGames/tree/master/atc</a>
<strong>OpenBSD man page:</strong> <a href="https://man.openbsd.org/atc.6">https://man.openbsd.org/atc.6</a>
<strong>FreeBSD man page:</strong> <a href="https://man.freebsd.org/cgi/man.cgi?query=atc&sektion=6">https://man.freebsd.org/cgi/man.cgi?query=atc&amp;sektion=6</a></p>
]]></description>
  </item>
  <item>
    <title>Greed: The Terminal Game That Eats Itself</title>
    <pubDate>Sat, 14 Mar 2026 00:00:00 +0000</pubDate>
    <description><![CDATA[<p><img src="/assets/games/greed.png" alt="Greed Game Image"></p>
<p>If you've ever wanted a game that rewards careful thinking but punishes you for being too clever, <strong>Greed</strong> is it. It's a deceptively simple terminal strategy game where the goal is to consume as much of the board as possible, without trapping yourself in the process.</p>
<h2>What is Greed?</h2>
<p>Greed is a curses-based terminal game originally written for Unix by <strong>Matt Day</strong> in 1996, adapted from a DOS freeware game of the same name. After Day stepped away from the project, <strong>Eric S. Raymond</strong> (ESR, author of <em>The Cathedral and the Bazaar</em> and longtime Unix toolsmith) adopted it, added color support, and continues to maintain it today. The current stable version is <strong>4.3</strong>, released under the BSD 2-Clause license.</p>
<p>The concept is razor thin: you sit in the middle of a 79×22 grid packed with random digits 1–9. You move in one of eight directions. The number you land on determines how far you travel — and every cell you pass through gets consumed. The game ends when you can't move anywhere. Your score is how many cells you've eaten.</p>
<h2>Gameplay</h2>
<p>The rules take about thirty seconds to learn. The strategy takes much longer to master.</p>
<ul>
<li>The board starts full of random digits 1–9</li>
<li>Your position is marked <code>@</code></li>
<li>Each move you pick a direction (any of 8, including diagonals)</li>
<li>You travel exactly N cells in that direction, where N is the digit in the first cell you'd enter</li>
<li>Every cell along the path is erased</li>
<li>You can't move off the board or into already consumed space</li>
<li>When no legal move exists in any direction, the game is over</li>
</ul>
<p>The tension comes from how quickly you can corner yourself. A high digit might eat a satisfying chunk of the board, but it can also wall you off from the remaining space. Low digits give you precision but less score. Every move is a small gamble.</p>
<p>Toggling the move highlight mode (press <code>p</code>) will show you which directions are currently legal — useful when you're trying to identify the least bad option before it disappears.</p>
<h2>Installing Greed</h2>
<h3>Linux</h3>
<p>Greed is packaged in most major distributions:</p>
<pre><code class="language-bash"># Debian / Ubuntu / Mint
sudo apt install greed

# Fedora / RHEL / Rocky / AlmaLinux
sudo dnf install greed

# Arch Linux
sudo pacman -S greed
</code></pre>
<p><strong>From source:</strong></p>
<p>The canonical source lives on GitLab, maintained by ESR:</p>
<pre><code class="language-bash">git clone https://gitlab.com/esr/greed
cd greed
make
sudo make install
</code></pre>
<h3>macOS</h3>
<p><strong>Using Homebrew:</strong></p>
<pre><code class="language-bash">brew install greed
</code></pre>
<h2>Keybindings</h2>
<p>Greed supports three control schemes simultaneously, so you can use whatever feels natural:</p>
<table>
<thead>
<tr>
<th>Direction</th>
<th>Arrow Keys</th>
<th>vi Keys</th>
<th>WASD-style</th>
</tr>
</thead>
<tbody>
<tr>
<td>Up</td>
<td>Up</td>
<td><code>k</code></td>
<td><code>w</code></td>
</tr>
<tr>
<td>Down</td>
<td>Down</td>
<td><code>j</code></td>
<td><code>x</code></td>
</tr>
<tr>
<td>Left</td>
<td>Left</td>
<td><code>h</code></td>
<td><code>a</code></td>
</tr>
<tr>
<td>Right</td>
<td>Right</td>
<td><code>l</code></td>
<td><code>d</code></td>
</tr>
<tr>
<td>Up-Right</td>
<td>—</td>
<td><code>u</code></td>
<td><code>e</code></td>
</tr>
<tr>
<td>Up-Left</td>
<td>—</td>
<td><code>y</code></td>
<td><code>q</code></td>
</tr>
<tr>
<td>Down-Right</td>
<td>—</td>
<td><code>n</code></td>
<td><code>c</code></td>
</tr>
<tr>
<td>Down-Left</td>
<td>—</td>
<td><code>b</code></td>
<td><code>z</code></td>
</tr>
</tbody>
</table>
<p>The numeric keypad works for all 8 directions as well.</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>p</code></td>
<td>Toggle move highlighting</td>
</tr>
<tr>
<td><code>Ctrl-L</code></td>
<td>Redraw the screen</td>
</tr>
<tr>
<td><code>q</code></td>
<td>Quit</td>
</tr>
</tbody>
</table>
<h2>A Few Extra Tricks</h2>
<p>Color output is configurable via the <code>GREEDOPTS</code> environment variable. It takes a 9-character string where each character maps to a color for digits 1–9. For example:</p>
<pre><code class="language-bash">export GREEDOPTS=&quot;rGcYbMwCg:p&quot;
</code></pre>
<p>Appending <code>:p</code> to <code>GREEDOPTS</code> enables move highlighting from the start, which is handy if you always want it on.</p>
<p>High scores are stored at <code>/var/games/greed/greed.hs</code> — so there's a real scoreboard if you're playing on a shared system.</p>
<h2>Why Play Greed?</h2>
<p>Greed is the kind of game that fits perfectly into the two minutes before a build finishes. It's fast to start, fast to lose, and just complex enough that you'll immediately want a rematch to try a different approach. There's no randomized luck in how the board unfolds — the digits are set at the start. Every loss is a bad decision somewhere, which makes it oddly satisfying to keep going back.</p>
<p>It's also a good reminder that in the terminal, you don't need much to make something compelling.</p>
<p><strong>Project page:</strong> <a href="http://www.catb.org/~esr/greed/">http://www.catb.org/~esr/greed/</a>
<strong>Source:</strong> <a href="https://gitlab.com/esr/greed">https://gitlab.com/esr/greed</a></p>
]]></description>
  </item>
  <item>
    <title>MyMan: Pac-Man for Your Terminal</title>
    <pubDate>Fri, 13 Mar 2026 00:00:00 +0000</pubDate>
    <description><![CDATA[<p><img src="/assets/games/my_man.png" alt="My Man Image"></p>
<p>If you've ever wanted to chomp ghosts without leaving your terminal, <strong>MyMan</strong> is the game for you. It's a faithful text-mode recreation of Namco's classic Pac-Man, running entirely in your console using curses — no GUI required.</p>
<h2>What is MyMan?</h2>
<p>MyMan is an open source, MIT-licensed terminal game written in C. It brings the full Pac-Man experience — dots, power pellets, ghosts, and mazes — to color and monochrome text terminals. It earned a SourceForge Community Choice badge after crossing 10,000 downloads, which speaks to how much terminal gaming enthusiasts have embraced it.</p>
<p>Beyond being a fun game, MyMan is impressively portable. It supports an extensive list of display backends:</p>
<ul>
<li><strong>curses/ncurses</strong> — the standard terminal UI library on Linux/macOS</li>
<li><strong>PDcurses / XCurses</strong> — Windows and X11 variants</li>
<li><strong>aalib / libcaca</strong> — ASCII art rendering libraries</li>
<li><strong>Allegro / GGI</strong> — graphical backends</li>
<li><strong>Carbon</strong> — native macOS output</li>
<li><strong>Win32 console</strong>, VMS console, and more</li>
</ul>
<p>This means MyMan can run almost anywhere you can get a shell.</p>
<h2>Gameplay</h2>
<p>The rules are classic Pac-Man:</p>
<ul>
<li>Navigate the maze eating all the dots to advance to the next level</li>
<li>Avoid the ghosts — they'll cost you a life</li>
<li>Eat a power pellet to temporarily turn the tables and hunt the ghosts yourself</li>
<li>Chase high scores across increasingly difficult levels</li>
</ul>
<p>The text-mode rendering is surprisingly charming. Characters and block elements stand in for the sprites, and on a color terminal it looks exactly like what it is: a love letter to arcade gaming.</p>
<h2>Installing MyMan</h2>
<h3>Linux</h3>
<p><strong>From source (recommended):</strong></p>
<p>MyMan's source tarball is available from SourceForge. You'll need <code>ncurses</code> development headers and a C compiler.</p>
<pre><code class="language-bash"># Install dependencies (Debian/Ubuntu)
sudo apt-get install build-essential libncurses5-dev

# Fedora/RHEL
sudo dnf install gcc ncurses-devel

# Arch Linux
sudo pacman -S base-devel ncurses
</code></pre>
<p>Download the latest source from <a href="https://sourceforge.net/projects/myman/files/">SourceForge</a> and build:</p>
<pre><code class="language-bash">tar xzf myman-*.tar.gz
cd myman-*/
./configure
make
sudo make install
</code></pre>
<p>Then launch it:</p>
<pre><code class="language-bash">myman
</code></pre>
<p><strong>Arch Linux (AUR):</strong></p>
<pre><code class="language-bash">yay -S myman
# or
paru -S myman
</code></pre>
<h3>macOS</h3>
<p><strong>Using Homebrew:</strong></p>
<pre><code class="language-bash">brew install myman
</code></pre>
<p>If it's not in the main tap, install from source. You'll need Xcode command-line tools and ncurses:</p>
<pre><code class="language-bash">xcode-select --install
brew install ncurses

tar xzf myman-*.tar.gz
cd myman-*/
./configure
make
sudo make install
</code></pre>
<p>On modern macOS you may need to tell <code>configure</code> where Homebrew's ncurses lives:</p>
<pre><code class="language-bash">./configure CPPFLAGS=&quot;-I$(brew --prefix ncurses)/include&quot; \
            LDFLAGS=&quot;-L$(brew --prefix ncurses)/lib&quot;
make
sudo make install
</code></pre>
<h2>Keybindings</h2>
<table>
<thead>
<tr>
<th>Key</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>Arrow keys</td>
<td>Move Pac-Man</td>
</tr>
<tr>
<td><code>q</code></td>
<td>Quit</td>
</tr>
<tr>
<td><code>p</code></td>
<td>Pause</td>
</tr>
</tbody>
</table>
<h2>Why Play MyMan?</h2>
<p>There's something deeply satisfying about playing an arcade classic in the same environment where you compile code and push commits. MyMan is lightweight, requires no X server, works over SSH, and is a perfect five-minute distraction between tasks. It's retro gaming at its most minimal — and most charming.</p>
<p><strong>Project page:</strong> <a href="https://myman.sourceforge.io">https://myman.sourceforge.io</a></p>
]]></description>
  </item>
  <item>
    <title>Cavez of Phear: A Boulder Dash Clone for the Terminal</title>
    <pubDate>Tue, 10 Mar 2026 00:00:00 +0000</pubDate>
    <description><![CDATA[<p><img src="/assets/games/cavez_of_phear.png" alt="Cavez of Phear"></p>
<p>Some terminal games try to recreate twitch arcade experiences. <strong>Cavez of Phear</strong> takes a different approach — it's a slow-burn puzzle game about caves, diamonds, rolling boulders, and the ever-present threat of being crushed or eaten. If you ever played Boulder Dash or Digger, you'll feel right at home.</p>
<h2>What is Cavez of Phear?</h2>
<p>Cavez of Phear is an open source Boulder Dash-style game for consoles and terminals. The goal is simple: collect all the diamonds in each cave level to advance toward freedom. The execution, however, involves careful planning — boulders roll, monsters roam, and a single wrong move can bring the ceiling down on you.</p>
<p>The game was originally created by <strong>Tom Rune Flo</strong> (v0.5.1, 2011) and is currently maintained by <strong>Dmitry Marakasov</strong> (AMDmi3). The latest release is <strong>0.6.2</strong>, published in September 2025. It's licensed under the GNU General Public License v3.</p>
<h2>Gameplay</h2>
<p>You navigate underground caverns using the arrow keys, digging through dirt and collecting items:</p>
<table>
<thead>
<tr>
<th>Symbol</th>
<th>Item</th>
<th>Points</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>*</code></td>
<td>Diamond</td>
<td>10 pts</td>
</tr>
<tr>
<td><code>$</code></td>
<td>Money</td>
<td>100 pts</td>
</tr>
<tr>
<td><code>%</code></td>
<td>Bomb</td>
<td>—</td>
</tr>
<tr>
<td><code>M</code></td>
<td>Monster</td>
<td>danger!</td>
</tr>
</tbody>
</table>
<p>Collect all the diamonds in a level to unlock the exit to the next cave. Earn an extra life for every <strong>1,000 points</strong> scored.</p>
<p><strong>The twist:</strong> physics. Boulders and stones obey gravity — they roll off rounded surfaces and fall when unsupported. Dig carelessly and you'll get crushed. The bombs add another layer: pick them up, place them with <code>b</code>, and detonate everything at once with <code>t</code>. Bombs are also subject to physics, so placement matters.</p>
<h3>Controls</h3>
<table>
<thead>
<tr>
<th>Key</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>Arrow keys / Numpad (2-4-6-8)</td>
<td>Move</td>
</tr>
<tr>
<td><code>b</code></td>
<td>Place bomb</td>
</tr>
<tr>
<td><code>t</code></td>
<td>Detonate all bombs</td>
</tr>
<tr>
<td><code>k</code></td>
<td>Self-destruct (restart if stuck)</td>
</tr>
<tr>
<td><code>s</code></td>
<td>Toggle sound</td>
</tr>
<tr>
<td><code>w</code></td>
<td>Highlight your position</td>
</tr>
</tbody>
</table>
<h3>Built-in Level Editor</h3>
<p>Cavez of Phear ships with a map editor. Launch it with:</p>
<pre><code class="language-bash">phear -e &lt;mapfile&gt;
</code></pre>
<p>Use numeric keys to place objects and build your own caves. Great for sharing custom levels.</p>
<h2>Installing Cavez of Phear</h2>
<p>The game is built with <strong>CMake</strong> and written in C, so it compiles cleanly on any Unix-like system.</p>
<h3>Linux</h3>
<p><strong>From your package manager:</strong></p>
<pre><code class="language-bash"># Debian/Ubuntu
sudo apt-get install cavezofphear

# Arch Linux (AUR)
yay -S cavezofphear

# Fedora
sudo dnf install cavezofphear
</code></pre>
<p><strong>Build from source:</strong></p>
<p>Install the dependencies first:</p>
<pre><code class="language-bash"># Debian/Ubuntu
sudo apt-get install cmake gcc libncurses5-dev

# Fedora/RHEL
sudo dnf install cmake gcc ncurses-devel

# Arch Linux
sudo pacman -S cmake gcc ncurses
</code></pre>
<p>Clone the repository and build:</p>
<pre><code class="language-bash">git clone https://github.com/AMDmi3/cavezofphear.git
cd cavezofphear
cmake .
cmake --build .
./phear
</code></pre>
<p>For a system-wide install:</p>
<pre><code class="language-bash">cmake -DSYSTEMWIDE=ON .
cmake --build .
sudo cmake --install .
phear
</code></pre>
<h3>macOS</h3>
<p>Install the build dependencies via Homebrew:</p>
<pre><code class="language-bash">brew install cmake ncurses
</code></pre>
<p>Then clone and build:</p>
<pre><code class="language-bash">git clone https://github.com/AMDmi3/cavezofphear.git
cd cavezofphear
cmake . -DCMAKE_PREFIX_PATH=&quot;$(brew --prefix ncurses)&quot;
cmake --build .
./phear
</code></pre>
<p>For a system-wide install:</p>
<pre><code class="language-bash">cmake -DSYSTEMWIDE=ON -DCMAKE_PREFIX_PATH=&quot;$(brew --prefix ncurses)&quot; .
cmake --build .
sudo cmake --install .
</code></pre>
<h2>Why Play Cavez of Phear?</h2>
<p>Most terminal games go for action. Cavez of Phear rewards patience and spatial thinking. Every level is a small puzzle: where do the boulders fall? Which path clears the diamonds without trapping you? When do you use a bomb versus digging around a monster?</p>
<p>It's a game you can play in a terminal over SSH, in a tmux pane, or on a server with no display. It's lightweight, thoroughly enjoyable, and scratches a very specific retro itch. The active maintenance (latest release: September 2025) means it builds cleanly on modern systems without fighting your toolchain.</p>
<p><strong>Source code:</strong> <a href="https://github.com/AMDmi3/cavezofphear">https://github.com/AMDmi3/cavezofphear</a></p>
]]></description>
  </item>
  <item>
    <title>Welcome to termplay.dev</title>
    <pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate>
    <description><![CDATA[<h1>Introduction</h1>
<p>This blog is a small corner of the internet dedicated to building, breaking, and experimenting with things in the terminal.</p>
<p>The main focus is simple: <strong>time-waster applications</strong>. Terminal games, strange utilities, odd experiments, and little programs that exist mostly for the fun of making them. Some will be useful, some will be pointless, and some will probably be both.</p>
<p>Along the way, I’ll also be exploring a few other interests that naturally intersect with this space: a bit of offensive security, some lightweight data engineering, and the process of building tools with modern AI assistants.</p>
<h3>Why This Blog Exists</h3>
<p>One of the goals of this blog is to embrace AI as part of the future of development.</p>
<p>Rather than treating AI as a black box, I want to treat it as a <strong>collaborative tool</strong>, something that helps explore ideas, prototype quickly, and experiment with concepts that might otherwise never get built. Many of the projects here will involve AI somewhere in the process: generating ideas, debugging code, suggesting architectures, or helping refine experiments.</p>
<p>But the point isn't automation.</p>
<p>The point is <strong>learning while building</strong>.</p>
<h3>A Throwback to the Old Web</h3>
<p>This site is intentionally simple.</p>
<p>No growth hacks. No content funnels. No endless optimization.</p>
<p>It’s closer in spirit to the early web of the 90s, when people created websites simply because they enjoyed making things and sharing them. Projects here might be small, rough, or weird — and that’s exactly the point.</p>
<p>Expect:</p>
<ul>
<li>Terminal games and command-line toys</li>
<li>Experiments built with AI assistance</li>
<li>Notes from learning offensive security</li>
<li>Small data engineering side projects</li>
<li>Random technical curiosities</li>
</ul>
<p>Most of it will be built for fun.</p>
<p>Some of it might even be useful.</p>
]]></description>
  </item>
</channel>
</rss>
