「日記2010年9月その3」の編集履歴(バックアップ)一覧に戻る

日記2010年9月その3 - (2010/10/06 (水) 16:09:52) のソース

*2010/9/22

ソーマキューブというパズルの問題。
7つのピースを使ってこの形を作れるかな。

十字架。
&ref(十字架.png)


犬
&ref(ソーマキューブ犬.png)
もう少し犬っぽい形があるような気がする。







*2010/9/30
&ref(水彩画風フィルタ失敗作.jpg)
水彩画風フィルタの失敗作
ソースコードは下記。
C#。
フォームにボタンを3つ、ピクチャボックスを2つ置いて使用。
配置したボタンのボタン2とボタン3で画像をピクチャボックスに表示してから、実行。
単なる試作品の上に失敗作。




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;  
public delegate void ExampleCallback(Bitmap outBit, PictureBox p1);

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        int tc = 0;
        //Bitmap lastB;
        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            pictureBox2.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/tumblr_l0771pDcX01qbq8jdo1_500.jpg");
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Bitmap b2 = new Bitmap(pictureBox1.Image);
            Bitmap b1 = new Bitmap (pictureBox1.Image); 
            pictFilter PTC1 = new WindowsFormsApplication2.pictFilter();
            //pictureBox1.Image=PTC1.HSVColorRound(b1, 30); 
            
            //pictureBox2.Image =PTC1.Laplacian2(b1,  PTC1.Laplacian(3,  PTC1.GrayImage(b1)));
            pictureBox2.Image =  PTC1.Laplacian(3, PTC1.GrayImage(b2));
            pictureBox2.Image = PTC1.Laplacian2 (b1,b2) ;

        }
        public static void ResultCallback(Bitmap outBit, PictureBox p1)
        {
            p1.Image = outBit;

        }


        private void pictureBox1_Click(object sender, EventArgs e)
        {
            tc++;
            pictureBox1.Top = 0;
            pictureBox1.Left = 0;

        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pictureBox2.Image = Image.FromFile(ofd.FileName); 
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "画像ファイル(*.jpeg;*.jpg;*.gif)|*.jpeg;*.jpg;*.gif|すべてのファイル(*.*)|*.*";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pictureBox1.Image = Image.FromFile(ofd.FileName);
            }
        }

    }
    class pictFilter
    {




        public Bitmap HSVColorRound(Bitmap b1, int r)
        {
            Color C1;
            String s;
            Bitmap b2 = new Bitmap(b1.Width, b1.Height);
            HSV HSV1;
            double d;
            double MaxS=0;
            double d2=0;
            for (int i = 0; i < b1.Width; i++)
            {
                for (int j = 0; j < b1.Height; j++)
                {
                    C1 = b1.GetPixel(i, j);
                    HSV1 = HSVConvert.RGB2HSV(C1);

                    //d = (double)(HSV1.H + r) / 360.0;
                    //HSV1.H =(int) Math.Round (d*(1-d)*4.0*360.0) % 360;
                    //HSV1.H =( HSV1.H +r) % 360;
                    HSV1.H = (HSV1.H + r) % 360;
                    //d2=HSV1.S/255.0;
                    //HSV1.S = (int)Math.Floor(d2 * (1.0 - d2) * 4.0 * 255.0);
                    //HSV1.S /= 2;

                    //s = HSV1.ToString();
                    b2.SetPixel(i, j, HSVConvert.HSV2RGB(HSV1.H, HSV1.S, HSV1.V));
                }
            }
            return b2;
        }
        
        
        
        
        
        public Bitmap Laplacian2(Bitmap bBitmap,Bitmap b2)
        {

            int i, j;
            double count;
            int tempR;
            int tempG;
            int tempB;
            double tempR2, tempG2, tempB2;
            double tempRGB;
            Color C1, C2,C3;
            Bitmap b3=new Bitmap (bBitmap.Width ,bBitmap.Height);
            // 変数の宣言 iFilter : ラプラシアンフィルタ




            // 画像に対するフィルタ処理
            int size=4;
            int size2 = (2 * size + 1) * (2 * size + 1);
            double hiritu;
            double a;
            for (i = size; i < b2.Width - size; i++)
            {

                for (j = size; j < b2.Height - size; j++)
                {
                    count = 0;
                    for (int k = -size; k < size+1; k++)
                    {

                        for (int l = -size; l < size+1; l++)
                        {
                            tempR = b2.GetPixel(i + k, j + l).R;
                            if (tempR > 128)
                            {
                                count++;
                            }
                        }
                    }
                    /*
                    
                    a= (size2 - count) / (size2 * (size2 - 1));
                    tempR2 =tempG2 =tempB2 = 0;
                    hiritu = count / size2;
                    double b=a*(size2-1) + hiritu;
                    for (int k = -size; k < size+1; k++)
                    {

                        for (int l = -size; l < size+1; l++)
                        {
                            C3 = bBitmap.GetPixel(i + k, j + l);
                            if (k == 0 && l == 0)
                            {
                                tempR2 += (double)C3.R * hiritu ;
                                tempG2 += (double)C3.G * hiritu ;
                                tempB2 += (double)C3.B * hiritu;
                            }
                            else
                            {
                                tempR2 += (double)C3.R * a;
                                tempG2 += (double)C3.G * a;
                                tempB2 += (double)C3.B * a;
                            }

                        }
                    }
                    tempR =(int)Math.Floor ( tempR2);
                    tempG =(int) Math.Floor(tempG2);
                    tempB = (int)Math.Floor(tempB2);
 
                    C3 = Color.FromArgb(tempR, tempG, tempB);
                    b3.SetPixel(i, j, C3);
                    */
                    
                    
                    tempRGB=Math.Pow ((count) / ((2*size+1)*(2*size+1)),2);
                    // フィルタ処理
                    C1 = bBitmap.GetPixel(i, j);
                    C2 = b2.GetPixel(i, j);

                    tempR = (int)(Math.Floor(CutNum((double)C1.R * (1 - tempRGB ) + (double)255 *  tempRGB)));
                    tempG = (int)(Math.Floor(CutNum((double)C1.G * (1 - tempRGB ) + (double)255  * tempRGB)));
                    tempB = (int)(Math.Floor(CutNum((double)C1.B * (1 - tempRGB ) + (double)255  * tempRGB)));
                 
                    
                    C3=Color.FromArgb(tempR, tempG, tempB);
                    b3.SetPixel(i, j, C3);
                    

                }
            }
            // フィルタ処理の結果の出力
            return b3;
            //pictureBox1.Image = bBitmap;    // 変更結果の設定

        }







        private double CutNum(double x){
            if (x > 255)
            {
                x = 255;
            }
            if (x < 0)
            {
                x = 0;
            }
            return x;
        }






        public Bitmap Laplacian(int iAmp,Bitmap  bBitmap)
            
{

    int        i, j, iColorValue;    // 変数の宣言 iColorValue : RGB平均値

    // 変数の宣言 iFilter : ラプラシアンフィルタ

    int[]    iFilter = new int[]{-1, -1, -1, -1, 8, -1, -1, -1, -1};

    // 変数の宣言 iArrayValue : ピクセル色情報の配列        

    int[,] iArrayValue = new int[bBitmap.Width, bBitmap.Height];

    Color[]    cArrayColor = new Color[9];    // 変数の宣言 cArrayColor : 色情報の配列

    Color    cSetColor;        // 変数の宣言 cSetColor   : 設定する色

    // 画像に対するフィルタ処理

    for(i = 1; i < bBitmap.Width - 1; i++)

        for(j = 1; j < bBitmap.Height - 1; j++)

        {
            for(int k=-1;k<2;k++){
                for(int l=-1;l<2;l++){
                    cArrayColor[(k + 1) * 3 + l + 1] = bBitmap.GetPixel(i+k,j+l);
                }
            }
            // フィルタ処理

iColorValue = 

iFilter[0]*cArrayColor[0].R + iFilter[1]*cArrayColor[1].R +

iFilter[2]*cArrayColor[2].R  + iFilter[3]*cArrayColor[3].R + 

iFilter[4]*cArrayColor[4].R + iFilter[5]*cArrayColor[5].R + 

iFilter[6]*cArrayColor[6].R + iFilter[7]*cArrayColor[7].R + 

iFilter[8]*cArrayColor[8].R;

            iColorValue = iAmp*iColorValue;    // 出力レベルの設定

            // iColorValue が負の場合

            if(iColorValue < 0)

                iColorValue = -iColorValue;    // 正の値に変換

            // iColorValueが255より大きい場合

            if(iColorValue > 255)

                iColorValue = 255;    // iColorValue を 255 に設定

            iArrayValue[i, j] = iColorValue;// iColorValue の設定

        }

    // フィルタ処理の結果の出力

    for (i = 1; i < bBitmap.Width - 1; i++)

        for (j = 1; j < bBitmap.Height - 1; j++)

{

// iArrayValue 値による色の設定

cSetColor = Color.FromArgb(iArrayValue[i, j],

iArrayValue[i, j],iArrayValue[i, j]);

// ピクセルの色の設定

bBitmap.SetPixel(i, j, cSetColor);

}
    return bBitmap; 
    //pictureBox1.Image = bBitmap;    // 変更結果の設定

}




        public   Bitmap GrayImage (Bitmap  bBitmap)

{

    int iRed, iBlue, iGreen;
    int iAverage;
    Color cSetColor;
    Color cColor;


    // 画像のグレースケールへの変換

    for (int i = 0; i < bBitmap.Width; i++)

        for (int j = 0; j < bBitmap.Height; j++)
        {    

            cColor = bBitmap.GetPixel(i, j);    // ピクセルの色の取得

            iRed = cColor.R;            // Red 値の設定

            iBlue = cColor.B;            // Blue 値の設定

            iGreen = cColor.G;            // Green 値の設定

            iAverage = (iRed + iBlue + iGreen) / 3;// RGB の平均値を算出

            // iAverage 値による色の設定

            cSetColor = Color.FromArgb(iAverage, iAverage, iAverage);

            bBitmap.SetPixel(i, j, cSetColor);    // ピクセルの色の設定

        }
    return bBitmap;
    //pictureBox1.Image = bBitmap;    // 変更結果の設定
}












        struct HSV
        {
            public int H;
            public int S;
            public int V;
        }

        class HSVConvert
        {
            //RGBをHSVに変換  
            public static HSV RGB2HSV(Color RGB)
            {
                HSV hsv = new HSV();

                double max = Math.Max(Math.Max(RGB.R, RGB.G), RGB.B);
                double min = Math.Min(Math.Min(RGB.R, RGB.G), RGB.B);

                //Vを求める  
                hsv.V = (int)max;

                //RGBすべてが同じ場合 HとSは0     
                if (max == min)
                {
                    hsv.H = 0;
                    hsv.S = 0;
                }
                else
                {
                    //Sを求める  
                    hsv.S = (int)(((max - min) * 255) / max);

                    //Hを求める  
                    hsv.H = 0;

                    if (max == RGB.R)
                    {
                        hsv.H = (int)(60 * (RGB.G - RGB.B) / (max - min));
                        if (hsv.H < 0) hsv.H += 360;
                    }
                    else if (max == RGB.G)
                    {
                        hsv.H = (int)(60 * (2 + (RGB.B - RGB.R) / (max - min)));
                        if (hsv.H < 0) hsv.H += 360;
                    }
                    else if (max == RGB.B)
                    {
                        hsv.H = (int)(60 * (4 + (RGB.R - RGB.G) / (max - min)));
                        if (hsv.H < 0) hsv.H += 360;
                    }
                }


                return hsv;
            }

            //HSVをRGBに変換  
            public static Color HSV2RGB(int H, int S, int V)
            {

                if (H == 360) H = 0;
                int Hi = (int)Math.Floor((double)H / 60) % 6;

                float f = ((float)H / 60) - Hi;
                float p = ((float)V / 255) * (1 - ((float)S / 255));
                float q = ((float)V / 255) * (1 - f * ((float)S / 255));
                float t = ((float)V / 255) * (1 - (1 - f) * ((float)S / 255));

                p *= 255;
                q *= 255;
                t *= 255;

                Color rgb = new Color();

                switch (Hi)
                {
                    case 0:
                        rgb = Color.FromArgb(V, (int)t, (int)p);
                        break;
                    case 1:
                        rgb = Color.FromArgb((int)q, V, (int)p);
                        break;
                    case 2:
                        rgb = Color.FromArgb((int)p, V, (int)t);
                        break;
                    case 3:
                        rgb = Color.FromArgb((int)p, (int)q, V);
                        break;
                    case 4:
                        rgb = Color.FromArgb((int)t, (int)p, V);
                        break;
                    case 5:
                        rgb = Color.FromArgb(V, (int)p, (int)q);
                        break;
                }


                return rgb;
            }
        }
    }
}















