変愚蛮怒のペットはいかにして「ズル」になったか

この記事は Roguelike Advent Calendar 2024 の12月8日のものです。
https://adventar.org/calendars/10237

 こんにちはあるいはこんばんは、ベッキーさんです。
 そしてKokaです。

 変愚蛮怒の必勝法のひとつとして「モンスターに大量の強い味方モンスター(ペット)をけしかける」というものがあります。もちろん、下準備等が要りますが。
 どんなに弱いビルドであっても、魔力復活薬がぶ飲みしつつサイキョーなペットのつよつよブレスを浴びせまくることで大抵のユニークモンスターの体力をがりがり削れるそうです。
 私はためしたことないけどな!

 変愚蛮怒にはズルという町があり、ややこしい。なんでそんな名前なのだ?
 掲題はもちろん町の名前でなく、チートスレスレの要素、という意味です。チートスレスレのペットですが、魔獣使いや騎兵では当然許されるかもしれません。ペットを使わない魔獣使いという1ミリも面白くない縛りプレイを思いつきますが、まあ1ミリも面白くないでしょう。

 バーチャ2のアキラの隠し技「崩撃雲身双虎掌(なぜか変換できる、ほうげきうんしんそうこしょう、通称アキラスペシャル)」は、その凶悪な性能ゆえ大会ですら使うとブーイングものだったそうです。それに近いのか、変愚蛮怒でペットを駆使することは、あえてやらない、もしくはあえてやる、強すぎる戦法になっています。

 なぜ変愚蛮怒のペットがここまで簡単に強いのか? なぜこうなったのか? 歴史を紐解きます(大げさに言いすぎです)。

「ペット」とかいう奇妙な呼び名の味方モンスターシステムはどのへんからきたのか? 御存知NetHackで、運命の大迷宮に味方モンスターとして好きな名前の犬か猫を連れて突入するという泣ける場面があります。驚くべきことです。泣く場面です。犬猫を連れていける、ここからネトハクや*bandでは味方モンスターはペットと呼ばれることになりました。

 一方無印Angband(バニラ)にはペットなどいませんでした。味方モンスターも、友好的なモンスターもいませんでした。「店」だけは友好的でしたが。
 そこへ、当時最先端だったAngbandバリアント「ZAngband」がペットを実装してしまいました。あーあ。
 しかし、この時点ではペットがバランスブレイカーとして完璧ではありませんでした。
 ペットを飼うのは大変なことなんだよ。
 という教訓なわけではないでしょうが、一部の限られた手段でしかペットを扱えませんでした。トランプ領域はサイバーデーモンを召喚できる! がっくやぶりの ひゃくばいやばいぜ! 生命領域の鳩の日(凪の日)で視界のモンスターをペットにできる! やばいよやばいよ(出川)。
 ZAngbandでもペットは強力な要素でしたが、変愚蛮怒よりは少し「限られて」いました。

 ZAngbandの時点では、3つほどの要素により、ギリギリペットのリスクと難しさがありました。
 1つ目はモンスターボールが無かったこと、2つ目は@さんを巻き込んでブレスやロケットを放つこと、そして3つ目は進化しないこと。
 この3つは御存知の通り、変愚蛮怒では、モンスターボールがあり、またプレイヤーをまきこまないでねとペットに命令でき、敵を倒しまくったペットは進化します。

 この上記3つですが、もちろん、変愚蛮怒を面白くしています。モンスターボールで捕まえて、増殖系モンスターをペットに倒させて、強いのを育成する。楽しいです。

 なぜモンスターボールがあるのか? これは大むかし、ZAngbandが最先端だった頃、newsgroup(太古のネット掲示板のようなもの)の誰かがローグライクのアイデアとして半ばジョークで言い出したことがきっかけです。”Mumak! I choose you!” ZAngbandには採用されませんでしたが、SillyJNetHackには採用されました。

 SillyJNetHackって何!? 
 Kokaという人が書いたNetHack日本語版のバリアントです。詳細は割愛しますが、モンスターボールというアイテムも追加要素の一つでした。
 ただし! is_animal(monptr) でTRUEが返ってくるモンスター(要するに自然界の動物に属するモンスター)にしか効きませんでした。なぜかというと、まあ……NetHackのペットはZAngband以上にぶっ壊れ性能になりうるからとかバランスってやつを考えていたのでしょう。残念ながらエルフを捕獲できませんでした。

 もどって、まあそういう時代だったので、変愚蛮怒では当然のようにモンスターボールが実装されました。捕まえられるモンスターの種類にほぼ制限がない理由は知りませんが、最大HPが一定以上の非ユニークモンスターは大抵捕獲できてしまいます。人間だろうとなんだろうと、どの職業でプレイしていても、簡単に「ペット」にできます。さらに、進化させられます。
 そして、ペットが主人を巻き込まないでブレスを吐くよう命令できるので、ZAngbandに比べて安全ですらあります。ペットのサイバーデーモンといっしょに敵を殴ってるとたまにロケットでエライ目に遭う、とかいうこともありません。

 あとはもう言う必要ないと思いますが、こうして、変愚蛮怒のペットは楽しく、かつ、つよつよになったのです。暗黒領域魔法で死体を集めて死体蘇生とかもありますね。楽しい。問題は楽しいということかもしれません。

 あえて使わないか、あえて使うか、まあ楽しく遊ぶのが良いでしょう。

 ではまた。

『元祖Rogue(?)』のソースコードの思い出

この記事はローグライクアドベントカレンダー2024年12月1日への寄稿です。
https://adventar.org/calendars/10237

 どうもこんにちはあるいはこんばんは、イェンダーの魔法使いです。影武者のエルフの王や、チーププラスチックイミテーションオブアミュレット等の逸話で知られています。
 いや、シレン6のやり過ぎでもう疲れてきているベッキーさんです。私用パソコンはないです。ゲームで疲れるってなんだよ。まだ真髄クリアしてないです。クリアアイコンあと一つ。これが真髄クリアだと思います。

 さて本題です。ゆっくり語ります。ゆっくり動画ではないです。
『元祖Rogue(?)のソースコード』についてです。
 そんなもん解説せんでもGitHubとかにいくらでもあるんじゃないのー? と思われるかもしれないし、実際あるのかもしれないですが、私の中での記憶を掘り起こすことをメインにしていきます。
 ソースは私です。ソースのソースが私です。
 よってこの記事には『ウソ』が含まれる可能性が多々あります。ご了承下さい。

1.ローグのソースとは?

 オイスター……オイスターっすかチクショーw

 その昔、元祖Rogueのソースをコピペすることはなんらかの違反行為にあたるかもしれないのでローグクローンというものが作られたと言われています。言われていない場合もあります。
 とにかく、元祖Rogueのソースリストと思しきものが、なぜかでかいgif画像ファイルで公開されていたことがありました。もちろん、ローグクローンのソースとは別物です。
 その『真髄(エッセンス)』のいくつかについて興味深いところをだらだらと書きます。ただし私のおぼろげな記憶がもとです。
 なお、ローグクローンの記憶と混ざってしまっている部分がおそらくあります。

2.アイテムやモンスターのオブジェクト

 リンクしたリスト

 元祖RogueC言語で書かれていました。まあそりゃそうですよね……
 モンスターと各種道具類(以下「アイテム」)は、同じstruct(構造体)になっていました。そして、リンクドリストでした(このへんはローグクローンと混同しているかもしれません)。
 たとえば、モンスターの種類を表すメンバ変数は、アイテムでもその種類を表すものとして使われていました。モンスターとアイテムが同じ構造体! ひどい実装ですね。なんでそんなことする(してた)のかはわかりません。オブジェクト指向とかいうやつでしょうか。十年先取りしてたのでしょうか。
 リンクドリストとは? monster->nextでfor文を回す太古の技術です。ポインタnextがNULLだった場合、そこでモンスターを数え終わるわけです。新しいモンスターはメモリを確保してそのポインタが末尾のモンスターのnextに代入されます。これは、メモリの許す限り無限にモンスターを湧かすことができるという利点があります。NetHackではこれが使われていますね。ていうかもはや旧世界の遺物ですね。リンクドリスト! Angbandではもっと安全なやりかただったと思います。
 そしてアイテムももちろん同様です。だいたい似たやり方で作られているNetHackで、凄まじい量のアイテムを同一フロアに出しても消えていくことがない理由になっています。Angbandではアイテムが同じフロアに多く出され過ぎた場合、価値(値段)の少ないマイナス系アイテムから消えていきます(現段階でどうなってるかは知りません)。

3.モンスターの行動ルーチン

 ワンダリングエネミー

 元祖Rogueでは、モンスターはプレイヤーを魔法的に探知して最短ルートで迷宮をおいかけてきてはいません。テキトーに歩き回ったり、そもそも移動しなかったりゴールドの上にのっかったりしています。プレイヤーと同じ部屋やとなりに来たとき、またはゴールドに乗っかってるところで隣接や攻撃をすると、はじめてプレイヤーを狙う動きをします。
 追尾はまあ四角の部屋なのでプレイヤーの座標に向かって移動するだけです。ちなみにK(ケストレル)とG(グリフォン)は高速で追尾してきますが、プレイヤーが逃げる移動をしても攻撃はされません。これは、プレイヤーの隣りにいない場合だけもう一度行動する、というやりかたで実装されています。
 テキトーに歩き回るとは?
 プレイヤーを発見していないモンスターは、部屋の出口へ向かって移動します。部屋の出口からは、通路を通り、次の部屋の扉へ向かって移動します。プレイヤーを発見しない限りは。あらかじめ部屋の出口座標が、マップ生成時に保存されていたかもしれません。
 そしてプレイヤーに出会ったあとはぶつかりに行くわけですが、ここでモンスターが他のモンスターにぶつかるときには、すこし移動方向の場所を変えて移動します。ごく自然に思える動きかもしれませんし、難しい技術ではないのですが、他のモンスターをよけて、なるべくプレイヤーに近づく向き・場所へ移動し、@を集団で囲んでボコりにきます。「通路へ行くんだ!」といわれるローグライクの基本テクニックがここで爆誕しているのです。

4.モンスターの攻撃ダメージ

 モンスターの攻撃ダメージは、文字列型で定義されています。
 なにを言っているのか?
 いや文字列型です。C言語で文字列といえば、

char aisatsu[] = ”Hello world.”;

とかそーいうやつです。
 ダメージの書かれた文字列、”1d12"とかそんな感じです。これをわざわざ解析して、それから1d12(12面ダイス1個)を振るとか、そんなことが行われています。なんのためか? 例によって記憶がおぼろげなのですが、”1d4+1”といった書き方ができていた気がします。さらに、F(ビーナスフライトラップ)は徐々に攻撃力が上がっていきますが、この文字列を書き換えるかたちで実装されています(私の記憶が確かならば)。
 もうNetHackの武器ダメージもこれで実装したほうがいいんじゃないのかと思います。君はNetHackドワーフのツルハシの攻撃ダメージを知っているか?

5.ヴォーパル

 したたかぐさり!

 元祖Rogueには、「scroll of vorpalize weapon」という巻物が登場します(同名のアイテムがCrawlにあります)。Rogueでの効果は、読んだあとに特定のモンスターに一回だけ倍ダメージを与えるというものです。その仇敵が視界に入ると特別なメッセージが表示されます。
 だが地味!
 特定のモンスターというのが、読んだときランダムでアルファベットが選ばれるだけで、たとえば「Q」に対して一回だけ倍ダメージになったところで……むしろ一撃必殺くらいにしとけばいいのに。まあローグクローンで廃止されたのもむべなるかなというところでしょう。
 魔法剣サンダガの時代を先取りしすぎた?

6.まとめ

 ゲームを作るならC言語! というか大抵のプログラムはC言語! という時代があったのかもしれません。よく知りませんが。Cマガジンとかいうプログラミング特化の雑誌があったけど今はもうないそうです。
 私にとっては、オープンソースの動くゲーム、主にRogueNetHackの存在は、なによりのプログラミングの勉強になりました。いくつもシューティングとか変なアクションゲームをCで書けるようになっていました。Allegroライブラリとか使ったけどね。
 ともかく。
 純粋C言語(pure C)の最も美しい使い方の一つであるRogueがあったからこそ、今のローグライクcursesプログラムができたんだ!
 というお話でした。

