NEW GAME!(1)〜(13)

「NEW GAME!」1〜13巻を読んだ

「今日も1日頑張るぞい」で一世を風靡したマンガが、13巻で見事に完結した。

舞台はゲーム業界

イーグルジャンプっていうゲーム会社に新卒で入社した青葉が主人公。青葉の他に、八神コウとか、3Dモデラーのひふみなど、女の子ばっかりの会社だ。

登場するキャラクターはみんな可愛く魅力的。ただ、ひたすら可愛いキャラクターを愛でつつ、ほのぼのした日常回を楽しむマンガかと思いきや、毎巻誰かに試練が訪れるのが意外だった。新タイトルのキャラクターデザインを争って、青葉とコウが衝突したり。可愛い絵柄に反して重たいシナリオは少なくなかった。

青葉の同級生がまた良い

特にねねっち。「C++を完全に理解してしまったかもしれない」はネットミームになったしね。

プログラミング未経験だったのに、青葉がゲーム会社に就職した影響でゲームプログラミングを始めて、入社前に1つゲームを完成させちゃうってのがスゴイ。いや、本当に。ねねっちは情報系の学部ってわけでもないからなおさら。自分はそんなことできなかったからなぁ。

可愛さに反して働きっぷりもかなりハード

ゲーム業界はかなりハードに働く業界だと思うけど、それを誤魔化さずにちゃんと描いている。

青葉は高卒でイーグルジャンプに就職していたり、ほたるも大学を中退して海外のAAAタイトルを持つ会社に入ったりしていて、現実ではどうなんだろうな。ゲーム業務は WebやSIerとは違って、アートに近い、実力至上主義なイメージはある。

最終巻で最大の試練が

親友のほたるがラスボスとして立ちはだかるとはね。決戦のコンペで、青葉が全力で描き上げたキービジュアルは、普通のコマだったけどゾクゾクっと来た。1ページまるまる使ってもいいのに、と思えるくらい。

見事なクロージングだった

クライマックスで、1 番の名シーンを持ってきたんじゃないだろうか。13巻という長さもちょうど良かった。ほのぼのと可愛いだけでなく、シリアスもちゃんとあって、メリハリがあった。名作と呼んで差し支えないと思うな。

アオアシ(30)

アオアシの題材の一つとも言える「考える葦」。主人公の名前も「葦人」だし。アシトが目指すべき人物が、ここに来てつい明らかになった感じ。司馬さんだったのか。アシト自身も司馬みたいになりたいと明言。考えて考えて考え続けるのは、仕事にも通じるところがあるな。

最後には紅白戦でアシトが司馬を動かし、ユース組のアシトと遊馬でゴールを奪えた。遊馬の泥臭いゴールは、こちらも一皮剥けたのかも。

アオアシはクラブユースのマンガだから、このま順調にプロになってしまったら終わってしまう、と思っていたらまさかの国際大会出場という展開。そしてバルサ。海外の育成の話が出てきそうで楽しみだ。

LIVE A LIVE

LIVE A LIVE のリメイク版を購入してクリア

オクトパストラベラーで HD2D を体験し、これLIVEA LIVEにも合いそうだなと思ったけど、まさか本当にHD2Dでリメイクされるとは。嬉しい誤算だった。

最初の発売は 1994年。当時の記憶はだいぶ忘れてしまっていたので、今回は新鮮な気持ちで遊べた。

幕末編

まずは、おぼろ丸が主人公の幕末編からスタート。舞台の尾手城は広く、中ボスも結構いて、作中1位2位を争うボリュームがある。やり込み要素も多い。自分は1周目に100人斬り、2周目に0人斬りを達成した。

おぼろ丸は即発動する技が多く、属性ダメージを与える術も豊富で、かなり強いキャラクター。特にLv9で覚える忍法かまいたちが強力。まぁ、それだけで満足せず、小判を集めて影一文字も習得したが。魔神龍之介を倒して村正もゲットしたし、岩間さまも倒してた。かなりやり尽くしたな。