*2010/10/1
歩兵FPSゲーム初心者教習講座Madムービー企画書 Ver企画書試作品。


BGM クラシック
語り口調 礼儀作法や研修用ビデオのノリで作る



1
学校で習いましたね。
道路を横切るときは必ず左右確認忘れずに。
道路に限らず開けた場所は、絶好のスナイプポイント。
運を天にまかして開けた場所に出るのは、道路の左右確認もしないで道に飛び出すのと同じ。
よく注意しましょう。
ナレーションは、道路を渡るときは左右を確認しましょうという小学生向けの道路安全講座風味のノリで。



2
建物に入るとき、出来るだけ手榴弾や閃光弾を投げ入れれましょう。
それが戦場での礼儀です。
(ナレーションや文章は礼儀作法のビデオのノリで)


3
狙撃地点への通り道は格好の待ち伏せ場所。
狙撃地点へ向かう敵のルートを予想し逆に待ち伏せするのが吉。
ナレーションは客をキャッチセールスするとき、客をどう捕まえるかの研修用ビデオ風味のノリで


4
戦車、乗り物の操縦方法
(車の教習講座風味のノリでナレーションを入れる)


5
茂みやヘコミは、敵の来る方向が制限される安全地帯。
むやみに動かず凹みに隠れへこみの前を敵が通るのを待つのはとても良い選択です。
(ナレーションは)



以下このノリで展開される初心者向けMAD映像を作りたい。

-目標
内容がくだらないので目標1000アクセス越え程度を目指す。














*2010/10/1
今日の嘘日記。
人口200万を数える県庁所在地加古川。
加古川では最近複合コンビニが増えている。

回転寿司がコンビニの中央に鎮座し、壁際に商品だなが置かれている回転寿司コンビニ。
漫画喫茶に近い、雑誌を座って読めるコーナーのアルコンビニ。
商品だなは畳張り、壁際は障子に和格子、天蓋には手水に日本庭園のミニチュアが置かれた完全和風の店内。
オーナーの趣味、店内をジオラマつき鉄道模型が走り回るジオラマコンビニ。
ハイテク完全自動、アシモ6号量産型の働く全自動コンビニ。
店員が全員メイドコスプレのメイドコンビニ。
熱血店長が君に熱血魂を注入してくれる熱血コンビニ。
コンビニ激戦区加古川では多種多様なコンセプトのコンビニが生まれては消えている。


そのほかに
怪奇現象と心霊現象多発、店員はヴァンパイアとの噂のあるホラーコンビニ。
謎の大手、異世界に出張所を持ち異世界の技術で作られた品があるロー○ソンコンビニ。
魔法使い向け商品最大手の経営する、魔術商品充実の魔法コンビニ。
異世界への入り口が開いていて国境機能バリケードのある、異世界コンビニ、異世界の商品を無税で買える。
契約済み地獄の魔物を店員として働かさせている。

などがあり、コンビには加古川の一大観光産業を形成している。




-嘘日記2
加古川のタクシーは過激だ。
スポーツカー使用、ごてごて飾り立てた暴走族使用、警察とのカーチェイスは日常茶飯事。
客を一分一秒でも早く送り届けるために、交通マナーは最悪。
込んでる日には歩道を走る車があるほどだ。





























*2010/10/2
彼女は待っている。彼を待っている。
 彼女と彼が初めて出会ったのは、今から約3年前。
 その時も調度今日の様に、彼女は待っていた。
 彼女に名前は無い。
 彼女は“人”ではない。
 彼女の目の前に、彼は立った。
 彼の知るかぎり、彼女は始めから、そこに居た。
 彼女がどこから来たのかも、彼は知らない。
 彼女は始めから、そこに居た。
 彼女は彼に言った。
「貴方が私のユーザーですか?」
 彼は答えた。
「そうだ」と。
 会議室の扉が開いた。
 疲れた表情の将校達に混じり、部屋から出るグラム。






勝手に文章推敲。
ここ違和感の塊になっているから修正しないといけないのは明白。
(*2010/10/5追記 ここは推敲したほうがいいよと何回も原作者にいったのですが、推敲してくれなかったので自分で修正することにしたのですが)
原作の設定を知らない俺がどう修正すればいいんだろ?
自分の作品ならまだしも人の作品だしなぁ。
耽美系とか、中二病全開のなんだか格好よさそうに見えるだけの恥ずかしい文章を並べてみようかな。
小学生には読めないし、中学高校生の時には格好良く感じて、年取ったらあまりのナルシスト文章に逆に恥ずかしくて読めない。
そういう感じで攻めてみよう。
とりあえず今日は5分だけ推敲。
明日ちゃんとしたの書こう。
って人の作品弄るって結構難しいじゃないか、書けない。