7.ぼやき・あとがき

 変愚蛮怒ローグライト化計画!?そんなことはさせない!(でも!)きみとならどこまでも

 ここからはべつに飛ばしてもいいです。
 さて、Rogueおよびローグライクの最大の特徴といえば例のキャッチコピーがあります。「1000回遊べるRPG!」「死は恒久的(パーマデス)です」
 元祖Rogueがそんな風だったため、現代的巨大Roguelikeが、地下99階だとか100とかになっています。鉄獄100階のボスを初見で倒せるか? しかも負けたらまたゼロからだよ? どういうゲームだよ……
 元凶じゃん元祖Rogueさん……てかRogueのひどいところを受け継がなくてもいいじゃん……元祖Rogueが、せいぜいフツーに遊んで地下25階あたりから魔除けをとって脱出する! だったから再挑戦も多少気楽にはいはい三十分以上も無駄にしちゃったねー無駄無駄無駄無駄無駄無駄
 それを99階とか100階とかにしたいのはわかるけど、一瞬の油断で10時間が消えるというゲームに進化させて、自分も含むけどローグライク原理主義者みたいになっちゃって、NetHackや*bandの死は恒久的だからいいんだよとかのたまうことになってて。ローグライトという用語およびゲームジャンルが出るのも必然だわと思います。

 まあ好きだけどね! 暗闇でコカトリス肉を触っちゃうのも! 変愚蛮怒でなんか変な知らないやつからのブレス連打で吹っ飛ぶのも!

 ではまた。

ユーズ ユア イマジネーション @ Roguelike

https://adventar.org/calendars/9031

これはローグライクアドベントカレンダー2023の25日の記事です。

どうもこんにちはあるいはこんばんは。
X(旧Twitter)に4コマ漫画を投稿しがちなベッキーさんです。

 てかKokaです。真面目に怪文書コカラゲを書いていたり、あの例のReadmeに書かれている壁紙機能を書いたことで有名なKokaです。変愚のバリアント「Kokaband」とQuickband日本語版のバリアント「みつばんど」のメンテナでした。今では両者とも入手困難でしょう。私も自分自身で行方を追っているのですが、もうリアルおみくじの「大吉:失せ物:出る^〜」を引くしかない気がします。うむ。どうでもいい。
 昨今は色々すごいゲームとか開発環境とかあるみたいだけど、パソコンを買うタイミングを逃しまくりだ! Shit!!
 貧乏ではあるが多少は買ってもよさそうな経済的余裕はある! でもなんか「PC新調したらブルスク連発で〜」ってお話あるじゃあないですか。あれです。怖いですね。クリスタがスゲー重いんですけど? とか、マンガ「川柳少女」で少年マガジンで一番愛されたヒロインになってしまった雪白七々子を作り上げた「神・五十嵐正邦」先生のスマホの修理代が180万というホラーもあるじゃあないですか。パソコンどころか軽自動車より高くないか!? 怖いですね。店で「壊れにくいパソコンありますか?」って訊きますよシマイには。

 さてローグライクの話だ。

 その昔「タイル派」と「文字派」が熾烈な争いを繰り広げており……いや争ってなくても、まあエラく長いこと無意味に好き勝手言ってる状態があったのは確かです。結論として「どうでもいい」となったのでした。あるいは「Take it easy!(テケリーリ!)」となりました。 たぶん。

 私自身の現在の意見を言わせてもらえば「視認できるならどっちでもいい」となります。
 約15年前(※以下「当時」)は「NetHackとCrawl以外は文字派」でした。理由は、当時は(例として)「変愚でジャッカルがたんなる茶色いモヤモヤにしか見えない」というのが原因でした。
 しかし今となっては自分の視力の問題である(あった)ことがついに判明しました。悲しい。悲しい事実なのだろうか。そのへんは別の話ですのでおいときます。

 さて、文字派の主な感想には、想像力を使うところがよい、という当時一般的だったものがあります。想像力。特に元祖Angbandのモンスターにおいては「挿絵のない本からの引用」が半数以上を占めています。ついでに「food rationて実際のとこマジ何なの?」の答えとして「てきとうなたべもの(保存食的な)」という逃げ道があります。元祖Rogueでは初期装備がsome foodなどとなっていた気がします。ちな変愚蛮怒にはアーティファクト的にアイテムに名前をつける機能があり(やりかたは取説を読もうね!)
 食料『巨大なおにぎり』
 食料『にくとめし』
 食料『さかな』
 食料『パスタ』
 食料『スイーツ』
などとして遊べます。楽しいです。好きなものを好きなだけ食べられるのが何よりの幸せだと思わないか、きみ。
 それに対してのタイル派のほうは、昔は貧弱な文字列インターフェースを強要されてたゲームだったから仕方ないけど、今現在のモダンなPC環境では絵くらいあって当然なのに想像力がどうとかまだ言ってるのかよ、というものがあります。

 さて、私は……前述にも少しありますが「両方ともよい」という、卑怯にもほどがある意見を言わざるを得ません。
 上記の文字派、タイル派、両方とも私の感想です。
