仲間との出会い
鈴木は、仲間との連携が不可欠な高難度依頼に興味を持つ。彼は、ある魔法使いの少女が持つ「呪文が自分に当たる」という致命的なバグに遭遇。ソースコードを解析し、単純な参照エラーを修正することで、彼女は本来の力を取り戻す。
「絶対に登れない崖」の当たり判定バグを修正したことで、鈴木は冒険者たちの間で「幸運をもたらす男」として、ある種の神格化された噂の的となっていた。もちろん、彼自身はそのことに全く気づいていなかったが、彼のデバッガーとしての魂は、次の獲物、すなわち、より複雑で厄介なバグを求めて疼いていた。
彼は、情報が集まる場所としてギルドに併設された酒場に足を運んだ。単独で解決できるバグ(単体テスト)も面白いが、SEとしての醍醐味は、やはり複数のシステムが絡み合うことで発生する予期せぬ不具合(結合テスト)にある。つまり、彼が今求めているのは、パーティ単位で挑むような、より高度な問題だった。
酒場の喧騒の中、様々な依頼の成功譚や失敗談に耳を傾けていると、ひときわ興味深い噂が彼の耳に飛び込んできた。
「聞いたか? "災厄のリナ"が、またパーティをクビになったらしいぜ」
「ああ、あの天才と名高い魔法使いか。詠唱は完璧なのに、撃った魔法が全部自分に返ってくるっていう…」
「もはや呪いだな。あいつと組むのは自殺行為だ」
「才能があるだけに、可哀想なこった」
冒険者たちは、同情と嘲笑をない交ぜにした声で、一人の少女の噂話をしていた。
その話を聞いた瞬間、鈴木の目がカッと見開かれた。「魔法が自分に返ってくる」。それは、呪いなどというオカルト的な現象ではない。プログラミングにおいて、あまりにも典型的で、初歩的で、そして致命的なバグの症状だった。
「ターゲット指定のポインタ参照エラーか、あるいは戻り値の処理ミスか…。面白そうだ」
鈴木の口元に、獲物を見つけた肉食獣のような笑みが浮かんだ。彼は早速、その「災厄のリナ」という少女を探し始めた。
リナを見つけるのは、そう難しくなかった。彼女は酒場の最も暗い隅のテーブルで、たった一人、フードを深く被って俯いていた。その背中からは、才能を正しく使えないことへの絶望と、周囲からの孤立による深い孤独感が滲み出ているようだった。鈴木は、そんな彼女の向かいの席に、断りもなくどかりと腰を下ろした。
「君が、リナだろ」
リナは驚いて顔を上げた。その瞳には、警戒と怯えの色が浮かんでいる。
「…誰?何の用?私を笑いに来たのなら、あっちへ行って」
その声は、ハリネズミのように全身の針を逆立てているかのようだった。
「笑いに来たんじゃない。君のその不具合、俺がデバッグしてやる」
鈴木は単刀直入に告げた。彼の口から出た「不具合」や「デバッグ」という言葉に、リナはきょとんとした顔をする。
「…バグ?何を言ってるの?これは呪いよ。高名な神官様にも解けなかった…」
「神官にシステムのバグが直せるわけないだろう。専門外だ。いいか、君の問題は呪いなんかじゃない。十中八九、魔法を発動する際のターゲットポインタの参照先が、意図せず自分自身(self)のオブジェクトに向くようにハードコーディングされているだけだ。これはソースコードを解析して、正しい参照先に修正すれば直る」
鈴木は、前世で後輩に仕様を説明する時のような、オタク特有の早口で一気にまくし立てた。リナは彼の言葉の半分も理解できなかったが、その自信に満ちた、しかしどこかズレている物言いに、今まで彼女に近づいてきた人間とは全く違う何かを感じ、ただただ圧倒されていた。
鈴木は、有無を言わさずリナの腕を掴むと、半ば強引に酒場の外、街はずれにある訓練場へと連れ出した。
「ここで、君の一番簡単な攻撃魔法を、あそこの的に向かって撃ってみろ。原因を特定してやる」
リナは、あまりの強引さに戸惑いながらも、彼のただならぬ雰囲気に押され、言われるがままに詠唱を始めた。彼女の手のひらに魔力が収束していく。その練度の高さは、素人の鈴木にも分かった。
「小さき炎の矢よ、彼の者を穿て!『ファイアボルト』!」
詠唱が完了した瞬間、リナの手から放たれた炎の矢は、しかし、的とは全く逆の方向へ、まるでブーメランのように綺麗な弧を描いてUターンし、彼女自身のローブの袖に見事に命中した。
「きゃっ!」
小さな悲鳴と共に、袖がわずかに焦げる。幸い、自分で制御しているため威力は最小限で、火傷には至らなかったが、これが彼女の「呪い」の正体だった。
しかし、魔法が発動したそのコンマ数秒の間に、鈴木はやるべきことを全て終えていた。彼は【デバッグ・コンソール】を全開にし、魔法が実行された際のシステムログをリアルタイムで追跡していたのだ。コンソールには、膨大なデータが滝のように流れていく。
Event: MagicCast triggered by object 'Rina_Mage_01'
Function call: cast_magic(spell='Firebolt', caster='Rina_Mage_01', target='Dummy_Target_07')
... Entering function cast_magic ...
variable damage_value = calculate_damage(caster.magic_power);
variable target_pointer = caster.pointer; // CRITICAL BUG FOUND!
deal_damage(target_pointer, damage_value);
...
「…ビンゴだ」
鈴木は、問題のコードを発見し、思わず呟いた。やはり、彼の予想通りだった。ターゲットを指定するための内部変数target_pointerに、引数で渡されたtarget(的)のポインタではなく、術者自身(caster)のポインタを代入してしまっている。あまりにも初歩的なコーディングミス。これでは、どんな魔法を撃っても自分に当たるのは当然だった。
「よし、今から君の魔法プログラムに、修正パッチを当てる。少し動かないでくれ」
鈴木はそう言うと、コンソールに意識を集中させ、リナのオブジェクト設定に直接介入するコマンドを組み立てた。これは、稼働中のサーバーのコードを、root権限で直接書き換えるような、極めて高度で危険な行為だ。
edit_object('Rina_Mage_01') {
function cast_magic(spell, caster, target) {
variable damage_value = calculate_damage(caster.magic_power);
variable target_pointer = target.pointer; // Patched!
deal_damage(target_pointer, damage_value);
}
}
commit;
彼は、リナの魔法詠唱を司る関数そのものを、正しいコードで強制的に上書き(オーバーライド)した。
「よし。もう一度、同じように撃ってみろ」
鈴木の言葉に、リナは半信半疑ながらも、再び詠唱を始めた。彼女はもう何度も、こうして期待しては裏切られてきたのだ。しかし、目の前の男の、揺るぎない自信に、これが最後かもしれないという、かすかな希望を託した。
「『ファイアボルト』!」
今度こそ、彼女の手から放たれた炎の矢は、まっすぐな軌道を描いて空を切り裂き、訓練用の木の的に深々と突き刺さった。ジュッ、という音と共に、的から白い煙が上がる。
リナは、その光景を信じられないものを見るように、ただ呆然と見つめていた。自分の手。まっすぐ飛んでいった魔法。そして、ダメージを受けている的。今まで一度も見ることのできなかった、当たり前の光景。その事実が、ゆっくりと彼女の脳に染み渡っていく。
「…治った」
ぽつりと呟いたその言葉は、やがて嗚咽に変わった。
「治った…!私の魔法が…!うわああああん!」
長年の苦しみと絶望から解放された彼女は、その場に崩れ落ち、子供のように泣きじゃくった。その涙は、彼女を縛り付けていた「呪い」という名のバグが、洗い流されていく音のようだった。
鈴木は、泣き続けるリナの隣にしゃがみ込み、少し照れくさそうに頭を掻いた。
「だから言っただろ。バグは、直せばいいんだ」
そのぶっきらぼうな優しさに、リナは涙でぐしゃぐしゃの顔を上げて、何度も、何度も頷いた。
「ありがとう…!本当に、ありがとう…!」
「礼には及ばない。それより、一つ提案がある。よかったら、俺とパーティを組まないか?」
鈴木は、彼女の強大な魔力という、新たな「ツール」に目をつけていた。
「この世界は、君が思っている以上にバグだらけなんだ。それを修正するのに、君の力が必要になるかもしれない」
その提案に、リナが否やを唱えるはずもなかった。彼女にとって、鈴木は呪いを解いてくれた恩人であり、初めて自分を必要としてくれた、唯一無二の理解者だった。
こうして、最強のデバッガーと、バグから解放された天才魔法使いという、異色のコンビが誕生した。彼らの前途には、この世界の根幹を揺るがすような、さらに巨大で厄介なバグが待ち受けていることを、二人はまだ知らない。