----
*2010/10/5 修正分
とりあえずの素案。
まだ素案なので文章の意味が通ってない状態。
原作者が加筆訂正してくれるようなので期待。



会議室の外では一人の女性が会議の終わりを待っている。
それはイクサミコと呼ばれる存在。  
HMAの戦術戦闘補佐として作られた生体パーツの名称。 、
機械と直通する接続コード、チタン配合の伝達速度が強化されたニューロン。
完璧までに滑らかな肌をもつ美しい女性の姿をしている。

パイロットと共にHMAに乗り込み。パイロットの変わりに敵の群れを把握し、敵を牽制する。
戦況全体を見極めパイロットに伝え補佐する存在。
パイロットは、彼女達なしでは戦場に立てない。
コクピットを降りれば、それがかわる。
軍属として人間の中に溶け込んで生活している。
パイロットと恋仲になることも多い。
彼女もそうした一人。
彼女は会議が終わるのを待っている。

会議室のグラム、彼には3年よりも前の記憶がない。 
あるのは歴戦のパイロットとしてヴァリアンタスと戦った日々。
イクサミコと共にHMAに乗り込み戦ってきた日々。
戦いの中で二人は同じコクピットで呼吸し、言葉を交わし、二人で一つのように機体を操ってきた。


陰に陽に、イクサミコは日常では秘書としての仕事に就く。
報告や部下の管理や事務仕事。
休日に仲間とかわす他愛のない会話。
グラムの感じる彼女の肌の温かみ。

今では会議室にさす日差しは夢のように感じられ、戦いの中こそが帰るべき故郷のようにも感じられる。
イクサミコと一体となったような戦闘機動。
業火のような戦場と、疲労を押し隠すまどろみのような休日、イクサミコと肌を重ねてきた日々。
それが彼の記憶の全て。
この気持ちを恋慕と呼ぶならそう呼ぼう。