「というものがあります。」とかいってるけど私の感想がそう「ある」のだから、あります。

 まあ要するに、アスキーVSタイルのファイナルファイトはファイナルをとうに通り過ぎた過去のものと言ってよいでしょう。

 文字の良いところは実装コストが極めて低いし著作権の問題(本名で登場のガチャピンてなんなの?)をスルーできる! もちろん、なんのシンボルか? アンデッドなのか、四足獣なのかすぐわかる! なんてとこでしょうか。

 タイルでモンスターが視認しやすい場合や、また――いちばん重要なのが――絵があることでゲームの入門者がとっつきやすくなるのなら、絵があったほうがいいのは当然です。グレートタイルアーティスト達、板倉さん(id:ita)、タイル版作ったぬるぽ堂さん、Denziさん、変愚の現メンテナの絵師Deskullさん、そして変愚タイルの人RENさん、あとなんかAngbandとかのを昔から描いてる海外の人たちに感謝しながら、魔除けを得たりオーブを盗み出したりサーペントを倒したりするのがよいでしょう。

 どっちもよい。それでバンバンザイでしょう。

 で、掲題の「ユーズ ユア イマジネーション」てのは?

 これはいわゆるASCII派がその昔言い出したことで、過言すれば言霊です。NetHackのやりすぎで「:」がトカゲに思えるし「@」は「@さん」であってなんかもうなんらかの人間にしか見えない境地にいる人達が、トチ狂って言い出したフレーズになります。
 これはNetHackについて主に言われていた感があります。例として英語版では「あなたは雑音を聞いた。」(You hear some noises)となっているのが、日本語版では「なにかが戦う音を聞いた.」となっていたりします。いや翻訳の話じゃあなかった。つまり、結局それがどういった音なのかはプレイヤーであるあなた自身のイマジネーションにかかっているのです。「盾と槍がぶつかる音」かもしれないし「ケガを負わされた声『ITEッ』」や「飛びかかろうとするモンスターの威嚇」かも。そういうのはNetHack文学においては挙げればキリがありませんが、まぁ一例として、ペットの犬猫が食べ物をガツガツ食べてるのもイマジネーションを使うべきところ、使ってないならイマジネーションを使わされているところです。キトゥンもハウスキャットもラージキャットもかわいいね! かわいいね! 単なる「f」なのにね! 「large cat」って良いよね。
 そんなわけだから「テンシ プラネター」「A」が「みすずちん」というのはまあ正しい遊び方なんです。なんなら変愚ならタイル描きかえ合法だし!
 ただしバックアップチート、テメーはダメ of the ダメダメだ。
 AIR 杭 出川 すり替え ダレヤネーン
 SPIDAHMA大好き。

 ASCII派はもちろん、タイル派も使おう、イマジネーション。イマジン。そんなに難しくないから。ジョンもそう言ってるから(ジョン・レノン)。

 以上! 来年もよろしく!

 ☆ ☆ ☆

 おまけ。

 そして、なぜかお絵かきにハマりだしたベッキーさんはイマジネーションを使う練習にハマりはじめ、とりあえずNetHackの全職業描くかー、と以下のようなものを何年か前に描きました。

A
考古学者(ジョーンズとは言っていない)

B
野蛮人(ツーハンデッドソード)

C
洞窟人(うるせぇアキリスぶつけんぞ)

H(キュア)


K(桂馬トビが得意)

M(破戒僧になるかどうかはプレイヤー次第)

P(混沌のプリーストとは)

Ra(アーチャーを兼ねる)

Ro(実はモンクに次ぐ最弱ではないか)

S(古いバージョンではフォーチュンクッキーを持っていた)

T(カメラ)

V(盾強い)

W(いい本を持っているのでいいね)


Flame Mage

Ice Mage

Androidスマホでギリギリできる*bandの話

