第23話 護衛依頼

 今日の課題依頼は商人の護衛だ。

 最初は俺に恐がっていた馬もしばらくすると落ち着いてきた。

 ミニアは俺の背に乗っているので商人との会話など発生しない。

 もの凄く暇だな。

 飛んで行くと先行しすぎるため大人しく歩いて馬車の後ろについていく。

 本来だと護衛は先頭なんだが。

 落ち着いたとはいえ俺達が前にいると馬が怯える。

 しょうがない。


 さすがの魔獣もドラゴンに喧嘩を売るようなのは街道沿いには出てこない。

 戦闘もなく楽なもんだ。

 途中、街道を塞ぐように倒木がある。

 怪しいな。

 ミニアが合図の口笛を吹くと馬車は停止。

 俺は前に出て倒木を尻尾で巻き取り遠くに放り投げた。

 それがきっかけだったのか。

 左右にある木の陰から三十人ほどの男達が現れた。


「お頭、ドラゴンが居ますぜ」

「あんなのはったりだ。使役できてるはずがねぇ。一斉に掛かるぞ」

「「「「「「おう」」」」」」


 男達は武器を抜いて一斉に掛かってきた。

 俺は大きく息を吸い込むとブレス。

 あっという声を残して男達は消し炭になった。

 初めて人を殺したな。

 ドラゴン的には全然問題ないみたいだ。

 精神的にくるものがない。

 食えなくてがっかりといった感があるだけだ。

 やっぱり俺ってドラゴンだよな。


「すばらしい」


 拍手しながら商人が馬車から降りて来た。


「ウィザ、無敵」


 ミニアが応対する。


「よろしければ今後もお付き合いしたいものですな」

「よろしく」


 その後はトラブルなどなく目的の街まで到着。

 商人はミニアに労いの言葉をかけた。

 そしてこんな事を言い始めた。


「胡散臭い呪文屋から魔法を借金のカタに押さえたのですが。その中に詠唱しても失敗する物がありまして。その二つを差し上げたいと思います」


 商人が立ち去ったので貰った呪文をチェックする。

 どれどれ、おっ。


 最初が『モチキニソ・けハニスイコチリリモチノイ』だ。

 今までと全然違う。

 期待に胸膨らませ冒頭部分を解析。


 これは『MAGIC *fire_ball_make(int ballsize)』だな。


 もしかすると、もしかするぞ。

 続けて解析。

 全体のイメージはこんなだ。


MAGIC *fire_ball_make(int ballsize)

{

 char *ball; /*火の玉のデータ*/

 MAGIC *mp; /*魔法定義*/

 long i; /*カウンター*/


 ball=(char*)malloc(ballsize*100); /*ファイヤーボールの領域確保*/

 if(ball == NULL) { /*確保失敗 この場合は魔力切れ*/

  exit(EXIT_FAILURE); /*処理の終わり*/

 }

 mp=magic_make(ball,ballsize*100,IMAGEBALL); /*魔法を作る*/

 for(i=0;i<ballsize*100;i++){

  *(&ball[i])=FIRE; /*領域を火属性にする*/

 }

 magic_trans(mp); /*現象に変換*/

 return(mp); /*魔法の情報を返す*/

}


 確かにこれは単体では実行できないな。

 メインじゃないからサブルーチンという奴だ。

 メインから呼び出されて効力を発揮する。


 解析の結果を吟味する。

 これはファイヤーボールを作る関数じゃないか。

 これをこのまま使うと名前が被るから『fire_ball_make2』変更してと。

 呪文のイメージをこんな感じにする。


MAGIC *fire_ball_make2(int ballsize)

{

 char *ball; /*火の玉のデータ*/

  ︙

 return(mp); /*魔法の情報を返す*/

}


void main(void)

{

MAGIC *mp; /*魔法定義*/

mp=fire_ball_make2(1); /*火の玉を生成*/

}


 呪文に翻訳してコンパイルしてみる。

 おー、確かにファイヤーボールが生成されほどなくして消えた。

 でもこれバグってるな。

 領域の確保が滅茶苦茶だ。

 ballの領域は保持されないので『main』に戻ると使えない。

 イメージにある『malloc』は領域の確保だ。

 mallocで領域を確保しているんだから解放しないと。

 あれ、消費される魔力に領域確保しているから、解放しても魔力は返ってこない。

 だから、これは良いのか。

 魔法特有のローカルルールなんだろうな。


 もう一つの呪文のイメージはこれか。


void magic_move(MAGIC *mp,char *orbit,int orbit_size)

{

 int i; /*カウンター*/

 for(i=0;i<orbit_size;i++){

  vector_add(mp,*(&orbit[i])); /*速度を設定*/

  time_wait(1); /*0.01秒待つ*/

 }

}


 やった動きの部分だ。

 これをこんなふうにすれば。


void magic_movet_hree(MAGIC *mp1,MAGIC *mp2,MAGIC *mp3,char *orbit1,char *orbit2,char *orbit3,int orbit_size)

{

 int i; /*カウンター*/

 for(i=0;i<orbit_size;i++){

  vector_add(mp1,*(&orbit1[i])); /*一つ目の速度を設定*/

  vector_add(mp2,*(&orbit2[i])); /*二つ目の速度を設定*/

  vector_add(mp3,*(&orbit3[i])); /*三つ目の速度を設定*/

  time_wait(1);

 }

}


 こうすれば三発同時に魔法を動かせる。

 最初の何メートルかを広がる様な軌道にしてその後追尾させれば色んな角度から同時に攻められる。

 この発見はすばらしい。


 この呪文を書いたのは誰だろう。

 呪文は全て発掘品だとミニアは説明してた。

 だとすれば生きてはいないのだろうな。

 話を是非聞きたかったんだが、やむなしか。


 まあ良い。

 今回の発見を組み込んで魔法を作るか。

 八方向から襲い掛かる八方向弾なんて良いかもな。

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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