彼は彼女を待っている。
暖かい日のさす、会議室というまどろみの中で、彼女のもたらす温もりを。
彼女は彼を待っている。
自分の半身、日常の中で人といきる温かみを教えてくれた彼を。

会議が終わり、彼女は彼の前に立つ。
二人が初めてであったあの日の様に。
----



















*2010/10/4
ある種のシンプルなアクションゲームから、アクションゲームの本質を抽象化する話。

&ref(ジャンプ.png)
平らかなところで左右に動く、一定のジャンプするというゲームにおける動きの模式図。
この図は全てのジャンプの軌跡をユーザーが選択できるということを表現している。
このように全ての動きの中からユーザーが自分の動きを選択するということがアクションゲームの一つの本質を表現している。



敵の配置や動きやオブジェは、この動きの自由度に制限を加えることとなる。
ユーザーは可能な動きの中から正解の動きの組を選択することを迫られる。
するとここにゲーム性が生まれる。
この正しい動きのセットをどこまで多様に演出出来るかが、このシンプルなアクションゲームのアクションの可能性を表現している。

敵や敵の攻撃などを考慮して制限された動き、動きのサブセット。
このサブセットこそが、ゲームとしての深みの多様性を表現しているわけだ。


サブセットには余裕がなくてはいけない。
例えば敵の弾を避けるときなど、可能な回避の動きは非情に幅が広くなくてはいけない。
そうでないとゲームがシビアになりすぎるから。



-本質
斜面やジャンプの角度を調整できいるようになっても、2段ジャンプが出来るようになっても本質は同じ。
他のゲームでも、可能な動きから選択するということでは同じである。

ちなみにマリオカートなどはよく出来ていると思う。
マップの上で可能な動きの全てをあらわした抽象的な模式図の中から、タイムアップに繋がる動き、繋がらない動きというのが複雑に絡み合って設計されている。
ミスがダメージになるアクションゲームと反対。
良い動きがタイムアップに繋がるという報酬系の世界。
この点も非常によくできている。
















*2010/10/5
漫画の中では、主人公が短期間で成長したり、誰にも教わらずにガリュウで見出したり。

問題が与えられたとき、脳の小さな生物ほど短時間で解決策を見出し大きな生物は時間がかかる。
脳の小さな生物はとりあえず適当に見つけた方法で安住してしまいそこから進歩がない。
すばやく身につけてしまう分、多種多様な状況を考慮できず、応用が利かない。
脳の大きな生物は、ゆったりと見極め色々な方法や試行錯誤の間で揺れ動きながらゆっくりと学習する。
ゆっくり学習するから多種多様なパターンに対応できるし、問題を解くだけじゃなく他の問題にも応用できるような高い応用能力も身に着けていく。

漫画のキャラというのは脳の小さな生物に近いわけで、漫画のキャラみたいに短期間で成長。
なんてのは憧れだけど現実的じゃない。
多種多様な問題に対応できるゆっくり学ぶ知性。
こういうのが脳の大きな生物の知性なんだよな。

すぐに理解できない。
というのは短絡的な答えに固執しないための大きな知恵なんだ。
人間のように脳の大きな生物は学習能力が遅いことで、逆に行動にふくらみが発生している。

人間、漫画みたいなキャラにだけは憧れないほうがいい。






























*2010/10/6
 午後になり、レイズは訓練を行っていた。
 狭いシミュレーター内、目の前に広がる空間の中で、彼は機体を機動させる。
 土地設定は“市街地”。敵数は“不明”
 無線に通信。
「501から503は左から。505と506は、このまま正面へ。常に、スリーマンセルで行動しろ」
 各機から返ってくる、了解の返事。
 レイズの乗るHMAは、他の二機と共にスラスター飛行へ移った。
 レーダーに表示される数個の光点。敵機、数、8。
「いたいた……! ソルジャータイプ、八機!」
 先頭を機動する機体から通信。
