SlackでRPG的なことができるnode-quest / hubot-combat というpackageの話

  • 18
    いいね
  • 0
    コメント

この記事は http://qiita.com/advent-calendar/2016/nodejs の2日目として書かれています。
こんにちは ara_ta3 です。

突然ですがRPG(ロールプレイングゲーム)いいですよね。
その昔こちらの記事を見て、「あ、SlackでRPG的なこと出来そうじゃね」と思ったのがきっかけでした。
http://gomayumax.hatenablog.com/entry/2015/12/16/061427

1. 概要

Slack内でRPGっぽいことがしたかったので、 node-quest というnpm packageを作りました。
イメージはRPGツク◯ルですね
そして、さらにhubotで使えるように hubot-combat というpackageも作りました。
今のところhubotですが、頑張れば分離できる気もするのでそのうち分離したいなと考えてます。
なんかRPGっぽく見えるように頑張ったりしたのでそれが動く所と実装の紹介をしようと思ってます。

  • node-quest
    • RPGの要素、例えばUserなどのエンティティを実装したpackageです

https://www.npmjs.com/package/node-quest
https://github.com/ara-ta3/node-quest

  • hubot-combat
    • User同士が戦うなどのサービスクラスをhubot moduleとして実装したpackageです
    • ※現在 hubot-slackのversionが 3.xでないと動きません・・・(この記事書いてるときに気が付きました…)
    • なので hubot-slackの依存を "hubot-slack": "^3.0.2 < 4.0.0", のようにする必要があります

https://www.npmjs.com/package/hubot-combat
https://github.com/ara-ta3/hubot-combat

2. hubot-combatが動く所

ここでは dark というユーザに対して攻撃して、最後ステータスを確認してる感じです。

スクリーンショット 2016-11-30 20.53.28.png

3. 今できることと工夫したこと

今できること

  • attack {user}
    • {user} へ攻撃
  • status {user}
    • {user} のステータスを確認
  • pray
    • 死んでしまった際に復活することできる

工夫したこと

Slackのユーザから他のユーザに対して攻撃ができます
この時、適当な固定ダメージだとRPG感ないし、
一様分布の乱数だと突然意味もなく変に高いダメージが出てしまって
なんかそれっぽさがないなと感じたので、
ボックス=ミュラー法という方法を使って正規分布に従うダメージが出るようにしました。
https://ja.wikipedia.org/wiki/%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%EF%BC%9D%E3%83%9F%E3%83%A5%E3%83%A9%E3%83%BC%E6%B3%95

実装はこのあたり
https://github.com/ara-ta3/node-quest/blob/master/src/game/model/Point.js#L19

なのでユーザの攻撃した際のダメージは、
平均: ユーザが持っている武器の平均的な威力 + ユーザの攻撃力
標準偏差: ユーザが持っている武器の威力のばらつき - ユーザの器用さ
とした標準正規分布に従います。
なので、威力のばらつきが高い武器だとたまにすごいダメージが出るけど、たまにものすごいしょぼいダメージが出たりします。
それっぽさ大事ですよね!

4. 今後できるようになること

  • メッセージのカスタマイズ
  • 魔法
  • モンスター
  • ジョブ
  • 武器

あたりの機能・・・
すでに自前のbotでは出来ているんですが、今回移植出来ませんでした・・・
自前のbotから分離して使いたいなと思うのでクリスマスあたりの休みでやろうかと思います。
ちなみに、自前のbotはこちらです。
https://github.com/ngineerxiv/dark-bot/tree/master/src/game

イメージ

言葉で説明しても仕方ないと思うのでどんなイメージか自前のbotの様子を御覧ください。
メラという魔法を放ったり、 黒魔道士 というジョブに転職したり、アスピルという魔法で相手のMPを吸収したり出来ます。

スクリーンショット 2016-12-01 19.16.42.png

またモンスターを召喚して戦うことも出来ます。
ここでは #prison チャンネルというところで 憲兵 と戦うというシナリオです。
個人のSlackTeamで検証したので私にしか攻撃してきていませんが、
本来は無作為に生きてるユーザ全員に攻撃してきます。
AutoActionというクラスを実装して、ユーザクラスが自動で行動する機能を実現してます。

https://github.com/ngineerxiv/dark-bot/blob/master/src/game/AutoAction.js

スクリーンショット 2016-12-01 19.23.12.png

5. まとめ

  • アイスを掛けてSlack内で戦うなど楽しんできましょう
  • くだらなくて楽しいからみんな使ってください
この投稿は Node.js Advent Calendar 20162日目の記事です。