第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】スキルで事足りる。
時は金なりって考えたら、仕方ないか。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます