https://github.com/morganconrad/runequest-discordbot
A Discord "bot" for Chaosium's Runequest RPG.
https://github.com/morganconrad/runequest-discordbot
Last synced: about 1 year ago
JSON representation
A Discord "bot" for Chaosium's Runequest RPG.
- Host: GitHub
- URL: https://github.com/morganconrad/runequest-discordbot
- Owner: MorganConrad
- License: mit
- Created: 2020-12-23T15:22:44.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2021-11-01T16:08:28.000Z (over 4 years ago)
- Last Synced: 2025-04-06T21:42:57.530Z (about 1 year ago)
- Language: JavaScript
- Size: 69.3 KB
- Stars: 3
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://travis-ci.org/MorganConrad/runequest-discordbot)
[](https://github.com/MorganConrad/runequest-discordbot)
# runequest-discordbot
A [Discord](https://discord.com/) bot to support [Chaosium's](https://www.chaosium.com/) fantasy role playing game
[Runequest](https://www.chaosium.com/runequest/).
Listens for commands with the prefix /rq.
- All text is converted to lowercase
- Mentions (e.g. @JohnDoe) are ignored.
[Technical Presentation for Port Townsend Web Developers](docs/presentation.md)
### New Beta Feature, dierollr, as of November 2021
- Commands starting with the prefix /r are treated as die roll commands
- [Instructions here](https://github.com/MorganConrad/runequest-discordbot/tree/main/dierollr#readme)
- code in the dierollr folder
## Discordbot Commands (all start with /rq)
Many commands take one or more optional numbers NN in the range 01-100 (00 also means 100), or use "x" to mean pick one at random
|command|arguments|description|shortcut|
|-------|---------|-----------|--------|
|resistance|AA DD|calculate resistance table percent for Attacker (AA) vs. Defender (DD)|rt|
|success |SS RR|show ability result (Normal, Critical, etc.) for skill SS and roll RR|ar|
|melee |AL PL|show end result for Attacker level of success (e.g. special) vs. Parry level (e.g. failure)||
|meleedodge|AL DL|show end result for Attacker level of success (e.g. special) vs. Dodge level (e.g. critical)|
|fumble |NN? |fumble NN, or random|fu, fa, fp, fd|
|chaos |NN? |Chaotic Feature NN, or random|cf|
|thed |NN? |Curse of Thed NN, or random|ct|
|spirit |NN? |Summon Ancestral Spirit NN, or random||
|spell |NN? |Spirit Magic Spell NN, or random|sm|
|help | |Help||
|info | |Information||
#### Alternatives (shortcut aliases) for Levels of Success (save typing)
```
- critical: cr, crit
- special: sp, impale, slash, crush
- normal: n, ok, hit, parry, dodge, success
- failure: m, miss
- fumble: fu, fa, fp, fd
```
## Examples (notes in parentheses)
```
/rq success 56 58 (skill 56, roll 58)
Ability: 56 Roll: 58 => Failure
/rq meleedodge slash miss (special attack vs. missed dodge)
Attack special vs. Dodge failure:
Attack does special success damage.
/rq melee m sp (missed attack vs. special parry)
Attack failure vs. Parry special:
Attack parried or deflected.
Defender rolls parrying weapon’s special damage.
Attacking weapon’s HP is reduced by any damage over its current HP.
/rq fumble (Random fumble, show both attack and parry result)
Fumble #83:
Attack: Weapon shattered (100% chance if unenchanted;
10% less for each point of battle magic spell on weapon,
and 20% less for each point of Rune magic spell on weapon).
Parry: Parrying weapon or shield shattered (100% chance if unenchanted;
10% less for each point of battle magic spell on weapon,
and 20% less for each point of Rune magic spell on weapon).
/rq fa 83 (Fumbled attack 83)
Fumble #83: Weapon shattered (100% chance if unenchanted;
10% less for each point of battle magic spell on weapon,
and 20% less for each point of Rune magic spell on weapon).
/rq resistance 14 12
Resistance Table: 14 vs. 12 => 60
/rq chaos @abc 77 (chaotic feature 77, the mention is ignored)
Chaos Feature #77: Functional extra appendage or body part. Modify hit locations accordingly.
/rq thed 54 x x (Curse of Thed 54, plus 2 random ones)
Curse Of Thed #54: Add +3 to damage of all weapons hitting the victim.*
Curse Of Thed #63: Victim becomes physically indistinguishable from caster of spell.
Curse Of Thed #48: All foes have +30% chance to hit victim.*
/rq spirit (random spirit)
Ancestral Spirit #37: Neutral, POW 3D6+6, 1D3 Spirit Spells, 0 Rune Points
Use /rq spell ... to generate random spirit spells
/rq spell x x (generate 2 random spirit magic spells)
Spirit Magic #90: Visibility
Spirit Magic #72: Spirit Screen
```
Many of the commands have shorter aliases as noted.
## Installation
### The bot may or may not be running on my Raspberry pi.
To try that, use the invite link
[https://discord.com/oauth2/authorize?client_id=791106265283690497&scope=bot](https://discord.com/oauth2/authorize?client_id=791106265283690497&scope=bot)
Please don't overdo it! Currently, this server only collects and logs information on
- servers ("guilds") at startup.
- errors.
- when it is used on a new server or channel.
### Create your own version
This requires a basic familiarity with javascript and node.js.
1. Download the code
2. `npm install`
3. Login to Discord, go to the developers page, and create your app.
- You should get a different magic number than in the above link.
- also note the "secret"
- Invite it to your server or channel. It should show up as offline
4. On the computer with the code. `node index.js SECRET`
- or, better, store secret in the `RQ_DiscordBotKey` environment variable
5. The rq bot should shortly appear as "online".
### Configuration
see config.js. You can change the prefix (and other things) there.
## Design Notes
### The main bot code is in runequest-discordbot.js. It
- reads all the command bots in the subdirectory './commands'
- `setup()` does initial login, and installing listeners
- converts the input to lowercase
- checks for the prefix "/rq"
- gets the arguments, filtering out any mentions
- checks for and handles "help" and "info"
- most commands are handled via `delegateToCommands()`
### Writing your own command
To add your own command, follow the overall design in any of the existing commands. You must export
- name: a user-friendly name, e.g. "ChaosFeature",
- aliases: an array of commands you support, e.g. ['cf', 'chaosfeature']
- use lowercase, since the input has been converted toLowerCase.
- don't conflict with other ones!
- help: a help string
You should export **one** of the following
- `data[]`: an array of 101 strings. Useful if this is just a random table like Chaos Features.
- 0 is filler.
- `'"'` means "ditto" to save typing.
- `doHandle(userCommand, args, utils, command)` for something more complex.
- userCommand: the command they used, e.g. "cf"
- args[]: any remaining args, e.g. ['65', '89']
- utils: some utiity functions
- command: your command (sort of `this`, usually ignored`)
#### Testing
`test.js` is a command line utility to test your command handler.
`node test.js /rq mycommand arg0 arg1`
The tests folder holds some very basic unit tests.
## TODOs
- better permanent server
- ~~allow multiple arguments to some commands, like `cf 56 33 88` to show three chaotic features~~ done as of v0.1.1
- more commands TBD
- fix bugs TBD