この記事は Roguelike Advent Calendar 2022
https://adventar.org/calendars/7815
への寄稿(その2)となります。

 おはようございます、こんにちは、あるいはこんばんは、パソコンのないベッキーさんです。

 スマホ変愚蛮怒? 操作性に無理ありすぎだろ……と思うでしょうが、実はできます。
 Android端末で「UserLAnd」というLinux環境で日本語の変愚蛮怒そのものもできるのです。やりかたはググればなんとかなります。頑張れ頑張れ! 気持ちの問題だ! あきらめるな!

 しかし、日本語環境を整えると5GB強くらいになってしまうのでアンインストールしてしまいました。ウマ娘とかもアンインストールしてしまいました。断捨離などではなく、しかたなかったからです。しかたなかった。
 その本家変愚のセーブファイルはクラウドストレージにアップロードしてあるのでたぶんパソコン手に入ったら続きができる……といいな。

 さて、ここからが本題なのです。
 Android端末で*bandをやる、もう一つの方法を紹介します。

 まず物理キーボードを用意します。今この記事を書くのに使ってるブルートゥースのやつは安物買いの銭失いというやつで、Enterキーを押すとたまに「二連打」になってしまう不具合があり難儀しています。保証は切れています。残念。

 キーボードは用意された? AndroidタブレットPC(?)だから最初からついてる? まあ用意された前提で行きます。

 まずGooglePlayに行き、「Angband」で検索すれば出てきます。アンオフィシャルポート(非公式移植版)とか書いてあるやつです。
 それをインストールしましょう。起動しましょう。

 以上!

 ……………

 いや変愚蛮怒が入っていない? たしかに。

 しかし! なんということでしょう! 変愚蛮怒のバリアントの一つが入っています!

 それが『FrogComposband』です!

 バリアント切り替えオプションがあるのでFrogComposbandを選びましょう。
 思ってたのより√100倍くらいスゴイバリアントです。まだ開発途上などの文言もありますが。

 とりあえずこのスクショを見てくれ。こいつをどう思う? (ズレてるのは単にHTMLを機械翻訳しただけだからです)

(追記 : 解像度が変になるとは思わなかった……ヘルプファイルのスクショのはずでした)
追記の追記:Twitterにもスクショ上げました。こっちなら見られるはず。
https://twitter.com/alicebecky10/status/1605524800822091778

 楽しげですね。デュエリストとは? ルーンナイトとは? 実験的要素マシマシです。これは近接戦闘クラスに分類されているクラス(職業)のヘルプファイルの一部だけです。この規模で、メイジやその他が沢山あります。盗賊系専用領域魔法なんてのもあります。「その他」のクラスでは錬金術師が興味深いです。
 まあやってみて下さい。

 でも、読者様がやってみる前につらつら語ります。

 個人的に、これは本家に逆輸入すべきと思うものがいくつもあります。幻想蛮怒(未プレイ)とかに既にありそうですが。

 少しだけ、変愚本家にあればいいのに、を挙げておきます。

 まず筆頭は与えたダメージの値が表示される機能(ただしオプション)です。TObandにもありましたね。モンハンライズで数字が出て「なぜ今までこれがなかったのだ」と思ったことが記憶に新しい、そういうやつです。FrogComposでは「You do 42 damage.」などと出ます。これ、バニラ(既にバニラという名のバリアントになっていることに注意)では単に攻撃メッセージのあと数字が「(42)」とつくようになってたりします。

 次が種族です。職業です。性格です。多いです。多すぎます。

 性格も沢山追加されています。
 中でも見るべき性格は「Chaotic」。これを選ぶと、どの種族/職業でもカオスパトロンがついてくれます。さらに、どの神のオモチャになるかを自由に選ぶことができます。さらにさらに、スタート時のオプションで「種族変容」という情け無用な天罰を無効にしてゲームを進めることもできます。イイね!

 職業! 当然のようにここが最大のポイントです。
 実験的職業が色々ありますが、特に気になったのはアルケミストモーラーです。
 アルケミストは、ポーション(「水」「油」含む)で色々できて楽しいです。魔法書は使えず、殴り職なのかもしれません。ヒーローの薬にクラス限定ボーナスがあり、少し加速がつくのでそれでなんとか敵を上手いこと料理して下さい、などとあります。
 モーラー(強撃戦士?)は重量のある両手持ちの武器による一撃を重視した戦士といった感じです。筆者はまだあまりやってませんが、最終装備でスゴイことになるのでしょうか。でも解析されたら普通の戦士より弱いかも?
 メイジ系にも色々あります。
 グレイメイジは少しの個数しか魔法を覚えられませんが、学習時以外は本無しで魔法を使え、スペルマスターのように自由に、ほぼどの本からも学習できます(ただし、ロー、ニュートラル、ケイオスのバイアスを選ぶことになります)。おそらく中盤以降は学習のスロットを上書きしていくことになります。
 イエローメイジは未プレイですが、説明によると「連射」のように魔法を使えるらしいです。
 ブラッドメイジはHPを犠牲にしてなんとかするようです。
 そのほかまだまだありますが、キャラクター作成画面が洗練されているところも理想的です。

 そして種族。色々あります。「生い立ち」をオミットすることで実現しているようです。
 このへんは本家より沢山あるよ! 程度です。

 アイテムに関してもかなり手が入っています。
 魔法棒が自然充填されたり、エゴアイテムな魔法棒があったりします。ロケットはどうなっているのだろう……そこまではたどり着いてません。
 ポーションは、Curingが寺院で販売されており、おそらくそこそこ重要になっています。状態異常を治すため中盤には必須? またしてもそこまではたどり着いていません。

 今のところ(たぶん)英語版しかないのですが、日本語版に慣れている強靭なる変愚蛮怒プレイヤーは問題なく入っていけるでしょう。FrogComposbandに触れたくてワクワクしてきたのなら一見の価値ありまくりです。
 なにより、スマホでできるとは思わなかった!

 よくわからん説明ばかりですが、やればわかります。よくわからん「ときめき」みたいなものを感じること間違いなしです。
 幻想蛮怒のほうがスゴイかもしれませんけどね!

 色々事情はあるのですが、来年には自分専用のパソコンを手に入れることができるようにがんばりたいベッキーさんです。
 今後ともよろしく。

 ではまた。

