{"id":26057348,"url":"https://github.com/theflyingape/dankdomain","last_synced_at":"2026-04-19T12:39:22.911Z","repository":{"id":50128038,"uuid":"70987693","full_name":"theflyingape/dankdomain","owner":"theflyingape","description":"🏰 Ɗaɳƙ Ɗoɱaiɳ :: the return of Hack \u0026 Slash","archived":false,"fork":false,"pushed_at":"2025-03-03T12:36:23.000Z","size":99205,"stargazers_count":41,"open_issues_count":0,"forks_count":9,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-06T00:45:11.410Z","etag":null,"topics":["bbs","dungeon","dungeon-crawler-game","multiplayer-game-server","multiplayer-online-game","node-js","telnet","terminal-game","web","xterm-js"],"latest_commit_sha":null,"homepage":"https://www.DDgame.us","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theflyingape.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-10-15T12:53:48.000Z","updated_at":"2025-03-03T12:36:26.000Z","dependencies_parsed_at":"2023-11-25T21:26:14.401Z","dependency_job_id":"f5f67cc1-a47f-4705-b784-b0d144147fef","html_url":"https://github.com/theflyingape/dankdomain","commit_stats":{"total_commits":249,"total_committers":1,"mean_commits":249.0,"dds":0.0,"last_synced_commit":"b89ca195e14e8aed6b9c76acc9b44d6d14a2b28b"},"previous_names":[],"tags_count":28,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theflyingape%2Fdankdomain","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theflyingape%2Fdankdomain/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theflyingape%2Fdankdomain/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theflyingape%2Fdankdomain/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theflyingape","download_url":"https://codeload.github.com/theflyingape/dankdomain/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242539042,"owners_count":20145884,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bbs","dungeon","dungeon-crawler-game","multiplayer-game-server","multiplayer-online-game","node-js","telnet","terminal-game","web","xterm-js"],"created_at":"2025-03-08T11:08:33.449Z","updated_at":"2026-04-19T12:39:22.900Z","avatar_url":"https://github.com/theflyingape.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏰 Ɗaɳƙ Ɗoɱaiɳ :: _the return of Hack \u0026amp; Slash_\n\n\u003ca href=\"https://robert.hurst-ri.us\"\u003e\u003cimg src=\"https://avatars.githubusercontent.com/theflyingape\" title=\"Robert Hurst\" align=\"right\"\u003e\u003c/a\u003e\n\n- [Player's Manual](#players-manual)\n- [Installation](#installation)\n- [FAQ](#faq)\n- [Files directory structure](#files-directory-structure)\n- [Gallery](#gallery)\n- [Node.js dependency tree](#nodejs-dependency-tree)\n\n---\n\n![screenshot](https://raw.githubusercontent.com/theflyingape/dankdomain/master/game/portal/static/assets/title.jpg \"Can you defeat the Demogorgon?\")\n\n## Player's Manual\n\n_Read the_ [Manual](https://manual.ddgame.us) _to play the_ [online game](https://play.ddgame.us)\n\n\u003e**Ɗaɳƙ Ɗoɱaiɳ** is the re-imagined classic Amiga bulletin board, [Hack \u0026 Slash](https://github.com/theflyingape/rpgbbs), built around a medieval role-playing atmosphere. Your character kills, steals, brawls, and jousts other PCs, NPCs, and BOTs to gain levels and fortune. Successful ventures into the deep dank dungeon are key to immortality.\n\nOriginal Commodore Amiga `Hack \u0026 Slash` enthusiasts can visit  [Absinthe BBS](https://www.telnetbbsguide.com/bbs/absinthe-bbs/) _by Anachronist_.\n\n---\n\n```linux\n[theflyingape@ddgame ~]$ sudo systemctl status dankdomain-portal\n● dankdomain-portal.service - 🏰 Ɗaɳƙ Ɗoɱaiɳ portal service\n   Loaded: loaded (/etc/systemd/system/dankdomain-portal.service; enabled; vendor preset: disabled)\n   Active: active (running) since Sat 2023-07-08 08:30:20 EDT; 25min ago\n Main PID: 1029 (DDnet)\n    Tasks: 11 (limit: 200)\n   Memory: 71.8M\n   CGroup: /system.slice/dankdomain-portal.service\n           └─1029 DDnet\n\nJul 08 08:41:18 ddgame DDnet[1029]: Startup BOT #1 (IMA) from Old Timers Tap → session 5668\nJul 08 08:41:18 ddgame DDnet[1029]: Classic Gate knock from remote host 119.77.138.76 → session 5666\nJul 08 08:52:26 ddgame DDnet[1029]: City Gates knocked from remote host: 100.40.9.157 (play.ddgame.us)\n```\n\n---\n\n```mermaid\n%%{init: {'theme':'dark'}}%%\nstateDiagram-v2\n  direction TB\n  Local : 👤 Local Player\n  Local --\u003e main : npm run play\n  Remote : 🌐 Remote Players\n  Remote --\u003e Firewall : telnet\n  Remote --\u003e Apache : https\n  Firewall : 🛡️ Firewall\n  Firewall --\u003e tty : 1986\n  state \"🕸️ Apache (optional)\" as Apache {\n    state \"SSL Proxy (localhost:1939)\" as proxy {\n      state \"🖧 Ɗaɳƙ Ɗoɱaiɳ portal service (DDnet)\" as DDnet {\n        app --\u003e tty : telnet-socket\n        app --\u003e bot : timer\n        app --\u003e websocket : http/ws\n        app --\u003e rest : express\n        app --\u003e static : express\n        fork: node-pty\n        tty --\u003e fork\n        bot --\u003e fork\n        websocket --\u003e fork\n        fork --\u003e main : fork\n      }\n      --\n      state static {\n        state bundle.js {\n          client --\u003e animate.css\n          client --\u003e xterm.js\n        }\n        assets\n        images\n        sounds\n      }\n    }\n  }\n\n  state \"🏰 Ɗaɳƙ Ɗoɱaiɳ (DDplay)\" as DDplay {\n    main --\u003e lib\n    lib --\u003e items\n    lib --\u003e runtime\n    lib --\u003e xvt\n    main --\u003e sys\n    main --\u003e init\n    init --\u003e db\n    init --\u003e pc\n    init --\u003e npc\n    init --\u003e player\n    state login \u003c\u003cchoice\u003e\u003e\n    init --\u003e login : login id?\n    login --\u003e taxman : bot or user\n    login --\u003e newuser\n    state newuser {\n      email\n      email --\u003e nodemailer\n      nodemailer --\u003e 📧\n    }\n    state taxman {\n      state \"💰\" as taxes\n      taxes --\u003e battle : refuse\n      taxes --\u003e menu : paid\n      menu --\u003e library\n      menu --\u003e sysop\n      menu --\u003e arena\n      menu --\u003e dungeon\n      menu --\u003e naval\n      menu --\u003e party\n      menu --\u003e tavern\n      menu --\u003e casino\n      menu --\u003e square\n      arena --\u003e battle\n      dungeon --\u003e battle\n      naval --\u003e battle\n      party --\u003e battle\n      tavern --\u003e battle\n      casino --\u003e taxes\n      square --\u003e taxes\n      tavern --\u003e taxes\n      state \"🏦\" as bank\n      casino --\u003e bank : atm\n      square --\u003e bank : bank\n    }\n  }\n```\n\n[![NPM](https://nodei.co/npm/dankdomain.png?compact=true)](https://nodei.co/npm/dankdomain/)\n\n[![Code Preview](https://badgen.net/badge/Preview/VS%20Code/blue?icon=github)](https://open.vscode.dev/theflyingape/dankdomain) _... or just press_ `dot (.)` _on your keyboard_\n\n![npm version](https://img.shields.io/node/v/dankdomain) ![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/npm/dankdomain?style=plastic) ![GitHub milestones](https://img.shields.io/github/milestones/closed/theflyingape/dankdomain)\n\n## Installation\n\nProject development on `Chrome OS` and `Linux` with the `Node.js` runtime. To run a local game copy, click the `VS Code` icon above or manually [install](https://www.npmjs.com/package/dankdomain):\n\n```bash\n# fetch this package source:\n$ git clone https://github.com/theflyingape/dankdomain\n# ... or via Node.js\n$ npm install dankdomain\n\n# cd into package source folder:\n$ npm install\n\n# 1) play it as standalone:\n$ npm run play\n\n# modify for your server networking preferences:\n$ cp etc/network.json_inet etc/network.json\n$ vim etc/network.json\n\n# 2) run it as a local multiuser server:\n$ npm run net \u0026\n$ npm run term\n$ npm stop\n\n# 3) other ways to play online:\n$ npm run mame\n$ npm run term play.ddgame.us\n$ telnet play.ddgame.us\nConnected to play.ddgame.us.\nEscape character is '^]'.\nCARRIER DETECTED\nPC emulation enabled\n            ...........|\\...................../|................. Welcome to\n             ........./  \\..|\\__  __/|......./  \\............... Dank Domain\n            ........./ /  \\.\\ _ \\/ _ /....../    \\.............\n      _  .........../ / /  \\.(-)\\/(-)....../  / \\ \\.............\n     (_)  ..........| | | / \\\\/(oo)\\/...../  // |\\ \\.............\n          ..........| | | |  \\|v--v|\\..../  / | || \\|...........\n        ............| | | | / \\_^^_/ \\../  / || || ||.............\n           ......../ / /  | |   \\/    \\/  /| || || ||/\\../\\....\n            /\\..../ / /  / /  |______/   /| \\ \\ || ||  \\/  \\    /\\        /\\\n /\\      /\\/  \\../ / /  / /  /\\_____/  |/ /__\\ \\ \\ \\ \\ /    \\  /  \\  /\\  /  \\\n/  \\/\\  / /    \\.| | | / /  /\\______/    \\   \\__| \\ \\ \\      \\/    \\/  \\/    \\\n    \\ \\/        \\| | | | | |\\______       \\_    \\__|_| \\     /      \\  /\n     \\/          | | ____ /\\______ ____     \\_       \\  |   /         /\n      \\          | |/    /\\_____  /    \\      \\__     \\ |\n       \\         |/ |   |\\______ |      |        \\___  \\|\n                    |   |\\______ |      |            \\_\n            _   ___/|   |\\______ |      |          /\\  \\   ___\n           / \\_/     \\   \\________\\_    _\\____/   /  \\__\\_|   \\\n       ___/ __     __/   /       __/   /__    \\__/      __     \\__\n     _/    /  \\   /  ___/       /  ___/   \\            /  \\       |__\n    |     |      |/|/          |/|/        \\__    \\        \\         |\n\nWho dares to enter my dank domain \u003cor NEW\u003e?\n```\n\n**NOTE**: _my_ \"public\" _access [packages](https://github.com/theflyingape?tab=packages\u0026visibility=public) are published on_ **GitHub** _and it requires your_ `Personal Access Token` authentication _to fetch/install them from this alternative_ `npm registry`. Read GitHub's [Working with the npm registry](https://docs.github.com/en/enterprise-server@2.22/packages/working-with-a-github-packages-registry/working-with-the-npm-registry#authenticating-to-github-packages) to learn more details.\n\n```bash\n# setup local Node.js package\n$ npm config set @theflyingape:registry https://npm.pkg.github.com\n$ npm login --scope=@theflyingape\n$ npm install @theflyingape/dankdomain\n```\n\n... or use **Docker** _(convenient and uses the latest commits)_:\n\n```linux\n$ docker pull theflyingape/dankdomain\n$ docker run --rm -it -p 1939:1939/tcp -p 1986:1986/tcp theflyingape/dankdomain\n\nDank Domain (DDnet) started on linux #661\ncwd /usr/games/dankdomain/game → /usr/games/dankdomain/game/portal\ninitializing Deeds\ninitializing Online\ninitializing Rings (unique)\n + adding ⚛️ Atomic\n + adding ✝️ Faith\n + adding ♾️ Infinity\n + adding 🐍 Medusa's\n + adding 🕳️ Mystic Portal\n + adding 👹 Ogre\n + adding 🖤 Undying\n + adding ⚪ White Wizard\ninitializing Players\ninitializing Gangs\n + adding AB Original with BOT+NPC members\n + adding (the) Monster Mash\nENOENT: no such file or directory, open '/usr/games/dankdomain/game/etc/network.json'\n→ listening on telnet 0.0.0.0:1986\n→ listening on https://0.0.0.0:1939/\n↔ WebSocket endpoints enabled\n```\n\nSupports running as a BBS door (as Amiga-only BBSes did for `Hack \u0026 Slash` in 1994) by allowing a passed user numeric ID paired with a compatible **Mystic** `door.sys` [file format](http://wiki.mysticbbs.com/doku.php?id=menu_commands#external_doors) launched from its `BBS node` startup directory. Here is how to _freshly_ unit-test that app startup mode:\n\n```bash\n[~/dankdomain]$ npm run clean\n[~/dankdomain]$ cd game\n[~/dankdomain/game]$ cp door-example.sys door.sys\n[~/dankdomain/game]$ node main 0\n```\n\nFor example, configure to call-out to a script with two (2) parameters: `userId` and the path with filename to `door.sys`\n\n```bash\n#!/bin/sh\npwd; [ -s \"$2\" ] || exit 1\ncp \"$2\" /usr/local/games/dankdomain/door.sys\nnode /usr/local/games/dankdomain/main \"$1\"\n```\n\n## FAQ\n\n- What does `etc/sysop.json` do? How do you assign sysop privileges?\n\n_This file simply regulates some of the game features loaded at_ `runtime`_. The first Player (non-NPC) to register is automatically entitled as the Ruler off the last object entry in_ `files/items/title.json` _which is packaged here as either the_ (M) King _or_ (F) Queen `access` _role. The Ruler alone is granted with minor \"favor\" over their domain, but aligned with the game play \u0026 spirit if not abused. Other roles can have_ `sysop: true` _enabled to gain access to_ `\"@\"` _and some overlapping favor with the Ruler as you'd expect from a minion._\n\n**NOTE**: _in_ `users` _folder, edit a hidden (dot) export file to carefully modify any Player's record and save as_ **`save.json`** _whereas a running DDnet_ `app.js` _portal service_ (`npm run net`) _will automatically consume and apply it to the_ `dankdomain.sql` **`Players`** _table._\n\n- What's the best way to modify Player time limits and timeouts throughout the game?\n\n_Refer to_ `files/items/title.json` _for player runtime values based on their_ `access` _role -- assigned or achieved by reaching the next_ `promote` _level. There are no soft-coded values for the timeouts assigned to the various prompts. Those have been specially tweaked to keep turn-play moving along -- appropriately. That said, try modifying_ `vt.defaultTimeout` _seconds in_ `main.js` _to your liking._\n\n## Files directory structure\n\nFor the Portal, consider downloading media packs: 📷 [images](https://drive.google.com/open?id=1jjLPtGf_zld416pxytZfbfCHREZTghkW) and 🔉 [sounds](https://drive.google.com/open?id=1UvqQJbN61VbWVduONXgo1gm9yvGI0Qp8) into the appropriate game/portal/static folder:\n\n```linux\n$ pwd\n/usr/games/dankdomain\n.vscode           Visual Studio Code: settings \u0026 debug profiles\ngame\n  etc             sysop support files\n  files           game, menu \u0026 player support files: ANSI and/or text formats\n    arena         ASCII art \u0026 menu files\n    casino        menu files\n    dungeon       ASCII art\n    items         game artifacts\n    library       deeds \u0026 menu files\n    main          about system \u0026 menu files\n    naval         ASCII art \u0026 menu files\n    party         instruction \u0026 menu files\n    player        ASCII art\n    square        menu files\n    tavern        all player events logged for the day\n    user          each player’s events logged since last visit\n  pcs             user object type templates for BOTs, NPCs, and PCs\n  play            game modules for each main menu item\n    battle.js     support module for player engagements\n    init.js       support module for initial login\n    runtime.json  game play runtime values\n    sysop.js      support module for the system operator - main menu \"@\" command\n  portal\n    static        UI html/css/js using bundle.js: client.js \u0026 xterm.js\n      assets      app install, fonts, etc.\n      images      visual media for artifacts, creatures, and players\n      sounds      audio media for event notifications\n    app.js        DDnet for optional web and/or telnet services to run DDplay remotely\n  users           player runtime database \u0026 current game files\n  db.js           net \u0026 play module for player runtime database \u0026 files\n  email.js        support module for (optional) dispatching email notifications\n  interfaces.js   TypeScript object types\n  items.js        support module for loading item artifacts \u0026 coin\n  lib.js          support module for common I/O functions\n  main.js         DDplay client node\n  npc.js          support classes for BOTs \u0026 NPCs with arena, dungeon, and naval denizens\n  pc.js           support classes for PCs with Deeds\n  player.js       support module for common PC functions\n  runtime.js      global runtime variables to govern play\n  sys.js          support module with discrete functions to dependencies\n  telnet.js       telnet client using websocket and XT emulator handling\n  types.js        TypeScript template literals\nmame              player - MAME VT240 terminal + socat startup script\nnode_modules      Node.js support libraries\npackage.json      Node.js manifest\n```\n\n 🇺🇸 ©️1991 - 2026 [Robert Hurst](https://www.linkedin.com/in/roberthurstrius/)\n\n## Gallery\n\n- [Arena](https://photos.app.goo.gl/sZS7xx6rpyoG4CYBA)\n- [Connect](https://photos.app.goo.gl/AeZZXrC8VKnMFuqj8)\n- [Dungeon](https://photos.app.goo.gl/XfQTJ2NrKdVWJext9)\n- [Images](https://photos.app.goo.gl/wXpBUtrY2L64SrEH6)\n- [Monster](https://photos.app.goo.gl/rTRm8xDbF2wGJDFZ7)\n- [Naval](https://photos.app.goo.gl/w6v8Zk4GVBc3CbAA6)\n- [NPC](https://photos.app.goo.gl/T4QQT87U1eZK6EHk8)\n- [Player](https://photos.app.goo.gl/BCEAJjynqHZKxpaX9)\n- [Potion](https://photos.app.goo.gl/Gj9HYSXQUDGVcviJ7)\n- [Ring](https://photos.app.goo.gl/SWQDdytqjdXNfT4m7)\n- [Specials](https://photos.app.goo.gl/Dn2g2BtdwtKSbudu7)\n- [User](https://photos.app.goo.gl/hfTJ8EstLPSp4Kry6)\n\n## Node.js dependency tree\n\n**DDnet** portal\n\n**`app`**\n\n- `chokidar`, `dns`, `express`, `fs`, `http`, `https`, `net`, `node-pty`, `ws`\n- `sys`: `fs`, `got`, `path`, `romanize`, `sprintf-js`, `title-case`\n- `items`: sys\n- `db`: `better-sqlite3`, items, sys\n- _network service options_\n  - telnet: `net-keepalive`, `telnet-socket`\n  - web: `url`\n\n**`client`**\n\n- `animate.css`, `browserify`, `xterm`, `xterm-addon-fit`, `xterm-addon-unicode11`, `xterm-addon-web-links`, `xterm-addon-webgl`\n\n**DDplay** game\n\n**`main`**\n\n- `sys`: `country-flag-emoji`, `fs`, `fast-geoip` `got`, `path`, `romanize`, `sprintf-js`, `title-case`\n- `lib`: items, runtime, sys, `xvt`\n  - `items`: sys\n  - `runtime`: sys\n- `init`: db, items, lib, npc, pc, player, runtime, sys\n  - `db`: `better-sqlite3`, items, sys\n  - `pc`: db, items, lib, runtime, sys\n  - `npc`: db, items, lib, pc, runtime, sys\n  - `player`: db, items, lib, npc, pc, runtime, sys\n  - `email`: db, items, lib, `nodemailer`, `nodemailer-smtp-transport`, pc, runtime, sys\n  - `newuser`: db, email, init, items, lib, pc, runtime, sys\n  - `taxman`: db, items, lib, pc, player, runtime, sys\n    - `battle`: db, items, lib, npc, pc, player, runtime, sys\n    - `menu`: battle, db, items, lib, npc, pc, player, runtime, sys\n      - `arena`: battle, db, items, lib, npc, pc, player, runtime, sys\n      - `casino`: db, items, lib, npc, pc, player, runtime, sys\n      - `dungeon`: battle, db, items, lib, npc, pc, player, runtime, sys\n      - `library`: db, items, lib, npc, pc, runtime, sys\n      - `naval`: battle, db, items, lib, npc, pc, player, runtime, sys\n      - `party`: battle, db, items, lib, npc, pc, player, runtime, sys\n      - `square`: battle, db, items, lib, npc, pc, player, runtime, sys\n      - `sysop`: battle, db, dungeon, email, lib, pc, player, runtime, sys\n      - `tavern`: battle, db, items, lib, npc, pc, player, runtime, sys, taxman\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheflyingape%2Fdankdomain","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheflyingape%2Fdankdomain","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheflyingape%2Fdankdomain/lists"}