功夫

次は心山拳老師の功夫編。弟子を3人集めて鍛えて、というシナリオ。レイを集中的に鍛えた。1人に絞った方が良いのはリメイク版でも変わらず。主人公の中では紅一点だし、レイ一択でしょ。レイは最終編で大活躍してくれる。全範囲攻撃の画竜点睛の陣がめっちゃ強力。奥義の旋牙連山拳も強力。今作最強キャラと言っても過言じゃない。

ボスのオディワン・リーと対決する時、師匠と弟子のW 旋牙連山拳は鳥肌モノだったな。その前の、老子が弟子に旋牙連山拳を授けるシーンも。この2つは作中でも好きなシーンだ。

近未来編

主人公のアキラは超能力者で、テレパシーによって相手の心の中を読める。そのテレパシーを活かした会話システムが当時は斬新だった。最終編でも、もっと心の中が読めるNPUがいればよかったのにな。

無法松が熱い漢で、魂が震えた。「通りすがりのたい焼きやさんよ!」は名台詞。ボスと対決する時のアキラの台詞「そうだろ松!」も。LIVE A LIVE は名シーンや名台詞が多い。

アキラはデバフを付与する系の技が多くて、パーティーでは主にサポート役。近距離で強力な技が欲しかった。一応、最終編でもパーティに入れたけど。

西部編

サンダウン・キッドの西部編は、短くてすぐクリアできる。ひたすら罠を探して仕掛け、ボスぐらいしかまともな戦闘はない。そのボス戦も、罠で取り巻きを蹴散らしていったら1匹だけになるので、あとはガトリングに注意しながら戦えば楽勝。

サンダウンは火力が記憶ほど高くない印象。スーファミ版の時はもっと強かった気がするが。ハリケーンショットや新・乱れ打ちを覚えたら戦力になるけど、それまでは1発が弱いし耐久も低くて、使い勝手悪かった。最終編ではパーティーにサンダウン入れたけど、消去法は否めない。

現代編

ストリートファイターみたいなシナリオ。いや、シナリオと呼ぶのはふさわしくないな。ストーリーないし。ひたすらバトル。

技を受けて習得するシステムなので、回復で耐えて、技を習得し終わったら浴びせ蹴り連発でクリアできた。最初に習得した浴びせ蹴りが使い勝手良すぎで、そればっかり使っていたな。難易度高くない。

原始編

匂いを嗅いで、敵がどこにいあるか当たりをつけて、ぶつかったら戦闘というシステム。おかげでレベル上げの効率がちょっと悪かった。

ポゴとゴリはどちらも弱くはないんだけど、便利な技を覚えるわけでなく、使い勝手イマイチ。一応ヒロイン(?)のべるがぶっ壊れ性能だった。るーるーが超強力。ポゴは Lv16 まで上げてドデゲスデンを覚えたので、大抵の敵は楽勝。ボスも楽勝。隠しボスのキングマンモーは流石に強くて、なんとか倒せた。ドデゲスデンを使ったポゴの能力が軒並み低下するので、やはり使い勝手悪い。

SF編

SFにはトラウマがある。というのも、当時、ベヒーモスがめっちゃ怖かった。突然現れるからビクビクしながら進めていた記憶がある。

今回もその恐怖は変わらず。急に現れて、そして移動速度も速い。キューブと同じ速度で迫ってくるので、操作ミスってぶつかったらゲームオーバー。そんなスリルは求めてないんだけど。SF編はやはり苦手。バトルは最後のボスだけで特に問題にならない。ただひたすらベヒーモスが嫌だった。

中世編

中世編も、小学生だった当時では軽いトラウマ。FFみたいな舞台。主人公は正統派な騎士で、FFっぽい。絶対、姫を救ってハッピーエンドと思うでしょ。それがまさかね。まったく救いのないエンドになるとはね。

