第12話「スタックオーバーフロー」
第二層は、別の世界だった。
天井が高い。松明のない広間に踏み込んだ瞬間、その空間のスケールが体で伝わってきた。壁面に埋め込まれたクリスタルが青白い光を放ち、石造りの柱が等間隔に並んでいる。前世のSEとして見慣れたサーバールームよりも、ずっと広い。ずっと静かだ。
そして静寂の中央に——それがいた。
「でかい……」
誰かが呟いた。
俺も同じ言葉しか出てこなかった。
体長三十メートルは超えている。翼を広げれば広間の半分を覆い尽くすだろう。全身を覆う鱗の一枚一枚に古代文字が刻まれており、それが微かに発光している。まるで生きたストレージだ。両の眼が赤く輝き、俺たちを認識した瞬間、低い唸り声が石床を震わせた。
「リカーシブ・ドラゴン」
デバッガーズ・アイが名称を拾う。俺は即座に詳細を展開した。
```
[ENTITY: Recursive_Dragon]
HP: 9200 / 9200
攻撃: 物理+炎属性(高威力)
防御: 極厚鱗(物理-60%)
特殊: HP_REGEN_RECURSIVE
├ HPがゼロに達した場合、再帰関数で再計算
└ 終了条件(base case): 未定義
```
「——HPが関数定義だ」
俺は眉をひそめた。
「何?」とガルドが隣で聞く。
「ダメージを与えてHPがゼロになった瞬間、HPを再計算する関数が呼ばれる。その関数が自分自身を再び呼び続ける仕組みになっている——終了条件なしの無限ループだ。理論上、何度倒しても全回復する」
「……つまり不死ってことか」
「そういうことです」
ガルドが「なるほどな」と言いながらニヤリと笑った。普通の人間なら絶望する状況で笑えるのは、この男がどうかしているからか、それとも実力に裏付けされた余裕なのか——どちらでもあると思う。
魔法師の一人が「攻撃してみます」と前に出た。
止めようとしたが間に合わなかった。
炎の柱が展開された。高温の術式がドラゴンを包み、鱗の表面が焼け、HPが削れていく。九千、七千、四千、一千——
HPがゼロに達した。
次の瞬間、ドラゴンの全身が金色の光に包まれた。
```
HP_REGEN_RECURSIVE: 起動
function regen() → calls regen() → calls regen()...
再帰深度: unlimited
出力: HP = 9200
```
ドラゴンは何事もなかったように立っていた。HPが全回復している。傷一つない。
「嘘だろ……」
魔法師が力を使い果たした顔で呟いた。
「嘘じゃない。設計上の問題です」
俺は冷静に答えながら、内側では高速で解決策を組み立てていた。
再帰関数に終了条件を書き込む。それしかない。
プログラミングの基礎中の基礎だ。再帰的に自分を呼び続ける関数は、必ず「ここで止まる」という条件(base case)を持たせなければならない。それがなければ関数は無限に自分を呼び続け、処理が終わらない——あるいは今回のドラゴンのように、終わらせたくても終わらない存在が生まれる。
問題は、コードを書き込むためにはドラゴンの体に直接接触する必要があることだ。
デバッガーズ・アイのLv.2は、接触なしでも読み取りはできる。だが改変——コードの書き込みには、対象との物理的な接触が条件になっている。あの体長三十メートルのドラゴンに、どうやって触れるか。
「ガルド」
「おう」
「頼みがある」
ガルドが俺を見た。その目が——わずかに変わった気がした。「頼みがある」という言葉に、俺が普段どれだけ人に頼らないかを知っているひとの目をしていた。
「ドラゴンの動きを止めてくれ。俺がコードを書き込む間だけでいい。全力でなくていい、あくまで動きを封じるだけだ」
「それは全力が必要なのと変わらんぞ」とガルドが笑う。「でもわかった。お前が終わったら合図しろ」
「合図したら全力で一発くれ。それで終わる」
「期待してろ」
ガルドが盾斧を構えた。全身から気迫が膨らむ——普段の飄々とした雰囲気が、完全に剥がれ落ちた。Bランク冒険者の、本気の顔だ。
同時に、アリアが俺の腕を掴んだ。
「レン。あなたが接触している間、私が援護します。横からドラゴンの意識を引きつけます」
「助かります。殿下」
「動ける間に動く。それだけです」
アリアは淡々と言ってから、東側に回り込んでいった。「第二条件・陽動」——彼女の剣法の応用技だ。威力は高くないが、的確に注意を引きつける。
ガルドが突進した。
盾斧でドラゴンの前足を真正面から受け止め、信じられない膂力でその場に押しとどめた。三十メートルの体重を真っ向から受け止める男が、普通の人間であるはずがない。地面が陥没し、石床に亀裂が広がる。
「早くしろよ蓮! 地味に重いぞこいつ!」
俺は走った。
ドラゴンの後ろ足へ。接触できる最も安全な場所を選ぶ。鱗の表面に両手を押し当てた。
流れ込んでくる。
ドラゴンの源コードが、指先から意識の中に流れ込んでくる。巨大な情報量だった。人間のコードとは桁が違う——一体のドラゴンが保持しているコードの量が、クウォレン村全体のそれを超えている。
でも。
目的の場所は見えている。
```
// 再帰再生関数(問題箇所)
function HP_REGEN() {
this.hp = HP_REGEN() + 9200;
// base case: 未定義
}
```
「——ここだ」
俺は書き込む。MP(魔力)が急激に消費される感覚がある。頭が軽くなる。視界の端が白み始める。それでも手を止めなかった。
```diff
function HP_REGEN() {
+ if (this.damage_accumulated >= threshold) {
+ return 0; // base case: 累積ダメージが閾値超過で再生停止
+ }
this.hp = HP_REGEN() + 9200;
}
```
「——完了」
「よし!」
ガルドが後退した。前足から解放されたドラゴンが咆哮を上げ、俺に向かって首を振り回す。俺は転がりながら距離を取った。アリアが「今です!」と叫んだ。
ガルドが振り返った。
盾斧を真上に掲げ——全体重を込めて振り下ろす。
奥義「スタックオーバーフロー」。
蓄積した全ての運動量を一点に収束させる一撃。ガルドの全身の血管が浮き上がり、盾斧が赤みがかった光を帯びる。衝撃波が走った。石床が砕け、断片が弾き飛ぶ。
ドラゴンに直撃した。
轟音。
広間全体が震えた。
ドラゴンのHPがゼロに達した。そして——書き込んだbase caseが発動した。再帰関数が終了条件を認識し、再生を止める。
ドラゴンの巨体が、ゆっくりと崩れていった。
鱗の一枚一枚が光の粒子に変わり、消えていく。古代文字が最後の光を放って——消えた。
静寂。
ガルドは膝をついていた。右腕が小刻みに震えている。奥義の反動だ。あの一撃の代償が、彼の体の中に残っている。
俺は黙って近づいた。
懐から回復薬を取り出し、ガルドの手に押しつけた。
「……ありがとな」
ガルドが短く言った。
「こちらこそ」
それだけ言って、俺は立ち上がった。
魔法師たちが言葉を失っている。あの再生するドラゴンが、ただの一撃で消えた。コードを書き換えることで、不死の存在を討滅した。理解が追いついていないのだろう。
アリアだけが俺をまっすぐ見ていた。
驚きの中に——何か別のものが混じっていた。羨望とも畏怖とも取れる、複雑な光だ。俺がアリアの視線に気づいて目を合わせると、彼女はわずかに目を逸らした。
「……見事でした」
それだけ言った。アリアにしては珍しく、素直な言葉だった。
塵が晴れていく。
広間の中央——ドラゴンが鎮座していた場所に、何かが浮かび上がっていた。
光を帯びた金属製の球体。直径一メートルほど。表面に回路のような文様が刻まれており、ところどころが淡く発光している。
デバッガーズ・アイが反応した。
```
[DETECTED: Ancient Storage Unit]
type: data_storage
内部プロセス: 1件格納中
状態: 休止中(HIBERNATING)
破損: なし
```
ストレージユニット。データを長期保存するためのシステムだ。
中に、何かのプロセスが、停止状態のまま格納されている。
「レン、あれは何だ?」
ガルドが回復薬を飲みながら聞く。
「わかりません——まだ」
俺は球体に近づいた。表面の回路模様が、デバッガーズ・アイの照射に反応して淡く輝く。
内部のプロセスは——生きている。ただ眠っているだけだ。
次回、第13話「メモリの起動」——古代のストレージが光を放ち、水色の髪の少女が目覚める。彼女の名は「メモリ」。世界の始まりから存在する、唯一の証人。




