Asciicker is a C++ ASCII/CP437-styled 3D game/editor engine with native, terminal, and web targets, plus a Python-based asset pipeline for .xp sprites and Blender integration.
This README is intentionally concise and command-accurate. Deep architecture and subsystem details live in docs/INDEX.md.
This repository is derived from msokalski/asciicker.
If you want to track upstream locally:
git remote add upstream https://github.com/msokalski/asciicker.gitBuild everything:
./build.shRun main binaries:
./.run/game
./.run/asciiid
./.run/server
./.run/game_termBuild individual targets:
make -f makefile_asciiid # editor
make -f makefile_game # game
make -f makefile_server # server
make -f makefile_game_term # terminal gameWeb build:
./build-web.shClean intermediates:
./clean.shpython3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtAsset pipeline entrypoint:
python3 -m scripts.asset_gen --helpInteractive asset wizard:
python3 -m scripts.asset_gen --wizardXP editor (GUI/Tkinter):
python3 -m scripts.asset_gen.xp_tool sprites/player-nude.xpREXPaint MCP server:
python3 scripts/rex_mcp/server.pyWizard MCP bridge:
python3 scripts/wizard_mcp_server.pyRender a terminal minimap from any .a3d file without starting the editor:
# From project root or agent-harness/:
python3 agent-harness/minimap_render.py # default map, center (0,0)
python3 agent-harness/minimap_render.py --cx 100 --cy -50 # center on position
python3 agent-harness/minimap_render.py --map a3d/other.a3d # specify map file
python3 agent-harness/minimap_render.py --scale 16 --width 60 # zoom/size
# Marker editing
python3 agent-harness/minimap_render.py add-marker SAC 0 -50
python3 agent-harness/minimap_render.py add-marker Town 10 30 --type region --glyph T
python3 agent-harness/minimap_render.py remove-marker SAC
python3 agent-harness/minimap_render.py list-markers
python3 agent-harness/minimap_render.py --helpMarkers are stored in .minimap_markers.json at the project root. The render_minimap_from_a3d() function is also importable from agent-harness/cli_anything/asciiid/core/minimap.py and exposed as the render_minimap tool in the asciicker-dev MCP server.
Run editor in MCP mode:
./.run/asciiid --mcpExample:
printf 'ECHO hi\nSET_TERRAIN_HEIGHT 4096\nRENDER\nQUIT\n' | ./.run/asciiid --mcpImplemented commands in asciiid.cpp:
ECHO <text>QUITRENDERDUMP_MATRIXPLACE_MESH <path> <x> <y> <z> <scale>LOAD_SPRITE <path>SET_ACTIVE_SPRITE <name|path>PLACE_SPRITE <path> <x> <y> <z> <yaw> [anim] [frame]PLACE_SPRITE_ACTIVE <x> <y> <z> <yaw> [anim] [frame]PLACE_SPRITE_ACTIVE_REL <dx> <dy> <dz> <yaw> [anim] [frame]SET_TERRAIN_HEIGHT <h>PROBE_TERRAIN <x> <y>(currently approximate patch-level height probe)GET_CAMERASET_CAMERA <x> <y> <z> <yaw> <pitch>(currently applies position + yaw; pitch argument is reserved)FOCUS_ORIGINDEBUG_AXISLIST_INSTANCESSET_GRID <alpha>LOAD_MAP [path](loads .a3d map; defaults toa3d/game_map_y8.a3d)
General verification:
python3 scripts/verify.pyBlender-focused tests:
python3 scripts/test_blender.pyEnd-to-end export + game driver verification:
python3 scripts/verify_e2e.py- Core engine/editor/server C/C++ sources: repo root (
*.cpp,*.h) - Build outputs:
.run/ - Build intermediates:
.o_*,.d_* - Assets:
sprites/,meshes/,fonts/,palettes/,a3d/,images/,icons/,samples/ - Blender addons/tools:
io_asciicker/,io_mesh_akm/,io_scene_a3d/,io_scene_a3d_tools/ - Python tooling and automation:
scripts/ - Technical documentation index:
docs/INDEX.md
Start with:
docs/INDEX.mddocs/ARCHITECTURE.mddocs/AGENT_PROTOCOL.mddocs/DEV_QUICKSTART_NOOBS.mddocs/TESTING_GUIDE.mddocs/MCP_SETUP.mddocs/ASSET_PIPELINE.mddocs/ASCIID_CODE_GUIDE.mddocs/RENDER_PIPELINE_DETAILED.md
Use Conventional Commits with scope:
feat(editor): add multi-tile brush
fix(game): clamp camera pitch
docs(render): clarify resolve stage
Keep changes focused, include test evidence where possible, and separate code changes from large asset drops when practical. Follow vibe coding etiquette and best practices (git ignore agent files, human code audit, proper code slop management ) See northstar backlog roadmap in the docs for ongoing task list before making any PR's.
See LICENSE and upstream licensing context.