第3章 魔法ギルドからの脱出!迫るGit Merge攻撃
森の中に身を潜めて数日。ギルドから完全に逃げ切れるわけでもなく、かといって奴らを真正面から迎え撃つだけの準備もないまま、俺とリナはじりじりと焦りが募っている。
前にギルドの地下で魔王コードの一端に触れたことで状況が好転するかと思いきや、むしろ「魔王コードをいじれる異端者」呼ばわりされ、厄介度が天井知らずにアップした感じだ。
とはいえ、このまま森の中で野宿を続けるのも限界がある。いつまでも逃げ回るだけじゃ先に進めない。俺は落ち着きを取り戻すために、小さな焚き火のそばでコードのログを眺めている。
頭の中に直接浮かぶようになった“術式管理画面”に、「まだ未整理のコンフリクトがある」とか「最新の魔王コードを取得しますか?」的なメッセージが散見されるから、どうにも胸騒ぎが消えない。
おそらく世界の各地で続々と魔法が暴走しているということなのだろう。
「創也くん、大丈夫?」
リナが木の枝をかき集めながら心配そうに見つめてくる。彼女も地面に転がしている短めの杖を手に取り、かじかんだ指先を温めている。まさか異世界で野営生活とは思わなかったが、おかげで自然に慣れてきた気がする。もっとも、寒さだけはまだきついけど。
「うん、なんとかな。でも、そう長くは持たないな。どっかでまともな寝床を確保しないと」
「町に戻りたいけど、ギルドが警戒してるよね。あのヴァイスって人、しつこく探してるんじゃないかな」
「ヴァイス・マージ、な……。相当ヤバい奴だってのは一度やり合ってわかったよ」
頭に思い浮かぶのは、地下保管庫での死闘。彼が振るった強烈な魔法攻撃を、俺が必死で“git stash”や“git rebase”でなんとか防いだ記憶がまだ生々しい。あの一戦を逃げ切れたのは正直なところ運が良かっただけだ。相手の攻撃スキルはかなり高い。
しかもギルドの粛清部隊を率いている以上、増援を引き連れてくる可能性もある。今度同じように奇襲を食らったら厳しいかもしれない。
「だけど、これ以上ここにこもってても魔王コードは直せない。むしろギルドが本腰を入れて攻めてきたらアウトだな」
俺がそうつぶやくと、リナが静かにうなずく。そもそも魔法ギルドは大人数で組織立った戦闘を仕掛けてくるはずだ。火球や雷撃の術式なんて掃いて捨てるほど持っているだろうし、突き詰めて考えると逃げ場なんてそう多くない。
何より、ゴールとしては魔王コードの完全修正を目指さなくちゃいけないのに、こんなところで足踏みしてる場合じゃない。
「だったらもう一度、ギルドの本部に乗り込むの?」
リナが息を呑むように言う。正面突破なんて無謀だと思うが、迂回ルートを探したところで奴らが組織的に動けばどうしようもない。とはいえ、俺にはまだ“Git操作”という奥の手が残っている。このスキルがあれば何か突破口が開けるかも……そう思っていた矢先、
「……ん? なんか来てるな」
森の奥から小さな魔力の気配を感じる。ほのかな光が木立の隙間をゆらゆら揺らしている。これは、まさか――急に心臓の鼓動が速まる。こんなタイミングで誰が来る?
リナと視線を交わし、俺たちは瞬時に焚き火を消して木陰に隠れる。ゴソゴソと落ち葉を踏む音が一つ、二つ、三つ……下手をすると集団かもしれない。ひそかな息づかいを押し殺して耳を澄ませると、
「いたぞ……あの辺りだ!」
聞こえてきた声は、やはりギルドの装束を身にまとった人間のものらしい。チラッと見えたのは二人か三人ほどか。だが彼らの雰囲気は、以前の粛清部隊とも少し違う印象を受ける。杖こそ持っているが、攻撃の構えには入っていない。
でも、ここで顔を出せば捕縛されるリスクが高い。俺はリナの手をぎゅっと握り、さらに木の影へ潜もうとする。
「待ってください! 私たちはギルドの正規部隊ではありません!」
急に女の声が森に響く。なんだ、彼女は敵意を示さずに叫んでる感じだ。こちらを探しながら必死に訴えている……とでもいうのか?
「ギルドで働いてはいるけど、魔法暴走を止めたいんです! もしあなたが“コードを修正できる人”なら……力を貸してほしい!」
なんとも奇妙な呼びかけ。コードを修正できる人――要するに俺のことを指しているのか?
俺はそっとリナを見やると、彼女も戸惑った顔で首をかしげている。どうやら相手は今すぐ攻撃する感じでもなさそうだ。でも油断はできない。
こっそり身を乗り出して相手の様子を探ると、三人の男女が小さな光球のような魔法照明を掲げ、こちらをキョロキョロと探している。腰にギルドの紋章を下げているが、武装自体は軽い。先頭の女性は髪をまとめた大人しそうな雰囲気で、どこか気弱そうに見える。
「……これ、どうする? 出るか?」
リナが小声で問う。正直、罠の可能性も捨てきれない。だが彼らの必死な感じは嘘っぽくもない。俺はひとまず慎重に、しかし隠れたまま声を張る。
「ギルドの粛清部隊か? もしそうなら、こっちには応じる義理はないぞ」
「違います、粛清部隊ではありません! 私たちは管理部門の下級メンバーで……術式の暴走に困っているんです! コードを修正できる方法を探していて……あなたの噂を聞きました!」
確かに、粛清部隊がこんなへりくだった物言いをするとは思えない。となると、本当に困っている管理担当かもしれない。俺はリナに目配せすると、彼女は「大丈夫そう」と無言で伝えてきた。よし、腹を決めてみるか。
木陰からゆっくり姿を見せると、向こうも驚いた表情で息をのむ。
まあ、お互いの立場を考えると怪しさ満点だが、こちらも一方的に敵を作りたくない。なるべく警戒の構えを解かずに問いかける。
「……で、あんたら何者?」
「わ、私はシエル・ブランチといいます! Gitのbranch操作に長けた部隊の一員で……えっと……“ブランチだけ”は速いって評価されていて……」
「ブランチだけ……変わった能力だな」
「はい、あの、branchやcheckoutを駆使して、術式を切り替えるのが得意で……でも、それだけで暴走を止めるのは難しくて……」
どうやら噛み締めるように必死で説明しているが、要するに“branch分岐の魔法”ができる人材というわけか。隣の二人も管理部門の新人らしく、同じく術式を制御しきれず困っているらしい。
彼らは低い位置に杖を構え、今は攻撃する気配はない。
「ヴァイス様のような力で押さえつけるのは危険だと思うんです。強引なmergeやpush --forceを繰り返せば、一時的には暴走を抑えられても、結局Conflictが増えるばかりで……」
「そりゃそうだ。強制マージなんて、バグの温床だしな」
思わずエンジニア魂が共感してしまい、俺はポロリと口を挟む。するとシエルはパッと表情を明るくし、深くうなずいた。
「そうなんです! 私たち下級メンバーでも薄々気づいてるのに、上層部は力押しでなんとかしようとしてばかりで……!」
「なるほどね。で、俺にどうしろと?」
警戒を解かずに促すと、彼女は少しうつむき加減で言葉を選ぶように唇をかむ。
「その……あなたが“コードを修正した”って噂は本当ですか? 火球の暴走を止めたり、ギルドの攻撃をリセットしたり……本当にそんなことができるなら、ぜひ教えてほしいんです。私たちも、どうにかバグを解消したい……」
俺はリナとちらりと目を合わせる。どうやら彼女たちは本気で助けを求めているように見える。しかし、ギルドの仲間という時点で信用しすぎるのはリスキーだ。
ここで「いいよいいよ」と受け入れたら、あっさり裏切られて粛清部隊に売り渡される恐れだってある。
「ギルドの上層部からは、お前らみたいなのを処刑対象だって言われてるんだけどね。その辺り、どう説明してくれる?」
少し意地悪な口調になってしまうが、こっちも必死なのだ。シエルは申し訳なさそうに眉を寄せる。
「はい……私たちは命令違反を承知で勝手に抜け出してきました。ヴァイス様のやり方にずっと疑問を感じていて……でも、他に道がなくて。もしあなたが本当に術式のバグを直せるなら、一緒に戦ってください……その、ギルドを止めるために」
「戦うって、相手は大勢いるんだろう?」
「それでも……私は、暴走魔法を終わらせたいんです」
その言葉には一切の嘘が混ざっていないように感じる。弱々しくも決意に満ちたまなざしに、俺は自然と息を呑む。リナも小声で「信じてもいいかもね」と囁く。
「……わかった。でも俺も、ギルドが大量に押し寄せてきたらどうしようもないよ。あいつら、火や雷やら色んな術式をほいほい投げてくるからな」
「だからこそ、branch分岐で味方を増やして魔法を制御する作戦を考えてるんです。私たちだけじゃ不十分だけど、あなたの“merge”と“rebase”があれば、Conflictを最小限にできるかもしれない……」
なるほど、branchとmergeで正しい手順を踏めば衝突を回避しながら少しずつ術式を安全化できる、という理屈か。確かにGitを使ったソース管理でも、branch運用は欠かせない。
バグ修正用のブランチを立ててから本流に統合するのが基本だ。魔王コードとやらも同じようにすれば、もしかすると安定させられるかもしれない――って、異世界なのにGitのセオリーが通じること自体、どこまでファンタジーなんだと思うが。
「ただし……ギルドの粛清部隊はもちろん、ヴァイス本人が出てきたら厄介だぞ」
俺がそう口にした瞬間、周囲の空気がピリつく。粛清部隊の名はやはり恐れられているらしく、仲間たちも不安げに視線を交わし合っている。
「噂では、ヴァイス様は“git merge --force”の使い手らしいです。通常のmergeよりもさらに強引な上書きを行って、大量の魔法を同時発動するんだとか……」
「普通はやらないよな、そんなこと……。Conflictだらけになるに決まってるのに」
「はい……でも圧倒的な力でねじ伏せられるから、表面上はギルドが制圧できてしまうんです」
なるほど、強引なpushやmergeを繰り返して勝利を収めているわけか。でもそれはバグを蓄積するだけで、いつか取り返しのつかないレベルに破綻が広がるはずだ。
だからこそ俺が呼ばれている……と頭では理解するものの、身体が緊張を覚える。次にヴァイスと戦うことになったら、前回のようにうまく逃げられる保証はない。
「……でも、確かに今の状況を放置すれば、世界が崩壊しかねない。バグ修正は急務だな」
「創也くん……やる?」
リナがこちらを見上げる。彼女の瞳にも迷いがあるようで、しかし、最後の決断を俺に委ねている感じだ。思わず苦笑がこぼれる。
まったく、過労死して転生した先で、さらに過酷なデスマーチに巻き込まれそうになるとはな。
「仕方ない。コードの暴走をこのままにしておくわけにはいかないからな。……あんたらも、その覚悟で来てるんだろう?」
「はい……ありがとうございます!」
シエルたちがほっと息をつく。表情が安堵に満ちている。こんなに素直に喜ばれると、こっちまで申し訳ない気分になるが、やはりギルド内部にも疑問を抱く者がいるということか。
全員が全員、“魔王コードは絶対だ”と盲信しているわけでもないのだ。
「じゃ、まず何をやるんだ?」
「ひとつ、私がbranchを切った“安全な魔法術式”をマージしてみませんか? もしConflictを起こさずに取り込めたら、今後の対策に使えそうな気がするんです」
なるほど、テスト的に小規模ブランチをマージしてみるのか。たしかにいきなりメインブランチにどかっと突っ込むのは危険だ。俺は頷き、手元に浮かび上がった術式管理画面を開く。
シエルたちのbranchがどんな変更を含んでいるかチェックしてみないといけない。
そこでシエルが魔法陣を展開し、「git branch」という声に合わせて、空中に複数の術式ファイル名が出現する。ファイル名は“FireFix_v2”とか“LightningSafeMode”とか、いかにも修正されたコードらしいネーミングだ。
俺がそれぞれの中身をざっと確認すると、確かにmana消費の最適化やエラー処理が追加されていて、バグを減らそうと努力した形跡が見られる。問題はこれを本流にマージする際、Conflictを起こさないかどうかだ。
「よし……とりあえず“LightningSafeMode”をマージするか。これで暴走しがちな雷術式を安全化できるかもしれない」
「はい、お願いします!」
シエルの声に合わせて、俺が「git merge LightningSafeMode」と唱える。すると術式管理画面に「Merging branch ‘LightningSafeMode’ into ‘master’…」と表示される。ワクワクしながら待っていると、
――Error: Merge conflict in Lightning.js――
「ああもう、やっぱり競合か」
思わず天を仰ぐ。案の定、Conflictは避けられなかった。
おそらく既存の雷術式との記述がかぶっているのだろう。シエルたちが「ごめんなさい!」と慌てているが、仕方ない。実際のソース管理でも、何かしらのConflictは起きるものだ。
「いや、いいよ。ここは俺の出番だ。‘git checkout’で片方を選ぶか、‘git rebase’で履歴を整理してみるか……。ちょい待ち」
俺はLightning.jsの競合箇所を視覚化し、どっちの記述が正しいかを選ぶ作業に入る。上段には既存の雷術式で mana消費量が大きく設定され、威力がやたら高いコード。下段にはシエルたちの修正で消費を抑え、暴走リスクを軽減する変更が入っている。これはもう迷わず下段を採用したい。
「git checkout --theirs」
ブツブツと呟きながら競合行を解消し、履歴のコメントを整えていく。しばらく細かい箇所を直し終えたあと、改めて「git commit」。すると画面に「Merge successful!」の文字が出現する。おお、成功したっぽい。
「やったね、創也くん!」
リナがパッと笑顔になり、シエルたちも感激の面持ちでこちらを見る。試しに“雷術式”を実行してみると、今までのように不意に暴発する様子もなく、穏やかに電気の球が生まれて消えていく。
これなら町で暴走していた火球や雷撃をある程度落ち着かせられるかもしれない。
「この調子でbranch運用すれば、段階的に魔法を安定化できるんじゃないか?」
「はい! Conflictさえ解消してもらえれば、私たちも協力します!」
シエルたちの目に希望の光が宿る。しかし問題は、この動きをギルド上層部が黙って見過ごすはずがないということだ。ましてや粛清部隊のヴァイスに見つかったら……。
――ゴォォォォン――
まるで俺たちの不安を具現化するように、遠くの方で大きな鐘のような音が鳴り響く。ぎょっとして見回すと、森の奥の道から再び魔力の揺らめきが感じられる。この気配、嫌な予感しかしない。
「シエル、これって……?」
「……まずいです。ギルド本部からの警戒信号かもしれない。たぶんヴァイス様が“merge”をかけて大規模な攻撃を起動してるんだ……!」
案の定の展開かよ。なんという強引な呼び出し方だ。俺はリナを振り返り、早口で確認する。
「リナ、支度はいいか?」
「うん、やるしかない!」
「シエル、あんたたちも逃げ場を確保してくれ。もしも俺がヤツらを抑えられればいいが、最悪の場合はbranchの術式を持って退避だ」
「は、はい……わかりました!」
バタバタと慌ただしく動き始めると、遠くから複数の足音が近づいてくる。どうやら粛清部隊だけじゃなく、増援も投入しているようだ。
森の静寂を裂くように、「見つけ次第排除せよ!」という怒号まで聞こえてくる。
「git stashして様子を見たいとこだけど、数が多いな……。まともに正面からぶつかったら不利か……?」
焦りを抑えながら、頭の中で作戦を組み立てる。正攻法で応じるより、branchを活用して少しずつ分断して無力化する方がいいのかもしれない。だが、それを実現するには俺のmergeとシエルのbranchが連携しないと難しそうだ。
と、そのとき、森を抜けた広場のあたりがぱっと明るくなり、無数の魔力の波動が渦巻くのを感じる。そこには、やはり姿を現した粛清部隊の黒マントたち。その先頭には……見慣れた険しい顔。
「見つけたぞ……魔王コードをいじる愚か者め」
低く鋭い声が森に響く。ヴァイス・マージだ。杖を不気味な光で満たし、こちらを睨んでいる。背後の部下たちも同じ装束で構え、完全に包囲網を形成している。数にして十名以上。これは正面突破どころか、退路すら怪しい。
「やっぱり来ると思ってたが……こんな大人数を引き連れてくるとは」
俺が舌打ち混じりに言うと、ヴァイスは口元をゆがめて不敵に笑う。
「不要なConflictを解消するには力が一番手っ取り早い。貴様ら下級管理者まで一緒にいるとはな。裏切り者め……」
シエルたちがびくっと身をすくませるが、ここでひるんではダメだ。俺はなるべく強気に杖を持ち直し、ギルド兵に向かって一歩踏み出す。
「……確かに力任せにmergeすれば、表面上は収束するかもしれないが、バグの根本は消えないだろ。むしろいずれ大規模崩壊を招くぞ」
「黙れ。そんなことは百も承知だが、魔王コードを勝手にいじる者を容認などできん。……git merge --force!」
ヴァイスがそう唱えた瞬間、彼の杖から大量の術式が一斉に重ね掛けされる。炎、氷、雷、風……複数の魔法を無理やり一括発動するのか。これはすさまじい衝撃波になりそうだ。
シエルが咄嗟にbranchで分岐を試みるが、融合された魔法の塊が一気に押し寄せてきて、押し返せない。
「これがmerge --forceかよ……やりたい放題だな!」
俺は顔をしかめながら“git rebase”で一部の攻撃履歴を上書きしようとするが、いかんせん数が多い。さらに部下たちが次々に補強術式を張り巡らせている。これはさすがに分が悪いか。
どうする? 逃げ場もないぞ?
「創也くん、どうしよう!?」
リナが叫ぶ。その刹那、耳をつんざくような衝撃波が俺たちの頭上をかすめる。近くの木がボロボロと崩れ落ち、地面にクレーターができる。この一撃をまともに食らえば、ひとたまりもない。
「くっ……仕方ない、最後の手段だ!」
覚悟を決めて、俺は“git reset --hard”のコマンドを呼び出そうとする。
けれど、この人数を一気に巻き戻すには、相当な負荷がかかるはず。下手をすれば魔法コードが崩壊しかねない。だが、今は背に腹は代えられない。
「git reset --hard!!」
轟音とともに森全体が瞬間的にゆがむような感覚が走る。空気がざわめき、ヴァイスを含む粛清部隊が放っていた術式がガラガラと瓦解しかける。よし、一瞬は時間を稼げ――
「Error: partial reset only. Some conflicts remain.」
「はあ!?」
画面にそんな無情なエラーメッセージが浮かぶ。要するに、force mergeされた複数のブランチを一度にリセットするのは無理があったのだろう。攻撃が一部だけ消失したものの、火炎と雷の複合魔法が依然としてこちらに襲いかかってくる。衝撃波が視界を焼き切り、思わず地面に伏せるが、地面を削る火力はなおも強大だ。
「ははは、甘いな……お前のresetにも限界があるらしい」
ヴァイスが勝ち誇った声を上げる。完全にこちらを追い詰めた形だ。ヤバい、ここで終わるのか?
「……まだだ! シエル、branchを切り替えてくれ!」
「わ、わかりました! git checkout emergency-branch!」
シエルが震える声でコマンドを叫ぶと、辺りに分岐の術式が展開される。複数の魔法が一時的に別の次元に“保管”されたようで、攻撃の一部が失速する。これで被害を最小限に抑えられるかも。俺はその隙に、再度コマンドを叫ぶ。
「‘git stash’! 余分な部分を一時保存してみる!」
術式の断片を強引に引っこ抜き、衝突をなだめにかかる。すると今度は火炎と雷のぶつかり合いが自然消滅し、広場に煙が立ちこめる。勢いが削がれた粛清部隊が一瞬ひるんでいるのがわかる。
「ちっ、手間をかけさせる……!」
ヴァイスが苛立たしげに眉を寄せる。でも短い隙を突いてこちらも態勢を立て直し、なんとかギリギリのところで踏みとどまっている。
「これ以上やり合うのはリスクが大きすぎる。リナ、シエル、全員撤退だ!」
「う、うん!」
「了解です!」
混沌とした煙の中で、俺たちは必死に退路を探す。ヴァイスの再攻撃が飛んでくる気配があるが、“stash”のおかげで大技はすぐには発動できないはずだ。
黙々と走り出すと、粛清部隊も追ってきそうな気配を示す。何人かが術式を再構築しているのが見えるが、森の複雑な地形を利用すれば、まだ逃げ切るチャンスはある。
「追え! 逃がすな!!」
怒声が後方から飛んでくるが、こっちも命がかかってる以上、そう簡単には捕まらない。シエルたちがbranchを小刻みに切り替え、追っ手の魔法を分散させてくれる。俺はその合間に合流してくるギルド兵の動線を読み、一瞬で方向を変える。リナが小回りの利く動きで俺の腕を引っ張ってくれて、辛うじて包囲網をかいくぐっていく。
――こうして激しい攻防戦の末、俺たちは何とか粛清部隊の包囲を抜けることに成功する。森のさらに奥深くへ逃げ込むうちに、ヴァイスの魔力の気配も遠ざかっていく。
まだ完全に安全とは言えないが、少なくとも今すぐ捕まる心配はなさそうだ。
「はぁ……はぁ……大丈夫か、みんな?」
全員が息を切らせ、木にもたれている。リナは膝に手をついて深呼吸しているし、シエルたちは肩を上下させながら必死に立っている。ヴァイスのmerge攻撃の圧倒的な破壊力を身をもって味わったが、こちらもbranchやstashで踏ん張れたのは大きい。
「粛清部隊、強すぎだよ……合流されてたら絶対ヤバかった」
リナがぼそりと言う。まったくだ。力づくのgit push --forceを平然と使う相手は厄介を通り越している。それでも俺たちは“正しいブランチ運用”で対抗の糸口をつかめた。
このやり方を突き詰めれば、いつか魔王コードの本格修正に手を伸ばすことができるかもしれない。
「これが本格的な攻防戦ってわけか。ギルドが本気で追ってくる以上、どこかで一戦交えるしかないのかもな」
「はい……でも、あなたがConflictを解消してくれたおかげで、branch分岐は機能しました。ありがとうございました」
シエルがぺこりと頭を下げる。俺はまだ気が抜けなくて苦笑するしかない。ギルドを相手にこの先どれだけ戦うかは未知数だが、ヴァイスを凌駕しない限り、世界の暴走は止められないだろう。
「いずれ、魔王コードにも踏み込まないと本末転倒だ。こうやって逃げながら、少しずつ術式を修正していくしかないな」 「創也くん……」 リナが小さく唇を引き結ぶ。もちろん彼女だって危険は嫌だろうが、俺の決意をくんでくれるはずだ。
「……行こう。怖いけど、やることは山積みだ」
そう言うと、シエルたちが不安げにもうなずく。少人数ではあるが、頼りになる仲間が増えたのは心強い。粛清部隊の包囲を突破した俺たちは、これからも“Git権限”と“branch魔法”を駆使して、世界のバグに立ち向かうしかない。
いつか必ず、魔王コードの本体を安定化してみせる――その思いを胸に、薄暗い森の中を足早に進んでいく。
戦いは激化するばかりだけど、Gitデバッグなら任せとけ。自分だけが扱える力ならば、最大限使ってやる。ヴァイスがどんなにforce pushでねじ伏せようとしても、俺がConflictを解消すればいい。
ブラック企業仕込みのデスマーチは飽き飽きだが、なぜか今は不思議と「まだやれる」と思えている。もしこの先に魔王との因縁があるなら、まとめてリファクタリングしてやるさ。
……そうやって肩で息をしながら、俺はリナやシエルたちとともに森の奥へ消えていく。ギルドの怒号が次第に遠ざかっていくのを背中に感じながら、胸の奥には奇妙な高揚感が残っている。
さあ、次はどんなバグが待ち受けてるのか。どうせなら、とことん楽しませてもらおうじゃないか。コードの力を信じて、走り続けるしかないのだから。
面白い/続きが読みたい、と感じて頂けましたら、
ページ下の【☆☆☆☆☆】から評価をお願いします!
ブックマークと、いいね・感想なども頂けると、とても嬉しいです