Haskellでプリキュアを作ってみた
by Yuji Yamamoto on December 11, 2016
この記事は「プリキュア Advent Calendar 2016」11日目の記事です。
現時点で11日目であるにもかかわらず私が最初の投稿者になってしまいそうで悲しいですorz. 遅れてもいいので登録したなら投稿はしていただきたい!
めげている場合ではありません。掲題通り、Haskellでプリキュアを実装しました。
何をいっているんだお前はと思うかたもいらっしゃるかもしれませんが、要はプリキュアの各作品の変身シーンの台詞や設定などを収録したライブラリーです。
似たようなものは各言語に存在します。過去にはACME::PrettyCureをはじめ、PycureやClocureなどが作られました。
そしてもちろん当Advent Calendarの主催にしてフルスタックキュアエンジニア、sue445さんのrubicureも忘れては行けません。その他の実装はこちらのまとめをご覧ください。
今回私が作ったプリキュア実装はtypesafe-precureといいます。hackageにも先ほど上げました!
以下、READMEの和訳も兼ねて特徴を紹介します。
⚠️注意⚠️ ver. 0.8.0.1 より、変身アイテムに装備品(Mofurun
に対するLinkleStoneDia
など)を付ける場合の仕様が変わり、この日本語版READMEに書いてあるサンプルコードは動かなくなりました。新しい方法については英語のみですが最新のREADMEをご覧ください。
タイプセーフプリキュア!
プリキュアの変身と浄化技の、型安全な実装。
Haskell製。
機能
- プリキュアが変身する際の台詞や、浄化技(必殺技)を発する際の台詞を集めたコレクション。
- 現時点で初代から「魔法つかいプリキュア!」までサポートしています(キュアエコーも含みます)!
- 変身時の台詞や浄化技の台詞を再生するためのモナド。
特徴
すべての女の子・プリキュア・プリキュアのスタイル・特殊アイテム、それぞれに固有の型を割り当てています。
そのため、正しい組み合わせによる変身、浄化技の発動しかできないように作られています。
結果、rubicureやclocureなど他のプリキュア実装に比べて非常に使いにくくなってしまっていますが、より正しい設定で再現するようになっています。
このライブラリーにとっては「正しさ」の方が優先なのです。
インストール方法
# unicode-showは必須ではありませんが、GHCiで試す場合は入れた方がいいでしょう。
$ stack install typesafe-precure unicode-show
## ... あるいは
$ cabal install typesafe-precure unicode-show
使用例
注意:
- GHCi上で日本語を
show
する場合、unicode-showを利用してください。 - 下記の出力結果は私が手で見た目を整えています。
変身したプリキュアなどの取得
$ ghci -interactive-print=Text.Show.Unicode.uprint
> :m ACME.PreCure
ghci> transformationSpeech (Mirai, Liko) (Mofurun LinkleStoneDia)
ghci"キュアップ・ラパパ! ダイヤ!"
[ "ミラクル・マジカル・ジュエリーレ!"
, "ふたりの奇跡!キュアミラクル!"
, "ふたりの魔法!キュアマジカル!"
, "魔法つかいプリキュア!!"
,
]> transformedStyle (Mirai, Liko) (Mofurun LinkleStoneRuby)
ghciCureMiracle_Ruby, CureMagical_Ruby)
(> purificationSpeech (CureMiracle_Ruby, CureMagical_Ruby) (LinkleStick LinkleStoneRuby, Mofurun LinkleStoneRuby)
ghci"リンクルステッキ!"
[ "(モッフー!)"
, "ルビー!紅の情熱よ私達の手に!"
, "フルフルリンクル!"
, "プリキュア!ルビー・パッショナーレ!"
, ]
プリキュアモナド
> :{
ghci> let scene = do
ghci....> say "この罪を抱いたまま、もう一度、グランプリンセスを目指す!"
....> scarlet <- transform Towa (PrincessPerfume DressUpKey_Scarlet)
....> scarletModeElegant <- transform scarlet (PrincessPerfume DressUpKey_Phoenix)
ScarletViolin DressUpKey_Phoenix)
purify scarletModeElegant (> :}
ghci> :t scene
ghciscene :: ACME.PreCure.Monad.PreCureMonad ()
純粋な関数として変身したり浄化したりする
> composeEpisode scene
ghci"この罪を抱いたまま、もう一度、グランプリンセスを目指す!"
[ "プリキュア!プリンセスエンゲージ!"
, "深紅の炎のプリンセス!キュアスカーレット!"
, "冷たい檻に閉ざされた夢、返していただきますわ。"
, "お覚悟を決めなさい!"
, "エクスチェンジ!モードエレガント!"
, "スカーレット・バイオリン!フェニックス!"
, "羽ばたけ炎の翼!"
, "プリキュア! フェニックス・ブレイズ!"
, "ごきげんよう。"
, ]
IOアクションとして変身したり浄化したりする
台詞が一行ごとに出力されます。rubicureに似た機能があったのでインスパイアされました。
> printEpisode scene
ghci
この罪を抱いたまま、もう一度、グランプリンセスを目指す!
プリキュア!プリンセスエンゲージ!
深紅の炎のプリンセス!キュアスカーレット!
冷たい檻に閉ざされた夢、返していただきますわ。
お覚悟を決めなさい!
エクスチェンジ!モードエレガント!
スカーレット・バイオリン!フェニックス!
羽ばたけ炎の翼!
プリキュア! フェニックス・ブレイズ! ごきげんよう。
以上が現在2016年12月11日時点のREADMEです。
苦労したところとか、気合いを入れたところとか。
開発はrubicureのconfigを見ながら行いましたが、ついついこだわってしまい、コピペはしつつも、原則youtubeなど(DVDではないですすみません…)を見返して、自分が感じた表記の違いなどを考慮しながら書いたため非常に時間がかかってしまいました。「正しさ」にこだわった結果です。
以下は箇条書きでもろもろを。
- 特殊なフォームの扱いには悩みました。READMEに書いた使用例のように、多くの特殊なフォームでは変身シーンと浄化技が一つのシーンとして描かれているため、ちょっと不自然に感じるのではないかと思います。
- 最初に魔法つかいプリキュアを実装しながら設計を考えたのですが、それに引きずられてしまった結果です。
- スイートプリキュアについてはちゃんと変身する人数ごとに台詞を分けています。以下のコードを試してみてください。
transformationSpeech (Hibiki, Kanade) (CureModules Dory, CureModules Rery)
transformationSpeech (Hibiki, Kanade, Ellen) (CureModules Dory, CureModules Rery, CureModules Lary)
transformationSpeech (Hibiki, Kanade, Ellen, Ako) (CureModules Dory, CureModules Rery, CureModules Lary, CureModules Dodory)
- 複数のメンバーが同じ変身アイテムを使って変身する際の引数も悩みました。「実際には違うアイテム」と判断したものはそれぞれ分けているのですが(例:
LovelyCommune
,PreCard
)、そうでないものもあります(例:CureMo
)。- そのためYes! プリキュア5が変身するときは
transform (Nozomi, Rin, Urara, Komachi, Karen) PinkyCatch
です。実際にはピンキーキャッチュは5つ使っているので、ちょっと不自然に聞こえるかもしれません。 - 使い勝手よりも正しさを重視、とは言いましたが、この件については今でも悩んでいます。
- そのためYes! プリキュア5が変身するときは
- キュアエコーの変身アイテムは「プリキュアになりたいという思い (
FeelingToBePreCure
)」です。もうちょっと適切な表現があれば教えてください。NonItemPurification
と同様にNonItemTransformation
を作るつもりはありません。 - Go! プリンセスプリキュアは最後に作ったためか、勢い余って大半のドレスアップキーとその浄化技を実装してしまいました。キュアスカーレットのドレスアップキーの組み合わせが思いの外イレギュラーで難しかったです。これだけはBlu-rayも見返せてよかった。
みなさんにお願い: 変身や浄化技・必殺技の台詞を募集します!
正しさにこだわって実装したtypesafe-precureですが、残念ながら浄化技やプリキュアの特殊なフォームは一部しか実装されていません。時間の力には勝てませんでした。
そのため、みなさんの好きなあの技・フォームがない可能性が十分あります。そうした場合は、こちらのルールにしたがって報告していただけると幸いです!
また、もちろん誤字・脱字や設定の大きな間違いについても受け付けます(キリがなくなりそうな状態になると私の一存でクローズするかもしれません。あらかじめご容赦を)。
以下が報告用フォームです。GitHubアカウントがないと報告できません。あしからず。
New Issue · igrep/typesafe-precure
謝辞
rubicureを作ったsue445さん始め、参考にした下記のサイトを編集されたみなさん、大変ありがとうございました!
みなさんの多大な努力によって、世界に新たなるプリキュア(のプログラミング言語による実装)が生まれました!
今後も精一杯頑張ってリポジトリーの平和を守りますので、今後もよろしくお願いします。 vim(_ _)mer
- Wikipediaの各種プリキュアのページ(日本語版・英語版)
- 英語版WikiaのプリキュアWiki
- プリキュアアイテム一覧 (ぷりきゅああいてむいちらん)とは【ピクシブ百科事典】
それともっと大事な、忘れてはいけない、東映アニメーション様を始めプリキュアという素晴らしいアニメ作りに携わるすべてのみなさん。
また妙なものを作ってしまい恐縮ですが、これからもわれわれファンが楽しく二次創作に励めるような、わくわくもんの作品を作り続けてください!
応援しております!
次回予告
- 明日のプリキュア Advent Calendar 2016は、shinya deguchiさんの記事です。よろしくお願いします。
- ちょうど1週間後のHaskell Advent Calendar 2016の私の記事では、今回作ったtypesafe-precureの、もうちょっと技術的な詳細を解説します。キュアップ・ラパパ!来週もいい記事にな~れ!