「掃射するぞ。高度を上げてから、連射を加えて擦過する」
「502、諒解」
「……」
 返事を返さないレイズ。
「おい、503。どうした? トラブルか?」
「あ、いえ……503、諒解」
 うだつの上がらない返事を返す彼を尻目に、二機はスラスターで、さらに高度を上げながら加速した。
 その後に従うレイズ機。
 敵機ロック、ガン・ラン。
 目標の斜め上空から迫る三機のHMAは、高空を擦過しながら、アサルトライフルのフルオート斉射を加えた。
 巻き上がる砂煙。数個の爆炎が散り、三機は上空を通り過ぎていく。
「斉射完了。軌道旋回による空中支援に入る」
「了解。こちらは突入して殲滅戦に移る」
 突入する地上部隊。
 隊長機を含めた3機のHMAが、地上戦を展開し、残存兵力を掃討していく。
 地上部隊の上空を軌道旋回する三機。
 突然、レーダーに反応。
「フラッシュ。敵機感知」
「ターゲットチエック」
「ナイト。数、2」
「なに!?」
 旋回を繰り返すレイズ達の更に上空から、二機のヴァリアント。中級指揮官型ヴァリアント、コードネーム“ナイト”。
 それが二機、部隊に迫っている。
 ナイトは、高速機動による近接戦闘に特化した種。接近されれば厄介だ。
「迎撃するぞ! 503援護しろ!」
「り、諒解!」
 先攻する二機のHMA。
 レイズは空に向かってライフルを構えた。
 モニターに上書きされるFCSの射撃視界。その中を踊るクロスゲージが、小刻みに揺れる。
 トリガーに掛けられる彼の人差し指。
 先行していった二機のHMAが、ナイトに向かってライフルを発砲。
 回避するナイト。空を切り裂く弾丸。
 二機のナイトは左右に別れ、その機体を大きく機動させた。
「今だ503! 撃て!」
 レイズの耳元に響く声。
 突然彼の脳裏に、あの記憶がフラッシュバックする。スタイナーの乗るHMAは、レイズの目の前で崩れ落ち、そして爆ぜた。
 遺体は一瞬で蒸発したのだろう。欠片も残らなかった。
 目を見開いたまま、動きを止めるレイズ。
 震える指先。それと連動するかの様に、ライフルの銃口が左右にぶれる。
「503! 早くしろ!」
「レイズ軍曹!」
 彼をサポートするサラが、彼に向かって声を上げた。
「503……!」
 途切れる無線。
 連帯のとれた動きで、二機のHMAを瞬時の内に葬る二機のナイト。
 二つの火球が空に散った。
「レイズ軍曹!」
 再びサラの声。さっきより強く。
 我に返る。
 次の瞬間、ナイトから一条のビームが放たれた。
「回避が……!」



この部分、タレも塩味も薬味もない素うどんを食べているみたいな気分になるので、推敲しなおと駄目だよな。
今日は全体をどうするかを考えたり。
結局自分の作品でないので、なにをけばいいかという大問題から逃げられないわけだ。



----
本日作業分

 午後になり、レイズは訓練を行っていた。
 狭いシミュレーター内、目の前に広がる空間の中で、彼は機体を機動させる。
 土地設定は“市街地”。敵数は“不明”
 
 敵の数が分かっているなら典型的なパタンを。

 不明というのは少し難しい課題だ。
 どんな敵が現れるか分からないために、強力な武器を何時使うかという問題が表れる。

 遮蔽物だらけの市街地に潜んだ敵を。
 どこから敵が現れても良いように、各機が各機をサポートできるように前進させる必要がある。
 どの機も味方機のセンサーの穴を埋めるように前進させなくてはいけない。
 目の前の敵に熱中しているからといって、一機がはぐれるようなことがあってはいけない。
 個々人の実力を何倍にも高めるのが隊長の役割だった。
 隊長としての実力が試されるミッションだった。
----