ASCII Cats in the Browser
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-04-10 04:53:29 +00:00
conf Initial commit 2026-04-06 18:43:38 -07:00
site fixing unicode 2026-04-09 20:56:56 -07:00
AGENTS.md Initial commit 2026-04-06 18:43:38 -07:00
docker-compose.yml Initial commit 2026-04-06 18:43:38 -07:00
README.md remove license 2026-04-09 21:51:45 -07:00

CATURDAY

escape while you can

A browser-based ASCII roguelike/puzzle game. Your house has been taken over by cats. You must escape room by room before they corner you — using only the things a normal person has lying around the house.

 ######   #####  ######## ##   ## ######  ######   #####  ##   ##
 ##      ##   ## ##       ##   ## ##   ## ##   ## ##   ##  ## ##
 ##      ####### ##       ##   ## ######  ##   ## #######   ####
 ##      ##   ## ##       ##   ## ##  ##  ##   ## ##   ##    ##
 ######  ##   ## ##        #####  ##   ## ######  ##   ##    ##

Overview

CATURDAY is a turn-based ASCII puzzle game rendered in a phosphor amber CRT aesthetic. It runs entirely in a single HTML file with no build tools, no dependencies, and no server-side logic. The only external resources are two Google Fonts loaded at runtime.

Target completion time is under 10 minutes. The game is designed to be challenging but fair — every room is solvable with the items available, and there is always a path through.


Gameplay

Objective

Start in your bedroom. Escape through 6 rooms to reach the shed, retrieve your bike, and get out. The cats are not your friends. They were never your friends.

Map

  [BEDROOM]
      │
  [HALLWAY] ── [BATHROOM]
      │
  [LIVING ROOM] ── [KITCHEN]
                       │
                   [GARDEN]
                       │
                    [SHED]  ← true escape

The bathroom is optional. Everything else is on the critical path.

Controls

Key Action
W A S D or Arrow keys Move
E Interact / use selected inventory item on nearest cat
T Take item on or adjacent to current tile
D Drop — opens inventory selector
I Inventory — free action, no turn consumed
L then direction Look at a tile
C Cat-call (friendly sound, unpredictable)
H Hiss (aggressive sound, unpredictable)
Q Pet nearest cat (Cat Whisperer only)
R Restart

Sprinter: double-tap a direction within 400ms to dash 2 tiles (once per room).

Rescue Worker: press two number keys while in the inventory overlay to combine items.

Game Modes

Chosen after selecting a character trait.

Mode Description
Race Mode Each room has a turn budget. Cats grow more agitated as it runs down, entering frenzy in the final 5 turns. Hit zero and they win.
Score Mode No turn limit and no frenzy. Cats behave normally throughout. Every action costs one move. Lower final score is better.

Character Traits

Chosen at the title screen. Arrow keys or number keys to select. ? or the fourth option for random assignment.

Trait Effect
Cat Whisperer Free Q Pet action once per room — freezes one adjacent cat for 2 turns. +20% to all favourable sound outcomes.
Rescue Worker Can combine items into new tools. Item pickup descriptions include combination hints.
Sprinter Double-tap a direction to dash 2 tiles in one turn. Once per room.

Cat Types

Symbol Type Behaviour Weakness
u Loaf Stationary. Does not move unless disturbed. Laser pointer, tuna, yarn
p Patrol Moves back and forth on a fixed path. Tuna (freeze 3 turns), Sprinter dash, hiss (reverses direction 50%)
z Chaos Moves to a random adjacent tile each turn. Cardboard box (traps permanently until room exit), catnip
B Boss Stationary. Immune to all items except one. Toy mouse — hand it over, the path clears
f Frozen Any cat that is currently immobilised.

Cats within 1 tile of the player trigger game over. At Frenzy phase (≤5 turns remaining in Race Mode) that radius expands to 2.

Items

Item Found Effect
Laser pointer Bedroom Moves one cat 2 tiles away
Yarn ball Bedroom Drops at feet — cats stop for 3 turns if they walk over it
House keys Bedroom (dresser) Required to unlock front door
Tuna can Kitchen (high cabinet, needs stool) Freezes one cat for 3 turns
Catnip Bathroom All cats in room enter frenzy for 4 turns — risky
Cardboard box Living room Permanently traps one Chaos cat (until you leave)
Broom Kitchen Pushes one cat back 2 tiles
Step stool Kitchen Required to reach the tuna can
Duct tape Bathroom Combine with box or broom
Toy mouse Living room (sofa) Required to pacify the Boss Cat in the shed
Bike lock note Kitchen (fridge) Reveals combination “42-7-19” — must be read before leaving the kitchen

Rescue Worker Combinations

Ingredients Result Effect
Broom + Yarn ball Extended Broom Drops yarn 3 tiles away instead of at feet
Cardboard box + Duct tape Reinforced Box Can trap Patrol cats as well as Chaos cats

Turn Limit (Race Mode only)

Each room has a turn budget. When it runs out, the cats win.

Phase Turns left Effect
Normal Full → 11 Nothing
Agitated 10 → 6 Patrol cats move every turn instead of every other
Frenzy 5 → 1 All cats gain +1 kill radius, Chaos cats move twice per turn
Timeout 0 Game over

Room budgets: Bedroom 45, Bathroom 35, Hallway 40, Living Room 50, Kitchen 55, Garden 30, Shed 25.


Hosting

CATURDAY is a single static HTML file. No build step. No backend.

Caddy

:8080 {
    root * /var/www/caturday
    file_server
}

Place caturday.html (or rename to index.html) in /var/www/caturday/.

Nginx

server {
    listen 80;
    root /var/www/caturday;
    index index.html;
}

Local testing

python3 -m http.server 8080

Then open http://localhost:8080/caturday.html.


Project Structure

Currently a single-file project. The file is structured in clearly marked sections:

caturday.html
├── <style>          CSS — CRT aesthetic, layout, animations
└── <script>
    ├── CONSTANTS    Tile types, cat types, trait definitions
    ├── ITEM_DEFS    All item data (name, description, rescue worker hints)
    ├── ROOMS        Room grid layouts, cat starting positions, item placements
    ├── LOOK         Tile/cat/item description strings
    ├── GAME STATE   initGame(), G object structure
    ├── ROOM ACCESS  enterRoom(), room transitions, backtrack logic
    ├── LOGGING      Message log rendering
    ├── RENDERING    Grid drawing, inventory panel, turn counter
    ├── CAT AI       Patrol, chaos, frenzy, collision detection
    ├── SOUND        Cat-call and hiss probability system
    ├── ITEMS        useItem(), pickUpItem(), Rescue Worker combine
    ├── MOVEMENT     tryMove(), exit detection, Sprinter dash
    ├── LOOK MODE    startLook(), doLook()
    ├── INTERACT     doInteract(), doTake(), doDrop()
    ├── OVERLAY      Inventory overlay, death screen, win screen
    ├── INPUT        keydown handler, mode routing
    ├── TITLE        Trait selection screen logic
    └── MODE SELECT  Race / Score mode selection screen logic

When the project is split into multiple files, the planned structure is:

caturday/
├── index.html
├── css/
│   └── style.css
├── js/
│   ├── constants.js
│   ├── rooms.js
│   ├── items.js
│   ├── cats.js
│   ├── player.js
│   ├── render.js
│   ├── input.js
│   └── game.js
└── README.md

Known Issues / Current Limitations

  • Furniture tiles are defined in the grid string but not all are interactable beyond blocking movement
  • The grid uses monospace character rendering — non-standard system fonts may cause slight alignment variance
  • No mobile/touch input support

License

TODO: Add license