SVX日記
2004-10-12(Tue) 「Namco TV Classics - Ms. Pac Man」レビュー、その3
今日はまとめて何通かメールを書く用事があるので工作はお休み。特にネタがないので、例の「Namco TV Classics - Ms. Pac Man」の残りの「ギャラガ」と「マッピー」のゲームのレビューをするのである。この2作ともデキがイイゾッ!!
ギャラガ
このゲームはデキがいい。実は現在一番ハマっているのがこのギャラガである。このゲームはギャラクシアンの二番煎じ的な作品ではあるものの、プレイするとプレイ間隔はまったく異なり、その奥の深さに驚く。全体にかなりスピーディな展開で、ギャラクシアンのようにダレず、事象の組み合わせで微妙に難度が上がっていくというナムコお家芸のゲームデザイン。正統な続編のギャプラスを差し置いて、ギャラガ88という続編が出たのもうなずける話だ。ゲーム内のすべてが高次なレベルで結晶化していという点では、パックマンと肩を並べるデキだと思う。
さて、以上のことはすべてオリジナルでの話だが、本製品もまったく同じように語れるレベルに仕上がっている。違いといえば、サウンドに関して、トラクタービームの音がせわしい、ボーナスパーフェクト時の「キューン」がない(わかる?)、分裂ザコの分裂音がない、ということくらいか。現在、私は29面まで到達しているが、10面、18面は登場時に攻撃してこない、数種のボーナスステージの動き、キャプチャ中に四方八方に弾を撃てる、という点も完璧だ。ゲームオーバー時にHIT MISS RATIOも表示される(200%技も可能)し、ゼビウスと違ってネーミングミュージックも2種類ある。
ゼビウスと同じようにこのゲームも元は縦画面ということで、若干寸詰まりの印象を受けないこともないが、だからといってゼビウスのように難度に重大な影響を及ぼしている感じはない。もし実際に比率を変更していて、バランスを取り直していたとしても、文句のつけようがない完成度である。
マッピー
このゲームもかなりの好ゲームである。なんといってもその特異な移動方法、適度に予測可能な敵の動き、絶妙な反撃アイテムや練られた得点戦略などのゲームの要素以外にも、キャラクタデザインの巧みさ、それにマッチしたBGMなど、これまたゲームバランスの妙を感じさせる。ギャラガと同様に、事象の組み合わせで微妙に難度が上がっていくというナムコお家芸のゲームデザインも健在だ。どうやったらこんな絶妙なバランスのゲームが創れるのだろうか?
本製品も上記のオリジナルのよさを損ねることはなく遊べるレベルに仕上がっている。違いといえば、やはりサウンドで、時々「音の伸ばし」がないという点が気になった(むぅ、もったいない)。ネーミングの音楽がえらくショボくなっているという点からすると、サウンド関連は意図的に手を抜いたのかもしれない。とはいえ、ゲームの内容的にはまったくオリジナルと同様で、ちゃんと追いかけデモから始まるし、ニャームコの動きが固定だったり、ミューキーズの速度が徐々に凶悪になっていく点、ハリーのタイミング、ご先祖様の出現まで違和感を感じることはなかった。現在14面まで到達しているが、屋敷の形も面ごとに異なるし、ベルや落とし穴のフィーチャーも存在した。若干、ドア開閉による攻撃がプレーヤー有利に設定されている感じがするが、これは改良ともとれるだろう。ボーナスステージは若干風船の当たり判定の異なる点があったが、ちゃんと数パターンあり、どれも結構シビアにできている(3パターン目のニャームコ割りも確認)。
ちなみに、このゲームも元は縦画面だが、若干(マッピーの身長程度)上下にスクロールすることで対応しており、ニャームコ屋敷はちゃんと6階+屋根裏がある。一番上までスクロールしても一階のミューキーズの頭が確認できるし、一番下まで移動しても屋根裏のミューキーズの足が確認できるので、指摘されなければスクロールしていることに気づかないこともあるだろう。
なお、ニャームコとマッピーはゲームに登場する以前、もともとはナムコ製作の迷路脱出ロボットのキャラクタとして考案されたものだということはあまり知られていない。試しに「マイクロマウス マッピー」としてググってみよう。
まとめ
というわけでこの製品、個人的にはものすごい逸品であると思う。プレイステーション版の方が再現度が高いという意見もあろうが、プラットフォームの寿命はビデオ端子ほどは長くなかろう。この製品ならば孫の代まで遊び倒せる。なにせ内蔵のゲームは「ひ孫の代まで遊ぶべき珠玉のゲーム達」なのであるッ!!
余談だが、ギャラガに関しては「GALAGA MANIAX」、マッピーに関しては「MAPPY MANIAC」が非常に詳しい。攻略の際にはぜひ参考に。
2014-10-12(Sun) ああっ! また踏み台にしたぁ!?
昨年末に作った、自転車用の踏み台が、しばらく前にポッキリ逝ってしまったので、再度、作ることにした。実は作った直後、友人に「木目の方向がよくないから割れちゃうかも?」という指摘を受けていたのだが、まさにそのとおりになってしまった。まぁ、1年持てば十分なほど安上がりな工作だったんで、やっちまった感はないのだが。
スプレーで黒く塗装して使っていたのだが、たまたま最初から黒い板を見つけたのでそれを買ってきた。250円。端材にしては安くない気もするが。ちなみに今回は木目の方向は大丈夫なのだが合板なのが微妙かも。
家にある端材を使って、足から作り直すつもりだったが、サインコサインタンジェントしてみたところ、どうも微妙に手持ちの端材では足りない感じ。仕方なく、既存の端材の一部を再利用しようか、と合わせてみたら、足がまるごと再利用できるほどピッタリっぽい。天板だけ交換する形で済みそうだ。
では、と、面取りカッター付きのφ3mmのビットを電気ドリルに取り付けたら、自分でも驚くほどアッサリ完成。サインコサインタンジェントを含めて1時間かからなかった。ちょうど庭のキンモクセイが香っていたし、もうちょっと作業させてくれてもよかったのにな。
と、さらに1年ぶりくらいに「カメラ付き戦車」を進捗。仕様を思い出しつつ、画像のカラー化に成功(?)。GIMPで持ち上げると、まぁ、情報は取れている。
2023-10-12(Thu) WebAssembly $41
偶然「RubyがWebAssemblyで動く」という記事を目にした。「WebAssembly」と聞くとブラウザ上で機械語が動くらしい印象を受けるが、具体的にはサッパリわからない。一般的なブラウザでRubyが動くなら実に喜ばしいことだが。しかし、Rubyを動かすためにはファイルシステムが……みたいな話になっている。よく理解できない。フムン。まずはRuby抜きでWebAssembly自体について学んでみたくなってきたな。
そもそも、自分は8bitの頃にコンピュータを始めたクチで、その頃はBASICを理解したら、次は機械語というのが定番のルートだった。自分はSHARP党だったので、X1ではZ80、X68000ではMC68000、Oh!XキッカケでPICマイコンのアセンブラにも手を染めたことがあるが、そもそもWebAssemblyの「Assembly」はアセンブラの意味で正しいのだろうか?
調べ始めると、どうもそれで正しいらしい。JavaScriptよりも高速な処理を目指したもので、そのバイナリは仮想マシンで処理されるものの、数倍の性能が得られるらしい。数倍……か。Z80の頃には、BASICと機械語では軽く数十倍以上の性能が得られたことに比べればずいぶん控えめな値ではあるが。
しかし驚いたのは、あらゆるI/O機能が「ない」ことだ。つまり計算やメモリ操作しかできない。そんなもん何に使ったらいいのか。せっかく懐かしくアセンブラに手を染められるかと思ったのに、使い道のないものを学んでも仕方がない……ん? いや、あるッ! ひとつだけ思いついたぞ。うむ、じゃ、やってみるか。
ということで、Web上でWebAssemblyの記事を探すと、CやRustから使う記事が多い。いや、そうじゃないんだ。せっかくなんだから、直接にニーモニック(mnemonic)を書きたいんだ。で、しつこく探すとそういう記事も多少は見つかる。
;; https://developer.mozilla.org/ja/docs/WebAssembly/Understanding_the_text_format
(module
(func (param $lhs i32) (param $rhs i32) (result i32)
local.get $lhs
local.get $rhs
i32.add
)
)
# dnf search webassem
wabt.x86_64 : The WebAssembly Binary Toolkit
# dnf install wabt
# wat2wasm add.wat
# ndump add.wasm
#Address +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F 'Character
#00000000 = 00 61 73 6D 01 00 00 00 01 07 01 60 02 7F 7F 01 '.asm....:...`....
#00000010 = 7F 03 02 01 00 0A 09 01 07 00 20 00 20 01 6A 0B '........:.. . .j.
# wasm2wat add.wasm
(module
(type (;0;) (func (param i32 i32) (result i32)))
(func (;0;) (type 0) (param i32 i32) (result i32)
local.get 0
local.get 1
i32.add))
しかし、なにしろ動かしてみないことには面白くない。なんでも、wasmバイナリを動かすには、ブラウザでJavaScriptを実行し、そこから呼び出す形式になるらしい。まさに昔、BASICプログラムから機械語サブルーチンを呼び出す場合の「CALL」や「USR」と同じ形式ということだな。
;; https://developer.mozilla.org/ja/docs/WebAssembly/Understanding_the_text_format
(module
(func (export "add") (param $lhs i32) (param $rhs i32) (result i32)
local.get $lhs
local.get $rhs
i32.add
)
)
<!-- https://developer.mozilla.org/ja/docs/WebAssembly/Understanding_the_text_format -->
<HTML>
<HEAD>
<TITLE>WebAssembly Add Test</TITLE>
</HEAD>
<BODY>
<SCRIPT>
WebAssembly.instantiateStreaming(fetch("add.wasm")).then(
(obj) => {
console.log(obj.instance.exports.add(1, 2));
}
);
</SCRIPT>
</BODY>
</HTML>
JavaScriptを含むhtmlと、機械語サブルーチンであるwasmは、/var/www/htmlの下に配置し、手元でApacheを上げ、ブラウザからhttp://localhost/add.htmlでアクセスする。何も画面に表示されなくても焦ってはいけない。「Chrome」なら右クリックからの「検証」「Console」し、ログに結果である「3」が……アレ? 出てないな。代わりにエラーが出ている。
Uncaught (in promise) TypeError: Failed to execute 'compile' on 'WebAssembly':
Incorrect response MIME type. Expected 'application/wasm'.
TypeError: Response has unsupported MIME type
よく読めばChromeの方が(ちょっと過剰にw)わかりやすい。Apacheがwasmを返す時の「MIME type」は「application/wasm」じゃないの? って言ってるワケだ。これは、Apache側に設定追加してやる必要がある。
/etc/httpd/conf/httpd.conf
<IfModule mime_module>
:
AddType application/wasm .wasm
:
</IfModule>