第5話 スキャンはちょっとあれ

 テスター魔道具を作ったときのことを思い出す。

 原理は単純だ。

 ポートに「PING」を打ち込み、返ってきた反応を解析するだけ。


「PING」とは、潜水艦映画でソナーが発する「ピーン」というあれだ。

 コンピューター用語でも、信号を送り返事を待つという意味がある。

 このボットは返ってきたデータを表示し、スキルの魔力回路を読み取る。


―――――テスター.py――――――――――――――

# テスター棒に魔力PINGを出力

io_port_write_command_str(io_port_search("テスター棒"), "魔力PING")

# テスター棒から結果を読み取り表示

print(io_port_read(io_port_search("テスター棒"))

――――――――――――――――――――――――


 要するに、魔力を打ち込み、返ってきた反応を受け取るだけの魔道具だ。

 もっと高度なスキャナーのように平面で読み取りたかったが、【ハック】スキルには制約がある。


 まず、材料に魔石が必要だ。

 魔石はモンスターの体内に必ず一つはあるが、弱いモンスターほど小さく、魔力線も少ない。

 最初に倒したザコモンスターでは、魔力線が三本しか作れなかった。


 魔力線は“思念を伝える線”で、USBケーブルのようなものだ。

 魔法陣はUSB機器のようなもので、普通は魔法陣同士をつないでも動作しない。

 そういうイメージだ。


「わぁ、懐かしい!」


 アセラがテスターを見て声を上げた。


「それ、ちょっと嫌な思い出なんだけど……」


 ベイシーとコーベルが苦笑する。


「最初の頃、スキルの魔力回路の位置がわからなくて、いろいろ大変だったからね」


「うん……あれは恥ずかしかったわ」


「悪かったよ。当時は本当に手探りだったんだ」


 スキルの魔力回路は個人差が大きく、場所もバラバラだ。

 だから、最初の頃はテスター棒で細かく位置を探る必要があった。

 今思えば、みんなよく協力してくれたと思う。


 ちなみに、魔力回路はモンスターにも存在する。

 魔石の数だけ同時にスキルを起動できるのは、魔石がボットのような役割を果たしているからだろう。


 チップの外側の材料も重要で、魔力を通さない素材が望ましい。

 最初は薪を使っていたが、魔力を通しにくい薪を探すのに苦労した。

 今は金属を使っている。


「こんにちは」


「ちわーす」


 宿の部屋に女性が二人訪ねてきた。

 冒険者の護衛が通したということは、スクリプトの紹介だろう。


「パイソンだ」


「ポップルっす」

「イフエルスです。私たち、透視と肉体変形のスキル持ちです。ギルドマスターから話は聞いてます」

「助かる。こちらも急ぎの案件だからな。参ったな。女性が来ると思わなくて。俺は部屋から出てるからフォルトゥナ頼む」

「了解」


「待つっす! パイソンはお貴族様っすよね。なにされるか解んないっすけど。パイソンにやってもらいたいっす」

「全裸にならないと駄目なんだけど」


「ばっちこいっす」

「ええ、私もパイソンにお願い」


 こいつらどういうつもりだ。


「理由を訊いても?」

「私達は上がった冒険者っす。高ランクで引退して金持ちっす。でも結婚が難しいっす。なのでっす」

「私も同じ」


 二人は真剣な表情でうなずいた。

 高ランク冒険者として引退した後、ギルド職員として働いているらしい。


 確かに行き遅れではある。

 高ランクの女性の冒険者が結婚できないのは、夫婦喧嘩で死人が出るからだな。

 そういう話を聞いたことがある。


「却下、間に合っているわ」


 冷たい口調のベイシー。


「見たところあなた達、まだ関係してないっす」

「くっ」

「なんで判るの」

「ちっ」


「仕方ない。フォルトゥナ、同席してくれ。魔道具が触るから、俺は無実だ。それとニップレスと前張りだな」

「全裸で良いっす」

「残念ね。でも別にいいんだけどね。4人の視線が怖いから、今回は退くわ」

「本当に残念っす」


「では、スキルスキャナーを使わせてもらう」


―――――スキルスキャナー.py―――――――――

import numpy as np

import matplotlib.pyplot as plt


# 読み込み先の辞書

base_pos = {"x": 0, "y": 0, "z": 0}

stick_pos = {"x": 0, "y": 0, "z": 0}


# 配列確保 10000*10000

data = np.zeros((10000, 10000), dtype=int)


# 計測の魔法陣 から XYZ を読み込む

io_port_write_command_str(io_port_search("計測"), "テスター棒の先の座標を計測しろ")

io_port_read_XYZ(io_port_search("計測"), base_pos)


# 計測されたxz座標がスタート。計測する人は寝て貰う。

start_x = base_pos["x"]

start_z = base_pos["z"]


for x in range(start_x, start_x + 10000):

  for z in range(start_z, start_z + 10000):

    # 接続先は念動の魔法陣

    io_port_write_command_str(io_port_search("計測"), "座標 x="+str(x)+" y="+str(base_pos["y"])+" z="+str(z)+"この座標のテスター棒の先に近い皮膚のy座標を計測")

    io_port_read_XYZ(io_port_search("計測"), stick_pos)

    io_port_write_command_str(io_port_search("念動"), "座標 x="+str(x)+

        " y="+str(stick_pos["y"])+

        " z="+str(z)+"にスキャン棒を移動")

    # テスター棒の先端から魔力放出

    io_port_write_command_str(io_port_search("テスター棒"), "魔力PING")

    # テスター棒の先端から結果読み取りして、格納

    data[x - base_pos["x"]][z- base_pos["z"]]=print(io_port_read(io_port_search("テスター棒"))


max=0

# 計測された最大値を求める。

for x in range(0, 10000):

  for z in range(0, 10000):

    if max<data[x][z]:

      max=data[x][z]

      

# 最大値を255にする。

for x in range(0, 10000):

  for z in range(0, 10000):

    data[x][z]=data[x][z]*255//max


# 結果表示。

plt.imshow(data, cmap="gray", interpolation="nearest")

plt.show()

――――――――――――――――――――――――


 テスター棒の位置は念動制御で調整するため、多少の凹凸があっても問題ない。


 計測が終り、魔力回路の濃淡が画像として浮かび上がってくる。

 フォルトゥナがそれを丁寧に写し取り、魔法陣の構造を記録していく。


「これで透視と肉体変形の魔法陣が揃ったわ」


「助かった。これで心臓修復の準備が整う」


 イフエルスとポップルは名残惜しそうにしつつも、丁寧に礼をして部屋を後にした。


 スキャン中、俺はずっと素数を数えて気を紛らわせていた。

 ボットが自動的に作業を行うから、目を離していても問題ない。

 問題はあれ。

 あれが何かは言いたくない。、

 さすがに緊張する作業だったが、無事に終わってよかった。


「パイソン、鼻の下を伸ばしちゃって」

「枯れてると思ったけど、男の子ね」

「ちょっと許せない」

「へんなことはなかったから許してやったら」


 透視と肉体変形スキルを持ったモンスターの分付図を訊いた方が良かったかな。

 それなら【生成AI】スキルで事足りる。

 時は金なりって考えたら、仕方ないか。

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る