自作ローグライクアクション

この記事はローグライクアドベントカレンダー2022への寄稿となります。
https://adventar.org/calendars/7815

 せっかくだから「ロシア人を上に!」というゲームを紹介させていただきます。
 ブラウザですぐ遊べるのでぜひやってみて下さい。indoxは「印度エックス」と読みます。
https://pachenya.github.io/web/indox.html
(今年のゲームじゃあないけど……)

(以下、かなりどうでもいい話)

 問題があるとすると、読みづらい配色のタイトルページですね。

 いえ「ロシア」が不謹慎になってしまい涙したベッキーさんです。
 てとこですね。
 戦争てオマエ。ふざけたことしてるとセイウチのケツにドタマつっこますぞ。というかテレビがなくて状況がわからないんですけど。
 念のため、政治的意図は全くないゲームです、とことわっておきます。去年のだし。

 ついでに嬉しかった感想にこんなところで返答。
「SSランクとった」
 天才ですね! 私にはとれません。
 ちなみにランクはクリアタイムでのみ付けられています。得点はランクと関係ないです。
「ドライバーでもスパークでもなくバスター」
 同意!
「夢中になれる」
 嬉しい!
「これ何面まであるん?」
 ローグライクなのでだいたいINTMAXみたいな面まである!

 まだほかにいくつも感想いただきましたが記憶が飛んでるのでスミマセン。

 ラスボスは「売人マン」です。とだけ言っておきましょう。

 世界平和!
 世界平和!

 ドモホルンリンクル!
 ドモホルンリンクル!

 では。

(変愚蛮怒で)○○○○を失った話

 ローグライカー諸君! 私がロストリンギル少佐のプレイヤーだ! 最近二階級特進してしまったぞ!

 以上!