ボスの「あの世で俺に詫び続けろ!」を声ありで聞けたのは満足。できれば「オルステッド!」まで言って欲しかった。デフォルトの名前のときだけ声入れてくれてたらよかったのに。そこだけ不満。

最終編

オルステッドとおぼろ丸を主人公にしてそれぞれプレイ。

オルステッドは、各シナリオのボスを使って、主人公を倒すだけ。ボスが強いので大抵は楽勝。明とおぼろ丸は強敵だった。

おぼろ丸を選んだときは、全ての主人公を一度はパーティーに加えて、各々の最強武器ゲットして、エリアル装備も全部揃えた。ほぼやり込んだな。100回逃げるのは大変だった。

最終的にパーティに加えたのは、レイとアキラとサンダウン。おぼろ丸とレイが主力。アキラはサポート役。サンダウンはハリケーンショットでの遠隔攻撃で支援。Lv25くらいまで上げて、ピュア・オディオとシン・オディオを苦戦することなく撃破できた。

戦闘は、敵の弱点をついたり、向きを変えて相手の攻撃範囲をズラすことで、有利に進められる。わかっていたら難易度は高くない。とにかぬ、おぼろ丸とレイは攻撃性能が高いので、最終編のパーティーにこの2人は必須。残りは好みで。

HD2Dでリメイクされた LIVe A LIVE は期待通りだった

小学生のとき以来遊んだわけだけど、記憶に違わず面白かった。HD2D との相性も予想通りにピッタリ。満足と言って良い。この調子で、往年のスクウェアRPG を HD2D でリメイクして欲しい。FF5FF6クロノトリガーあたりをぜひ。

Numpy.NET で ReLU レイヤー

C# で「ゼロから作るDeep Learning」に挑戦中。

今までは Numpy の .NET 移植版である NumSharp を使っていたけど、開発は停滞してるっぽい。足りない機能に直面する機会も増えてきて、このまま使い続けるのはキビシイ。

今回から、Numpy の .NET バインディングである Numpy.NET を試してみる。こちらは Numpy の機能をほぼ使えるようだ。

github.com

ReLU レイヤーを実装してみた。

using Numpy;

var x = np.array(new double[,]
{
    { 1.0, -0.5 },
    { -2.0, 3.0 },
});
Console.WriteLine(x);

var mask = (x <= 0.0);
Console.WriteLine(mask);

var relu = new Relu();
var @out = relu.forward(x);
Console.WriteLine(relu.mask);
Console.WriteLine(@out);

var dx = relu.backward(@out);
Console.WriteLine(dx);

public class Relu
{
    public NDarray? mask { get; private set; }

    public NDarray forward(NDarray x)
    {
        this.mask = (x <= 0.0);
        var @out = x.copy();
        @out[this.mask] = (NDarray)0;
        return @out;
    }

    public NDarray backward(NDarray dout)
    {
        dout[this.mask] = (NDarray)0;
        var dx = dout;
        return dx;
    }
}

Numpy.NET では x <= 0.0@out[this.mask] = (NDarray)0; が使えた。NumSharp ではこうはいかない。

.NET 6 で実行。

NumSharp で加算レイヤー

C# で「ゼロから作るDeep Learning」に挑戦する続き。

今回は加算レイヤーを追加し、乗算レイヤーと組み合わせてみた。

using NumSharp;

NDArray apple = 100;
NDArray apple_num = 2;
NDArray orange = 150;
NDArray orange_num = 3;
NDArray tax = 1.1;

// layer
var mul_apple_layer = new MulLayer();
var mul_orange_layer = new MulLayer();
var add_apple_orange_layer = new AddLayer();
var mul_tax_layer = new MulLayer();

// forward
var apple_price = mul_apple_layer.forward(apple, apple_num);
var orange_price = mul_orange_layer.forward(orange, orange_num);
var all_price = add_apple_orange_layer.forward(apple_price, orange_price);
var price = mul_tax_layer.forward(all_price, tax);