※この記事はRoguelike Advent Calendar 2021 への寄稿です。

 

 以下どうでもいい話!

 このブログの人気記事『変愚蛮怒用語集』については、多めにウソが入っています。変愚プレイヤーが見れば「わけわからん」「そんな用語はない」とわかるものです(「砲形」とか)。『今日のウソ』タグが付いた記事なので、超テキトーに、私以外の誰かがリンギル落としをやってしまったこととしか思えない風に書いていたのは否めません。自作自演(←?)、虚言癖と言われても仕方ない面もあるでしょう。御不便をおかけしてすみません。

 ちなみに「武器落とし」がある文字画面ローグライクというのはいくつかあります。私のプレイした範囲では、ADOMでは日常茶飯事で、Animebandにもおそらく有りました(Animebandのほうは詳細不明。あとNetHackのネタバレはしません)。

 まさか変愚蛮怒にそれがあるとは知らなかったのです。本当に知らなかったのです。

 しかし、変異を取り除く施設へ向かう最中の広域マップで落としたのは確かです。武器を落とさないためにはバックパックにしっかりとしまっておきましょう。どんどんしまっておきましょう。


 さて、大佐に二階級特進したのはどのダンプなんだ? 種族、職業、性格は? といった最大の疑問がいくつかあると思います。

 結論から言えば、全く覚えていません。御不便をおかけしてすみません。その数カ月後に当時の自分のPCをあさりましたが、見つけることはできませんでした。死亡ダンプはおそらくスコアサーバに送信しておらず、さらにはセーブファイルの行方を知ることは実家の当時のPCが壊れているらしいので永久に不可能でしょう。

 自分自身での推測をしてみます。

 カオス領域魔法を使っていたのは確かです。ですが、混沌の戦士を使うことはほぼないのです。理由は特にないつもりですが、強いて言えば種族シャッフルという恐るべきものを避けるためでしょう(しかし、使ったこともあるので混沌の戦士が完全に候補から外れることはないです)。すると、レンジャーという強職も候補にあがります。しかし、私の性格上、レンジャーでなくて魔法戦士を選ぶことのほうが多いと思われます。当時は。では、生命プリーストか? 大いに有り得そうですが、微妙なところです。結局はメイジが本命になります。仙術・カオスあたりでしょうか。いやいや、ハイメイジかも……予想だけでキリがありません。

 要するに、残念ながら「不明」としか言いようがありません。御不便をおかけしてすみません。


 最後に――とくに隠しているつもりはありませんでした(8年のブランクの後のネットへの復帰後には)。IRCスマホで参加させていただいたとき「リンギル落としたの自分です」と一度報告しましたが、反応は薄く、そのログもとってありません。Twitterで書いたこともありますが、そこでも反響はほぼありませんでした(いいねくれた人、ありがとー!)。


 ベッキーだぞー。大佐だぞー。


 では。

C++版

#include <stdio.h>

#define CHECK_ALL
#define N_ANS 3

int ata_map[8][8];

void clear_map()
{
  for (int i = 0; i < 8; i++)
  {
    for (int j = 0; j < 8; j++)
    {
      ata_map[i][j] = 0;
    }
  }
}

const int yyy[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
const int xxx[8] = {-1, 0, 1, -1, 1, -1, 0, 1};

bool put_q_yx(int y, int x)
{
  if (ata_map[y][x])
    return true;

  for (int i = 0; i < 8; i++)
  {
    for (int j = 0; j < 8; j++)
    {
      int ypos = y + j * yyy[i];
      int xpos = x + j * xxx[i];
      if (ypos < 0 || ypos >= 8 || xpos < 0 || xpos >= 8)
      {
        break;
      }
      else
      {
        ata_map[ypos][xpos] = 1;
      }
    }
  }
  ata_map[y][x] = 2;
  return false;
}

void print_map()
{
  putchar('\n');
  for (int i = 0; i < 8; i++)
  {
    for (int j = 0; j < 8; j++)
    {
      if (ata_map[i][j] == 2)
      {
        putchar('Q');
      }
      else
      {
        putchar('.');
      }
    }
    putchar('\n');
  }
}

int main()
{
  int ans = 0, cnt = 0;
  int iii[8];
  for (int i = 0; i < 8; i++)
  {
    iii[i] = 0;
  }
  int t = 0;
  for (iii[0] = 0; iii[0] < 8; iii[0]++)
  {
    for (iii[1] = 0; iii[1] < 8; iii[1]++)
    {
      for (iii[2] = 0; iii[2] < 8; iii[2]++)
      {
        for (iii[3] = 0; iii[3] < 8; iii[3]++)
        {
          for (iii[4] = 0; iii[4] < 8; iii[4]++)
          {
            for (iii[5] = 0; iii[5] < 8; iii[5]++)
            {
              for (iii[6] = 0; iii[6] < 8; iii[6]++)
              {
                for (iii[7] = 0; iii[7] < 8; iii[7]++)
                // the main loop.
                {
                  bool is_hit = false;
                  bool flg_cont = false;
                  clear_map();
                  // and build map
                  for (int i = 0; i < 8; i++)
                  {
                    is_hit = put_q_yx(i, iii[i]);
                    if (is_hit)
                    {
                      flg_cont = true;
                      break;
                    }
                  }
                  if (flg_cont)
                    continue;

                  print_map();
#ifndef CHECK_ALL
                  ans++;
                  if (ans >= N_ANS)
                  {
                    return 0;
                  }
#endif
                  clear_map();
                } // end of main loop
              }
            }
          }
        }
      }
    }
  }
  return 0;
}