// backward
NDArray dprice = 1;
var (dall_price, dtax) = mul_tax_layer.backward(dprice);
var (dapple_price, dorange_price) = add_apple_orange_layer.backward(dall_price);
var (dorange, dorange_num) = mul_orange_layer.backward(dorange_price);
var (dapple, dapple_num) = mul_apple_layer.backward(dapple_price);

Console.WriteLine(price.ToString());
Console.WriteLine($"{dapple_num} {dapple} {dorange} {dorange_num} {dtax}");

class AddLayer
{
    public NDArray forward(NDArray x, NDArray y)
    {
        var @out = x + y;
        return @out;
    }

    public (NDArray dx, NDArray dy) backward(NDArray dout)
    {
        var dx = dout * 1;
        var dy = dout * 1;
        return (dx, dy);
    }
}

class MulLayer
{
    NDArray? x;
    NDArray? y;

    public NDArray forward(NDArray x, NDArray y)
    {
        this.x = x;
        this.y = y;
        var @out = x * y;
        return @out;
    }

    public (NDArray dx, NDArray dy) backward(NDArray dout)
    {
        var dx = dout * this.y;
        var dy = dout * this.x;
        return (dx, dy);
    }
}

.NET 6 での実行結果。

NumSharp で乗算レイヤー

C# で「ゼロから作るDeep Learning」に挑戦する続きは 5 章に入った。

NumSharp を使って、乗算レイヤを実装してみた。

using NumSharp;

NDArray apple = 100;
NDArray apple_num = 2;
NDArray tax = 1.1;

var mul_apple_layer = new MulLayer();
var mul_tax_layer = new MulLayer();

// forward
var apple_price = mul_apple_layer.forward(apple, apple_num);
var price = mul_tax_layer.forward(apple_price, tax);
Console.WriteLine(price.ToString());

// backward
NDArray dprice = 1;
var (dapple_price, dtax) = mul_tax_layer.backward(dprice);
var (dapple, dapple_num) = mul_apple_layer.backward(dapple_price);
Console.WriteLine($"{dapple} {dapple_num} {dtax}");

class MulLayer
{
    NDArray? x;
    NDArray? y;

    public NDArray forward(NDArray x, NDArray y)
    {
        this.x = x;
        this.y = y;
        var @out = x * y;
        return @out;
    }

    public (NDArray dx, NDArray dy) backward(NDArray dout)
    {
        var dx = dout * this.y;
        var dy = dout * this.x;
        return (dx, dy);
    }
}

.NET 6 で実行。

C# でもタプルと分解代入を使えば、Python にかなり近い書き味になる。

かぐや様は告らせたい(27)

前巻で四宮家のお家騒動にカタがついて、あとはクロージング。

四宮家三男の雲鷹は、作中でも印象がガラリと変わった人物の筆頭だな。第一印象は最悪。早坂拐おうとしてたし。ただ、かぐやを四宮家の人間としては一人前に育てたし、なんだかんだ情はあったみたいで、手のひらクルッてなった。雲鷹は、かぐやと会長が将来結婚するのも認めているようだし、会長も面と向かってではないけど、雲鷹兄さんなんて呼んじゃっていたり。赤坂先生の手のひらで見事に踊らされてしまったな。

藤原書記のラーメン四天王編もついに完結。最後の晩餐には寿司か焼肉というオチが、じつに彼女らしい。藤原書記のフリーダムさに四天王が勝手に振り回されているだけの構図なのに、それが面白い。藤原書記だから成り立ったシリーズ。藤原書記もまた、第一印象と現在で評価が変わった一人だな。メインヒロインだったはずなのに。すぐ化けの皮剥がれたけど。下ネタ連呼しても許されるヒロインなんてそうそういない。

次がいよいよ最終巻。27巻発売時点で残り3話なんだけど、会長の最初の生徒会長選挙での大立ち回りが明かされるんだろうか。このまま触れられず終わったりしないか心配だ。伏線はきっちり回収し終わってほしい。